Wie schreibe ich ein Perl-, Python- oder Ruby-Programm, um den Speicher eines anderen Prozesses unter Windows zu ändern?

8

Ich frage mich, ob Perl, Python oder Ruby verwendet werden kann, um ein Programm so zu schreiben, dass es nach 0x12345678 im Speicher eines anderen Prozesses sucht (wahrscheinlich der Heap für Daten und Codedaten) und dann, wenn es gefunden wird , ändere es zu 0x00000000? Es ähnelt der Cheat Engine , die unter Windows so etwas machen kann.

    
太極者無極而生 18.06.2009, 16:45
quelle

6 Antworten

13

Ich dachte zuerst, dass das nicht möglich sei, aber nachdem ich Brians Kommentar gesehen hatte, suchte ich CPAN und siehe da, es gibt Win32 :: Prozess :: Speicher :

%Vor%

Das Modul verwendet offenbar die Funktion ReadProcessMemory : Hier ist einer meiner Versuche:

%Vor%

Ausgabe:

%Vor%     
Sinan Ünür 18.06.2009, 16:52
quelle
8

Dies ist möglich, wenn Sie Ihr Programm als Debugger an den Prozess angehängt haben, was in diesen Sprachen möglich sein sollte, wenn Wrapper um die entsprechenden APIs existieren oder indem Sie direkt auf die Windows-Funktionen durch etwas wie ctypes (z Python). Es kann jedoch einfacher sein, dies in einer Sprache auf niedrigerer Ebene zu tun, da in höheren Ebenen Sie sich damit befassen müssen, wie Sie Datentypen höherer Ebene in niedrigere umwandeln usw.

Beginnen Sie mit dem Aufruf von OpenProcess zum Debuggen des Prozesses entsprechender Zugriff erforderlich (Sie müssen ein Administrator auf dem Computer sein / haben ziemlich hohe Zugriffsrechte). Sie sollten dann in der Lage sein, Funktionen wie ReadProcessMemory und WriteProcessMemory zum Lesen und Schreiben in den Speicher dieses Prozesses.

[Bearbeiten] Hier ist ein kurzer Python-Proof-of-Concept einer Funktion, die erfolgreich Speicher aus dem Adressraum eines anderen Prozesses liest:

%Vor%

Beachten Sie, dass Sie bestimmen müssen, wo im Speicher nach Dingen gesucht wird - der größte Teil des Adressraums wird nicht zugeordnet. Es gibt einige Standard-Offsets, die nach Programmcode, dlls usw. suchen.

    
Brian 18.06.2009 18:42
quelle
6

Nun, der spaßige Teil ist der Zugriff auf den Speicher des anderen Prozesses. CheatEngine führt dies aus, indem es Ihr gesamtes Betriebssystem unter einer virtuellen Maschine ausführt, die es ermöglicht, den Speicherschutz zu besiegen. Es gibt auch das Modell "unter einem Debugger laufen", was bedeutet, dass die Zielanwendung als untergeordneter Prozess der sich ändernden Anwendung mit erhöhten Rechten gestartet wird. Sehen Sie sich die Win32-API für viele interessante Sachen an.

>

Wenn Sie in Perl den erforderlichen Zugriff hatten, würden Sie wahrscheinlich mit Win32::Sicherheit::Raw .

    
chaos 18.06.2009 17:07
quelle
4

Es gibt Möglichkeiten, dies zu tun, indem Sie Process injection, load library usw. verwenden.

Ich sehe nicht, dass Sie es mit den Tools tun, die Sie aufgelistet haben. Das ist C und Assemblerland und fängt an, dich in das Gebiet des Virusschreibens zu bringen. Sobald Sie es zum Laufen gebracht haben, werden alle Anti-Virus-Pakete sein Veto laufen und versuchen, es zu isolieren. Du solltest das wirklich besser machen.

"Mit Macht kommt viel ...."

Viel Glück

    
kingchris 18.06.2009 16:59
quelle
0

Es ist möglich, den gesamten Prozess in einer der aufgelisteten Sprachen zu implementieren, aber eine kompilierte Sprache wäre besser für das Scannen von Arbeitsspeicher geeignet (nur bei Geschwindigkeitsüberlegungen). Es gibt eine DLL (mit Quelle) namens SigScan, die, obwohl für ein bestimmtes Spiel zugeschnitten, wahrscheinlich mit minimalem Aufwand an Ihre Bedürfnisse angepasst werden könnte.

Aufbauend auf Brians korrekter Antwort hier ist ein schnelles und schmutziges Beispiel der Verwendung einer DLL, um Ihre Adresse innerhalb von Python zu erhalten. Dies ist natürlich spezifisch für die DLL-Implementierung. "Modulname" wäre im Allgemeinen der DLL-Name, der im Dialogfeld "DLLs und Symbole aufzählen" von Cheat Engines angezeigt wird.

Mit Brians Beispiel als Richtlinie und MSDN Sie können dies leicht mit Ihrer eigenen WriteProcessMemory-Methode erweitern.

%Vor%     
Pmc 01.08.2009 11:49
quelle
0

Ich schrieb Proc :: Memory und die zu Grunde liegende Bibliothek libvas zu diesem Zweck. Es ruft nur {Read,Write}ProcessMemory unter Windows auf, unterstützt aber auch andere Plattformen. Beispiel:

%Vor%     
a3f 16.09.2017 00:14
quelle