Seite 1 von 1
Speicher eines Prozess auslesen
Verfasst: Dienstag 23. September 2014, 21:06
von waki
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
Re: Speicher eines Prozess auslesen
Verfasst: Dienstag 23. September 2014, 21:13
von 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.
Re: Speicher eines Prozess auslesen
Verfasst: Dienstag 23. September 2014, 21:26
von waki
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.
Re: Speicher eines Prozess auslesen
Verfasst: Dienstag 23. September 2014, 21:56
von 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.
Re: Speicher eines Prozess auslesen
Verfasst: Mittwoch 24. September 2014, 08:21
von Sirius3
@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.
Re: Speicher eines Prozess auslesen
Verfasst: Mittwoch 24. September 2014, 08:59
von lackschuh
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)
Re: Speicher eines Prozess auslesen
Verfasst: Mittwoch 24. September 2014, 09:21
von 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.