我需要从程序中获取一些东西。并且在ollydbg和IDA的帮助下,我发现可以在名为sub_HEXHEX
的函数中获得的“东西”。
现在,我知道如何从Dll挂接一个函数,例如DrawTextA
或其他函数。
我需要获取函数地址
HMODULE hmod = LoadLibrary(L"User32.dll");
GetProcAddress(hmod, "DrawTextA")
但是当我需要钩住这个sub_HEXHEX
时,我感到困惑。我可以得到该exe的HANDLE,我知道该函数的地址(即0x00HEXHEX),但是没有GetProcAddress
可以使用。我尝试使用HANDLE + 0x00HEXHEX
作为函数的地址,但是我认为'偏移'的东西是错误的。
这就是我所做的
DWORD dwPid = GetCurrentProcessId();
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPid);
OldA2ECB0 = (sub_A2ECB0)((HMODULE)hProcess + 0xA2ECB0);
pfOldA2ECB0 = (FARPROC)OldA2ECB0;
和sub_A2ECB0
typedef int(*sub_A2ECB0)(LPCSTR param1, int param2);
但是pfOldA2ECB0将为NULL。
我对C ++和Win32(英语)的了解也不多,所以对我来说太难了。
答案 0 :(得分:1)
根据我的理解,并且我相信我正确地理解了您想要的是内部挂钩。
我可以通过3个简单的步骤向您展示如何做到这一点。
这些是您必须了解的内容:
这些是您必须执行的步骤:
只需在远程进程内部应用一次钩子即可:
// 0xE8指令是相对调用指令 SetCompleteHook(0xE8,0x00A2ECB0,&YOUR_OWN_FUNCTION);
助手:
void SetCompleteHook(BYTE head,DWORD offset,...)
{
DWORD OldProtect;
VirtualProtect((void*)offset,5,PAGE_EXECUTE_READWRITE,&OldProtect);
if(head != 0xFF)
{
*(BYTE*)(offset) = head;
}
DWORD* function = &offset+1;
*(DWORD*)(offset+1) = (*function)-(offset+5);
VirtualProtect((void*)offset,5,OldProtect,&OldProtect);
}
就是这样,在您的情况下,它尽可能简单明了。
您当然可以走得更远,并执行更复杂的内部挂钩,但是对于您的学习目的,这是向前迈出的重要一步。
享受!