Speicher eines Prozess auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

Hey,
ich würde gerne den Speicher eines anderen Programms unter Windows 8.1 auszulesen. Habe bisschen gegoogelt und und einen Code gefunden und den ausprobiert:

Code: Alles auswählen

import win32api
import ctypes


PROCESS_VM_READ = 0x0010

PID = 7152
adresahexmem = 0x11B8
nrbcititi = 147


process = win32api.OpenProcess(PROCESS_VM_READ,0,PID) 
readprocmem = ctypes.windll.kernel32.ReadProcessMemory 
bufferbcititi = ctypes.create_string_buffer(nrbcititi) 
 
if readprocmem(process.handle,adresahexmem,bufferbcititi,nrbcititi,0):
  print repr(bufferbcititi.raw)
else:
  print "false"
Dieser ging leider nicht und auch zahlreiche andere, die nur marginal unterschiedlich waren gingen auch nicht. Ich kenne mich in diesem Bereich leider sehr schlecht aus und weis nicht genau wo das Problem liegt. Ich würde mich sehr über Hilfe freuen.

LG Wakille
BlackJack

@waki: „Ging nicht” ist eine unzureichende Fehlerbeschreibung. Und wenn man sich in dem Bereich nicht auskennt, kann man halt keine solchen Programme schreiben, bis man sich weit genug in das Thema eingearbeitet hat.
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

Es wird nichts ausgelesen, obwohl an der Stelle etwas sein muss. Es kommt immer zum Ergebnis "false". Ich habe momentan nicht die Zeit um mich da wirklich einzuarbeiten. Ich hatte gehofft, dass mir jemand sagen könnte wie es sicher geht, da ich für meine Zweck nur einmal etwas auslesen muss. Geschweige denn, dass ich wenig sinvolle Quellen zu dem Thema in Phyton gefunden habe.
BlackJack

@waki: Vielleicht hast Du nach der falschen Programmiersprache gesucht: das heisst Python. ;-)

Allerdings besteht so etwas ja im Grunde nur aus API-Aufrufen von Windowssystembibliotheken, was an sich nicht Python-spezifisch ist.

Woher weisst Du denn das beim Prozess mit der PID 7152 an Adresse 0x11B8 etwas steht? Und hast Du zum Beispiel auch die nötigen Rechte um das auszulesen? Es darf ja nicht jedes Programm einfach so im Adressraum von anderen Programmen lesen.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@waki: Du benutzt eine Windows-API, wenn Du also was nicht verstehst, dann guckst Du in die Microsoft-Dokumentation hier. Da steht auch, dass wenn ein Fehler passiert, man den genauen Fehlercode mit GetLastError bekommt. Das ist der übliche Weg, wie fast alle Windows-Funktionen ihre Fehler zurückmelden, weil das auch schon zu DOS-Zeiten nicht anders war. Mit der Information kannst Du dann herausfinden, warum es nicht funktioniert.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Vielleicht hilft dir dieser Code weiter. Hab mal einen Game-Trainer gemacht. Getestet allerdings nur unter Win 7 x64.

Hier auch noch ein Thema dazu:
http://www.python-forum.de/viewtopic.php?f=1&t=30162

Code: Alles auswählen

# coding: utf-8

import ctypes
#user32.DLL
user32 = ctypes.windll.user32
#Kernel32.DLL
kernel = ctypes.windll.kernel32

OpenProcess = ctypes.windll.kernel32.OpenProcess
ReadProcessMemory = ctypes.windll.kernel32.ReadProcessMemory
WriteProcessMemory = ctypes.windll.kernel32.WriteProcessMemory
CloseHandle = ctypes.windll.kernel32.CloseHandle

PROCESS_ALL_ACCESS = 0x1F0FFF

WindowName = u"Solitär"

# ToDo - Automatisch pid auslesen
pid = ctypes.c_ulong()
GameWindow = user32.FindWindowW(None, WindowName)
print "Window handel:", GameWindow, "as Hex:", hex(GameWindow)
user32.GetWindowThreadProcessId(GameWindow, ctypes.byref(pid))
print "PID: ", pid

# Dynamische Adresse, welche den Punkte-Wert speichert

# TODO; BasePointer und Offset, damit damit statische lpBaseAddresse gefunden wird
lpBaseAddress = 0x0010A6E4

"""
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553(v=vs.85).aspx
BOOL WINAPI ReadProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPCVOID lpBaselpBaseAddress,
  _Out_  LPVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesRead
);

BOOL WINAPI WriteProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPVOID lpBaseAddress,
  _In_   LPCVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesWritten
);
"""

lpBuffer = ctypes.c_char_p(b'Pointer; Ausgabe des Adressraums')
val = ctypes.c_int()
nSize = len(lpBuffer.value)
lpNumberOfBytesRead = ctypes.c_ulong(0)

#punkte = int(raw_input('Punkte eingeben: '))

new_punkte = ctypes.c_ulong(punkte)
bPointer = ctypes.pointer(new_punkte)
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, pid)

# ReadProcessMemory
def read_memory():
    if ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, ctypes.byref(lpNumberOfBytesRead)):
        ctypes.memmove(ctypes.byref(val), lpBuffer, ctypes.sizeof(val))
        print "Aktuelle Punkte: " + str(val.value)
    else:
        print "Failed."

# WriteProcessMemory
def write_memory():
    WriteProcessMemory(hProcess, lpBaseAddress, bPointer, 4, None)
    return read_memory()

if __name__ == '__main__':
    read_memory()
    write_memory()
    CloseHandle(hProcess)
BlackJack

@lackschuh: Der Quelltext ist aber nicht besonders schön. Nahezu alles auf Modulebene, keine Fehlerbehandlung, keine echten Funktionen, und einiges etwas umständlich und inkonsistent gelöst.
Antworten