Home of Gamehacking - Archiv
Code Injection + AutoIT - Druckversion

+- Home of Gamehacking - Archiv (http://archiv-homeofgamehacking.de)
+-- Forum: Coding (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=15)
+--- Forum: AutoIt (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=46)
+--- Thema: Code Injection + AutoIT (/showthread.php?tid=1307)

Seiten: 1 2 3


Code Injection + AutoIT - Schnieker - 06.01.2013

Moin Leute,
Ich hab mal wieder eine Frage, undzwar: Wenn ich in CheatEngine ein Script für CodeInjection habe. Kann ich das dann irgendwie in AutoIT einbauen? Wenn ja, wie? Bis jetzt kann ich mit AutoIT nur Adressen und Pointer manipulieren.
Danke!


RE: Code Injection + AutoIT - Acubra - 10.01.2013

Hey,
eine CodeInjection ist im Prinzip auch nur das Schreiben von Werten in Adrressen.
Mal ein einfaches Beispiel:
Du hast folgenden Befehl:

Code:
012C1B8F - 3B 0D 18402C01        - cmp ecx,[012C4018] : [B71093FF]

Wie du siehst befindet sich der "Compare" an der Adresse 012C1B8F und wird durch die Bytes "3B 0D 18 40 2C 01" beschrieben. Wenn du nun den Befehl "Noppen" willst, musst du einfach per WriteProcessMemory "90 90 90 90 90 90" in die Adresse 012C1B8F schreiben. Somit hast du eigentlich schon deinen eigen Code in den Speicher des Spiels eingefügt. Deine CodeInjection ist fertig.


RE: Code Injection + AutoIT - Schnieker - 10.01.2013

:O Danke! Ist denn da "90 90 90 90 90 90" die Pauschallösung oder muss ich da was beachten? Wovon hängt ab wie oft ich 90 schreiben muss? 90 steht für nop, das wusste ich schon. Aber woher weiß ich wie viel ich noppen muss?


RE: Code Injection + AutoIT - Acubra - 10.01.2013

Hey,
in diesem Fall musst du 6 Nops an die Adresse schreiben.
Die Befehle und somit auch die Größe dieser werden durch verschiedene Bytesequenzen beschrieben. Ein Far Jump ist z.B immer 5 Bytes groß und fängt mit E9 an und danach folen die Bytes, die (Zieladresse - Quelladresse) beschreiben.


RE: Code Injection + AutoIT - Schnieker - 14.07.2013

Tagchen,
nach langer Zeit muss ich mich jetzt nochmal zurückmelden und mache dafür jetzt mal nich nen neuen Thread auf. Undzwar habe ich bei der Methode von Acubra immer das Problem dass mir das Spiel abstürzt. Muss ich wenn ich die Bytes schreibe das in einem bestimmten "Format" (ich weiß nicht wie man das nennt), also float, dwort o.ä. machen? Aktuell versuche ich mich an Cube World, das ist allerdings auch bei anderen Spielen so. Falls gewünscht poste ich auch Screenshots aus CheatEngine.
MfG,
Schnieker


RE: Code Injection + AutoIT - Acubra - 14.07.2013

Hey,
poste doch mal das Script. Zusätliche Infos (vor allem Screenshots) sind natürlich auch immer von großem Vorteil.


RE: Code Injection + AutoIT - Schnieker - 14.07.2013

Hi Acubra,
Hier ist mal das Skript (AutoIT):

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <NomadMemory.au3>

$PID = ProcessExists("Cube.exe")

$Open = _MemoryOpen($PID)

HotKeySet("{F2}","_Run")
HotKeySet("{F3}","_End")

Func _Run()
   _MemoryWrite(0x013277E3,$Open,"90 90")
EndFunc

Func _End()
   Exit
EndFunc

While 1
   Sleep(10000)
WEnd


Und hier ein Screen vom Disassembler:
[Bild: unbenannto5q4l.png]

Wenn ich im Disassembler noppe geht es, über das Skript allerdings nicht.

EDIT: Ein weiteres Problem ist, wie ich eben festgestellt habe, dass sich die Adresse die ich noppen möchte immer ändert. Wie könnte man das behandeln?

EDIT: Ich habe gerade herausgefunden wo mein Fehler lag. Ich muss die Bytes auch als BYTE schreiben und nicht als DWORD. Logisch 0o Happy Aber das Problem mit der sich ändernden Adresse besteht immernoch...
MfG,
Schnieker


RE: Code Injection + AutoIT - Acubra - 14.07.2013

Hey,
das du das mit dem Datentyp gelöst bekommen hast, freut mich.
Zu der sich ändernden Adresse gibt es schon eine Reihe von Tutorials (auch hier bei uns). Du musst die BaseAdresse des Moduls ausfindig machen (siehe Module32First/Module32Next API's) und darauf dann ein Offset addieren. Sieh dir mal die UDF hier an: http://www.autoitscript.com/forum/topic/115352-process-thread-dll-functions-udfs/?p=829011&hl=module%20address&fromsearch=1#entry829011
Bzw. das Offset zu der jeweiligen BaseAdresse kannst du dir auch von CE im Memory viewer anzeigen lassen (dazu auf View-->Show module addresses).


RE: Code Injection + AutoIT - Schnieker - 14.07.2013

Wow!
Nachdem ich das alles erst nicht verstanden habe geht es jetzt doch. (Bis jetzt jedenfalls Happy) Vielen Dank dafür schonmal! Nun hätte ich noch 2 weitere Fragen: 1.: wenn ich den Code genoppt habe, dachte ich, ich könnte dies rückgängig machen indem ich die alten Bytes wieder hineinschreibe. Allergings geht das nicht. Es passiert einfach nichts... Und 2.: Gibt es eine Möglichkeit über Assembler das Selbe zu erreichen als wenn ich in CheatEngine direkt den Wert der Adresse bearbeite und somit z.B. das Leben auf 1000 setzen kann? Kann ich also auch direkt Werte im Spiel verändern?


RE: Code Injection + AutoIT - Acubra - 15.07.2013

Hey,
also wenn du den Code noppen kannst, dann kannst du ihn auch wieder herstellen. Du hast entweder nen Fehler in deinem Script, oder du führst den jeweiligen Befehl gar nicht aus.
Die direkten Werte im Spiel kannst du natürlich genauso verändern. Je nachdem welcher Datentyp vorliegt, musst du auch deinen MemoryWrite-Befehl anpassen (byte, dword, float u.s.w). Der Healthwert wird ja auch ganz normal in einer Adresse bzw. Variable gespeichert. Da sich beim Neustart (oder z.B Levelwechsel) die Healthadresse meist ändert, greift man deshalb gerne auf Pointer zurück.
//EDiT: Ach du meinst in Assembler. Naja das ist ne andere Geschichte. Du kannst eben die Adresse rausfinden und dann irgendwo im Spiel ne CodeCave unterbringen, in der du z.B mov, [adresse], 63 schreibst. Aber das ist ja nicht so dynamisch wie in CE. Außerdem wird, wenn der Codeabschnitt ständig durchlaufen wird, der Wert der Adresse in dem Fall auf 100 gefreezt. Dann müsstest du wieder nen Check einbauen u.s.w.. Also es geht, aber nicht so bequem wie in CE.