繁体   English   中英

使用C ++挂钩GetTickCount

[英]Hooking GetTickCount with C++

我不擅长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; 
}

你能看到不正确或应该改变的东西吗? 任何帮助表示赞赏。 谢谢!

什么是“KeyHooks”主题? 如果它希望调用绕道的API,你应该在创建线程之前绕道而行。

GetTickCount_orig是否已经设置好了?

GetTickCount可能是一个非常非常短的API,导致Detours出现问题(只是没有足够的字节来进行挂钩)。

您的DetourRemove正在删除GetTickCount64,而不是GetTickCount。

另外,如果Detours没有运行,那么mhook库的许可证就更简单了。

不要修改oldtick

你必须保存一次,然后

// accelerating time by factor of "factor"
return oldtick + (realtick - oldtick) * factor;

编辑:

另一个可能的问题是GetTickCount (至少在我的计算机上,XP 32bit)没有标准的“可挂钩”preamle:

8B FF     mov     edi, edi
55        push    ebp
8B EC     mov     ebp, esp

没有它,它只能从IAT连接,并且必须为每个调用它的模块完成。 我怀疑DetourFunction每个进程都有效,所以它使用前导码挂钩API。

要解决此问题,您可以尝试挂钩每个模块的IAT,也可以手动修补它,但是当它挂钩时您将无法调用原始版本。

EDIT2 :使用jump是最常用的方法,但这意味着我们必须在函数开头覆盖5个字节。 它的主要问题不是函数的大小,而是代码的开头。 当然,任何东西都可以被覆盖,但如果你想在钩子打开时能够调用旧函数(如本问题所示),那么你必须知道你在覆盖什么。
您不想覆盖一半的操作码,并且您必须执行被覆盖的部分。 这意味着在通用情况下,您需要一个完整的反汇编程序。

为了简化这一过程,大多数函数以额外的2字节NOP开头: mov edi, edi ,这样它们的前导码就有5个字节,这些字节是标准的,易于重定位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM