CheatEngine Function Calling + in AutoIt übernehmen
Hallo,
ich bräuchte spezielle Hilfe, da ich mehr so der Hochsprachen-Typ bin und mit Assembler was hier gebraucht wird eher nur "rate" was hier vor sich geht.
Speziell geht es darum in einem Prozess via CheatEngine eine Function im Dissassembler zu finden sowie diese über CheatEngine zu "callen".
Dazu das ganze in AutoIt zu übernehmen (etwas vorarbeit habe ich hier schon).
Wer sich also gut damit auskennt und Discord/TS3 hat sowie mit mir via AnyDesk dies durchgehen möchte kann sich gerne bei mir direkt via PN melden.
Bin auch bereit für genug "Hilfe" ein Trinkgeld zu geben.
Hier mal ne grobe zusammenfassung
Ein prozess hat seinen eigenen vrituellen Speicherbereich bestehend aus TEXT (dem programmcode) DATA (konstanten/globalen variablen) HEAP und STACK.
Cheatengine basically ließt das TEXT segment aus und disassembled das. Dafür benötigst du aber keine Runtime analyse, du kannst genauso gut die Executable disassembeln und am ende die basisaddresse an die die libc geladen wurde drauf rechnen.
Kleines beispiel unter Linux, mit dem gdb. Ich will die addresse von sprintf aus der LibC in meinem gdb finden (ignorieren wir mal das ich einfach print &sprintf eingeben könnte).
Zunächst disassemble ich die libc mit objdump.
Code:
$ objdump -T /usr/lib/libc.so.6
/usr/lib/libc.so.6: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
[...]
0000000000059530 g DF .text 00000000000000b6 GLIBC_2.2.5 sprintf
[...]
Die ausgabe sagt mir jetzt die Funktion sprintf ist in addresse 0x059530. Die ist, solange sich die libc version nicht ändert, immer gleich.
Jetzt gilt es die basisadresse des moduls herauszufinden. Dafür starte ich mein programm im gdb, breake und gebe mir das memory mapping aus:
Hier kann ich sehen das die libC an addresse 0x7ffff7df1000 geladen wurde. Addiere ich also die addressen auf 0x7ffff7df1000 + 0x059530 = 0x7ffff7e28530 (Ein schnelles print &sprintf verifiziert die rechnung).
Mit diesem Funktionspointer kann ich jetzt was anfangen. Wenn ich jetzt z.B. im GDB p ((int (*) (const char *)) 0x7ffff7e28530) (ToAddr, "ABC") eintippen würde, würde die gdb die Funktion sprintf ausführen, und basically ABC an die addresse ToAddr schreiben.
GDB macht das ganze richtig, Pausiert die prozess bereitet das memory vor (stack frame, register, etc.) und macht dann den call. Beschrieben ist das hier: . Während du das so auch versuchen könntest zu basteln, gibt es glaube ich einen weitaus schmerzloseren weg.
Zurück zu Windows. Um funktionen in Assemblies (.exe, .dll) zu finden kannst du z.B. IDA pro oder Binary Ninja verwenden, zwei state of the Art disassembler die noch viel mehr funktionalität haben, aber auch super einfach dir alle funktionen anzeigen können. Du disassemblest damit einfach die binary, suchst die funktion die du willst, und schreibst dir die Addresse auf
Um nun die Basisadresse zu bekommen ohne einen debugger zu verwenden, bietet dir die WinAPI folgende Möglichkeit: . Zu guter letzt kannst du den Funktionspointer den du dir einfach aus Basisadresse + Funktionsaddresse ausgerechnet hast mithilfe von erzeugen.
Aber achtung, die Funktion wird wie der name schon sagt in einem Separaten Thread ausgeführt, es kann also zu Raceconditions führen. Wenn du das programm während dessen anhalten willst musst du es so machen wie es der GDB macht
So, erstmal ein herzliches Dankeschön an warfley, die Funktion ist gefunden und nun stehe ich nur noch vor dem letzten Problem, den ASM-Code von AutoIt aus in den Speicher der Zielanwendung zu bekommen, damit ich diese Funktion von dort aus via CreateRemoteThread aufrufen kann.
Folgender ASM-Code soll letzendlich in der Ziel-Exe dann stecken:
Wenn ich das ganze über CheatEngine via "Allocate Memory" + genau den obigen ASM-Code via Auto-Assemble in den Speicher der Exe schreibe, funktioniert schon alles 1a und kann die Funktion via AutoIt und CreateRemoteThread verwenden.
Hat das schon jemand gemacht und kann mir hier helfen?
Solltest eigentlich einfach mit VirtualAllocEx speicher mit execute Rechten (flAllocationType sollte MEM_COMMIT | MEM_RESERVE sein und flProtect sollte PAGE_EXECUTE_READWRITE sein) aus AutoIT in dem Prozess allokieren können, mit irgendeinem assembler dein assembler code assemblen so dass du die entsprechenden bytes hast (kannst die ja einfach von dem was bei Auto Assemble in cheat engine rauskommt sehen), und diese bytes dann mit WriteProcessMemory in deinen Speicher schreiben. Dann mit CreateRemoteThread da nen thread erstellen und das sollte gehen. Wie man das in AutoIT genau macht weiß ich leider nicht.
mit irgendeinem assembler dein assembler code assemblen so dass du die entsprechenden bytes hast (kannst die ja einfach von dem was bei Auto Assemble in cheat engine rauskommt sehen), und diese bytes dann mit WriteProcessMemory in deinen Speicher schreiben.
Genau und daran scheitert es aktuell, speicher frei machen ist nicht das Problem, aber wie ich meinen gewünschen ASM Code hier in den Speichern schreibe und diesen erstmal umwandle.
Naja, wirklich am einfachsten wäre einfach das einmal in dem cheat engine auto assembler zu machen und dir dann den speicher anzuschauen, den du vorher in cheat engine allokiert hast. Da stehen dann ja die bytes neben den instructions, die würdest du dann einfach in ein array in autoit kopieren. Hab leider kein windows und cheat engine mehr, von daher wird das etwas schwer das dir mit cheat engine zu zeigen. Ich würde auf Linux halt einfach
Code:
global _start
section .text
_start:
movss xmm2, [0xB7D478]
movss xmm1, [0xB7D470]
push ecx
mov ecx, [0x9E994C]
call 0x6F2D20
ret
in eine assembly.S datei oder so schreiben, dann mit
(Das würdest du halt mit cheat engine machen, oder dir irgendeinen anderen assembler suchen, oder einfach jetzt von mir die bytes kopieren).
Die bytes die links stehen schreibst du jetzt einfach mit WriteProcessMemory aus autoit in deinen speicher, dh. du würdest so ein Array hier erstellen:
std::function of a function returning an std::function 11/11/2013 - C/C++ - 19 Replies Nun muss ich nach langer Zeit auch mal wieder einen Thread erstellen, weil mir Google nicht mehr weiterhelfen kann.
Ich verzweifle an Folgendem Vorhaben:
#include <Windows.h>
#include <string>
#include <iostream>
using namespace std;
Need some help calling function for height 07/27/2011 - Perfect World - 2 Replies Hey there, for some reason I keep crashing upon trying to call this function and it's really pissing me off. I was wondering if somebody could give me some advice as to what I'm doing wrong :(
The function is being called inside a function starting at address 0x465730 in PWI
The function I'm looking for is called twice here, namely at 0x4657C7 and 0x465879. The code where it is called looks something like this:
http://img94.imageshack.us/img94/9867/coordfuncti on.png
Now, I'm...
Help, calling an ingame function 03/13/2010 - General Coding - 2 Replies Im trying with my dll to set off the "set stat function". The one that u press when you add a stat point to str, dex or what ever. My goal is to make players able to set there Stats to whatever they use to have from an earlier saved point. So if you play against different sort of mobs or players you reform your stats to be suetable for that sertan task in just 1 second right where you stand. Im thinking this is very useful for many ppl here.
So now i could use help with the actuall call of...
Help with calling this function! 03/13/2010 - 12Sky2 - 6 Replies First off: sorry for my poor english!
Im trying with my dll to set off the "set stat function". The one that u press when you add a stat point to str, dex or what ever. My goal is to make players able to set there Stats to whatever they use to have from an earlier saved point. So if you play against different sort of mobs or players you reform your stats to be suetable for that sertan task in just 1 second right where you stand. Im thinking this is very useful for many ppl here.
So now i...
Calling function in a game 03/29/2009 - General Coding - 1 Replies Hai guise,
I'm a stupid morron but how can I make a hook in c++ that will use Gameplay::GetMoney(); to return the current amount of Gold I have?
http://www.bilderkiste.org/show/original/0bba0c93 80a21de4810c1429cbc287c9/call.jpg