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

) (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(value, 32, 0)
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(value, 32, 0)
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(value, 32, 0)
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