|
You last visited: Today at 16:24
Advertisement
ASM Funktion in C als Function Pointer schreiben
Discussion on ASM Funktion in C als Function Pointer schreiben within the C/C++ forum part of the Coders Den category.
06/01/2013, 02:25
|
#1
|
elite*gold: 14
Join Date: May 2011
Posts: 2,671
Received Thanks: 818
|
ASM Funktion in C als Function Pointer schreiben
Hallo, ich bin gerade dabei, eine reverste ASM Funktion in C als Function Pointer zu schreiben.
Die Funktion:
Code:
CPU Disasm
Address Hex dump Command Comments
00467CB0 /. 8B0D C8966E00 MOV ECX,DWORD PTR DS:[6E96C8]
00467CB6 |. 8B41 04 MOV EAX,DWORD PTR DS:[ECX+4]
00467CB9 |. 8B50 10 MOV EDX,DWORD PTR DS:[EAX+10]
00467CBC |. 83C1 04 ADD ECX,4
00467CBF |. 6A 0B PUSH 0B
00467CC1 |. FFD2 CALL EDX
00467CC3 |. 894424 08 MOV DWORD PTR SS:[ESP+8],EAX
00467CC7 |. C74424 04 E4F MOV DWORD PTR SS:[ESP+4],0064F8E4
00467CCF \.- FF25 D0E76400 JMP DWORD PTR DS:[<&python22.Py_BuildValue>]
6E96C8 ist also demnach der class ptr und CALL EDX müsste der Aufruf der Memberfunction sein.
Eigentlich sollte die Function (soll den Geldstand des Spielers zurück geben) keine Parameter nehmen (wüsste nicht welche), was also ist das "PUSH 0B"?
Habe bereits versucht, EDX zu dereferenzieren, allerdings crashed so direkt das Spiel:
Code:
pGetMoney = (GetMoney_t) (*(DWORD*) (*(DWORD*) (ADR_CLASS_GETMONEY + 0x4)) + 0x10);
Mein typedef sieht so aus:
Code:
typedef int (__thiscall *GetMoney_t) (void *_this);
Und so rufe ich den Geldstand ab:
Code:
int money = pGetMoney((void*) ADR_CLASS_GETMONEY);
Wo liegt denn das Problem? :/
|
|
|
06/01/2013, 10:34
|
#2
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Wieso dereferenzierst du bis auf den Wert, der als erstes an der Funktion steht? Du hast die Adresse schon mit dem +0x10, dereferenzierst du ein weiteres Mal, liest du an ihr aus und da der Code sehr wahrscheinlich keine Readwrite Protection gesetzt hat, stürzt es dir mit einer Access Violation ab.
|
|
|
06/01/2013, 11:27
|
#3
|
elite*gold: 14
Join Date: May 2011
Posts: 2,671
Received Thanks: 818
|
Alles klar, das Spiel crashed jetzt nicht mehr direkt nach/während der dref, sondern erst beim Aufruf der Funktion.
dref:
Code:
pGetMoney = (GetMoney_t) ((*(DWORD*) (ADR_CLASS_GETMONEY + 0x4)) + 0x10);
Und Aufruf:
Code:
if (GetAsyncKeyState(VK_NUMPAD1) & 1)
{
int money = pGetMoney((void*) *(DWORD*) ADR_CLASS_GETMONEY);
char szBuffer[256];
sprintf(szBuffer, "Money [%d]", money);
MessageBoxA(NULL, szBuffer, "Debug", NULL);
}
|
|
|
06/01/2013, 14:12
|
#4
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Quote:
*(DWORD*) ADR_CLASS_GETMONEY
|
Warum dereferenzierst du den Pointer auf das Objekt und castest es in einen Pointer? Lass die Dereferenzierung weg, wenn die Funktion einen Pointer erwartet, es ist doch schon einer oO Hast du überhaupt eine Ahnung, wie man mit Pointern umgeht? :f
Ansonsten sind falsche Calling Conventions ein beliebter Crashgrund.
|
|
|
06/01/2013, 14:34
|
#5
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,480
Received Thanks: 3,319
|
Für dich ist ja der Bereich hier relevant:
Code:
MOV ECX,DWORD PTR DS:[6E96C8]
MOV EAX,DWORD PTR DS:[ECX+4]
MOV EDX,DWORD PTR DS:[EAX+10]
ADD ECX,4
PUSH 0B
CALL EDX
In meinen Augen muss man das dann so für die Funktion aufbereiten:
Code:
typedef unsigned long* DWORD_PTR;
typedef int (*GetMoney_t)(void *t, int param);
GetMoney_t pGetMoney = nullptr;
DWORD_PTR ecx = reinterpret_cast<DWORD_PTR>(*reinterpret_cast<DWORD_PTR>(0x6E96C8));
DWORD_PTR eax = reinterpret_cast<DWORD_PTR>(*(ecx + 0x4));
DWORD_PTR edx = reinterpret_cast<DWORD_PTR>(*(eax + 0x10));
pGetMoney = reinterpret_cast<GetMoney_t>(edx);
pGetMoney(ecx + 0x4 /* this-Pointer */, 0x0B);
Gerade mal mit Clang compiled, das geht schonmal, aber vor allem der Aufruf der Funktion scheint bei dir inkorrekt zu sein, da ja noch 4 Bytes ins ECX-Register addiert werden und der Parameter (push 0Bh) fehlt.
Korrigiert mich, falls ich falsch liege.
|
|
|
06/01/2013, 14:44
|
#6
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Hat er alles drin, sein Fehler liegt in der Dereferenzierung des Parameters. Und ja, stimmt, das push 0Bh fehlt auch.
|
|
|
|
Similar Threads
|
[HOW TO] Mit AutoIT Hacks schreiben mit Pointer!
03/08/2015 - Coding Tutorials - 25 Replies
<<TUTORIAL>>
Mit AutoIT Hacks schreiben mit Pointer!
=> Was wollen wir machen?
Wir wollen einen Hack programmieren z.b. für 4Story!
Der beim Drücken des On Buttons den Wert aus der Inputbox liest und sich die Farbe der Graphic auf Grün ändert. Beim drücken des Off Buttons ändert sich der Wert wieder auf den Ursprünglichen Wert.
=> Wie geht es los?
Mit einer einfachen GUI man kan aber auch Hacks programmieren ohne GUI aber ich zeige euch hier mit GUI.
|
VB.net Frage zum Pointer schreiben
04/02/2013 - General Coding - 9 Replies
Hallo ich habe ein Problem und zwar habe ich jetzt für ein Spiel mit Visual Basic 2010 Express etwas geschrieben und zwar einen Pointer. Er nimmt den Prozess, sucht die Adresse die ich angegeben habe und ändert die Value in meine angegebene Value.
Nur leider klappt das nicht weil das Spiel ein Hackschild nutzt was den kompletten Prozess versteckt. Somit findet VB den Prozess nicht, was kann man dagegen tun?
Game Guard wird als Schutz verwendet...
Mit freundlichen Grüßen...
|
[HILFE] CE Pointer in Autoit schreiben
02/02/2013 - AutoIt - 0 Replies
Guten Morgen Leute,
ich wollte heute anfangen zu lernen, wie man die Pointer von CE in Autoit richtig einügt. Ein paar Tut habe ich mir schon angeguckt, allerdings habe ich noch viele Fragen dazu. Es wäre sehr nett wenn mir jemand helfen könnte, am besten über Skype.
Skype: framewhere
Mfg. -*
|
[Autoit]Pointer auslesen/schreiben
02/22/2011 - AutoIt - 8 Replies
hallo ich versuch derzeit es hinzubekommen mit au3 pointer auszulesen.
dazu benutzt ich die
Improved _Mem() UDF's - AutoIt Forums
und dementsprechend
_MemoryPointerWrite
das beispiel an dem ich es versuche is der 8te abschnitt des offieziellen ce tuts,
ich hab den static pointer und entsprechend die offsets
das pw dafür ist
|
Quest funktion jede minute was schreiben
02/27/2010 - Metin2 Private Server - 4 Replies
Hallo,
Suche die Funktion für eine quest damit die quest ein befehl jede minute ausführt.
Bitte..leute es ist echt wichtig.
Danke
|
All times are GMT +2. The time now is 16:24.
|
|