English. Put the links from the original Text
Hallo, heute zeige ich euch wie ihr einen AutoIt Trainer macht bei dem ihr auch versteht was er tut! Als erstes solltet ihr AutoIt und Scite Script Editor installiert haben. Dann kann es auch schon direkt losgehen. Doch vorerst muss ich euch noch sagen das ich dieses Tutorial nur auf Deutsch schreibe. Englisch aus dem Grund nicht, da dieses Tutorial eher für Leute gedacht ist die der deutschen Sprache mächtig sind und außerdem kann ich nicht so gut Englisch.
Also, erstellt euch ein neues au3 Script. Nun kann es auch schon direkt losgehen. Als erstes wollen wir eine GUI (graphical user interface = grafische Benutzeroberfläche) machen bei der wir 2 Checkboxen machen (also 2 verschiedene Funktionen). Da ich nicht der Fan on solchen Start Buttons bin, machen wir es direkt so dass unser kleines Programm nach S4 prüft. Also hier nochmal die Aufgaben als Liste:
1. Erstellen einer GUI mit 2 verschiedenen Funktionen
2. Automatisches Wartn auf den S4Client
3. Ändern der Werte
4. Beenden des Programmes
Also, ich hoffe ihr versteht schon ein bisschen AutoIt und den Umgang mit dem Koda Form Designer. Also, geht in Scite klickt dort auf auf Tools. Nun klickt ihr auf Koda Form Designer. Dort könnt ihr alles mögliche an eurer GUI einstellen. Aber da wir nur 2 Checkboxen haben wollen fügen wir diese ein.
Die eine Checkbox nennen wir Shophack, die andere No Fog. Vergesst bitte nicht eure GUI umzubennen!
So nun fügen wir diese in Scite ein.
Doch dieser Code ist einfach nur Hässlich. Wieso? Nunja, erstes sind 1-2 Includes unnötig außerdem sind viele Sache Zeilenverschwendung und die Variablen müssen noch umbenannt werden. Also, welche Includes sind denn unnötig? Also auf jeden Fall die ButtonConstants.au3 und dann noch bedingt die GUIConstantsEx.au3. Was macht sie denn so unnütz? Diese Includes sind vollgepumpt mit Variablen. Doch die meisten bauchen wir hier nicht. Also entfern bitte folgendes:
Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
Dann seht ihr noch so ein
Code:
#Region ### START Koda GUI section ### Form=
und ein
Code:
#EndRegion ### END Koda GUI section ###
Diese dienen nur zur Übersicht. Aber da wir bei unseren kleinen Trainer nicht so viel Code haben sind diese unnütz. Also entfernen wir dies auch. Das nächste wäre dass
Code:
GUISetState(@SW_SHOW)
Was ist daran verkehrt? Eigentlich nichts, doch dass "@SW_SHOW" spielt für uns hier kein Rolle. Also macht das weg. Das sollte dann so aussehen:
Code:
GUISetState()
So, als nächstes sollten wir die Variablen umbenennen. Wieso? Infach desswegen weil es übersichtlicher ist und das $Form1 zB doof aussieht. Also nennen wir zB die $Form1 Variable zu $hGUI um. Die $Checkbox1 zu $Shophack. Letzendlich noch die $Checkbox2 zu $No_Fog. So, wenn wir nun unsere GUI anschauen wollen können wir einen kurzen Testlauf starten. Drück dazu einfach F5. Huch! Was passiert denn da? Ein Fehler? Wir haben doch eigentlich alles richtig gemacht oder? Im Prinzip ja, aber gehen wir doch mal durch was er uns mitteilen will. Er sagt "$GUI_EVENT_CLOSE: undeclared global variable.". Was sollen wir darunter verstehen? Er will uns mitteilen das die Variable $GUI_EVENT_CLOSE mit keinem Wert definiert ist, und er jetzt nicht weiß was er tun soll. Woran liegt dass? Wir haben ja die unnötigen Includes entfernt, und ich meinte dass wir die GUIConstantsEx.au3 nur bedingt brauchen. Bedingt definiere ich in diesen Fall mal mit "Wir brauchen nur eine Variable und zwar diese $GUI_EVENT_CLOSE". Doch was sollen wir nun tun? Ganz einfach, würden wir bei den Includes nachsehen würden wir rausfinden dass $GUI_EVENT_CLOSE mit dem Wert "-3" definiert ist. Also tauschen wir die Variable mit einer -3. Das sieht dann so aus
Code:
Case -3
So, nun können wir unser Programm mit F5 nochmal starten. Bei mir sieht die GUI ganz okay aus, ist jetzt aber nichts besonderes.
So, weiter gehts. Man sagt ja immer man soll die Trainer als Admin starten. Doch wir können das auch umgehen mit dem Befehl #RequireAdmin. Damit überprüft das Programm ob Adminrechte vorhanden sind, und teilt einen mit das dieses Programm welche erfordert. Also setzen wir den Befehl #RequireAdmin ganz oben am Anfang unseres Scriptes hin.
Achja, falls ihr eine Funktion nicht versteht, dann markiert sie und drückt F1. Dann öffnet sich das AutoIt Hilfefenster und dort ist die Funktion erklärt, meistens auch mit Beispielen.
Nun geht es weiter zum Überprüfen, ob der Prozess namens S4Client.exe vorhanden ist. Wenn ja soll er eine Funktion aufrufen. Doch wie stellen wir das am besten an? Schauen wir uns mal diesen Codeteil genauer an:
Code:
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
Wend
Dies ist in typisches Beispiel einer Schleife. Mit dem Befehl $nMsg = GUIGetMsg() wird sozusagen die GUI gefragt ob irgendwelche Aktionen zu tun sind. Mit Switch $nMsg tun wir in eine sozusagene Unterschleife wechseln bei der sich alles um die Variable $nMsg dreht. $nMsg ist die Variable für die Abruffunktion usnerer GUI. Mit Case -3 stellt er eine "Wenn Bedingung" her. Also, wenn -3 herrscht (also die GUI geschlossen wird) dann soll er den befehl Exit ausführen was das Beenden des Programmes bedeutet. Mit EndSwitch gehen wir aus dieser "GUI Schleife" wieder heraus und der Befehl Wend schließt die Schleife komplett ab. Phu, harter Tobak aber wir schaffen das schon. Also, wo sollten wir unsere Abfrage am besten hintun? Ich werde das direkt unter den
Code:
Case -3
Exit
machen. Eine "Wenn Bedingung" machen wir mit dem Befehl If. Das Abfragen eines Prozesses machen wir mit ProcessExists. Also wohl an, ich werde dass hier so machen:
Code:
If ProcessExists("S4Client.exe") <> 0 Then
_Werte_Ändern()
EndIf
Das bedeuted folgendes, Wenn der Prozess S4Client.exe orhanden ist dann soll die Funktion _Werte_Aendern() aufgerufen werden. Mit EndIf schliefen wir diese ganzen If, Then Sachen ab. So, doch nun ist das Problem dass wir _Werte_Aendern() noch nicht gemacht haben. Also machen wir uns diese Funktion. Dies machen wir mit dem befehl Func. Wir schreiben ganz unten folgendes hin:
Code:
Func _Werte_Aendern()
EndFunc
So, nun ist unsere Funktion bereit, doch es steht nichts drin. Also füllen wir diese. Als erstes solltet ihr euch die NomadMemory.au3 UDF (UDF = User definied function = Benutzerdefinierte Funktion) downlaoden. Diese findet ihr eigentlich überall, am besten ihr sucht aber bei Google. Habt ihr sie gedownlaodet, so geht ihr in euren programm Ordner und dann zum AutoIt Ordner. Dort öffnet ihr den Include Ordner und fügt diese dort ein. So, weiter zum Script. Erstmal müssen wir sie includieren (einbeziehen) in unser Script damit wir sie benutzen können. Dies folgt wie bei den WindowsConstants.au3 über den Befehl #include ab. Nur bei dem Include Befehl gibt es 2 verschidene Arten, ich erkläre diese mal.
Code:
#include "NomadMemory.au3"
und
Code:
#include <NomadMemory.au3>
Im großen und ganzn sehen sie sich sehr ähnlich. Nur statt bei den "" wird beim 2. Befehl ein <> genutzt. Wo befindet sich der Unterschied? Wenn ihr "" benutzen tut dann sagt ihr dem Programm dass sich eure Include Datei im selben Bereich/Ordner wie euer Script befindet. Schriebt ihr aber <> so teilt ihr dem Programm mit dass sich eure Include Datei im Include Ordner von AutoIt befindet. Im großen und ganzen simpel. Da wir nun aber die NomadMemory.au3 in den Include Ordner von AutoIt getan haben müssen wir demzufolge welchen Befehl nehmen?
Spoiler:
Diesen setzen wir nun ganz oben bei den WindowsConstants.au3 hin, es ist egal ob drüber oder drunter.
So, nun geht es ans Memorychanging. Dies ist nicht sonderlich schwer wenn man die Funktionen versteht. Folgende Arbeitsabläufe müssen wir machen:
1. Den Memory von S4Client.exe öffnen
2. Auslesen ob ein Häckchen in der Checkbox gesetzt wurde
3. In den Speicher schreiben
4. Den Memory von S4 Client.exe schließen
5. Das Programm beenden
So fangen wir an. Als erstes müssen wir dem Programm sagen welchen Prozess er öffnen soll. Dafür nutzen wir ProcessExists. Dieser Befehl holt sich die PID (Process ID) von den angegebenen Prozess und gibt diese zurück. Da er diese zurückgibt müssen wir das ja irgendwo speichern. Dafür setzen wir diesen Befehl einfach in eine Variable. Das dürfte dann so aussehen:
Code:
$PID = ProcessExists("S4Client.exe")
Also setzen wir nun diesen Befehl in unsere Funktion rein. Diese sieht nun so aus:
Code:
Func _Werte_Aendern()
$PID = ProcessExists("S4Client.exe")
EndFunc
Gut, nun sollten wir erstmal den Speicher von den S4Client öffnen. Dafür gibt es den Befehl _MemoryOpen. Und als Prozess geben wir unsere Variable $PID an die ja die Prozess ID (kurz PID) von S4Client.exe besitzt. Das sollte dann so aussehen:
Code:
$Open = _MemoryOpen($PID)
Um den geöffneten Speicher (aka. Memory) nutzen zu können speichern wir das in einer Variable. Um mich daran besser orientieren zu können nehme ich die Variable $Open. Merkt euch, jede Variable in AutoIt muss mit einem $ beginnen, da sonst das Programm nicht weiß das ihr eine Variable deklarieren wollt.
So, nun müssen wir abfragen ob Chophack oder No Fog ausgewählt worden ist. Dafür gibt es den Befehl GuiCtrlReat. Diese Aufgabe werden wir in einer If Abfrage lösen. Hier mal die Lösung:
Code:
If GUICtrlRead($Shophack) = 1 Then
EndIf
If GUICtrlRead($No_Fog) = 1 Then
EndIf
Zuerst fragen wir ob er aus der Variable Shophack den Wer 1 lesen tut. Der Wert 1 bedeuted beim Programmieren (oder in diesem Fall beim Scripten) True. Demzufolge würde welche Zahl für False stehen?
Spoiler:
So, nachdem wir jetzt wissen wofü 1 und 0 steht können wir auch direkt mit dem Werteändern beginnen. Dafür haben wir den Befehl _MemoryWrite. Dieser ist etwas kompliziert. Schauen wir uns doch mal die Syntax an.
Code:
_MemoryWrite($iv_Address, $ah_Handle, $v_Data, $sv_Type = 'dword')
Also, hier mal die Erklärung:
$iv_Address -> Hier unsere Adresse. Vergesst nicht das 0x davor da die gesuchten Adressen mit Cheat Engine fast immer Hexdezimal sind.
$ah_Handle -> Das Prozesshandle. Also unsere $Open Variable
$v_Data -> unser Wert in den wir die Adresse ändern wollen. Merkt euch, den Wert in "" zu schreiben.
$sv_Type = 'dword' -> Den Typ des Wertes den wir nutzen. Es gibt viele unterschiedliche Typen, hier mal ein paar aufgelistet:
Float -> Floats sind Gleitkommazahlen, also Zahlen wie 1.4 oder 1 oder 6.7846485 oder 23512873.23768123. Floats sind 4 Bytes groß.
Doule -> Double sind doppelte Floats. Dementsprechend sind sie 8 Bytes groß. Dadurch lassen sich deutlich präzisere Zahlen errechnen.
char -> chars sind strings. Also Werte wie "Hallo" oder "Deine Mudda123" oder "elite34_5"
long -> das sind Werte im 4 Bytes Bereich
So, das genug Datentypen, wenn ihr mehr braucht könnt ihr sie ja einfach mal googeln. Nur eins muss ich euch noch klar machen, nämlich der Umgang mit char. Angenommen ich habe das Wort "Hallo", dann müsste ich folgendes bei $sv_Type = 'dword' schreiben:
char[6]
Wieso char[6]? Char um unseren Programm zu sagen das wir ein Wort nehmen. Die 6 steht für die Buchstabenanzahl + 1. Unser Wort "Hallo" besteht aus 5 Buchstaben. Plus 1 gerechnet ergiebt dies die Zahl 6. Doch wieso +1? Das liegt daran dasman beim Schreiben des Speichers ein Byte mehr benutzen muss. Doch wieso? Weil ein String mit einem "\00" Byte abgeschlossen wird. Desswegen wird bei Cheat Engine auch gefragt "Terminate string with zero".
Aber weiter nun zum Memorychange Befehl. Angenommen wir haben die Adresse 0x00D3F00C (keine Angst, die Adresse ist uralt und gilt schon lange nichtmehr). Diese ist ein String namens "Off". Wir wollen diesen String in On changen um unseren Shophack zu erzielen. Also sieht unser Befehl so aus:
Spoiler:
Super, da dies der Shophack ist müssen wir den aber auch in die Abfrage des Shophacks reintun. Welche war das nochmal?
Spoiler:
Also müsste dass dann so aussehen:
Spoiler:
Gut gemacht, nun aber noch No Fog. Angenommen wir haben die Adresse 0x00F87CD1 (Diese Adresse funktioniert ebenfalls nicht da sie erfunden ist). Diese Adresse ist ein Float und wir möchten sie in den Wert 6.2 ändern (ist kein Originalwert denn No Fog ist eigentlich ein String aber ich möchte euch noch zeigen wie das in Float geht). Also selbe Frage wieder. Wo packen wir das hinein?
Spoiler:
Okay, und wie würde es mit dem MemoryWrite Befehl aussehen?
Spoiler:
So, ich muss aber noch sagen dass ihr das "Float" nicht unbedingt großschreiben müsst. Ihr könnt zB auch FLOAT oder float schreiben dass ist egal. Hauptsache ist dass das Programm es versteht.
So, das war es ja auch schon fast. Es fehlen uns noch 2 Arbeitsvorgänge. Das schließen des Speichers (auf Englisch Memory) und das beenden des Programmes. Als erstes schließen wir mal den Memory. Wo? Unter unsere ganze If Abfragen. Zum schließen des Speichers gibt es den Befehl _MemoryClose. Dieser ähnelt stark den _MemoryOpen Befehl. Doch wie nutzen wir ihn? Ganz simpel, geöffnet haben wir den Memory mit _MemoryOpen und haben es in der Variable $Open gespeichert. Da wir nun den geöffneten Memory schließen wollen, nehmen wir einfach wieder die $Open Variable und überschreiben diese. Das sollte dann so aussehen:
Spoiler:
Fein gemacht. Nun noch das Beenden des Programmes. Dafür gibt es den Befehl Exit. Also schreiben wir direkt unser unseren _MemoryClose Befehl ein Exit.
Respekt, ihr habt soeben euren Trainer fertig gemacht. Eure Funktion _Werte_Aendern dürfte nun so aussehen
Spoiler:
Noch etwas, wenn ihr euren Source kommentieren wollt dann setzt vor euren Kommentaren ein ";". Also zB so
Code:
;Hallo das ist ein Kommentar
Kommentare werden in AutoIt Grün angezeigt und haben den zweck euch bei der Übersichtlichkeit eures Programmes zu helfen.
Da ihr mit eurem Programm nun fast fertig seid geht es um den Feinschliff. Drückt dafür einfach STRG + T. Schon wird eurer AutoIt Source in die richtige Form gebracht und ist gleich viel Überswichtlicher. Nun geht es ums Compilen. Dabei wird euer geschriebener Source kompressiert und in einer ausführbaren Datei auf euren Computer gespeichert. Wenn ihr Compilen wollt drückt ihr STRG + F7. Dann kommt ihr in das Compile Fenster von AutoIt. Jetzt bestehen trotzdem noch ein paar Fragen. Ich würde ruch empfehlen bei Output type A3X auszuwählen.
Aus den Grund weil dadurch euer Script in der Laufzeitumgebung von AutoIt gestartet wird und somit mehr Rechte hat. Der Nachteil ist, dass der Traineruser AutoIt installiert haben muss. Wenn ihr bei Output type EXE ausgewählt habt dann brauch der User zwar kein AutoIt aber es wird höchstwahrscheinlich nicht funktionieren da euer Programm nicht genug Rechte hat. Also empehle ich euch A3X auszuwählen.
Nun noch Output arch.
Dort müsst ihr auswählen für welche Bit Systeme euer Programm läuft. Ich empfehle euch "Compile X86 version. (default)" auszuwählen, da es dann bei 32 Bit und 64 bit funktioniert.
So, ob ihr UPX benutzen wollt müsst ihr wissen. Wenn ihr euer Programm im Anschluss noch mit Themida packen wollt (geht nur wenn ihr es als EXE compilen tut) dann dürft ihr UPX nicht auswählen.
Wenn ihr fertig seid drückt ihr auf Compile Script und euer Programm wird erstellt.
Das war es auch schon mit meinem kleinen Tutorial. Ich hoffe doch sehr ihr habt etwas gelernt und nicht nur C&P gemacht. Man sollte schließlich wissen was man tut
Bei Fragen jeglicher Art steh ich euch natürlich zur Verfügung. Es würde mir aber gefallen wenn ihr die Fragen in diesen Thread posten würdet da ich nicht so auf PM Spam stehe.
Ansonsten, schönen Tag noch!
Btw, wer nicht googlen kann findet diverse Dateien unten im Anhang Unter Anderem ist das die NomadMemory oder zB unser Trainerscript.
Downloads
AutoIt
Angehängte Dateien
Dateityp: rar Nomad Memory.rar (3,2 KB, 29x aufgerufen)
Dateityp: rar Trainerscript.rar (588 Bytes, 38x aufgerufen)