From a3b15d870187d40696f8bbde42cfc0e06af233b4 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Sun, 30 Apr 2023 00:28:20 +0200 Subject: [PATCH 1/4] Minori engine hooks --- texthook/engine/engine.cc | 122 +++++++++++++++++++++++++++++++++++++ texthook/engine/engine.h | 1 + texthook/engine/match32.cc | 4 ++ 3 files changed, 127 insertions(+) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index c2c7abc..45de08a 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -21728,6 +21728,128 @@ bool InsertNamcoPS2Hook() } #endif // 0 +bool Minori1EngFilter(LPVOID data, DWORD *size, HookParam *, BYTE) +{ + auto text = reinterpret_cast(data); + auto len = reinterpret_cast(size); + StringCharReplacer(text, len, "\\n", 2, ' '); + StringFilter(text, len, "\\a", 2); + StringFilter(text, len, "\\v", 2); + CharReplacer(text, len, '\xC4', '-'); + CharReplacer(text, len, '\x93', '"'); + CharReplacer(text, len, '\x94', '"'); + CharReplacer(text, len, '\x92', '\''); + StringCharReplacer(text, len, "\\I", 2, '\''); + StringCharReplacer(text, len, "\\P", 2, '\''); + + return true; +} + +bool Minori1JapFilter(LPVOID data, DWORD *size, HookParam *, BYTE) +{ + auto text = reinterpret_cast(data); + auto len = reinterpret_cast(size); + StringFilter(text, len, "\\a", 2); + StringFilter(text, len, "\\v", 2); + StringFilter(text, len, "\\N", 2); + + if (cpp_strnstr(text, "{", *len)) { + StringFilterBetween(text, len, "{", 1, "}", 1); + } + + return true; +} + +bool InsertMinori1Hook() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/v19644 + * https://vndb.org/v12562 + */ + const BYTE bytes[] = { + 0x84, 0xC0, // test al,al << hook here + 0x0F, 0x85, XX4, // jne trinoline_en_AA.exe+243E1 + 0x68, XX4, // push trinoline_en_AA.exe+118BF8 << alt eng hook + 0x33, 0xFF // xor edi,edi + }; + enum { alt_addr_offset = 8 }; + + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:Minori1: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_edx_off -4; + hp.codepage = 932; + hp.type = USING_STRING; + hp.filter_fun = Minori1JapFilter; + ConsoleOutput("vnreng: INSERT Minori1"); + NewHook(hp, "Minori1"); + + const BYTE bytes2[] = { + 0x84, 0xC0, // test al,al + 0x0F, 0x85, XX4, // jne trinoline_en_AA.exe+243E1 + 0x68, XX4, // push trinoline_en_AA.exe+118BF8 + 0x33, 0xFF // xor edi,edi + }; + ULONG addr2 = MemDbg::findBytes(bytes2, sizeof(bytes2), processStartAddress, processStartAddress + range); + if (addr) { + HookParam hp = {}; + hp.address = addr + alt_addr_offset; + hp.offset = pusha_edx_off -4; + hp.type = USING_STRING; + hp.filter_fun = Minori1EngFilter; + ConsoleOutput("vnreng: INSERT Minori1eng"); + NewHook(hp, "Minori1eng"); + } + + return true; +} + +bool InsertMinori2Hook() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/v35 + */ + const BYTE bytes[] = { + 0x80, 0x38, 0x00, // cmp byte ptr [eax],00 + 0x0F, 0x84, XX4, // je WindRP.exe+2832A + 0xB8, 0x20, 0x03, 0x00, 0x00, // mov eax,00000320 + 0x89, 0x44, 0x24, 0x10, // mov [esp+10],eax + 0x89, 0x44, 0x24, 0x14, // mov [esp+14],eax + 0x8B, 0x47, 0x20 // mov eax,[edi+20] + }; + enum { addr_offset = 0 }; + + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:Minori2: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr + addr_offset; + hp.offset = pusha_eax_off -4; + hp.index = 0; + hp.length_offset = 1; + hp.type = NO_CONTEXT | DATA_INDIRECT; + ConsoleOutput("vnreng: INSERT Minori2"); + NewHook(hp, "Minori2"); + return true; +} + +bool InsertMinoriHooks() +{ return InsertMinori1Hook() || InsertMinori2Hook();} + } // namespace Engine // EOF diff --git a/texthook/engine/engine.h b/texthook/engine/engine.h index 5e167b2..620916c 100644 --- a/texthook/engine/engine.h +++ b/texthook/engine/engine.h @@ -165,6 +165,7 @@ void InsertRealliveHook(); // RealLive: RealLive*.exe void InsertStuffScriptHook(); // Stuff: *.mpk bool InsertTinkerBellHook(); // TinkerBell: arc00.dat bool InsertWaffleHook(); // WAFFLE: cg.pak +bool InsertMinoriHooks(); // Minori: *.paz // CIRCUS: avdata/ bool InsertCircusHook1(); diff --git a/texthook/engine/match32.cc b/texthook/engine/match32.cc index fffc4c7..297720c 100644 --- a/texthook/engine/match32.cc +++ b/texthook/engine/match32.cc @@ -370,6 +370,10 @@ bool DetermineEngineByFile3() bool DetermineEngineByFile4() { + if (Util::CheckFile(L"*.paz")) { + if (InsertMinoriHooks()) + return true; + } if (Util::CheckFile(L"EAGLS.dll")) { // jichi 3/24/2014: E.A.G.L.S //ConsoleOutput("vnreng: IGNORE EAGLS"); InsertEaglsHook(); From a31460cee1eeb489c8fbb7252305de6c676d6e56 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Sun, 30 Apr 2023 03:29:22 +0200 Subject: [PATCH 2/4] Minori engine hooks --- texthook/engine/engine.cc | 49 +++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index 45de08a..74bbac6 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -21792,21 +21792,23 @@ bool InsertMinori1Hook() ConsoleOutput("vnreng: INSERT Minori1"); NewHook(hp, "Minori1"); - const BYTE bytes2[] = { - 0x84, 0xC0, // test al,al - 0x0F, 0x85, XX4, // jne trinoline_en_AA.exe+243E1 - 0x68, XX4, // push trinoline_en_AA.exe+118BF8 - 0x33, 0xFF // xor edi,edi - }; - ULONG addr2 = MemDbg::findBytes(bytes2, sizeof(bytes2), processStartAddress, processStartAddress + range); - if (addr) { - HookParam hp = {}; - hp.address = addr + alt_addr_offset; - hp.offset = pusha_edx_off -4; - hp.type = USING_STRING; - hp.filter_fun = Minori1EngFilter; - ConsoleOutput("vnreng: INSERT Minori1eng"); - NewHook(hp, "Minori1eng"); + hp.address = addr + alt_addr_offset; + hp.codepage = 0; + hp.filter_fun = Minori1EngFilter; + ConsoleOutput("vnreng: INSERT Minori1eng"); + NewHook(hp, "Minori1eng"); + + return true; +} + +bool Minori2Filter(LPVOID data, DWORD *size, HookParam *, BYTE) +{ + auto text = reinterpret_cast(data); + auto len = reinterpret_cast(size); + StringCharReplacer(text, len, "\\n", 2, ' '); + + if (cpp_strnstr(text, "{", *len)) { + StringFilterBetween(text, len, "{", 1, "}", 1); } return true; @@ -21820,14 +21822,14 @@ bool InsertMinori2Hook() * https://vndb.org/v35 */ const BYTE bytes[] = { - 0x80, 0x38, 0x00, // cmp byte ptr [eax],00 + 0x80, 0x38, 0x00, // cmp byte ptr [eax],00 << hook here 0x0F, 0x84, XX4, // je WindRP.exe+2832A 0xB8, 0x20, 0x03, 0x00, 0x00, // mov eax,00000320 0x89, 0x44, 0x24, 0x10, // mov [esp+10],eax 0x89, 0x44, 0x24, 0x14, // mov [esp+14],eax 0x8B, 0x47, 0x20 // mov eax,[edi+20] }; - enum { addr_offset = 0 }; + enum { alt_addr_offset = 9 }; ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); @@ -21836,13 +21838,14 @@ bool InsertMinori2Hook() return false; } - HookParam hp = {}; - hp.address = addr + addr_offset; - hp.offset = pusha_eax_off -4; - hp.index = 0; - hp.length_offset = 1; - hp.type = NO_CONTEXT | DATA_INDIRECT; ConsoleOutput("vnreng: INSERT Minori2"); + HookParam hp = {}; + hp.address = addr + alt_addr_offset; + hp.offset = pusha_eax_off -4; + hp.type = USING_STRING; + hp.filter_fun = Minori2Filter; + ConsoleOutput("vnreng: INSERT Minori2"); + ConsoleOutput("vnreng:Minori2: Please, set text to max speed"); NewHook(hp, "Minori2"); return true; } From aa8f461a9accbaacf02b77b39accba416a523b77 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 6 Feb 2024 01:26:55 +0100 Subject: [PATCH 3/4] Minori2 engine fix --- texthook/engine/engine.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index 74bbac6..a7c1895 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -21829,8 +21829,6 @@ bool InsertMinori2Hook() 0x89, 0x44, 0x24, 0x14, // mov [esp+14],eax 0x8B, 0x47, 0x20 // mov eax,[edi+20] }; - enum { alt_addr_offset = 9 }; - ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); if (!addr) { @@ -21840,7 +21838,7 @@ bool InsertMinori2Hook() ConsoleOutput("vnreng: INSERT Minori2"); HookParam hp = {}; - hp.address = addr + alt_addr_offset; + hp.address = addr; hp.offset = pusha_eax_off -4; hp.type = USING_STRING; hp.filter_fun = Minori2Filter; From 489b9eaa74a30fb555b02e04ef4b7b4964100a19 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 6 Feb 2024 01:30:20 +0100 Subject: [PATCH 4/4] Minori3-4 engine hooks --- texthook/engine/engine.cc | 71 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index a7c1895..7cadb35 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -21848,8 +21848,77 @@ bool InsertMinori2Hook() return true; } +bool InsertMinori3Hook() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/r10137 + */ + const BYTE bytes[] = { + 0x0F, 0xB6, 0x08, // movzx ecx,byte ptr [eax] << hook here + 0x3B, 0xCA // cmp ecx,edx + }; + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:Minori3: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_eax_off -4; + hp.split = pusha_esp_off -4; + hp.split_index = 0; + hp.length_offset = 1; + hp.codepage = 1252; + hp.type = NO_CONTEXT | USING_SPLIT | DATA_INDIRECT; + ConsoleOutput("vnreng: INSERT Minori3"); + NewHook(hp, "Minori3"); + return true; +} + +bool InsertMinori4Hook() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/r10138 + */ + const BYTE bytes[] = { + 0x68, XX4, // push ef_latter_en.exe+12EDB0 << hook here + 0x33, 0xFF, // xor edi,edi + 0x8D, 0xB5, XX4, // lea esi,[ebp-00000090] + 0xC7, 0x45, 0x84, XX4 // mov [ebp-7C],0000000F + }; + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:Minori4: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_edx_off -4; + hp.split = pusha_esp_off -4; + hp.split_index = 0; + hp.codepage = 1252; + hp.type = NO_CONTEXT | USING_STRING | USING_SPLIT; + ConsoleOutput("vnreng: INSERT Minori4"); + NewHook(hp, "Minori4"); + return true; +} + bool InsertMinoriHooks() -{ return InsertMinori1Hook() || InsertMinori2Hook();} +{ + bool ok = InsertMinori1Hook(); + ok = InsertMinori2Hook() || ok; + ok = InsertMinori3Hook() || ok; + ok = InsertMinori4Hook() || ok; + return ok; +} } // namespace Engine