c++ - Hook kernel32.dll 函数使我的程序无法运行

标签 c++ hook detours kernel32

你知道为什么我hook其中一个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 );
}

最佳答案

“//我在这里的操作”会很有趣,也许你正在破坏堆栈。 或者错误可能出在您的 DetourFunction 中。 你的程序怎么会失败?可能存在访问冲突?

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

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 这样的反汇编器,绕道后转储你的目标函数,看看 hook 是否被正确应用

关于c++ - Hook kernel32.dll 函数使我的程序无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18033200/

相关文章:

C# 有没有办法通过带钩子(Hook)的附加鼠标按钮检测鼠标点击?

php - 如何从 foreach 数组循环中构造手动自定义字段?

WordPress Hook 在发送之前修改电子邮件正文

c++ - 多个源文件中带有外部全局变量的 Unresolved 链接器错误

c++ - 绕道钩住 CreateFile 函数触发堆栈溢出

c - 通过绕道减少非决定论?

c++ - 如何编译Detours Express 3.0?

c++ - 来自另一个类的对象的类 vector

c++ - 使用 Qt5 查找可执行文件

c++ - Win CE 上的 process.h