From 5034888ba6791a3aa99bffeb5f7846b4d17783de Mon Sep 17 00:00:00 2001 From: Blu3train Date: Tue, 7 Nov 2023 02:25:11 +0100 Subject: [PATCH] Sysd engine hook --- texthook/engine/engine.cc | 55 ++++++++++++++++++++++++++++++++++++++ texthook/engine/engine.h | 1 + texthook/engine/match32.cc | 4 +++ 3 files changed, 60 insertions(+) diff --git a/texthook/engine/engine.cc b/texthook/engine/engine.cc index c2c7abc..2976715 100644 --- a/texthook/engine/engine.cc +++ b/texthook/engine/engine.cc @@ -21728,6 +21728,61 @@ bool InsertNamcoPS2Hook() } #endif // 0 +bool SysdFilter(LPVOID data, DWORD *size, HookParam *, BYTE) +{ + auto text = reinterpret_cast(data); + auto len = reinterpret_cast(size); + + if (text[0] == '\x81' && text[1] == '\x40') { + *len -= 2; + ::memmove(text, text + 2, *len); + } + while (text[*len-1] == '\n') { + (*len)--; + text[*len] = '\0'; + } + + return true; +} + +bool InsertSysdHook() { + //by Blu3train + /* + * Sample games: + * https://vndb.org/v2069 + */ + const BYTE bytes[] = { + 0xC1, 0xE9, 0x02, // shr ecx,02 <- hook here + 0xF3, 0xA5, // repe movsd + 0x8B, 0xCA, // mov ecx,edx + 0x83, 0xE1, 0x03, // and ecx,03 + 0xF3, 0xA4, // repe movsb + 0x5F, // pop edi + 0xB8, 0x01, 0x00, 0x00, 0x00 // mov eax,00000001 + }; + + ULONG range = min(processStopAddress - processStartAddress, MAX_REL_ADDR); + ULONG addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStartAddress + range); + if (!addr) { + ConsoleOutput("vnreng:Sysd: pattern not found"); + return false; + } + + HookParam hp = {}; + hp.address = addr; + hp.offset = pusha_esi_off -4; + hp.index = 0; + hp.padding = 0x12; + hp.split = 0x2 * 4; //arg 2 + hp.split_index = 0; + hp.type = USING_STRING | NO_CONTEXT | USING_SPLIT; + hp.filter_fun = SysdFilter; + ConsoleOutput("vnreng: INSERT Sysd"); + NewHook(hp, "Sysd"); + + return true; +} + } // namespace Engine // EOF diff --git a/texthook/engine/engine.h b/texthook/engine/engine.h index 5e167b2..7d725fa 100644 --- a/texthook/engine/engine.h +++ b/texthook/engine/engine.h @@ -156,6 +156,7 @@ bool InsertWillPlusHook(); // WillPlus: Rio.arc bool InsertWolfHook(); // Wolf: Data.wolf bool InsertYukaSystem2Hook(); // YukaSystem2: *.ykc bool InsertYurisHook(); // YU-RIS: *.ypf +bool InsertSysdHook(); // Sysd: sysd.ini void InsertBrunsHook(); // Bruns: bruns.exe void InsertIronGameSystemHook();// IroneGameSystem: igs_sample.exe diff --git a/texthook/engine/match32.cc b/texthook/engine/match32.cc index fffc4c7..fd3abf3 100644 --- a/texthook/engine/match32.cc +++ b/texthook/engine/match32.cc @@ -370,6 +370,10 @@ bool DetermineEngineByFile3() bool DetermineEngineByFile4() { + if (Util::CheckFile(L"sysd.ini")) { + if (InsertSysdHook()) + return true; + } if (Util::CheckFile(L"EAGLS.dll")) { // jichi 3/24/2014: E.A.G.L.S //ConsoleOutput("vnreng: IGNORE EAGLS"); InsertEaglsHook();