我不太擅长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;
}
您是否发现了任何错误或需要更改的地方?我们非常感谢您的帮助。谢谢!
break;
怎么样?因为现在的写法是,在初始化之后立即移除钩子。 - valdo