Funktion aus injecteter .dll über eine .exe aufrufen

Hi,

ich habe eine .dll, in der sich eine Funktion befindet, in der inline asm enthalten ist. Diese .dll injecte ich mit einem in c++ geschriebenen Injector. Die Funktion wird auch korrekt ausgeführt, aber nur einmal beim injecten eben. Jetzt möchte ich die Funktion aus der .dll über eine .exe oder z.B. über den Injector ausführen, und das nicht nur wenn die .dll injected wird.

Wie stelle ich so etwas an? Ich dachte da ein eine Art dllimport in meine .exe, um von dort aus die Funktion einfach aufrufen zu können, doch so einfach ist das ja leider nicht. Ist so etwas überhaupt so einfach möglich? Google spuckt mir leider nichts hilfreiches aus.

MfG
 
Zuletzt bearbeitet:
ich versteh nicht zu 100%, was du vor hast. nen programmgrundgerüst wär sicher hilfreich, um das besser nachvollziehen zu können.

ich vermute mal, dein injector lädt die dll mit CreateRemotethread(bla,bla,bla,LoadLibrary,ptrToName,bla,bla) in irgendeinen prozess. dabei wird erstmal die dllMain ausgeführt.
ich versteh noch nicht ganz, wo dann ne exportierte funktion aus der dll ausgeführt wird.
gibt da mehrere möglichkeiten:

  • aufruf aus dllMain (einmalig)
  • dllMain erzeugt nen Thread, der die funktion gelegentlich ausführt
  • aufrufe werden in den prozesscode gepatcht
  • die funktion wird über den injector mit CreateRemoteThread im prozess ausgeführt
 
ich habe 3 Datein:

- Injector.exe
- hook.dll
- Spiel.exe

Die in der hook.dll vorhandenen Funktion welche aus inline-asm code besteht, lade ich mithilfe meiner Injector.exe in ein Spiel (Spiel.exe), dort wird meine Funktion aus der hook.dll einmalig beim injecten aufgerufen/ausgeführt.

Nun möchte ich diese Funktion aus der hook.dll aber beliebig oft aufrufen, und das, indem ich sie von meiner Injector.exe aus aufrufe.

Ist das einfach via dllimport oder ähnlichem möglich oder welche Möglichkeiten gibt es da?


hier noch zum leichteren verständnis meine .dll

Code:
#include <windows.h>
#include "blub.h"

int __stdcall DllMain(_In_ void * _HDllHandle, _In_ unsigned _Reason, _In_opt_ void * _Reserved)
{
	if(DLL_PROCESS_ATTACH == _Reason)
	{
		Funktion (blub, bla)
	}
	return 1;
}

meine injector.exe, sieht aus wie jeder andere normale injector auch... und dann ist da eben noch das Spiel, indem ich die .dll mit der injector.exe injecte.
 
Zuletzt bearbeitet:
das entspricht also dem 4. punkt in meiner liste.

am einfachsten geht das so:

für die funktion nen wrapper bauen, der die signatur DWORD func(DWORD) hat. dann kannst du sie ganz easy mit CreateRemoteThread aufrufen, ohne dass du vorher noch die paramter allocen musst.
nachster schritt ist dann in injector.exe die funktion mit CreateRemoteThread aufrufen. dazu musst du dir erstmal die adresse besorgen. die moduladresse der dll solltest du dir beim injecten schon gespeichert haben. da addierst du dann noch das funktionsoffset drauf und dann solltest du sie aufrufen können.
 
hmm so in etwa dachte ich mir das auch schon, dachte nur es gibt einen leichteren weg, meine funktion mit den parametern vom Injector aus direkt aufzurufen, so wie es bei einem dllimport möglich ist, also einfach direkt von meiner Injector.exe aus

Code:
 Funktion (5, 3);

aufzurufen.

trotzdem vielen dank für deine hilfe
 
eine frage habe ich noch dazu,
ich rufe meine injectete .dll funktion nun mit CreateRemoteThread auf. Die Funktion enthält ein Parameter also z.B. void Test (int Zahl).
Wie gesagt rufe ich mit CreateRemoteThread auf, und übergebe noch dazu den Parameter int Zahl, in hex also z.B. (LPVOID)0x4, für die dezimal zahl 4.

Die Funktion wurde durch die Injection mit der Zahl 8 vorher aufgerufen. Wenn ich jetzt die Funktion mit CreateRemoteThread mit 4 aufrufe, wird die Funktion trotzdem mit 8 aufgerufen, anstatt mit 4. Was ist ist jetzt das Problem?
 
ohne den aufrufcode und die funktion hab ich dazu leider keine idee.

btw. ist es dem compiler egal, ob du konstanten in hexadezimal, dezimal oder oktal eingibst. der code der rauskommt ist immer der gleiche.
 
Zurück
Oben