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.
InformationsquelleAutor user3366103 | 2014-10-26