C++ Obtenir Module Adresse de Base pour 64bit Application
J'ai été jouer avec la mémoire de lecture/de montage récemment et se sont heurtés à un problème qui, je pense, est due à l'application 64 bits, j'ai aussi essayé de compiler sous 64 bits.
Je n'ai eu aucun problème avec ce script à l'aide avec les applications 32 bits, cependant lorsque je l'ai essayer sur Solitaire il ne parvient pas à obtenir l'adresse de base, qui ne parvient pas à la séance d'entraînement de corriger les décalages ect.
Voici le script:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
using namespace std;
DWORD dwGetModuleBaseAddress(DWORD dwProcessID, TCHAR *lpszModuleName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
DWORD dwModuleBaseAddress = 0;
if (hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32 = { 0 };
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
int main()
{
DWORD address = 0xBAFA8;
HWND hwnd = FindWindow(0, L"Solitaire");
DWORD pid;
int data = 0;
int newData = 0;
if (hwnd)
{
GetWindowThreadProcessId(hwnd, &pid);
HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
if (phandle)
{
DWORD base = dwGetModuleBaseAddress(pid, L"Solitaire.exe");
cout << "Base: " << (void*)base << endl;
ReadProcessMemory(phandle, (LPCVOID)(base + address), &data, sizeof(data), 0);
}
else {
cout << "Couldnt get handle" << endl;
}
}
else {
cout << "Couldn't find window" << endl;
}
cin.get();
return 0;
}
Le problème peut être que la fonction que j'utilise utilise MODULE32, cependant j'ai essayé d'autres fonctions (qui utilise EnumModules) qui ne parvient toujours pas à l'adresse de retour.
Des idées comment faire pour obtenir l'adresse de base de 64 bits de l'application ou pour obtenir ce script?
Grâce
- Cela peut être utile (note de la discussion qui fait référence au nombre de bits de la cible et le programme de recherche de programme) stackoverflow.com/questions/17412545/...
modBaseAddr
est un pointeur. Arrêtez de coulée pour un entier de 32 bits. Vous comprenez que les pointeurs sont des 64 bits sur 64 bits de Windows droit? Vous ne serez pas en mesure de voir en 64 bits processus à partir d'un processus 32 bits fonctionnant sous la version 32 bits WOW64 émulateur. Si l'exécution de 64 bits est essentiel.
Vous devez vous connecter pour publier un commentaire.
Bien votre code ne va jamais fonctionner correctement car vous parlez de 64 bits mais vous utilisez DWORD pour l'adresse de base! Solitaire pourrait 32 bits de l'adresse, mais vous ne pouvez pas garantir que vous ne devez jamais l'assumer.
Cette fonction. Il nécessite uniquement l'ID de processus du processus en question, et il suppose que vous voulez l'adresse de base de ce processus. c'est à dire pas un de ses Dll. Si vous ne voulez pas le processus propriétaire, alors vous devez parcourir
moduleArray
en utilisant quelque chose commefor (int i=0; i<moduleCount; i++ ) { //do something with moduleArray[i] }
et puis vérifier le module de nom de fichier.Si vous voulez seulement le départ du processus (l'exécutable), vous pouvez simplement faire l'hypothèse que c'est le premier élément dans le tableau.
Comme évoqué par David cette ligne est fausse:
puisque vous êtes en jetant un 64-bit pointeur (sur une application 64 bits) pour un
DWORD
tronquer la valeur (capture d'écran à partir du débogueur, 64 bits d'application de l'ouverture d'un 64 bits processus)Vous devriez aller pour un type de pointeur (
DWORD_PTR
pourrait également travailler pour une solution portable).ULONGLONG
? Stocker un pointeur sur un pointeur de type de données.unsigned char*
semble assez dur à battre.Échantillon de la console demande basée sur les exemples donnés par @Nostromoo
Devrait fonctionner sur x86/x64
sizeof(baseModuleInfo.lpBaseOfDll)
? basé sur quoi ? sont-il pas déjà définies au moment de la compilation ?#if
bloc. au deuxième si vous compilez le code 32 bits - vous de ne pas obtenir 64 bits module d'adresse de base. au troisième votre solution efficace et très pas le meilleurEnumProcessModules
échouer dans ce cas