使用EnumProcessModules的Windows程序入口点返回意外值

时间:2016-10-07 08:33:58

标签: c++ windows pointers memory psapi

我正在运行一个简单的应用程序并尝试使用Window的PSAPI读取其内存中的特定偏移量。
当我运行我的调试器时,我得到内存地址的实际值,以及我的“.exe”入口点的相对值。
然而,当我运行以下代码时,作为入口点的基本模块与我的偏移量一起产生一个不同的地址(它是错误的,并且由一些(六个)化学点关闭)。 可能是什么问题?

ReadMemory是ReadProcessMemory

的模板
    HWND   WINDOW_HANDLE;
HANDLE PROC_HANDLE;
DWORD PROC_ID;
DWORD address;
SIZE_T bytesRead; 

int InitReadMemory(const char* windowClass,const char* caption, DWORD addressOffset)
{

    DWORD cbNeeded;
    DWORD dwdResult;
    HMODULE mainModule;
    BOOL enumResult;

    //Get the window handle
    WINDOW_HANDLE = FindWindow(windowClass, NULL);
    if(WINDOW_HANDLE == NULL)
    {
        //Window was not foud
        return 10;
    }

    //Get the process ID
    dwdResult = GetWindowThreadProcessId(WINDOW_HANDLE, &PROC_ID);
    if(dwdResult==0)
    {
        //Getting Process ID failed
        return 20;
    }

    //Open the process
    PROC_HANDLE = OpenProcess(PROCESS_ALL_ACCESS, false, PROC_ID);

    if(PROC_HANDLE==NULL)
    {
        //Process failed to open
        return 30;
    }

    /*
     *Get the Main Module-
     *first entry in the returned HMODULE array from
     *EnumProcessModules
     */
    enumResult = EnumProcessModules(PROC_HANDLE, &mainModule, sizeof(HMODULE), &cbNeeded);

    if(enumResult != 0)
    {
        //Failed enumerating process modules
        return 40;
    }

    //offset the requested memory address from the application's base address
    address = (DWORD)((UINT_PTR)mainModule + addressOffset);  

#ifdef DEBUG        
    using namespace std;
    char filenameBuffer[64]="";


    string number;
    stringstream stristream;


    stristream << address;
    stristream >> number;
    cout << number << "\r\n" << endl;

    GetModuleFileNameEx(PROC_HANDLE, mainModule , filenameBuffer, 256);
    cout << (byte)ReadMemory<byte>() << "\r\n" << number << "\r\n" << filenameBuffer << endl;
system("PAUSE");
#endif

return 1;}

提前谢谢你:)

P.S。我主要只是寻找指针...... bah dum tsss

更新 显然,检查GetLastError值,EnumProcessModules在完成后会提示299错误代码。并且调试显示mainModule没有任何内容......但是EnumProcessModules在“no errors”中返回0。

昨天,我设法得到它并使GetModuleFileName工作正常(相同的代码,只添加了GetLastError)。

1 个答案:

答案 0 :(得分:0)

显然,我的问题是我使用片段运行测试

&#xA;&#xA;
  enumResult = EnumProcessModules(PROC_HANDLE,&amp; mainModule,sizeof(HMODULE), &amp; cbNeeded)&#xA; if(enumResult!= 0)&#xA; {&#xA; //枚举流程模块失败&#xA;返回40;&#xA;}&#xA;  
&#xA;&#xA;

并成功运行EnumProcessModules会产生非零结果! (因此给我带来了一些困惑并使我的整个调试过程出现故障)

&#xA;&#xA;

在我弄清楚这个细节之后,我再次运行了一些旧测试并发现我的目标进程是64我正在运行32位应用程序。&#xA;更改为64位,现在它就像魅力一样

&#xA;