diff --git a/cpp/LunaHook/LunaHook/engine32/Bishop.cpp b/cpp/LunaHook/LunaHook/engine32/Bishop.cpp index b2c2275f..076da124 100644 --- a/cpp/LunaHook/LunaHook/engine32/Bishop.cpp +++ b/cpp/LunaHook/LunaHook/engine32/Bishop.cpp @@ -1,67 +1,110 @@ -#include"Bishop.h" +#include "Bishop.h" bool bishopmbcjmstojis() { - //特別授業 + // 特別授業 const BYTE bytes[] = { - //unsigned int __cdecl _mbcjmstojis(unsigned int C) - 0x55,0x8b,0xec, - 0x8b,0x45,0x08, //mov eax, [ebp+C] - 0x81, 0x3D,XX4, 0xA4 ,0x03 ,0x00 ,0x00, //cmp dword_4A1F0C, 3A4h //if ( dword_4A1F0C == 932 ) - XX2, - 0xa9,0x00,0x00,0xff,0xff //if ( (C & 0xFFFF0000) != 0 ) - }; - + // unsigned int __cdecl _mbcjmstojis(unsigned int C) + 0x55, 0x8b, 0xec, + 0x8b, 0x45, 0x08, // mov eax, [ebp+C] + 0x81, 0x3D, XX4, 0xA4, 0x03, 0x00, 0x00, // cmp dword_4A1F0C, 3A4h //if ( dword_4A1F0C == 932 ) + XX2, + 0xa9, 0x00, 0x00, 0xff, 0xff // if ( (C & 0xFFFF0000) != 0 ) + }; + auto addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress); - - if (!addr) return false; - + + if (!addr) + return false; + HookParam hp; - hp.address = addr ; - hp.offset=get_stack(2); - hp.type = USING_SPLIT|USING_STRING; - + hp.address = addr; + hp.offset = get_stack(2); + hp.type = USING_SPLIT | USING_STRING; + return NewHook(hp, "bishop"); } -bool Bishop::attach_function() { - - return bishopmbcjmstojis(); -} +bool Bishop::attach_function() +{ -bool Bishop2::attach_function(){ - - //三射面談~連鎖する恥辱・調教の学園~ - //特別授業3SLG - auto entry=Util::FindImportEntry(processStartAddress,(DWORD)GetGlyphOutlineW); - if(entry==0)return false; - bool ok=false; - for(auto addr:Util::SearchMemory(&entry, 4, PAGE_EXECUTE, processStartAddress, processStopAddress)){ - addr = MemDbg::findEnclosingAlignedFunction(addr); - if (!addr) continue; - auto xrefs=findxref_reverse_checkcallop(addr,max(processStartAddress,addr-0x100000),min(processStopAddress,addr+0x100000),0xe8); - for(auto addrx:xrefs){ - //ConsoleOutput("xref %p",addrx); - const BYTE aligned [] = {0xCC,0xCC}; - auto addrx1 = reverseFindBytes(aligned, sizeof(aligned), addrx-0x200, addrx); - //ConsoleOutput("Aligned %p",addrx1); - if (!addrx1) continue; - addrx1+=2; - BYTE __1[]={0xDC,0x0D,XX,XX,XX,0x00}; - auto _1 = MemDbg::findBytes(__1, 6, addrx-0x30, addrx); - //ConsoleOutput("sig %p",_1); - if(_1==0 )continue; - BYTE checkthiscall[]={0x8B,0xF9};//mov edi, ecx - auto _3 = MemDbg::findBytes(checkthiscall,2, addrx1, addrx); + return bishopmbcjmstojis(); +} +bool embedbishop() +{ + // 黒の教室 + const BYTE bytes[] = { + 0x53, + 0x8b, 0x5c, 0x24, 0x0c, + 0x56, + 0x8b, 0xf7, + 0xe8, XX4, + 0xd9, 0xee, + 0xdd, 0x9f, XX4, + 0x8b, 0xc3, + 0xdb, 0x44, 0x24, 0x0c, + 0x8d, 0x50, 0x02, + 0xdd, 0x9f, XX4, + 0x66, 0x8b, 0x08, + 0x83, 0xc0, 0x02, + 0x66, 0x85, 0xc9}; + + auto addr = MemDbg::findBytes(bytes, sizeof(bytes), processStartAddress, processStopAddress); + if (!addr) + return false; + HookParam hp; + hp.address = addr; + hp.offset = get_stack(2); + hp.type = USING_STRING | CODEC_UTF16 | EMBED_ABLE | EMBED_AFTER_NEW; + hp.embed_hook_font = F_GetGlyphOutlineW; + hp.lineSeparator = L"\\n"; + return NewHook(hp, "bishop"); +} +bool Bishop2attach_function() +{ + + // 三射面談~連鎖する恥辱・調教の学園~ + // 特別授業3SLG + auto entry = Util::FindImportEntry(processStartAddress, (DWORD)GetGlyphOutlineW); + if (entry == 0) + return false; + bool ok = false; + for (auto addr : Util::SearchMemory(&entry, 4, PAGE_EXECUTE, processStartAddress, processStopAddress)) + { + addr = MemDbg::findEnclosingAlignedFunction(addr); + if (!addr) + continue; + auto xrefs = findxref_reverse_checkcallop(addr, max(processStartAddress, addr - 0x100000), min(processStopAddress, addr + 0x100000), 0xe8); + for (auto addrx : xrefs) + { + // ConsoleOutput("xref %p",addrx); + const BYTE aligned[] = {0xCC, 0xCC}; + auto addrx1 = reverseFindBytes(aligned, sizeof(aligned), addrx - 0x200, addrx); + // ConsoleOutput("Aligned %p",addrx1); + if (!addrx1) + continue; + addrx1 += 2; + BYTE __1[] = {0xDC, 0x0D, XX, XX, XX, 0x00}; + auto _1 = MemDbg::findBytes(__1, 6, addrx - 0x30, addrx); + // ConsoleOutput("sig %p",_1); + if (_1 == 0) + continue; + BYTE checkthiscall[] = {0x8B, 0xF9}; // mov edi, ecx + auto _3 = MemDbg::findBytes(checkthiscall, 2, addrx1, addrx); HookParam hp; hp.address = addrx1; - if(_3) - hp.offset=get_stack(3); + if (_3) + hp.offset = get_stack(3); else - hp.offset=get_stack(4); + hp.offset = get_stack(4); hp.type = CODEC_UTF16; - - ok=NewHook(hp, "Bishop2"); - } + + ok = NewHook(hp, "Bishop2"); + } } - return ok; + return ok; +} + +bool Bishop2::attach_function() +{ + return Bishop2attach_function() | embedbishop(); } \ No newline at end of file diff --git a/cpp/LunaHook/LunaHost/host.cpp b/cpp/LunaHook/LunaHost/host.cpp index a6646ea4..ceec501e 100644 --- a/cpp/LunaHook/LunaHost/host.cpp +++ b/cpp/LunaHook/LunaHost/host.cpp @@ -137,6 +137,11 @@ namespace case HOST_NOTIFICATION_RMVHOOK: { auto info = *(HookRemovedNotif*)buffer; + auto sm = Host::GetCommonSharedMem(processId); + if (sm) + for (int i = 0; i < ARRAYSIZE(sm->embedtps); i++) + if (sm->embedtps[i].use && (sm->embedtps[i].tp.addr==info.address)&&(sm->embedtps[i].tp.processId==processId)) + ZeroMemory(sm->embedtps + i, sizeof(sm->embedtps[i])); RemoveThreads([&](ThreadParam tp) { return tp.processId == processId && tp.addr == info.address; }); } break;