mirror of
https://github.com/HIllya51/LunaHook.git
synced 2024-12-25 20:54:15 +08:00
109 lines
3.8 KiB
C++
109 lines
3.8 KiB
C++
|
#include"Retouch.h"
|
|||
|
|
|||
|
// jichi 6/21/2015
|
|||
|
namespace { // unnamed
|
|||
|
|
|||
|
void SpecialHookRetouch1(hook_stack* stack, HookParam *, uintptr_t *data, uintptr_t *split, size_t*len)
|
|||
|
{
|
|||
|
DWORD text = stack->stack[1];
|
|||
|
*data = text;
|
|||
|
*len = ::strlen((LPCSTR)text);
|
|||
|
*split =
|
|||
|
stack->eax == 0 ? FIXED_SPLIT_VALUE * 2 : // name
|
|||
|
stack->ebx == 0 ? FIXED_SPLIT_VALUE * 1 : // scenario
|
|||
|
FIXED_SPLIT_VALUE * 3 ; // other
|
|||
|
}
|
|||
|
|
|||
|
bool InsertRetouch1Hook()
|
|||
|
{
|
|||
|
HMODULE hModule = ::GetModuleHandleA("resident.dll");
|
|||
|
if (!hModule) {
|
|||
|
ConsoleOutput("Retouch: failed, dll handle not loaded");
|
|||
|
return false;
|
|||
|
}
|
|||
|
// private: bool __thiscall RetouchPrintManager::printSub(char const *,class UxPrintData &,unsigned long) 0x10050650 0x00050650 2904 (0xb58) resident.dll C:\Local\箱庭ロジヂ<E382B8>\resident.dll Exported Function
|
|||
|
const char *sig = "?printSub@RetouchPrintManager@@AAE_NPBDAAVUxPrintData@@K@Z";
|
|||
|
DWORD addr = (DWORD)::GetProcAddress(hModule, sig);
|
|||
|
if (!addr) {
|
|||
|
ConsoleOutput("Retouch: failed, procedure not found");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
HookParam hp;
|
|||
|
hp.address = addr;
|
|||
|
hp.offset=get_stack(1);
|
|||
|
hp.type = USING_STRING|NO_CONTEXT|EMBED_ABLE|EMBED_AFTER_NEW|EMBED_BEFORE_SIMPLE|EMBED_DYNA_SJIS;
|
|||
|
hp.hook_font=F_GetGlyphOutlineA;
|
|||
|
hp.text_fun = SpecialHookRetouch1;
|
|||
|
ConsoleOutput("INSERT Retouch");
|
|||
|
return NewHook(hp, "Retouch");
|
|||
|
}
|
|||
|
|
|||
|
bool InsertRetouch2Hook()
|
|||
|
{
|
|||
|
HMODULE hModule = ::GetModuleHandleA("resident.dll");
|
|||
|
if (!hModule) {
|
|||
|
ConsoleOutput("Retouch2: failed, dll handle not loaded");
|
|||
|
return false;
|
|||
|
}
|
|||
|
// private: void __thiscall RetouchPrintManager::printSub(char const *,unsigned long,int &,int &) 0x10046560 0x00046560 2902 (0xb56) resident.dll C:\Local\箱庭ロジヂ<E382B8>\resident.dll Exported Function
|
|||
|
const char *sig = "?printSub@RetouchPrintManager@@AAEXPBDKAAH1@Z";
|
|||
|
DWORD addr = (DWORD)::GetProcAddress(hModule, sig);
|
|||
|
if (!addr) {
|
|||
|
ConsoleOutput("Retouch2: failed, procedure not found");
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
HookParam hp;
|
|||
|
hp.address = addr;
|
|||
|
hp.offset=get_stack(1);
|
|||
|
hp.offset=get_stack(1);
|
|||
|
hp.type = USING_STRING|NO_CONTEXT|EMBED_ABLE|EMBED_AFTER_NEW|EMBED_BEFORE_SIMPLE|EMBED_DYNA_SJIS;
|
|||
|
hp.hook_font=F_GetGlyphOutlineA;
|
|||
|
ConsoleOutput("INSERT Retouch");
|
|||
|
return NewHook(hp, "Retouch");
|
|||
|
}
|
|||
|
|
|||
|
namespace HistoryHook {
|
|||
|
inline ULONG get_jmp_absaddr(ULONG inst)
|
|||
|
{ return inst + 5 + *(ULONG *)(inst + 1); }
|
|||
|
bool attach() // attach scenario
|
|||
|
{
|
|||
|
if(GetModuleHandle(L"resident.dll")==0)return false;
|
|||
|
auto [startAddress, stopAddress] = Util::QueryModuleLimits(GetModuleHandle(L"resident.dll"));
|
|||
|
const uint8_t bytes[] = {
|
|||
|
0x8b,0x44,0x24, 0x04, // 051cf2e0 8b4424 04 mov eax,dword ptr ss:[esp+0x4]
|
|||
|
0x6a, 0x02, // 051cf2e4 6a 02 push 0x2
|
|||
|
0x6a, 0x00, // 051cf2e6 6a 00 push 0x0
|
|||
|
0x6a, 0x00, // 051cf2e8 6a 00 push 0x0
|
|||
|
0x6a, 0x00, // 051cf2ea 6a 00 push 0x0
|
|||
|
0x50, // 051cf2ec 50 push eax
|
|||
|
0xe8 //9ef8ffff // 051cf2ed e8 9ef8ffff call _1locke2.051ceb90
|
|||
|
// 051cf2f2 c2 0400 retn 0x4
|
|||
|
};
|
|||
|
auto addr = MemDbg::findBytes(bytes, sizeof(bytes), startAddress, stopAddress);
|
|||
|
if (!addr)
|
|||
|
return false;
|
|||
|
addr += sizeof(bytes) - 1; // move to the short call instruction
|
|||
|
addr = get_jmp_absaddr(addr);
|
|||
|
HookParam hp;
|
|||
|
hp.address = addr;
|
|||
|
hp.offset=get_stack(1);
|
|||
|
hp.type = USING_STRING|NO_CONTEXT|EMBED_ABLE|EMBED_AFTER_NEW|EMBED_BEFORE_SIMPLE|EMBED_DYNA_SJIS;
|
|||
|
hp.hook_font=F_GetGlyphOutlineA;
|
|||
|
return NewHook(hp, "RetouchHistory");
|
|||
|
}
|
|||
|
|
|||
|
} // namespace HistoryHook
|
|||
|
} // unnamed namespace
|
|||
|
bool InsertRetouchHook()
|
|||
|
{
|
|||
|
bool ok = InsertRetouch1Hook();
|
|||
|
ok = InsertRetouch2Hook() || ok;
|
|||
|
ok=HistoryHook::attach()||ok;
|
|||
|
return ok;
|
|||
|
}
|
|||
|
bool Retouch::attach_function() {
|
|||
|
|
|||
|
return InsertRetouchHook();
|
|||
|
}
|