1

我正在为游戏制作 Pixel-Cheat。该程序目前仅适用于 64 位,我正在尝试编译为 32 位。

我尝试了很多方法来查找进程的基地址,但无济于事。只有 64 位功能有效,它会创建一个 64 位程序。

这是我的 64 位工作功能:

DWORD64 GetModuleBase(HANDLE hProc, string &sModuleName) 
{ 
  HMODULE *hModules; 
  char szBuf[50]; 
  DWORD cModules; 
  DWORD64 dwBase = -1; 
  //------ 

  EnumProcessModulesEx(hProc, hModules, 0, &cModules, LIST_MODULES_ALL); 
  hModules = new HMODULE[cModules/sizeof(HMODULE)]; 

  if(EnumProcessModulesEx(hProc, hModules, 
      cModules/sizeof(HMODULE), &cModules,     LIST_MODULES_ALL)) { 
  for(int i = 0; i < cModules/sizeof(HMODULE); i++) { 
     if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) { 
        if(sModuleName.compare(szBuf) == 0) { 
           dwBase = (DWORD64)hModules[i]; 
           break; 
           } 
        } 
     } 
  } 

  delete[] hModules; 

  return dwBase; 
}

google 上的所有 32 位功能都失败,出现错误:

21 59 C:\Users\Administrator\Documents\main.cpp [错误] 从 'BYTE* {aka unsigned char*}' 转换为 'DWORD {aka long unsigned int}' 失去精度 [-fpermissive]

如何让这段代码在 32 位下工作?

4

1 回答 1

0
DWORD64 GetModuleBase(HANDLE hProc, string &sModuleName) 
{ 
  HMODULE *hModules;
  char szBuf[50]; 
  DWORD cModules; 
  DWORD64 dwBase = -1; 
  //------ 

  EnumProcessModulesEx(hProc, NULL, 0, &cModules, LIST_MODULES_ALL); 
  hModules = new HMODULE[cModules/sizeof(HMODULE)]; 

  if(EnumProcessModulesEx(hProc, hModules, 
      cModules/sizeof(HMODULE), &cModules,     LIST_MODULES_ALL)) { 
  for(unsigned int i = 0; i < cModules/sizeof(HMODULE); i++) { 
     if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) { 
        if(sModuleName.compare(szBuf) == 0) { 
           dwBase = (DWORD64)hModules[i]; 
           break; 
           } 
        } 
     } 
  } 

  delete[] hModules; 

  return dwBase; 
}

您的函数在我机器上的 32 位 exe 中编译得很好,并带有一些警告,我在上面的代码段中更正了这些警告。

您可能想要做的几件事是确保您的编译器设置为在多字节字符模式下运行,而不是 Unicode,如果您要将 8 位字符数组(szBuf)传递给函数,否则使用 16 位wchar 数组。此外,您在第一次调用时将 hModules 传递给EnumProcessModulesEx()了您要获取模块数量的地方,由于尚未分配它会产生错误,在第一次调用时传递 NULL 以获取模块数量,然后传递h模块。

唉,代码应该可以编译运行正常了,但是下次使用GetModuleHandle()之前提到的,会省去你的头疼的。

于 2013-06-29T05:03:50.137 回答