我正在使用:
MS VS 10
绕行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 ”
有人可以提示如何修复它吗?
答案 0 :(得分:2)
来自GetProcAddress()参考页,lpProcName
:
函数或变量名称,或函数的序数值。如果此参数是序数值,则它必须在低位字中;高阶词必须为零。
这意味着可能不是指向字符串的指针,但替换函数总是将其处理。这可能是访问冲突的原因,因为它将使用整数值(例如182
)作为空终止字符串的起始内存地址。
使用HIWORD()
更正:
if (HIWORD(lpProcName))
{
prclist << "name: " << lpProcName << std::endl;
}
else
{
prclist << "ordinal: " << reinterpret_cast<DWORD>(lpProcName) << std::endl;
}
答案 1 :(得分:0)
查看我的评论。看起来只需要在插入运算符(&lt;&lt;)之前对其进