DLL Injection -> Funktion aus externem Programm nutzen (c++)

11/02/2011 18:10 MaxMilimeter#1
Huhu allerseits,
ich habe da eine relativ simple Frage, auf die ich bei Google einfach keine Antwort finde. Undzwar möchte ich eine Funktion, die sich im Opferprogramm (das Programm in das die DLL injiziert wird) befindet, mit meinen eigenen Argumenten aufrufen. Ziel ist es in einem MMORPG die Send Funktion zu nutzen, ohne diese nachbauen zu müssen.

Habe es mal mit inline ASM probiert, also mein Paket in das Register geschrieben und die entsprechende Funktion gecalled. Mein Spiel stürzte daraufhin ab. Allerdings konnte ich im Debugger meine eigene Funktion nicht finden um sie anschließend Schritt für Schritt zu debuggen, wie komm ich an die Adresse?

War mein Ansatz richtig und wenn nicht, wie ich so etwas mit C++ realisieren?

Danke im Voraus,
MaxMilimeter
11/02/2011 20:11 Medix#2
Ist problemlos realisierbar . Ist aber unschön mit inline asm. Würde aber inline asm vermeiden wenn es sich um standard calling conventions handelt. Ist eigentlich ziemlich simpel du musst nur in der lage sein folgende sachen zu reversen:

*Adresse der Funktion
*Calling Convention
*Argumente der Funktion

sagen wir du hast folgende Funktion reversed (richtige calling convention,richtige reihenfolge der argumente und den rückgabewert)
Code:
void __stdcall SendPacket(int length,BYTE* pPacket);
Adresse:
Code:
0xDEADBEEF
dann:
Code:
 typedef void (__stdcall *tSendPacket)(int length,BYTE* pPacket);
tSendPacket SendPacket = (tSendPacket)(0xDEADBEEF);
jetzt kannst du die funktion einfach so in deinem code aufrufen:

Code:
SendPacket(length,pPacket);
Wenns crashed:
*Calling convention nochmal überprüfen
*Funktionsadresse überprüfen
*Reihenfolge der Argumente überprüfen

habs ausm kopf geschrieben daher kein anspruch auf richtigkeit :D.
11/03/2011 21:00 MaxMilimeter#3
Hey Medix,
ich danke dir für die Codeschnipsel und deine Tipps. Habe mir ein einfaches Programm geschrieben um das Prinzip mal auszuprobieren und es hat funktionert. Werd' mich demnächst dann ransetzen und versuchen die echte Sendfunktion aus meiner DLL heraus zu callen.

Edit: Achja, hast ein e bei typdef vergessen. Der richtige Code lautet typedef, ist aber nicht weiter schlimm. ^^