如何在C ++中获取进程的起始/基地址?

我正在微软的蜘蛛纸牌上使用它testing整个基地/静态指针的东西。 所以我得到了玩家使用的“移动”量的基本指针,而欺骗引擎告诉我这是“SpiderSolitaire.exe + B5F78”。 所以现在我被困在如何确定SpiderSolitaire.exe的起始地址是什么(当然每次程序启动时都会改变)。 我如何findSpiderSolitaire.exe的起始地址,所以我可以添加偏移量,并得到“移动”值的真实地址(当然在c + +)?

这是一些代码来查找给定进程的基地址。

请注意,此代码使用多字节字符集; 在VS2012中,这是从属性>配置属性>项目默认值>字符集>使用多字节字符集。

#define _CRT_SECURE_NO_WARNINGS #define UNINITIALIZED 0xFFFFFFFF #include <iostream> #include <iomanip> #include <Windows.h> #include <TlHelp32.h> //PROCESSENTRY /* The name of the process */ const char* processName_ = "REPLACETHIS.exe" ; void main(void) { DWORD processID_ = NULL ; DWORD processBaseAddress_ = UNINITIALIZED; /* Get the process ID */ { PROCESSENTRY32 processEntry_ ; // Entry into process you wish to inject to HANDLE hProcSnapshot_ = NULL ; /* Takes a snapshot of the system's processes */ hProcSnapshot_ = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) ; //? /* While process has not been found, keep looking for it */ while(!processID_) { /* If a process on the system exists */ if(Process32First(hProcSnapshot_, &processEntry_)) //? { /* Check all processes in the system's processes snapshot */ do { /* Compare the name of the process to the one we want */ if( !strcmp(processEntry_.szExeFile, processName_) ) //? { /* Save the processID and break out */ processID_ = processEntry_.th32ProcessID ; break ; } } while(Process32Next(hProcSnapshot_, &processEntry_)) ; } /* Didnt find process, sleep for a bit */ if( !processID_ ) { system("CLS") ; std::cout << "Make sure " << processName_ << " is running." << std::endl ; Sleep(200) ; } } /* Process found */ std::cout << "Found Process: " << processName_ << std::endl ; } /* Find Base Address of process */ { HANDLE moduleSnapshotHandle_ = INVALID_HANDLE_VALUE; MODULEENTRY32 moduleEntry_; /* Take snapshot of all the modules in the process */ moduleSnapshotHandle_ = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, processID_ ); /* Snapshot failed */ if( moduleSnapshotHandle_ == INVALID_HANDLE_VALUE ) { std::cout << "modulee Snapshot error" << std::endl ; return ; } /* Size the structure before usage */ moduleEntry_.dwSize = sizeof( MODULEENTRY32 ); /* Retrieve information about the first module */ if( !modulee32First( moduleSnapshotHandle_, &moduleEntry_ ) ) { std::cout << "First module not found" << std::endl ; CloseHandle( moduleSnapshotHandle_ ); return ; } /* Find base address */ while(processBaseAddress_ == UNINITIALIZED) { /* Find module of the executable */ do { /* Compare the name of the process to the one we want */ if( !strcmp(moduleEntry_.szmodulee, processName_) ) //? { /* Save the processID and break out */ processBaseAddress_ = (unsigned int)moduleEntry_.modBaseAddr ; break ; } } while( modulee32Next( moduleSnapshotHandle_, &moduleEntry_ ) ); if( processBaseAddress_ == UNINITIALIZED ) { system("CLS") ; std::cout << "Failed to find module" << processName_ << std::endl ; Sleep(200) ; } } /* Found module and base address successfully */ std::cout << "Base Address: " << std::hex << processBaseAddress_ << std::dec << std::endl ; CloseHandle( moduleSnapshotHandle_ ); } 

这是用Visual Studio 2015编写的另一种方法,但应该向后兼容。

 #define PSAPI_VERSION 1 #include <windows.h> #include <tchar.h> #include <stdio.h> #include <psapi.h> // To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS #pragma comment(lib, "psapi.lib") void GetBaseAddressByName(DWORD processId, TCHAR *processName) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId); if (NULL != hProcess) { HMODULE hMod; DWORD cbNeeded; if (EnumProcessmoduleesEx(hProcess, &hMod, sizeof(hMod), &cbNeeded, LIST_MODULES_32BIT | LIST_MODULES_64BIT)) { GetmoduleeBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR)); if (!_tcsicmp(processName, szProcessName)) { _tprintf(TEXT("0x%p\n"), hMod); } } } CloseHandle(hProcess); } int main(void) { DWORD aProcesses[1024]; DWORD cbNeeded; DWORD cProcesses; // Get the list of process identifiers. if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) return 1; // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Check the names of all the processess (Case insensitive) for (int i = 0; i < cProcesses; i++) { GetBaseAddressByName(aProcesses[i], TEXT("SpiderSolitaire.exe")); } return 0; } 

你应该看看你的可执行文件中的结构IMAGE_OPTIONAL_HEADER。 我也建议你阅读这个伟大的指南: http : //msdn.microsoft.com/en-us/library/ms809762.aspx