C ++获取exe的64位baseAddress

时间:2014-09-04 19:53:45

标签: c++ pointers visual-studio-2012

我正在尝试获取exe的基础地址。 这适用于x86应用程序,但它使用x64进程为我提供了错误的起始地址。 我正在使用VS2012编译为在W7 x64上运行64位。

    static uintptr_t dwGetModuleBaseAddress(DWORD dwProcessIdentifier, TCHAR *lpszModuleName)
    {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier);
        BYTE* dwModuleBaseAddress = 0;
        if(hSnapshot != INVALID_HANDLE_VALUE)
        {               
            MODULEENTRY32 ModuleEntry32 = {0};
            ModuleEntry32.dwSize = sizeof(MODULEENTRY32);

            if(Module32First(hSnapshot, &ModuleEntry32))
            {
                do
                { 
                    if(_tcsicmp(ModuleEntry32.szModule, lpszModuleName) == 0)
                    {                           
                        dwModuleBaseAddress = (BYTE*) ModuleEntry32.modBaseAddr;
                        printf("ModuleEntry32.szModule= %S\n", ModuleEntry32.szModule);
                        printf("dwModuleBaseAddress= %p\n", dwModuleBaseAddress);

                        break;
                    }
                }
                while(Module32Next(hSnapshot, &ModuleEntry32));
            }
            CloseHandle(hSnapshot);
        }else{              
            std::cout << "CreateToolhelp32Snapshot Error: " << GetLastError() << std::endl;
        }
        return (uintptr_t) dwModuleBaseAddress;
    }

这给了我137000000作为baseAdress,这是CheatEngine所说的错误。

我做错了什么? ModuleEntry32.modBaseAddr的返回值和BYTE *类型应该是正确的。

任何帮助都非常感谢!

此致

1 个答案:

答案 0 :(得分:0)

您的代码没有任何问题,我只是在x86和x64上运行了它,在两种情况下都可以正常工作。如果在x64进程上使用此文件,则必须将exe编译为x64,如果这样做,则uintptr_t将正确解析为8字节的变量。看来您要为x86进行编译,也许就是您的问题。

enter image description here