Type convertierung / Funktionspointer to DWORD (Functionsaddr)

06/28/2011 12:38 Xenox3#1
Hey liebe Coder,

Ich habe ein kleines Umsetzungsproblem in einem meiner Programme.

Ich versuche die Addr einer Funktion in DWORD zu speichern.

Code:
class Beispiel
{
public:
void Funktion();
};

void Beispiel::Funktion()
{
     DWORD Ptr2Func = &Beispiel::Funktion; <- so ;)

}
In einen FunktionsPointer die Addr der Funktion zu speichern ist für mich kein Problem aber die Addr einer Funktion in DWORD zu konvertieren funktioniert nicht :/. Mit der Funktion (DWORD) GetProcessAddr() funktioniert das ganze einwandfrei... :(
Meine Variante ist derzeit etwas unschön. Hoffe mir kann einer helfen ;).

Vielleicht ist meine Frage auch wieder zu leicht für alle und ich Noob komm wieder nicht drauf ;)
06/28/2011 18:01 MrSm!th#2
Das liegt daran, dass Funktionspointer für Klassen anders funktionieren als normale.
Es wird soweit ich weiß nur ein Offset gespeichert und Funktionspointer für Klassen lassen sich auch wirklich nur in jenen Speichern, nicht in anderen Typen wie DWORD.

Korrigiert mich, wenn ich das falsch in Erinnerung habe :o
06/28/2011 19:09 Xenox3#3
ich versuche das ganze assembler übergreifend machen.

Code:
006254E0  /$  83EC 10       SUB ESP,10                               ;Meine funktion in assembler/Memory
006254E3  |.  53            PUSH EBX
006254E4  |.  56            PUSH ESI
006254E5  |.  8BF1          MOV ESI,ECX
006254E7  |.  8B86 40030000 MOV EAX,DWORD PTR DS:[ESI+340]
006254ED  |.  85C0          TEST EAX,EAX
.
.
.
Nun versuche ich die Addr 0x06254E0 herausfinden.

Bisher schaff ich das nur so:
Code:
void (MemoryClass::*pt2Func)();
pt2Func = &MemoryClass::CheckState;
char buf[250];
sprintf(buf,"Hier ist die Funktionsaddr %x",pt2Func);
Jedoch kann ich pt2Func nicht in DWORD konvertieren.
Ich könnte nun zwar den HexString in DWORD konvertieren jedoch finde ich das etwas unschön...
06/28/2011 21:08 MrSm!th#4
Versuch es doch so:

Erstell nen Pointer, der auf den Pointer zeigt, caste den und dereferenziere dann.
So kann man auch float in DWORD casten, ohne dass einfach der Wert ohne die Nachkommastellen konvertiert wird (sprich einfach alle bytes werden 1:1 kopiert):

Code:
DWORD addr = (DWORD)(*((DWORD**)(&method_ptr)));
Das sollte eigentlich gehen, da ein Pointer auf nen Pointer (egal welche Größe letzterer hat) ja auf 32bit Maschinen immer 32bit haben sollte und dementsprechend auch konvertiert können werden sollte.