获得程序的32位基址,而不需要64位(仅)程序?

时间:2013-06-29 02:02:12

标签: c++ winapi memory-address

我正在为游戏制作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位工作?

1 个答案:

答案 0 :(得分: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以获取数字模块,然后通过hModules。

唉,代码应该编译并运行正常,但下次使用前面提到的GetModuleHandle()会让你头疼。