[Autohotkey] Write/ReadProcessMemory

04/28/2010 21:33 -Raptor-#1
Hallo und guten Morgen|Tag|Abend,

ich weiss zwar das die Ahk schreiber hier stark in der Minderzahl sind, aber das hat mich trotzdem nicht davon abgehalten für euch ein schickes Tut zu schreiben wie mann ein Write bzw ReadProcessMemory hinbekommt.

Ihr braucht:
-Ahk (lach lach :p) (Version grösser als 1.80 (aktuell 1.85))
-ein bisschen wissen über DllCall und VarSetCapacity
-und natürlich gutes Ahk grundwissen

Also Fangen wir an::


als erstes Deklinieren wir eine Funktion und nennen die Passenderweise
WriteProcessMemory

PHP Code:
WriteProcessMemory()
{


So nun gucken wir was MSDN zum thema WriteProcessMemory sagt

PHP Code:
BOOL WINAPI WriteProcessMemory(     ;ähhmmm sollte klar sein
  __in   HANDLE hProcess
,                  ;als erstes ein ProcessHandle
  __in   LPVOID lpBaseAddress
,            ;Die Addresse in die wir schreiben
  __in   LPCVOID lpBuffer
,                   ;den Wert den wir schreiben wollen
  __in   SIZE_T nSize
,                        ;grösse in bytes
  __out  SIZE_T 
*lpNumberOfBytesWritten ;relativ egal
); 
1.
Handle Des Processes.
Um das Handle zu bekommen brauchen wir ersteinmal die ProcessID (PID)
die hohlen wir uns mit WinGet,var,PID,Titel des Fenster
also brauchen wir erstmal den Titel des Fensters den Titel lassen wir dan den Anwender angeben also

PHP Code:
WriteProcessMemory(title)
{
WinGet ,idvar,PID,%title%

So jetzt haben wir die PID aber NICHT das handle das Handle bekommen wir mit der WindowsFunktion OpenProcess.
Wir beachten auch Autohotkey schneidet gerne werte aber wir wollen immer ein schönen 32byte grossen integer also....
VarSetCapacity(idvar,32,0)
VarSetCapacity(processhandle,32,0)
OpenProcess benötigt ebenfalls "Rechte" wir nehmen da lieber eine Kombination
0x8 PROCESS_VM_OPERATION
0x10 PROCESS_VM_READ
0x20 PROCESS_VM_WRITE
_____
0x38

PHP Code:
WriteProcessMemory(title)
{
VarSetCapacity(idvar,32,0)
VarSetCapacity(processhandle,32,0)
WinGet ,idvar,PID,%title%
processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar)


Soooo,
Jetzt haben wir den Process Geöffnet.
Jetzt Brauchen wir eine Addresse in die wir schreiben
lassen wir natürlich auch den anwender entscheiden
netürlich lassen wir auch eine option für ein offset

PHP Code:
WriteProcessMemory(title,address,offset)
{
VarSetCapacity(idvar,32,0)
VarSetCapacity(processhandle,32,0)
WinGet ,idvar,PID,%title%
processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar)

Wäre natürlich blöd wenn wir nichts in die addresse schreiben können also setzen wir auch eine wert in unsere funktion wider schön 32byte gross und da wir autohotkey verbieten sie zu "schneiden" (brauch dringend ein besseres wort dafür) müssen wir mit NumPut den wert schreiben alsooo...

PHP Code:
WriteProcessMemory(title,address,offset,wert)
{
VarSetCapacity(value320)
VarSetCapacity(idvar,32,0)
VarSetCapacity(processhandle,32,0)
NumPut(wert,value,0,Uint)
WinGet ,idvar,PID,%title%
processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar)

SO nun haben wir alle Parameter die wir Brauchen hier nochmal ein Rückblick

PHP Code:
BOOL WINAPI WriteProcessMemory(     
  
processhandle           X
  addresse
+offset         X
  Wert                        X
  32                           X
  0                             X
); 
So also integrieren wir die Funktion (!!!! die addresse des wertvalue benutzen)

PHP Code:
WriteProcessMemory(title,address,offset,wert)
{
VarSetCapacity(value320)
VarSetCapacity(idvar,32,0)
VarSetCapacity(processhandle,32,0)
NumPut(wert,value,0,Uint)
WinGet ,idvar,PID,%title%
processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar)
Funkvar:=DllCall("WriteProcessMemory","Uint",processhandle,"Uint",address+offset,"Uint",&value,"Uint",32,"Uint",0)


Und Fertig hier noch ein Beispielcode
(Wallhack für CS:S)


PHP Code:
;=============Deklarieren==========================
WriteProcessMemory(title,addresse,wert,size
{
VarSetCapacity(idvar,32,0)
VarSetCapacity(processhandle,32,0)
VarSetCapacity(value320)
NumPut(wert,value,0,Uint)
address=%addresse%
WinGet ,idvar,PID,%title%
processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar)
Bvar:=DllCall("WriteProcessMemory","Uint",processhandle,"Uint",address+0,"Uint",&value,"Uint",size,"Uint",0)
}
;===============================================


#NoTrayIcon
#SingleInstance force
Return
pruefvar=0

q
::
{
if (
pruefvar=0)
{
WriteProcessMemory("Counter-Strike Source",0x243AEC3C,1)
pruefvar=1
Return
}else{
WriteProcessMemory("Counter-Strike Source",0x243AEC3C,2)
pruefvar=0
Return
}
}


HOME::
ExitApp 




+++
Noch nciht fertig
ReadProcessMemory und weitere Kompliziertere Bsp. kommen noch
05/03/2010 20:49 ~kau~#2
THX! besonders für
05/03/2010 21:01 HardCore.1337#3
Quote:
Originally Posted by kauknochen View Post
THX! besonders für
MSDN hätte haargenau das gleiche gesagt. ;)
05/08/2010 22:03 ~kau~#4
ja aber net auf deutsch xD edit lol hab 5 fehler o.O