Autor |
Beitrag |
derDoc
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Mo 07.02.05 13:05
Ich nehme an, dass du die Reduktions-Routinen mit 0x90 überschreibst. Dadurch wird jeglicher Abzug verhindert.
Deshalb solltest du nach der Adresse der Lebensenergie suchen und mit einem Debugger wie SoftIce einen Breakpoint darauf setzen. Nun musst du etwas Lebensenergie verlieren. Der Debugger bekommt das mit und zeigt dir an, welcher Code diese Veränderung herbeigeführt hat. Dort musst du ansetzen und dir die wahre Lebensenergieadresse geben lassen (Dein Trainer muss das machen). Dort kannst du dann den Wert verändern, sodass nur du eine extrem hohe Lebensenergie bekommst, womit du fast unsterblich bist.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
WeBsPaCe
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Mo 07.02.05 13:20
Dadrum geht's doch! Wie bekommt er die mit DMA vergebene RAM-Adresse raus!?! Die ändert sich doch jedes Mal, aber in dem Code-Schnipsel, der er ja schon für seinen Trainer gefunden hat, steht sie drin. Und da möchte er sie rauslesen.
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
derDoc
Beiträge: 623
Win Vista Prof
D2007 Prof
|
Verfasst: Mo 07.02.05 14:52
Nun denn, Schritt für Schritt.
Benötigt:
SoftIce
Erklärung:
kursive Teile sind Kommandos für die SoftIce Kommandozeile
[ekige Klammern bedeuten Tastendruck]
%Prozente dienen als Platzhalter%
[Strg]+[D] drücken, um SoftIce aufzurufen.
Folgende Fenster werden gebraucht:
REGISTER WINDOW ( WR [return])
DUMP WINDOW ( WD [return])
CODE WINDOW ( WC [return])
Aktuelle Adresse suchen
Mit TSearch nach der Lebensenergie suchen. Wenn der Wert gefunden wurde zurück in SoftIce ([Strg]+[D]) folgendes
eingeben:
BPM %Adresse% W [return]
Beispiel:
BPM 786ca4 W [return]
Lebensenergie verändern
SoftIce sollte in den Vordergrund treten und so etwas zeigen:
Quelltext 1: 2: 3: 4:
| 0041A736 8B8308020000 MOV EAX,[EBX+00000208]; verschiebt die Lebensenergie nach EAX 0041A73C D983CC000000 FLD REAL4 PTR [EBX+000000CC] 0041A742 D8B3C8000000 FDIV REAL4 PTR [EBX+000000C8] 0041A748 A3A46C7800 MOV [00786CA4],EAX; verschiebt die Lebensenergie in die Anzeigeadresse |
Test:
D EBX+208 [return]
Im DUMP Fenster kann man nun den Wert verändern und sehen, dass man den richtigen Wert hat.
Auf Einzigartigkeit prüfen
Zuerst alle Breakpoints löschen:
BC* [return]
Breakpoint auf die Veränderung der Anzeige setzen:
BPX 41A736 [return]
[F5] mehrmals drücken und nachsehen, ob der Inhalt von EBX sich ändert.
Falls nicht, haben wir die richtige Adresse.
Codecave suchen
Den Namen des Fensters suchen:
TASK [return]
Die Sektionen anzeigen:
MAP32 %Fenstername% [return]
Nun sollte man soetwas sehen:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| :map32 %Fenstername% Owner Obj Name Obj# Address Size Type %Internername%.text 0001 017F:00401000 0004BE10 CODE RO %Internername%.data 0002 0187:0044D000 00006718 IDATA RW %Internername%.bss 0003 0187:00454000 0035CDB4 UDATA RW %Internername%.idata 0004 0187:007B1000 000014F0 IDATA RW %Internername%.rsrc 0005 0187:007B3000 0000095C IDATA RO SHARED |
Normalerweise ist am Ende der Data-Sektion viel freier Platz. Daher gehen wir mit
D 454000 [return]
an den Anfang der folgenden Sektion und gehen nur ein Stückchen zurück. Wir nehmen ín diesem Beispiel 453f00.
Gateway erzeugen
Zurück zu unserer ersten Ansicht
U 41a736 [return]
Gateway einbauen:
A 41a736 [return]
jmp 453f00 [return]
nop [return] (Die Byteanzahl muss mit der vorherigen übereinstimmen)
[return]
Beispiel:
ORIGINAL
Quelltext 1: 2: 3: 4:
| 0041A736 8B8308020000 MOV EAX,[EBX+00000208] 0041A73C D983CC000000 FLD REAL4 PTR [EBX+000000CC] 0041A742 D8B3C8000000 FDIV REAL4 PTR [EBX+000000C8] 0041A748 A3A46C7800 MOV [00786CA4],EAX |
GATEWAY
Quelltext 1: 2: 3: 4: 5:
| 0041A736 E9C5970300 JMP 00453F00 0041A73B 90 NOP 0041A73C D983CC000000 FLD REAL4 PTR [EBX+000000CC]; hierhin müssen wir nachher zurück 0041A742 D8B3C8000000 FDIV REAL4 PTR [EBX+000000C8] 0041A748 A3A46C7800 MOV [00786CA4],EAX |
Codecave beschreiben
Zur Codecave springen:
U 453f00 [return]
In die Codecave schreiben:
A 453f00 [return]
Zuerst den erstzten Teil wieder einbauen:
mov eax,[ebx+208] [return]
Dann die echte Adresse EBX in eine statische Speicheradresse in der Nähe unserer Codecave schreiben (hier 453f30):
mov dword ptr [453f30],ebx [return]
Zurück zur eigentlichen Funktion:
jmp 41a73c [return]
Fertig:
[return]
Die Codesektion sollte jetzt so aussehen:
Quelltext 1: 2: 3:
| 00453F00 8B8308020000 MOV EAX,[EBX+00000208] 00453F06 891D303F4500 MOV [00453F30],EBX 00453F0C E92B68FCFF JMP 0041A73C |
Trainer erstellen
Im Trainer muss man jetzt alle diese Änderungen auch vornehmen; bei jedem Start. Dazu muss man z.B. an Adresse 453F00 die Bytes 8B 83 08 02 00 00 schreiben, etc.
Danach kann man die Speicheradresse 453F30 auslesen, 0x208 hinzuaddieren und den dortigen Wert ändern.
_________________ MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mo 07.02.05 15:47
guter artikel, derDoc
mal schauen wie das ganze mit ollydbg zu machen ist - nach der ausführlichen beschreibung sollte das aber kein problem sein.
|
|
Assun
Beiträge: 26
D2005 PE
|
Verfasst: Di 08.02.05 13:48
Hi !
Hab das mit dem Trainer auch mal versucht ! Opfer : NFSU II
Mit AutoHack gehts, wenn ich auf "Freezen" klicke, aber in Delphi verjagst mir dat game !
hab bei WriteProcessMemory alles von 1 - 8 ausprobiert, aber jedesmal verjagst mir dat ding !!!
Ich verzweifle bald ! weiss jemand, wass ich falsch mache ?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure WriteValues; var c, write : Cardinal; buf: pchar; begin c:=FindWindow(nil,'NFS Underground 2'); buf := #144#144; if c=0 then begin MessageDlg('You have to run the game first !',mtwarning,[mbOK],0); Exit; end; GetWindowThreadProcessId(c,@c); c:=OpenProcess(PROCESS_ALL_ACCESS,False,c); WriteProcessMemory(c,Ptr($547156),buf,4,write); CloseHandle(c); end;
procedure TForm1.Button1Click(Sender: TObject); begin WriteValues; end; |
Vielen Dank im Voraus !
ächz, ich saß da ne halbe Nacht dran und verzweifle blald !
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Di 08.02.05 13:57
ist uach logisch wenn buf
buf := #144#144; (2 bytes sind)
und du 4 überschreibst
WriteProcessMemory(c,Ptr($547156),buf,4,write);
WriteProcessMemory(c,Ptr($547156),buf,2,write); müsste es sein wenn die adresse stimmt und du nur 2 bytes nopen willst (144 = $90)
|
|
Assun
Beiträge: 26
D2005 PE
|
Verfasst: Di 08.02.05 14:08
also wenn ich nu 3 bytes bei WriteProcess..... hab ,dann muss ich #144#144#144 schreiben oder was?
und bei 2 : #144#144
und bei 5 dann : #144#144#144#144#144
richtig?
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Di 08.02.05 14:16
du weißt schon was es mit der #144 auf sich hat oder :> du musst die assembler funktion überschreiben die die variable erhöht 144 = $90 = NOP = no operation solltest halt schaun wie groß die ist
|
|
Assun
Beiträge: 26
D2005 PE
|
Verfasst: Di 08.02.05 14:20
und woher weiss ich wie groß die is ?
|
|
delphischaf
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 08.02.05 15:52
Mit der Funktion
WriteProcessMemory(c,Ptr($547156),buf,4,write);
überschreibst du 4 aufeinanderfolgende Byte im Arbeitsspeicher. D.h. Du musst wissen, aus wie viel Byte Deine Variable besteht. Von Mir aus probiers aus.
Die 4 Sagt, wieviel Byte überschrieben werden. Die werden mit dem, was in Buf drin steht, überschrieben. und buf soll als wert $90 oder #144 haben.
Also ich sehen wenn ich mit TSearch die Funktion noppe, wie viele Bytes er überschreibt. Unten im Debugfenster. Da würde dann wenn er 4 Byte noppen würde 4 mal unter einander nop rechts stehen.
|
|
F34r0fTh3D4rk
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Di 08.02.05 18:07
wenn du mit tsearch nach adressen mit 4 byte suchst sind es automatisch 4,
dann nimmst du $90 und das denn 4 mal, oder halt oben deine #144#144, das sind schon 2byte, dann müsste das net 4 sein um 4 zu ergeben sondern 2, weil 2 * 2 = 4, oder du lässt unten 4 stehen und machst oben nur einmal #144
|
|
delphischaf
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 09.02.05 08:51
@derDoc
Welches SoftIce muss ich da nehemen? Das mit Vanille und Schoko oder?
Ne wrn Spass. Ich habe jetzt die Version 4.05 für WinNT Aber wenn ich das Starte, kommt nur ein Dos-Fenster, indem Steht, das die Prozedur nicht gefunden werden kann. Muss ich da noch irgendwas einstellen?
|
|
delphischaf
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 11.02.05 09:42
Wasn los, schreibt keiner mehr?
Das SoftIce geht auf XP irgenwie nicht.
|
|
WeBsPaCe
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Fr 11.02.05 11:45
Kannst du denn auch wirklich nichts eintippen? Probier's doch einfach mal. Soweit ich das verstanden hab', ist dieses SoftICE auch nur ein Kommandzeilenutility, also mit diesem schwarzen Fenster.
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
retnyg
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 11.02.05 15:17
WeBsPaCe hat folgendes geschrieben: | Soweit ich das verstanden hab', ist dieses SoftICE auch nur ein Kommandzeilenutility, also mit diesem schwarzen Fenster. |
falsch verstanden. das ist ein programm was sich ganz tief in dein system einklinkt. sobald du STRG-D drückst steht dann alles und ein textbildschirm tut sich auf.
|
|
delphischaf
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 14.02.05 10:27
Ah, gut. Ich werds heute nachmittag nochmal probieren.
|
|
*treky
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 19.02.05 15:25
delphischaf hat folgendes geschrieben: | Also ich hab das ganze, was im Tut zum Anfang beschrieben wurde mal realisiert ( kopiert ) und verändert, so das es für Battlefield 1942 v1.6 klappt. Es funktioniert auch im Multiplayer. Ich hab eingerichtet, das man keine Lebenspunkte oder Munition verliert. Die Waffen werden auch nicht heiß. Problem: Da die Funktion, die das leben abzieht, ja nicht mehr ausgeführt wir, sterbe nicht nur ich nicht mehr, sondern auch kein anderer. Die Panzer gehen nicht mehr kaputt. Also muss ich nicht die Funktion auf Null setzen, sondern raus finden, welche Adressen der funktion, die das leben veringert übergeben werden, damit ich die Werte die im Speicher stehen ändern kann. Aber wie mache ich das. Die Werte bzw die Variablen werden ja dynamisch angelegt. Also ändern sich die Adressen dauernd. Tja.... |
du hast das mit bf1942 aber net im internet ausprobbiert oder..???
denn da hätte ja jeder seine eigenen werte auf seinem eigene pc.... oder speicher der server die variablen
nur du würdest nix an energie verlieren, oder?
da sich die adressen ändern:
da gibs doch pointer du musst nur die pointer finden (die wissen ja wo die adresse steht) und die sind immer gleich ,glaube ich
|
|
delphischaf
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 21.02.05 14:19
Ich habs nicht im Internet getestet. Im LAN hab ich es aber probiert und da gings. Es hatten aber alle teilenhmer(2) das Tool. Da die BOTS mit auf meinem PC laufen und der die funktionen bereit stellt, haben die auch unendlich munition.
|
|
Alex_ITA01
Beiträge: 56
Win XP
D7 Prof
|
Verfasst: Di 22.02.05 09:25
so ich habe das jetzt mal alles hier verfolgt und habe auch mal ein bischen rumgetestet...
Ich habe nur mal eine Frage zu Herr der Ringe:Schlacht um Mittelerde.
Ich finde ja bei "dlh" einige trainer nur leider funktioniert keiner... Nagut dann versuche ich mein Geld mittels TSearch mal einzufrieren aber leider wird der Geldwert (beim Spielstart = 1000) insgesamt 97 mal gefunden. Jetzt habe ich mir ein Gebäude für 350 gekauft und nach 650 im Speicher suchen lassen... Leider findet er überhaupt nichts mehr. Hat jemand eine Idee, woran das liegen könnte oder was ich ändern kann? Wäre echt super wenn ihr ein "Denkanstoß" für mich hättet.
MFG Alex
|
|
delphischaf
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 22.02.05 10:13
Du hast vieleicht nach 2 Byte gesucht, müsstest aber warscheinlich nach einem Wert mit 3 oder 4 Byte suchen.
|
|
|