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 useIsBadReadPtr
。明确检查高位词。【参考方案2】:
看我的评论。看起来流只需要在使用插入运算符 (
【讨论】:
以上是关于Detours 3.0 钩子 GetProcAddresss()的主要内容,如果未能解决你的问题,请参考以下文章
C++ Detours 3.0 express on MVS 2012 错误“找不到标识符”
Detours Hook:GetVolumeInformation 随机卷序列