|
You last visited: Today at 08:37
Advertisement
CheatEngine Function Calling + in AutoIt übernehmen
Discussion on CheatEngine Function Calling + in AutoIt übernehmen within the General Coding forum part of the Coders Den category.
04/27/2019, 18:39
|
#1
|
elite*gold: 5
Join Date: Mar 2008
Posts: 460
Received Thanks: 436
|
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.
Viele Grüße,
Swarn
|
|
|
04/27/2019, 19:24
|
#2
|
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 573
|
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:
Code:
(gdb) info proc mappings
process 112443
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x555555554000 0x555555555000 0x1000 0x0 /home/frederic/a.out
0x555555555000 0x555555556000 0x1000 0x1000 /home/frederic/a.out
0x555555556000 0x555555557000 0x1000 0x2000 /home/frederic/a.out
0x555555557000 0x555555558000 0x1000 0x2000 /home/frederic/a.out
0x555555558000 0x555555559000 0x1000 0x3000 /home/frederic/a.out
0x7ffff7dcf000 0x7ffff7df1000 0x22000 0x0 /usr/lib/libc-2.28.so
0x7ffff7df1000 0x7ffff7f3c000 0x14b000 0x22000 /usr/lib/libc-2.28.so
0x7ffff7f3c000 0x7ffff7f88000 0x4c000 0x16d000 /usr/lib/libc-2.28.so
0x7ffff7f88000 0x7ffff7f89000 0x1000 0x1b9000 /usr/lib/libc-2.28.so
0x7ffff7f89000 0x7ffff7f8d000 0x4000 0x1b9000 /usr/lib/libc-2.28.so
0x7ffff7f8d000 0x7ffff7f8f000 0x2000 0x1bd000 /usr/lib/libc-2.28.so
0x7ffff7f8f000 0x7ffff7f95000 0x6000 0x0
0x7ffff7fce000 0x7ffff7fd1000 0x3000 0x0 [vvar]
0x7ffff7fd1000 0x7ffff7fd3000 0x2000 0x0 [vdso]
0x7ffff7fd3000 0x7ffff7fd5000 0x2000 0x0 /usr/lib/ld-2.28.so
0x7ffff7fd5000 0x7ffff7ff4000 0x1f000 0x2000 /usr/lib/ld-2.28.so
0x7ffff7ff4000 0x7ffff7ffc000 0x8000 0x21000 /usr/lib/ld-2.28.so
0x7ffff7ffc000 0x7ffff7ffd000 0x1000 0x28000 /usr/lib/ld-2.28.so
0x7ffff7ffd000 0x7ffff7ffe000 0x1000 0x29000 /usr/lib/ld-2.28.so
0x7ffff7ffe000 0x7ffff7fff000 0x1000 0x0
0x7ffffffde000 0x7ffffffff000 0x21000 0x0 [stack]
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
|
|
|
04/28/2019, 14:21
|
#3
|
elite*gold: 5
Join Date: Mar 2008
Posts: 460
Received Thanks: 436
|
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:
Code:
movss xmm2,[B7D478]
movss xmm1,[B7D470]
push ecx
mov ecx,[9E994C]
call 6F2D20
ret
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?
|
|
|
04/28/2019, 17:54
|
#4
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|
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.
|
|
|
04/28/2019, 18:27
|
#5
|
elite*gold: 5
Join Date: Mar 2008
Posts: 460
Received Thanks: 436
|
Quote:
Originally Posted by th0rex
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.
Da wäre ein Beispiel ganz nett
|
|
|
04/28/2019, 18:50
|
#6
|
elite*gold: 46
Join Date: Oct 2010
Posts: 782
Received Thanks: 525
|
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
Code:
nasm -felf32 assembly.S && objdump -d assembly.o
folgendes kriegen:
Code:
00000000 <_start>:
0: f3 0f 10 15 78 d4 b7 movss 0xb7d478,%xmm2
7: 00
8: f3 0f 10 0d 70 d4 b7 movss 0xb7d470,%xmm1
f: 00
10: 51 push %ecx
11: 8b 0d 4c 99 9e 00 mov 0x9e994c,%ecx
17: e8 1c 2d 6f 00 call 6f2d38 <_start+0x6f2d38>
1c: c3 ret
(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:
Code:
[0xf3, 0x0f, 0x10, 0x15, 0x78, 0xd4, 0xb7, 0x00, 0xf3, 0x0f, 0x10, 0x0d, 0x70, 0xd4, 0xb7, 0x00, 0x51, 0x8b, 0x0d, 0x4c, 0x99, 0x9e, 0x00, 0xe8, 0x1c, 0x2d, 0x6f, 0x00, 0xc3]
und das dann in den Speicher schreiben.
|
|
|
04/28/2019, 18:54
|
#7
|
elite*gold: 5
Join Date: Mar 2008
Posts: 460
Received Thanks: 436
|
Werd ich mal versuchen klingt logisch für mich mal schauen ob ichs hinkrieg
Okay ich hab's nun hinbekommen, ging fast wie gewollt.
Lediglich die Call Funktion musste ich etwas abändern, da sich dieser OP-Code immer ändert, hab ich aber dennoch hinbekommen und es funktioniert  .
Für alle die vll mal drüberstolpern hier der AutoIt Code:
Code:
Func _Inject_Function()
Local $push_dword = 0x68
Local $call = 0xE8
Local $return=0xC2
Local $Push_ebp = 0x55
Local $MovEbpEsp = 0xEC8B
Local $MovEspEbp = 0xE58B;MOV ESP,EBP
Local $Pop_ebp = 0x5D
Local $AddESP = 0xC483
Local $MovEcx = 0x0D8B
Local $Aktuell = 0
$FunctionCTM=0x6F2D20
$Object=0x9E994C
;ASM Funktion die abgebildet werden soll
;movss xmm2,[B7D478]
;movss xmm1,[B7D470]
;push ecx
;mov ecx,[9E994C]
;Call 6F2D20
;ret
;OP-Code für movss-Float Parameter + mov ecx:
Local $CTM_OPCode[23] = [0xf3, 0x0f, 0x10, 0x15, 0x78, 0xd4, 0xb7, 0x00, 0xf3, 0x0f, 0x10, 0x0d, 0x70, 0xd4, 0xb7, 0x00, 0x51, 0x8B, 0x0D, 0x4C, 0x99, 0x9E, 0x00]
;Speicher frei machen
$AllocAdresse = _MemVirtualAllocEx ($HPID[1],0,29,$MEM_COMMIT ,$PAGE_EXECUTE_READWRITE)
$Aktuell=$AllocAdresse
;Float Parameter "movss" hinzufügen via OPCode aus CE kopiert.
For $i = 0 To UBound($CTM_OPCode)-1
_MemoryWrite($Aktuell,$HPID,$CTM_OPCode[$i],"byte")
$Aktuell+=1
Next
;Function Call
_MemoryWrite($Aktuell,$HPID,$call,"byte")
$Aktuell+=1
$offsetToCall=0x6F2D20-(Number ($Aktuell)+4)
_MemoryWrite($Aktuell,$HPID,$offsetToCall,"dword")
$Aktuell+=4
;Return
_MemoryWrite($Aktuell,$HPID,$return,"byte") ;RETN
$Aktuell+=1
EndFunc
|
|
|
 |
Similar Threads
|
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
|
All times are GMT +1. The time now is 08:37.
|
|