2016-06-13 8 views
0

Ich muss die Adresse der Basisadresse eines .exe erhalten, der bei jedem Start eine zufällige Basisadresse hat. Ich habe es versucht, aber es scheint nicht zu funktionieren:Wie bekomme ich die Basisadresse eines anderen Prozesses? (ASLR)

int Base = (DWORD)GetModuleHandle("Test.exe"); 

Was ist los?

+0

Ich denke, ich nicht? – Customality

+0

Die Methode ist in meinem Test korrekt. Könnten Sie Ihren gesamten Code einfügen? Oder versuchen Sie, die Basisadresse eines anderen Prozesses zu erhalten? –

+2

Warum sollte "GetModuleHandle" angeblich das tun, was Sie wollen? –

Antwort

2

Es scheint, dass Sie versuchen, die Basisadresse eines anderen Prozesses zu erhalten. Leider funktioniert GetModuleHandle nur für Module im aktuellen Prozess. Um Ihr Ziel zu erreichen, müssen Sie PSAPIs oder CreateToolhelp32Snapshot verwenden, um die Modulliste eines anderen Prozesses zu extrahieren. Und die Basisadresse befindet sich in der Liste.

+0

@Customality, siehe dies: http://StackOverflow.com/Questions/14467229/get-Base-Address-of-Process –

+1

Da das OP sowieso mit dem Speicher dieses anderen Prozesses geigen wird, würde eine direktere Lösung injizieren eine DLL (mit [CreateRemoteThread] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682437.aspx) zum Beispiel). Sobald Sie in das Haus einer anderen Person eingebrochen sind, können Sie 'GetModuleHandle (NULL)' aufrufen, um die Basisadresse des ausführbaren Abbilds abzurufen, das zum Erstellen des Prozesses verwendet wurde. – IInspectable

1

Ich muss die Basisadresse/Einsprungadresse einer .exe, die eine zufällige Basisadresse hat jedes Mal, wenn es gestartet ist. Das Programm verwendet ASLR.

...

Ich werde es bestimmte Stücke von Speicher in der richtigen Prozess

Um Daten in einem anderen Prozess bearbeiten verwenden, zu schreiben, müssen Sie WriteProcessMemory(), verwenden, die Sie erfordert Öffnen Sie eine HANDLE für den Prozess, in den geschrieben wird.

Sie erhalten diese HANDLE mit OpenProcess(), fordern PROCESS_VM_OPERATION und PROCESS_VM_WRITE Berechtigungen. OpenProcess() nimmt eine Prozess-ID als Eingabe, die Sie von bekommen:

Siehe Process Enumeration und Enumerating All Processes.

Zu keinem Zeitpunkt müssen Sie die Basisadresse des Prozesses ermitteln, in den geschrieben wird. Lassen Sie das System diese Informationen für Sie im Auge behalten. Alles, was Sie brauchen, ist die offene HANDLE für den Prozess.

+0

Uh ... sicherlich brauchen Sie in der Regel die Basisadresse, um die virtuelle Adresse der statischen Variable oder des Codeblocks zu berechnen, den Sie lesen oder ändern wollen? (Was ich annehmen kann, können Sie tun, indem Sie Module32First/Module32Next verwenden.) –

+0

@HarryJohnston: Die an 'ReadProcessMemory()' und 'WriteProcessMemory()' übergebene Adresse ist eine virtuelle Adresse, die relativ zur Basisadresse des durch den angegebenen Prozess ist 'GRIFF'. Es ist nicht relativ zu einem bestimmten Modul. Sie müssen also nicht die Basisadresse des Prozesses kennen, sondern nur die relative virtuelle Adresse des Zielspeicherblocks innerhalb des Prozesses. Wie Sie diese Adresse bekommen, ist ein anderes Problem. Es kann im voraus statisch bekannt sein. Sie kann dynamisch bestimmt werden, indem andere Speicherblöcke und nachfolgende Zeiger verarbeitet werden. Das ist ein sehr weites Thema. –

+0

@HarryJohnston: Für eine statische Variable kennen Sie vielleicht ihren festen Offset innerhalb eines Moduls, und ja, Sie können die Basisadresse eines Moduls innerhalb des Prozesses abrufen. Daraus können Sie die virtuelle Adresse der Variable innerhalb des Prozesses bestimmen. –

Verwandte Themen