挂钩kernel32.dll函数会阻止我的程序运行

时间:2013-08-03 13:10:27

标签: c++ hook detours kernel32

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

已经编写了OpenProcess,因为我之前尝试过将它挂钩并遇到同样的问题。

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 );
}

1 个答案:

答案 0 :(得分:1)

“//我在这里的行动”会很有趣,也许你正在破坏堆栈。 或者错误发生在您的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这样的反汇编程序并在绕行后转储目标函数以查看钩子是否正确应用