【发布时间】:2011-06-16 23:17:12
【问题描述】:
我不擅长 C++,更多的是 C# 和 PHP。我被分配了一个项目,该项目需要我使用GetTickCount 并连接到应用程序。我需要一些帮助,因为由于某种原因它没有按计划工作......这是挂钩的代码,我知道它有效,因为我以前在项目中使用过它。我唯一不太确定的是其中的GetTickCount 部分。我尝试GetTickCount64 认为这是对我的问题的修复(它没有使我注入的内容崩溃),但发现它根本不起作用,所以它没有崩溃。
bool APIENTRY DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hDll);
CreateThread(0,0, (LPTHREAD_START_ROUTINE)KeyHooks, 0, 0, 0);
GetTickCount_orig = (DWORD (__stdcall *)(void))DetourFunction((PBYTE)GetProcAddress(GetModuleHandle("kernel32.dll"), "GetTickCount"), (PBYTE)GetTickCount_hooked);
case DLL_PROCESS_DETACH:
DetourRemove((PBYTE)GetProcAddress(GetModuleHandle("kernel32.dll"), "GetTickCount"), (PBYTE)GetTickCount_hooked);
break;
}
return true;
}
这是用于GetTickCount 的其余代码
DWORD oldtick=0;
DWORD (WINAPI *GetTickCount_orig)(void);
DWORD WINAPI GetTickCount_hooked(void)
{
if(oldtick==0)
{
oldtick=(*GetTickCount_orig)();
return oldtick;
}
DWORD factor;
DWORD ret;
ret = (*GetTickCount_orig)();
factor = 3.0;
DWORD newret;
newret = ret+((oldtick-ret)*(factor-1));
oldtick=ret;
return newret;
}
你能看到一些不正确或应该改变的地方吗?任何帮助表示赞赏。谢谢!
【问题讨论】:
-
这里的实际问题是什么?
-
尝试注入应用程序时崩溃。我的 QueryPerformanceCounter 注入良好,没有问题。
-
将
break;放在case DLL_PROCESS_DETACH之前怎么样?因为就像现在写的那样 - 你在初始化后立即删除你的钩子
标签: c++ winapi hook detours gettickcount