Autor Beitrag
derDoc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2322
Erhaltene Danke: 1

FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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
ausblenden 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
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 26


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

ausblenden 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'); //Get WindowHandle
  buf := #144#144;
  if c=0 then
  begin
    MessageDlg('You have to run the game first !',mtwarning,[mbOK],0);
    Exit;
  end;
  GetWindowThreadProcessId(c,@c); //Get ProcessID and ignore ThreadID
  c:=OpenProcess(PROCESS_ALL_ACCESS,False,c);  //Get ProcessHandle
  WriteProcessMemory(c,Ptr($547156),buf,4,write);                    // Diese 4 habe ich schon durch alles von  1-8 ersetzt !
  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
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 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 26


D2005 PE
BeitragVerfasst: 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
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 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 26


D2005 PE
BeitragVerfasst: Di 08.02.05 14:20 
und woher weiss ich wie groß die is ? :shock:
delphischaf
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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



BeitragVerfasst: Mi 09.02.05 08:51 
@derDoc

Welches SoftIce muss ich da nehemen? Das mit Vanille und Schoko oder? :lol:
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



BeitragVerfasst: Fr 11.02.05 09:42 
Wasn los, schreibt keiner mehr?
Das SoftIce geht auf XP irgenwie nicht.
WeBsPaCe
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2322
Erhaltene Danke: 1

FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
BeitragVerfasst: 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. :roll:

_________________
Steht der Bauer im Gemüse, hat er später grüne Füße.
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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. :roll:

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



BeitragVerfasst: Mo 14.02.05 10:27 
Ah, gut. Ich werds heute nachmittag nochmal probieren.
*treky
Hält's aus hier
Beiträge: 7



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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 56

Win XP
D7 Prof
BeitragVerfasst: 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



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