Detours 3.0 钩子 GetProcAddresss()

Posted

技术标签:

【中文标题】Detours 3.0 钩子 GetProcAddresss()【英文标题】:Detours 3.0 hook GetProcAddresss() 【发布时间】:2013-06-02 12:38:36 【问题描述】:

我正在使用:

MS VS 10

Detours v3.0 Express

完整的源代码DLL

#include <windows.h>
#include <detours.h>
ofstream prclist ;
#pragma comment(lib,"detours.lib")
FARPROC (WINAPI * pGetProcAddress)(HMODULE hModule,LPCSTR lpProcName) = GetProcAddress;
FARPROC WINAPI  myGetProcAddress(HMODULE hModule,LPCSTR lpProcName);
FARPROC WINAPI  myGetProcAddress(HMODULE hModule,LPCSTR lpProcName)

    prclist << lpProcName << endl; // <- ACCESS_VIOLATION READ
    return pGetProcAddress( hModule, lpProcName);


BOOL APIENTRY DllMain(HINSTANCE hDLL, DWORD reason, LPVOID reserved)


switch(reason)
    
        case DLL_PROCESS_ATTACH:
        
            prclist.open("proclst.log",ios::out | ios::app );
            DisableThreadLibraryCalls(hDLL);
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourAttach(&(PVOID&)pGetProcAddress, myGetProcAddress);
            DetourTransactionCommit();
            break;
        
        case DLL_PROCESS_DETACH:
        
            prclist.close();
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
            DetourDetach(&(PVOID&)pGetProcAddress, myGetProcAddress);
            DetourTransactionCommit();
            break;
        
   
        return TRUE;

我尝试查看 GetProcAddress 接收到的函数列表。但启动后,程序关闭并报错:“ACCESS_VIOLATION, UNABLE_TO_READ

有人可以提示如何修复它?

【问题讨论】:

你能在调试器中捕获 AV 并检查调用堆栈等吗? 不好意思,这段代码不会报错,我忘了加上:**prclist 我更新了源代码。 结果:proclst.log ... DecodePointer DecodePointer EncodePointer DecodePointer DecodePointer DecodePointer EncodePointer DecodePointer DecodePointer DecodePointer IsDebuggerPresent 并且此应用程序遇到严重错误:程序:异常:0xC0000005 (ACCESS_VIOLATION) at 001B:604DD950 “0x604DD950”处的指令引用了“0x00000068”处的内存。无法“读取”内存。按 OK 终止应用程序。 -------------------------- ОК ---------- ----- 这很有帮助。该代码正在取消引用对象指针以读取成员。指针为空,成员偏移104字节,导致0x00000068处读取失败。 【参考方案1】:

来自GetProcAddress() 参考页面,对于lpProcName

函数或变量名,或者函数的序数值。如果这个参数是序数值,它必须在低位词中;高位字必须为零。

这意味着它可能不是指向字符串的指针,但替换函数总是这样对待它。这是访问冲突的一个可能原因,因为它将使用整数值(例如182)作为空终止字符串的起始内存地址。

使用HIWORD()更正:

if (HIWORD(lpProcName))

    prclist << "name: " << lpProcName << std::endl;

else

    prclist << "ordinal: " << reinterpret_cast<DWORD>(lpProcName) << std::endl;

【讨论】:

@DOLBOEB:Don't use IsBadReadPtr。明确检查高位词。【参考方案2】:

看我的评论。看起来流只需要在使用插入运算符 (

【讨论】:

以上是关于Detours 3.0 钩子 GetProcAddresss()的主要内容,如果未能解决你的问题,请参考以下文章

C++ Detours 3.0 express on MVS 2012 错误“找不到标识符”

Delphi 如何与 Detours 库互操作?

Detours Hook:GetVolumeInformation 随机卷序列

为啥使用函数指针调用函数会绕过钩子?

为啥 DirectX Device Present 钩子在弯路中不起作用?

EasyHook库系列使用教程之四钩子的启动与停止