Autor |
Beitrag |
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Di 04.03.08 10:48
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var bla: array[0..5] of byte = ($90,$90,$90,$90,$90,$90);
procedure TForm1.Button1Click(Sender: TObject); begin WindowName := FindWindow(nil,WindowTitle); If WindowName = 0 then MessageDlg('...erst spiel starten...dann trainer starten =)', mtwarning,[mbOK],0); ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); WriteProcessMemory(HandleWindow,pointer($480802), @bla[0],6,write); closehandle(HandleWindow); MessageDlg('Geld ist eingefroren', mtwarning,[mbOK],0); end; |
versuch mal obiges
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
cherrymoon69
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 04.03.08 15:43
vielen dank. das scheint so zu funktionieren.
aber es gibt das nächste problem. wenn ich in einen bereich des speichers schreiben möchte wo noch nichts steht, also z.b.:
00400F87 - 00 00 - add [eax],al
dann schreibt die prozedur nichts. absolut keine veränderung. weiß jemand rat? ich möchte an diese position 22 Bytes (als hex) schreiben.
--- Moderiert von Narses: Beiträge zusammengefasst---
habe etwas rausgefunden. wenn ich mit ein em hexeditor mir die speicheradresse angucke, gibt es die option make writable. wenn ich das mache, kann ich mit der prozedur meinen wert schreiben. ich suche jetzt also eine lösung um einen speicherbereich von 22 byte schreibfähig zu machen. wie geht das in kombination mit der oben genannten prozedur?
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 05.03.08 13:43
Delphi-Quelltext 1: 2: 3: 4: 5:
| var old: DWord; begin VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size, PAGE_EXECUTE_READWRITE, old); WriteProcessMemory(processhandle...); VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size, old, old); |
das gilt aber nur wenn der speicher schon existiert. du schreibst da den imageheader putt, wenn du selbst speicher brauchst dann hol dir welchen mit
Delphi-Quelltext 1: 2: 3: 4: 5:
| var mem: pointer; begin mem := VirtualAllocEx(processhandle, nil, size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(processahndle,...); VirtualFreeEx(processhandle, mem, 0, MEM_RELEASE); |
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
cherrymoon69
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 05.03.08 14:11
das mit dem speicher holen klingt interessant, aber welche adresse bekomme ich dann?
ich muß ja den jmp-befehl auf diese adresse legen.
vielen dank soweit.
acj ja. und was macht diese zeile?
VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size{22}, old, old);
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 05.03.08 18:55
den Jump-Befehl kannst du ja dynamisch berechnen, ein $E9 distance jump berechnet man durch ZUadresse-VONadresse-5
das VirtualProtect setzt wieder den alten Wert, sollte es aber ausführbarer code bleiben solltest du es auf PAGE_EXECUTE_READWRITE belassen
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
cherrymoon69
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 05.03.08 19:00
du hast mir sehr geholfen. danke.
aber:
zitat: den Jump-Befehl kannst du ja dynamisch berechnen, ein $E9 distance jump berechnet man durch ZUadresse-VONadresse-5
habe ich nicht wirklich verstanden. dafür bin ich wohl noch nicht weit genug fortgeschritten, fürchte ich.
|
|
bensch
Beiträge: 44
|
Verfasst: Sa 19.04.08 20:11
Titel: wie sieht das bei dma aus?
der trainer ist ja speziell für sma erstellt wurden. wie würde das jetzt bei dma aussehen?
also ich hab hier ein game, wo sich der wert der mannschaft nach jedem neustart ändert. der wert wird also auf einer dynamischen speicheradresse abgelegt. nun habe ich den static pointer gesucht, der auf die speicheradresse der mannschaft zeigt. den habe ich gefunden, dieser liegt unter der adresse 9D903C. dieser pointer zeigt auf einen weiteren (dynamischen) pointer. ich müsste jetzt also den wert der adresse 9D903C (dem statischen pointer) auslesen, um die adresse für den dynamischen pointer zu erhalten, der widerrum auf die mannschaftsadresse zeigt. wie mache ich das?
das auslesen von der adresse 9D903C habe ich so gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var hProcess: THandle; wert:integer; BytesRead: DWORD; adresse:pointer; ...
adresse:=ptr($9D903C);
ReadProcessMemory(hProcess,adresse,@wert,sizeof(wert), BytesRead );
... |
jetzt habe ich einen wert, den ich mit 96 addieren müsste, um an die speicheradresse des nächsten dynamischen pointers zu gelangen. aber da hängt es schon: wie kann ich den eben ausgelesenen wert, der in der variable wert gespeichert wurde, mit 96 addieren, und dann die speicheradresse dieses ergebnisses wieder auszulesen?
EDIT: mir wurde jetzt in diesem thread ( www.delphi-forum.de/....php?p=498803#498803 ) geholfen. falls jemand ähnliche schwierigkeiten hat wie ich, so hats bei mir funktioniert:
Delphi-Quelltext 1: 2: 3: 4: 5:
| ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead); adresse := Ptr(wert + $60); ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead); CloseHandle(hProcess); Edit1.Text := IntToStr(wert); |
gruß bensch
|
|
gemy
Hält's aus hier
Beiträge: 1
|
Verfasst: Do 28.08.08 02:09
Titel: Mein Erkentnisse darüber.
Hallo,
hab auch mal eine Frage. Momentan schreibe ich in den Speicher fremder Programme mit diese Funktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function WriteMemory(Adress:Pointer; Buffer:array of char):Bool; begin try Result:=False; VirtualProtectEx(handlewindow, Pointer(Adress), Length(Buffer), PAGE_EXECUTE_READWRITE, old); If (WriteProcessMemory(handleWindow, Pointer(Adress), @Buffer, Length(Buffer), BytesWritten) and (BytesWritten = Length(Buffer))) then Result:=True else Result:=False; finally VirtualProtectEx(Handlewindow, Pointer(Adress), Length(Buffer), old, old); end; end; |
aufrufen tue ich die Funktion mit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Adress:= Ptr($00400400); pcardinal(@buffer[0])^ := $8B4154A3; pcardinal(@buffer[4])^ := $00054000; pcardinal(@buffer[8])^ := $C3000000; pcardinal(@buffer[12])^:= $00000000; pcardinal(@buffer[16])^:= $00000000;
If WriteMemory(Adress, Buffer) = True then Memo1.Lines.Add('OK') else Memo1.Lines.Add('Err'); |
Klappt auch wunderbar. Was mir nun aufgefallen ist, ist das der Speicher bei $00400400 nicht so beschrieben wird:
8B 41 54 A3 00 05 40 00 C3 00 00 00
sondern so :
A3 54 41 8B
usw.. Also genau umgekehrt. ich habe ganz oben in meinem Project die variable "Buffer: array [0..19] of char;". Nun habe ich aber nicht immer 20 Bytes zum schreiben. Manchmal auch nur 8 oder 12.
Hat jemand eine Lösung oder Function, die
a) die 4 bytes im Buffer immer umdreht, und
b) nur soviel Buffer schreibt wie auch nur tatsächlich bytes da sind.
also manchmal: z.b.
($89,$96,$88,$09,$00,$00,$89,$15,$40,$05,$40,$00,$C3); und ein andermal
($8B,$41,$54,$A3,$00,$05,$40,$00,$C3);.
Also immer verschieden lang.
Gruß, gemy #delphi.de@quakenet
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 28.08.08 04:15
probiers doch mal mit einem dynamischen array und einer bitweisen operation (and,or,xor)
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
ness
Hält's aus hier
Beiträge: 7
|
Verfasst: Fr 31.07.09 23:41
Ich habe jetzt den vollkommenen Blackout und aus meinem Gehirn spruehen FUNKEN heraus!
Mal ein ganz einfaches Beispiel,damit ich es auch verstehen kann!
Aaalso,keine Angst,mein Ziel ist NICHTS BOESES und damit hole ich mir kein Vorteil,es ist auch kein Internetspiel etc.
Ich habe die Adresse mit CHEAT ENGINE herausgekriegt:
0103EB28
Und der Value betraegt 24!
Type ist 4 Bytes!
Wie kann ich das auf 50 mit Delphi erfolgreich aendern?
|
|
|