Hook检测

这段代码展示了如何使用`CheckHooks`函数检查opengl32.dll中'glBegin'函数是否被修改,通过对比内存中的原始和检查数据来判断是否存在hook。它用于检测潜在的代码注入或安全漏洞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bool CheckHooks(const char* pszModule, const char* pszMethod, BYTE* pBytesToCheck, DWORD dwSize)
{
  bool bOK = false;
  HANDLE hProcess = ::GetCurrentProcess();
  HMODULE hModule = ::GetModuleHandle(pszModule);
  if (!hModule)
    return true; //The dll aint loaded
  LPVOID pAddress = ::GetProcAddress(hModule, pszMethod);

  // change the page-protection for the intercepted function
  DWORD dwOldProtect;
  if (!::VirtualProtectEx(hProcess, pAddress, dwSize, PAGE_EXECUTE_READ, &dwOldProtect))
    return false;

  //Read the bytes to see if someone hooked that function
  BYTE* pBytesInMem = (BYTE*)malloc(dwSize);
  DWORD dwRead = 0;
  if (::ReadProcessMemory(hProcess, pAddress, pBytesInMem, dwSize, &dwRead))
  {
    bOK = 0 != memcmp(pBytesInMem, pBytesToCheck, dwRead);

    /*
    char szAddress[_MAX_PATH];
    sprintf(szAddress, "%s::%s - at %lx - %s", pszModule, pszMethod, pAddress, bOK ? "OK" : "HACK");
    AgLog(szAddress);
    HANDLE hFile = CreateFile("c:\\temp.bin", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);
    DWORD dwWritten;
    WriteFile(hFile, pBytesToCheck, dwRead, &dwWritten, NULL);
    CloseHandle(hFile);  
    */
  }

  //
  // restore page protection
  //
  VirtualProtectEx(hProcess, pAddress, dwSize, dwOldProtect, &dwOldProtect);

  free(pBytesInMem);

  return bOK;
}        
 代码调用方法


BYTE byHokoHack[1] = {0xE8};
BYTE byRegularJumpHack[1] = {0xE9};
if ( !CheckHooks("opengl32.dll", "glBegin", byHokoHack, sizeof(byHokoHack))
|| !CheckHooks("opengl32.dll", "glBegin", byRegularJumpHack, sizeof(byRegularJumpHack))
)
{
m_sDll = "opengl32.dll (patched)";
return 11;
}

用法:

BYTE byHokoHack[1] = {0xE8}; 
  BYTE byRegularJumpHack[1] = {0xE9}; 
  if ( !CheckHooks("opengl32.dll", "glBegin", byHokoHack, sizeof(byHokoHack))
    || !CheckHooks("opengl32.dll", "glBegin", byRegularJumpHack, sizeof(byRegularJumpHack))
    )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值