Sorry wenn wer anders schon mal einen thread zum gleich thema auf gemacht hat (hab nicht wirklich nachgeschaut) so aber jetzt zum Tut.:
Worum geht es hier ?
Dieses Tutorial soll euch zeigen wie man einen Trainer für ein Spiel macht.
Daher ich nur Starcraft und CS installiert habe wird es in diesem Tutorial
um einen Starcraft Trainer gehen.
Was benötige ich um das Tutorial zu verfolgen ?
1.) Einen ASM Compiuler oder einen C++ Compiler mit Inline ASM
2.) Eine API Referenz wie z.b. das MSDN
3.) Starcarft
4.) Und Olly Debug (Ich weiss viele Cracker bevorzugen SoftIce aber ich halt nicht :-P)
Was ist ein "Trainer" ?
Das ist im Grunde auch ein Cheat. Diese Art der cheats waren sehr weit verbreitet zu DOS/C64
und Amiga Zeiten. Es gabe sogar mal trainer für Konsolen (SNES und SMD-> Replay X ).
Was dieser Cheat macht ist euch mehr Mineralien zu geben.
Kann ich einfach offsets patchen ?
Normalerweise ist es unter Windows9x/NT nicht erlaubt auf andere Prozesse zuzugreifen.
Glücklicherweise hat Microsoft aber ein paar Funktionen eingebaut welche eigentlich zum
Debugen gedacht waren. Und genau diese Funktionen werden wir nun für unsere Zwecke ver-
wenden.
Hier sind die Namen:
OpenProcess //Diese Funktion öffnet uns ein Handle zu dem Prozess den wir Modden wollen
WriteProcessMemory //Diese Funktion schreibt unsere Daten in einen bereitslaufenden Prozess
ReadProcessMemory //Diese Funktion liest Daten aus einen fremden Prozess aus.
Im Grunde wird unser Programm sich wie ein Debugger verhalten. D.H. auf den Speicherplatz anderer
Programme zugreifen und diese verändern.
Wie ist so ein Programmaufgebaut ?
1.) Intro (Einfach eine kleine MessageBoX )
2.) Das "erhalten" der Process ID der Programms welches wir modifizieren möchten.
3.) OpenProcess
4.) Werte verändern
5.) Das Handle Schließen und Beenden
Erklärung des verwenden der API Funktionen:
Das erhalten des Fenster Handle's:
Um das Fenster Handle zu bekommen verwenden wir FindWindowA.Diese Funktion gibt uns ein handle zurück und
"will" als Parameter den Fensternamen("Starcraft") und die Fensterklasse ("SWarrClass").(Wir können den
Klassennamen eines Fensters mit SoftICE rausfinden(TASK->HWND).
Mit dem Fensterhandle können wir uns die entsprechenden Prozesse hohlen.
Oder die PID in dem wir GetWindowThreadProcessId benutzen.
Dann hohlen wir uns natürlich ein neues Handle mit openprocess in dem wir dann unsere gewünschten
Attribute selbst angeben.
Alles wird jetzt leichter. Denn jetzt können wir WriteProcessMemory benutzen um die gewünschten änderungen
am Prozess vornehmen.
Dann schliessen wir das handle mit Colsehandle und rufen ExitProcess auf.
Die Speicheradressen:
Wir können sehr leicht an die Speicheradressen wie z.B. Mineralien ran kommen indem wir einen Debugger
verwenden. Dazu würde ich Olly Debug empfehlen.
Mineralien = 04EFE08h
VespinGas = 04EFE38h
Der Source code (ASM)
.386P ;Umgebungseinstellungen für den Assembler
Locals
jumps
.Model Flat ,StdCall ; bestimmen des Stackmodels
PROCESS_VM_WRITE equ 020h ; Flags für Schreibzugriff
PROCESS_VM_OPERATION equ 008h ; zu dem Prozess
mb_ok equ 0 :
minerals_pos equ 04efe08h ; Adresse für Mineralien
gas_pos equ 04efe38h ; Adresse für VespinGas
; Setzten der Prototypen der zuverwendenden API Funktionen und der Variablen
extrn MessageBoxA : PROC ; Messagebox
extrn FindWindowA : PROC ; Funktion um das Fensterhandle zubekommen
extrn GetWindowThreadProcessId roc; Funktion um die PID zubekommen
extrn OpenProcess : PROC ; Funktion um auf den Prozess zugreifen zu können
extrn WriteProcessMemory: PROC ; Funktion um unsere werte in das Programm zuschreiben
extrn CloseHandle : PROC ; Funktion um das Hanlde zu schließen
extrn ExitProcess : PROC ; Funktion zum beenden des Programmes
; Hier fängt unser Programm an
.Data
caption db "_masta_'s essay on Win32-ASM-Coding, part 2",0 ; Überschrift, 0-terminated
text db "Hi, here we are at part 2",13,10
db "This tut will describe you how to make",13,10
db "Win32-ASM Trainer",0 ; Introtext , 0-terminated
err_cap db "ERROR",0 ; Überschrift
notrun db "Sorry, Starcraft is not running",0 ; Fehler wenn Starcarft nicht läuft
no_write db "Mmmhhhh, a problem, by writing",13,10 ; Zugriffsfehler
db "to Starcrafts memory",13,10,0 ;
readycap db "Ready",0 ; Überschrift
readytxt db "Ok, now you have 1000000 Minerals and Gas",0 ; Erfolgsmeldung
million dd 1000000 ; Neuer Wert für die Resourcen
dd 1000000
wnd_name db "Starcraft",0 ; Name des Starcraft-Fensters
cls_name db "SWarClass",0 ; Klasee vom Starcraft-Fenster
pid_sc dd ? ; hier wird die PID gespeichert ...
p_hand dd ? ; und hier das Handle
; Und hier fängt unser Code an
.Code
Main:
; Da das Stacksegment ein LIFO Register ist werden die Parameter in umgekehrter
; Reinfolge übergeben
push mb_ok ; Ok - Button für unsere MessageBox
push offset caption ; Überschrift
push offset text ; MessageBox Inhalt
push 0 ; Kein extra parameter
call MessageBoxA ; Startnachricht
is_SC_RUN:
push offset wnd_name ; Übergeben das Fensternamens
push offset cls_name ; Übergeben des Klassennamens
call FindWindowA ; Finden des Fensters
cmp eax,0 ; Wenn eax NULL ist dann exestiert das Fenster nicht
jz SC_isnt_run_end ; Benachrichtigen des Users das Startcraft nicht gefunden wurde
push offset pid_sc ; Offset für die PID
push eax ; Übergeben des Fensterhandels
call GetWindowThreadProcessId ; Aufruf der Funktion
open_the_process:
push pid_sc ; Übergeben der PID
push 0 ; 0 da wir keinen neuen Prozess erstellen
push PROCESS_VM_WRITE OR PROCESS_VM_OPERATION ; Aktivieren der Schreibrechte
call OpenProcess ; Erhalten des Handles
mov p_hand,eax ; Speichern des handles zu p_hand
change_Minerals:
push 0 ; wird Nicht benötigt
push 8 ; Größenangabe des 8 Bytes großen wertes 1.000.000 (2 Dwords)
push offset million ; Offset zu den Mineralienwert den wir in StarCraft schreiben
push minerals_pos ; Speicheradresse der Mineralien in StarCraft
push p_hand ; Handle zum Prozess
call WriteProcessMemory ; Ausführen des Schreibvorgangs
cmp eax,0 ; Hat der Schreibvorgangs geklappt ?
jz error_on_write ; Wenn es einen Fehler gegeben hat dann benchrichtigen wir den User
change_gas:
push 0 ; wird Nicht benötigt
push 8 ; Größenangabe des 8 Bytes großen wertes 1.000.000 (2 Dwords)
push offset million ; Offset zu den t den wir in StarCraft schreiben
push gas_pos ; Speicheradresse des Vespin Gases in StarCraft
push p_hand ; Handle zum Prozess
call WriteProcessMemory ; Ausführen des Schreibvorgangs
cmp eax,0 ; Hat der Schreibvorgangs geklappt ?
jz error_on_write ; Wenn es einen Fehler gegeben hat dann benchrichtigen wir den User
Trainer_ready:
push mb_ok ; Ok-Button für die MessageBox
push offset readycap ; Offset für den Überschrifts String
push offset readytxt ; Offset für dem MessageBox Inhalt
push 0 ; nicht benötogt
call MessageBoxA ; Oki alles hat Hingehauen (weeeeeeeeeee)
close_the_PID_Handle:
push p_hand ; Übergeben des Handles
Call CloseHandle ; Schließen des Handles
jmp end_ ; Und auf zum Ende
error_on_write:
push mb_ok ; OK Button bei der MessageBox
push offset err_cap ; Überschrift
push offset no_write ; FehlerMeldung
push 0 ; Wiedermal 0
call MessageBoxA ; Aufrufen der MessageBox
jmp close_the_PID_Handle ; Schließen des Handels bevor wir Beenden
SC_isnt_run_end:
push mb_ok ; OK Button bei der MessageBox
push offset err_cap ; Überschrift
push offset notrun ; FehlerMeldung
push 0 ; immer noch 0
call MessageBoxA ; StarCraft ist nicht präsent
end_:
CALL ExitProcess ; Beenden unseres Programmes
End Main
Spezielle Anmerkung :
Dieser Trainer Funktioniert Grundsätzlich mit jedem Spiel alles was ihr machen müsst um ihn auf ein anderes Spiel
zu Übertargen ist die neuen Offsets rausfinden und diese mit den Bestehenden zu ersetzen.
Mfg LPP.
Tutorial by _masta_








