Comment obtenir l’adresse de départ / de base d’un processus en C ++?

Je teste tout ce truc de base / pointeur statique en l’utilisant sur le Spider Solitaire de Microsoft. J’ai donc obtenu le pointeur de base de la quantité de “coups” utilisés par le joueur, et le moteur de sortingche m’a dit qu’il s’agissait de “SpiderSolitaire.exe + B5F78”. Alors maintenant, je suis coincé sur la façon de déterminer l’adresse de départ de SpiderSolitaire.exe (bien sûr, cela change à chaque démarrage du programme). Comment puis-je trouver l’adresse de départ de SpiderSolitaire.exe afin que je puisse append les décalages et obtenir l’adresse réelle de la valeur “move” (en c ++ bien sûr)?

Voici une autre manière, écrite en Visual Studio 2015 mais qui devrait être rétrocompatible.

#define PSAPI_VERSION 1 #include  #include  #include  #include  // 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(""); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId); if (NULL != hProcess) { HMODULE hMod; DWORD cbNeeded; if (EnumProcessModulesEx(hProcess, &hMod, sizeof(hMod), &cbNeeded, LIST_MODULES_32BIT | LIST_MODULES_64BIT)) { GetModuleBaseName(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; } 

Voici un code pour trouver l’adresse de base pour un processus donné.

Notez que ce code utilise le jeu de caractères multi-octets; dans VS2012, ceci est défini dans Propriétés> Propriétés de configuration> Par défaut du projet> Jeu de caractères> Utiliser le jeu de caractères multi-octets.

 #define _CRT_SECURE_NO_WARNINGS #define UNINITIALIZED 0xFFFFFFFF #include  #include  #include  #include  //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 << "Module Snapshot error" << std::endl ; return ; } /* Size the structure before usage */ moduleEntry_.dwSize = sizeof( MODULEENTRY32 ); /* Retrieve information about the first module */ if( !Module32First( 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_.szModule, processName_) ) //? { /* Save the processID and break out */ processBaseAddress_ = (unsigned int)moduleEntry_.modBaseAddr ; break ; } } while( Module32Next( 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_ ); } 

Vous devriez regarder la structure IMAGE_OPTIONAL_HEADER dans votre exécutable. Je vous suggère également de lire ce guide formidable: http://msdn.microsoft.com/en-us/library/ms809762.aspx