【问题标题】:Hooking kernel32.dll function stops my program from working挂钩 kernel32.dll 函数使我的程序无法工作
【发布时间】:2013-08-03 13:10:26
【问题描述】:

你知道为什么我在挂钩 kernel32 函数之一时无法运行程序吗?我正在写反作弊,并希望对其进行更多优化,因为目前它正在线程中,但是有问题...

写了OpenProcess,因为我之前试过hook它,同样的问题。

typedef HANDLE ( WINAPI * pOpenProcess )(   _In_   HANDLE hProcess,
                                         _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                         _In_   SIZE_T dwStackSize,
                                         _In_   LPTHREAD_START_ROUTINE lpStartAddress,
                                         _In_   LPVOID lpParameter,
                                         _In_   DWORD dwCreationFlags,
                                         _Out_  LPDWORD lpThreadId );

pOpenProcess original;

__declspec(naked) void hOpenProcess()
{
    __asm PUSHAD
    __asm PUSHFD
        //my actions here
    __asm POPFD
    __asm POPAD
    __asm JMP[original]
};

void ZPerformHook()
{
    DWORD Address = ( DWORD )GetProcAddress( GetModuleHandle( TEXT( "kernel32.dll" ) ), "CreateRemoteThread" );
    original = ( pOpenProcess )DetourFunction( (PBYTE)Address,  (PBYTE)hOpenProcess );
}

【问题讨论】:

  • OpenProcess 的参数在堆栈上传递。您要做的第一件事就是更改堆栈。这不好。您的代码需要同时保留 cpu 寄存器 并且 不损坏堆栈。这很重要,最好不要自己编写此代码。已经完成,您已经用 [detours] 标记了问题,因此您已经知道了一个好的解决方案。期待另一个没有意义。
  • @HansPassant:虽然我完全同意没有理由编写自己的代码来执行此操作,但堆栈正在向上传递消息的论点并不适用,因为相同的 PUSH 操作是与 POP 操作相匹配 - 至少不适用于对原始函数的调用。 //my actions here 更有可能以某种方式损坏(或者 original 可能不包含正确的地址)。
  • [当然假设这是为 32 位代码编译的 - 但我认为内联汇编程序无论如何都不支持 64 位模式,并且内联汇编程序应该知道 PUSHFD 和 POPFD 和 PUSHAD和 POPAD 不适用于 x86-64。
  • @MatsPetersson:原件地址不正确,问题已解决。

标签: c++ hook detours kernel32


【解决方案1】:

"//my actions here" 会很有趣,也许你正在破坏堆栈。 或者错误可能在您的 DetourFunction 中。 你的程序是怎么失败的?可能存在访问冲突?

您也不必使用裸函数。您可以挂钩到与您的目标具有完全相同签名的函数。 不需要汇编。

HANDLE __stdcall hOpenProcess(  HANDLE hProcess,
                                LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                SIZE_T dwStackSize,
                                LPTHREAD_START_ROUTINE lpStartAddress,
                                LPVOID lpParameter,
                                DWORD dwCreationFlags,
                                LPDWORD lpThreadId )
{
    // do your stuff here
    std::cout << "From hook" << std::endl;

    return original( hProcess, lpThreadAttributes, dwStackSize,  lpStartAddress, lpParameter,  dwCreationFlags,  lpThreadId);
}

如果这不起作用,请检查 GetProcAddress 的返回值,如果正确,您的 DetourFunction 中的某些内容可能会出错。

你也可以使用像 beaengine 这样的反汇编程序,并在绕道之后转储你的目标函数,看看钩子是否被正确应用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多