From 5768edce755dc1b563190647707f304c1b04c2ee Mon Sep 17 00:00:00 2001 From: Blu3train Date: Mon, 22 May 2023 20:38:04 +0200 Subject: [PATCH 1/4] WillPlus4 engine hooks --- texthook/engine/engine.cc | 45 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index c2c7abc..e12b08c 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -9628,12 +9628,55 @@ static bool InsertNewWillPlusHook() return found; } +bool WillPlus4Filter(LPVOID data, DWORD *size, HookParam *, BYTE) +{ + auto text = reinterpret_cast(data); + auto len = reinterpret_cast(size); + wchar_t *pFilter; + + WideStringCharReplacer(text, len, L"\\n", 2, L' '); + WideStringCharReplacer(text, len, L"%K", 2, L' '); + WideStringCharReplacer(text, len, L"%P", 2, L' '); + + return true; +} + +static bool InsertWillPlus4() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/r71235 + */ + const BYTE bytes[] = { + 0x33, 0xC9, // xor ecx,ecx <-- hook + 0x8B, 0xC7, // mov eax,edi + 0xC7, 0x84, 0x24, XX4, XX4, // mov [esp+000001E0],00000007 + 0x89, 0x9C, 0x24, XX4 // mov [esp+000001DC],ebx + }; + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:WillPlus4: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_edi_off -4; + hp.type = USING_UNICODE | USING_STRING; + hp.filter_fun = WillPlus4Filter; + ConsoleOutput("vnreng: INSERT WillPlus4"); + NewHook(hp, "WillPlus4"); + return true; +} + } // unnamed namespace bool InsertWillPlusHook() { bool ok = InsertOldWillPlusHook(); - ok = InsertWillPlusWHook() || InsertWillPlusAHook() || InsertNewWillPlusHook() || ok; + ok = InsertWillPlusWHook() || InsertWillPlusAHook() || InsertNewWillPlusHook() || InsertWillPlus4() || ok; if (!ok) PcHooks::hookOtherPcFunctions(); return ok; } From 4f5bb1e98337a889ac048024f6b9e9a2678370fd Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 23 May 2023 00:52:26 +0200 Subject: [PATCH 2/4] fix --- texthook/engine/engine.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index e12b08c..1bb5aa8 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -9632,11 +9632,11 @@ bool WillPlus4Filter(LPVOID data, DWORD *size, HookParam *, BYTE) { auto text = reinterpret_cast(data); auto len = reinterpret_cast(size); - wchar_t *pFilter; WideStringCharReplacer(text, len, L"\\n", 2, L' '); - WideStringCharReplacer(text, len, L"%K", 2, L' '); - WideStringCharReplacer(text, len, L"%P", 2, L' '); + WideStringFilter(text, len, L"%LF", 3); + WideStringFilter(text, len, L"%K", 2); + WideStringFilter(text, len, L"%P", 2); return true; } From 6a5c79428948768020d497b880bca7fd36fe3fcc Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 31 Oct 2023 22:50:17 +0100 Subject: [PATCH 3/4] WillPlus5 engine hooks --- texthook/engine/engine.cc | 42 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index 1bb5aa8..0b80204 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -9633,8 +9633,11 @@ bool WillPlus4Filter(LPVOID data, DWORD *size, HookParam *, BYTE) auto text = reinterpret_cast(data); auto len = reinterpret_cast(size); + WideStringCharReplacer(text, len, L" \\n", 3, L' '); WideStringCharReplacer(text, len, L"\\n", 2, L' '); + WideStringCharReplacer(text, len, L"\\d", 2, L'\"'); WideStringFilter(text, len, L"%LF", 3); + WideStringFilter(text, len, L"%LC", 3); WideStringFilter(text, len, L"%K", 2); WideStringFilter(text, len, L"%P", 2); @@ -9671,12 +9674,49 @@ static bool InsertWillPlus4() return true; } +static bool InsertWillPlus5() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/v29881 + */ + const BYTE bytes[] = { + 0xE8, XX4, // call AdvHD.exe+38550 <-- hook here + 0x8B, 0x4B, 0x08, // mov ecx,[ebx+08] + 0x89, 0x8F, XX4, // mov [edi+0000014C],ecx + 0x85, 0xC9, // test ecx,ecx + 0x74, 0x04 // je AdvHD.exe+396C6 + }; + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:WillPlus5: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_esi_off -4; + hp.index = 0; + hp.split = pusha_ebx_off -4; + hp.split_index = 0; + hp.type = USING_UNICODE | USING_STRING | NO_CONTEXT | USING_SPLIT; + hp.filter_fun = WillPlus4Filter; + ConsoleOutput("vnreng: INSERT WillPlus5"); + NewHook(hp, "WillPlus5"); + return true; +} + } // unnamed namespace bool InsertWillPlusHook() { bool ok = InsertOldWillPlusHook(); - ok = InsertWillPlusWHook() || InsertWillPlusAHook() || InsertNewWillPlusHook() || InsertWillPlus4() || ok; + ok = InsertWillPlus4() || ok; + ok = InsertWillPlus5() || ok; + ok = InsertWillPlusWHook() || InsertWillPlusAHook() || ok; + ok = InsertNewWillPlusHook() || ok; if (!ok) PcHooks::hookOtherPcFunctions(); return ok; } From 14c44ac96412154b06dc81ba2a753aaf4842dae7 Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 5 Dec 2023 00:35:02 +0100 Subject: [PATCH 4/4] WillPlus6 engine hooks --- texthook/engine/engine.cc | 57 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index 0b80204..19e0e5e 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -9628,11 +9628,14 @@ static bool InsertNewWillPlusHook() return found; } -bool WillPlus4Filter(LPVOID data, DWORD *size, HookParam *, BYTE) +bool WillPlusWFilter(LPVOID data, DWORD *size, HookParam *, BYTE) { auto text = reinterpret_cast(data); auto len = reinterpret_cast(size); + if (*text == L'/' || *text == L'|') + return false; + WideStringCharReplacer(text, len, L" \\n", 3, L' '); WideStringCharReplacer(text, len, L"\\n", 2, L' '); WideStringCharReplacer(text, len, L"\\d", 2, L'\"'); @@ -9640,6 +9643,8 @@ bool WillPlus4Filter(LPVOID data, DWORD *size, HookParam *, BYTE) WideStringFilter(text, len, L"%LC", 3); WideStringFilter(text, len, L"%K", 2); WideStringFilter(text, len, L"%P", 2); + WideStringFilter(text, len, L"%XS", 5); // remove %XS followed by 2 chars + WideStringFilter(text, len, L"%XE", 3); return true; } @@ -9668,7 +9673,7 @@ static bool InsertWillPlus4() hp.address = addr; hp.offset = pusha_edi_off -4; hp.type = USING_UNICODE | USING_STRING; - hp.filter_fun = WillPlus4Filter; + hp.filter_fun = WillPlusWFilter; ConsoleOutput("vnreng: INSERT WillPlus4"); NewHook(hp, "WillPlus4"); return true; @@ -9702,12 +9707,57 @@ static bool InsertWillPlus5() hp.split = pusha_ebx_off -4; hp.split_index = 0; hp.type = USING_UNICODE | USING_STRING | NO_CONTEXT | USING_SPLIT; - hp.filter_fun = WillPlus4Filter; + hp.filter_fun = WillPlusWFilter; ConsoleOutput("vnreng: INSERT WillPlus5"); NewHook(hp, "WillPlus5"); return true; } +static bool InsertWillPlus6() +{ + //by Blu3train + /* + * Sample games: + * https://vndb.org/v47136 + */ + const BYTE bytes[] = { + 0xCC, // int 3 + 0x53, // push ebx <-- hook here + 0x8B, 0xDC, // mov ebx,esp + 0x83, 0xEC, 0x08, // sub esp,08 + 0x83, 0xE4, 0xF8, // and esp,-08 + 0x83, 0xC4, 0x04, // add esp,04 + 0x55, // push ebp + 0x8B, 0x6B, 0x04, // mov ebp,[ebx+04] + 0x89, 0x6C, 0x24, 0x04, // mov [esp+04],ebp + 0x8B, 0xEC, // mov ebp,esp + 0x6A, 0xFF, // push -01 + 0x68, XX4, // push AdvHD.exe+1965B0 + 0x64, 0xA1, 0x00, 0x00, 0x00, 0x00, // mov eax,fs:[00000000] + 0x50, // push eax + 0x53, // push ebx + 0x81, 0xEC, 0x28, 0x01, 0x00, 0x00 // sub esp,00000128 + }; + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:WillPlus6: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr + 1; + hp.offset = pusha_esi_off -4; + hp.index = 0; + hp.split = pusha_ebx_off -4; + hp.split_index = 0; + hp.type = USING_UNICODE | USING_STRING | NO_CONTEXT | USING_SPLIT; + hp.filter_fun = WillPlusWFilter; + ConsoleOutput("vnreng: INSERT WillPlus6"); + NewHook(hp, "WillPlus6"); + return true; +} + } // unnamed namespace bool InsertWillPlusHook() @@ -9715,6 +9765,7 @@ bool InsertWillPlusHook() bool ok = InsertOldWillPlusHook(); ok = InsertWillPlus4() || ok; ok = InsertWillPlus5() || ok; + ok = InsertWillPlus6() || ok; ok = InsertWillPlusWHook() || InsertWillPlusAHook() || ok; ok = InsertNewWillPlusHook() || ok; if (!ok) PcHooks::hookOtherPcFunctions();