Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:24

  • Please register to post and access all features, it's quick, easy and FREE!

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.

Reply
 
Old   #1
 
elite*gold: 14
The Black Market: 108/0/1
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? :/
vwap is offline  
Old 06/01/2013, 10:34   #2


 
MrSm!th's Avatar
 
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.
MrSm!th is offline  
Old 06/01/2013, 11:27   #3
 
elite*gold: 14
The Black Market: 108/0/1
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);
        }
vwap is offline  
Old 06/01/2013, 14:12   #4


 
MrSm!th's Avatar
 
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.
MrSm!th is offline  
Old 06/01/2013, 14:34   #5

 
snow's Avatar
 
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.
snow is offline  
Old 06/01/2013, 14:44   #6


 
MrSm!th's Avatar
 
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.
MrSm!th is offline  
Reply


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.