kann man mit Autoit ohne Crashes eine Adresse Hooken und ohne Probleme sie wieder auf die Ausgangsadresse umleiten ohne dass das Programm crasht ? Denn jedesmal wenn ich es mache crasht es :/.Daher möchte ich diejenigen Fragen die damit erfahrung haben.(Natürlich wäre es leichter dies mit C++ oder C# zumachen aber ich wollte alles mal mit autoit machen)Hoffe ihr könnt mir helfen.(Im Internet gibt es auch eiige "Hooking.au3" welche aber entweder nicht funktioniert oder einfach eine Fehlermeldung zurück gibt und das noch im Beispiels Script.)
Das was du mit C++ schaffst geht auch mit AutoIt nur ist es ein bisschen umständlicher.
Entweder exportierst du eine DLL die in C++ geschrieben ist und die Hooking Funktion darin über AutoIt ausführt oder du schreibst selber mit MemoryWrite in den Speicher.
Wenn es crasht, dann liegt es wahrscheinlich an nicht abgesichertem / zugesichertem Speicher (VirtualProtect() in C++).
Schau dir das Grundgerüst in C++ mal an und versuch das zu übernehmen, solltest du das nicht können bastel dir eine kleine DLL die das für dich macht.
Ich hab etwas von shadow gefunden was den assembler code injected und zwar macht er einen Jump und nopt die unwichtigen adressen nun meine frage wie kann ich nun damit am anderen Ende des Jumps meine Funktion abfragen oder das sie überhaupt ausgeführt wird? Das ist das was ich schon gemacht habe bisher nopt sie alles und jumpt (irgendwo) zu einer Adresse hin.
Du injectest deine Funktion in eine CodeCave, und jumpst dahin (speicherst natürlich den ASM Code auf den du schreibst als 1. in die CodeCave) am Ende deiner Funktionen in der CodeCave jumpst du zurück wo du den eigentlich Jump initiiert hast nur ein Schritt weiter.
Du machst hier im Moment nichts, außer 2 Byte zu nopen und das Register ebx in deine allokierte Variable zu kopieren. Da ist kein Jump oder sonst was zu erkennen und wenn die Adressen im Speicher einfach so gewählt sind, bringt das auch nichts.
Was du vom Ablauf her machen musst:
- Speicher für deine CC allokieren & deine Instructions dort hin kopieren
- an der gewünschten Stelle zur CC springen
- am Ende der CC zur gewünschten Stelle + len(jump_instruction) springen
- entweder du berechnest die Adresse relativ und springst dann direkt hin (jmp 0x12345678) oder du schiebst die Adresse der CC in ein Register (mov eax, 0x12345678) und springst dann mit der Angabe des Registers (jmp eax). Hat beides Vor- und Nachteile.
Was du momentan machst:
- mov [adresse], ebx
AutoIt ist hierfür in meinen Augen ziemlich ungeeignet, schau dir mal C++ an. Ansonsten könnte AsmJit mit einem Wrapper eine Option sein.
Man möchte zum Beispiel EBX auf 0 setzen, sicherlich kann man hier das ADD EBX, 2 zu einem MOV EBX, 0 machen aber wir wollen das per CC Injection machen.
Ich bin mir im klaren das der Code Fehler enthält, aber er soll das nur verdeutlichen.
Wenn wir jetzt zur CodeCave jumpen wollen machen wir folgendes
0x0001 ADD EBX, 2
0x0002 MOV ECX, EBX
ändern wir zu
0x0001 JMP 0x1000
0x0002 MOV ECX, EBX
Somit jumpen wir an der Stelle wo vorher das ADD EBX, 2 war zu unserer CC, führen den Code aus der an der Stelle an dem wir dem Jump platziert haben aus (man kann nicht einfach so was zwischen einfügen, deshalb die Anweisung auf jeden Fall kopieren) und fügen unseren Code den wir dort ausführen möchten hinzu und anschließend springen wir zurück. Die 0x001 0x1002 sind nur Beispielspeicheradressen.
Man jumpt am Ende dahin zurück von wo man "weggejumpt" ist +1.
Es gibt sicherlich ein Befehl womit man die aktuelle Speicheradresse abspeichern kann.
es gibt keinen allgemeinen "befehl" der mich am ende meiner codecave dorthin bringt, wo ich hin will...
je nachdem, was ich mit meiner codecave bewirken will, muss ich entsprechend das ende der codecave anpassen. es gibt situationen, in denen ich 100 zeilen aus dem zielprozess durch 200zeilen aus meiner codecave ersetzen will. hier muss ich natürlich am ende der codecave hinter die 100 zeilen code des zielprozesses springen.
je nachdem was ich vorhabe, kann die zieladresse am ende meiner codecave deshalb sehr stark variieren.
ein kleiner tipp zum schluss: jump befehle sind allgemein recht komplex aufgebaut. es gilt aus zieladresse und aktueller adresse den befehlscode zu errechnen. deutlich leichter geht das auf anderen wegen. nimmt man zb den return befehl, so pusht dieser die zieladresse einfach vom stack.
Code:
jmp x
bringt mich entsprechend zur gleichen stelle, wie
Code:
push x
retn
nur das beim letzteren code keinerlei Berechnungen zur codeerstellung notwendig sind.
ok aber wie macht das Cheat Engine ? Denn bei Cheat Engine ist das anders denn da erstellt er alles selbern ohne da selbst viel zu hantieren daher->
Ich habe eine Cheat Engine Script welches ich mit Autoit "nachahmen " möchte ohne jedesmal ce zu starten daher auch meine Frage Wie bekomme ich es hin von eine Adresse einen jump zu veranlassen welcher dann von meinem Script genutzt wird und dann wieder zurück jump (eins weiter nach unten) ohne dass es crasht ?
Ich würde sagen, du schreibst die Bytes an deiner Addresse um(MemoryWrite oder mit der CC Inject.au3) und schreibst dir die CodeCave mit einem Debugger vor(OllyDbg, CE), dann musst du nur noch alles auf AutoIt übertragen.(Also wieder Bytes umschreiben.)
[AutoIt] - Systemnahes Entwickeln (DLL's, Hooking, APIs, CodeInjection, Security etc) 01/12/2014 - AutoIt - 3 Replies Hey,
Ich habe diesen Thread als eine Art "Disskussionsthread" erstellt.
Ich habe mir gedacht das man ein bisschen über das Systemnahe programmieren mit AutoIt spricht, Tipps
gibt, interessante/hilfreiche Links postet, Fragen über die im Titel genannten Themenbereiche stellt, Skripte postet, einander hilft etc.
Das soll kein Thread sein indem über AutoIt-Basics gesprochen wird, sondern über Fortgeschrittene Dinge.
Also, mal ein paar Links von meiner Seite, bezüglich dem Systemnahen...
Autoit/AutoHotkey hooking the mouse 10/03/2009 - Aion - 3 Replies I am running EU/US Aion 1.5 so no game guard. I am still having trouble sending mouse clicks to Aion the mouseclick("right") function works fine oustide the game but if I <alt> <tab> in it seems to get blocked. I am a bi t puzzled as the freeware mouse driver that I use to re-map extra mouse buttons works. Of course I have tried removing the mouse driver completely to ensure there is no clash. Any one have any ideas? Cheers.