如何钩住exe函数?

时间:2019-12-04 03:10:55

标签: c++ winapi hook

我需要从程序中获取一些东西。并且在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);

Function in IDA

但是pfOldA2ECB0将为NULL。
我对C ++和Win32(英语)的了解也不多,所以对我来说太难了。

1 个答案:

答案 0 :(得分:1)

根据我的理解,并且我相信我正确地理解了您想要的是内部挂钩

我可以通过3个简单的步骤向您展示如何做到这一点。

这些是您必须了解的内容:

  • IDA 中显示的功能未导出,因此您不能使用GetProcAddress()
  • 您必须在远程过程的上下文中以挂钩内部功能
  • 您不能使用Detours之类的库,必须具有自己的挂钩方法/功能

这些是您必须执行的步骤:

  1. 使用远程进程的上下文是最简单的方法:注入dll。
  2. 从IDA获取地址偏移量,在您的情况下为00A2ECB0。
  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);
}

就是这样,在您的情况下,它尽可能简单明了。

您当然可以走得更远,并执行更复杂的内部挂钩,但是对于您的学习目的,这是向前迈出的重要一步。

享受!