Autor Beitrag
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 04.03.08 10:48 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var bla: array[0..5of byte = ($90,$90,$90,$90,$90,$90);
// bzw = ($D9,$9E,$F4,$1B,$00,$00)

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



BeitragVerfasst: 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 user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 05.03.08 13:43 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var old: DWord;
begin
VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size{22}, PAGE_EXECUTE_READWRITE, old);
WriteProcessMemory(processhandle...);
VirtualProtectEx(processhandle, pointer(@addresse{$00400F87}), size{22}, 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

ausblenden 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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. :roll:
bensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
    hProcess: THandle; //Prozesshandle des Spiels
    wert:integer;  //wert des ausgelesenen speichers
    BytesRead: DWORD;
    adresse:pointer;  //adresse, die ausgelesen werden soll

...

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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead);  // originaladresse lesen
adresse := Ptr(wert + $60);  // Wert + 96dez
ReadProcessMemory(hProcess, adresse, @wert, SizeOf(wert), BytesRead);  // eben berechnette adresse auslesen
CloseHandle(hProcess);
Edit1.Text := IntToStr(wert);


gruß bensch
gemy
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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:


ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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



BeitragVerfasst: 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?