Programm soll mit DLL kommunizieren, welche in fremdem Prozess injiziert ist
-
Hey!
Ich habe eine DLL geschrieben, welche in einen fremden Prozess injiziert wird.
Nun möchte ich, dass mein Programm mit der DLL kommunizieren kann, genauer:Das Programm soll bestimmte Funktionen der DLL steuern.
Die DLL soll bestimmte Funktionen des Programms steuern.Also zB. soll das Programm DLLFunc() der DLL ausführen können. Weiters soll die DLL APPFunc() des Programmes ausführen können.
Wie macht man das?
MfG
-
Zuerst möchte ich wissen warum Du das willst?
Ansonsten würde ich Dir die Forum Suche mal anbefehlen. Dies ist in den letzten Tagen sooft behandelt worden, dass bestimmt auch was für Dich dabei ist.
PS: Dieses Forum mutiert zur Anfragestelle für Hooks und DLL Injezierung?
-
Die Suche funktioniert leider nicht so, wie man es sich erwartet. Weiters wüsste ich nicht, nach was ich suchen soll.
Warum ich das will? Weil ich es brauche...
Mein Programm soll steuern, was die injizierte DLL tun soll. Ob sie nun DLLFunc1() ausführt, oder DLLFunc2().
Und die DLL soll APPFunc1() oder APPFunc2() ausführen, damit mein Programm weiß, welches Ergebnis die DLL-Funktion erhalten hat.Ich denke es würde auch reichen, wenn mein Programm eine Variable in der DLL ändern kann (bool). Aber die DLL muss eine Funktion meines Programmes ausführen können.
MfG
-
übergebe der DLL- Funktion einen geeigneten Functionszeiger als Callback- Funktion.
Die DLL- Funktion kann diese rufen - mit geeigneten Parametern.
Die Callback- Funktion des aufrufenden Programmes kann gemaess der Parameter handeln.
-
Danke für den Tipp, aber dann könnte die DLL nur eine Funktion meines Programmes aufrufen, wenn es vorher umgekehrt passiert. Das ist schlecht.
Die DLL soll, wenn ein Ereignis in ihrem Code passiert, eine Funktion meines Programmes ausführen. Das muss dazu in meinem Fall leider sehr schnell gehen.MfG
-
-
Ein einfaches Beispiel dazu wäre toll.
Nochmals zum Verständnis: Ein Prozess ist fremd, in diesem wird nur meine DLL ausgeführt.MfG
-
ceplusplus@loggedoff schrieb:
Die DLL soll, wenn ein Ereignis in ihrem Code passiert, eine Funktion meines Programmes ausführen. Das muss dazu in meinem Fall leider sehr schnell gehen.
Hier knirscht es doch. Du musst den aktuellen Thread verlassen eine IPC Funkti0on ausführen auf das Ergebnis warten und dann erst weitermachen. Du kanst Dir vorstellen, dass dies nicht unbedingt schnell ist.
Schau Dir an, was Spy++ mit einer Applikation macht, wenn alle Nachrichten eines Fensters getraced werden.
Welchen Sinn soll diese Aktion haben?
-
ceplusplus@loggedoff schrieb:
Danke für den Tipp, aber dann könnte die DLL nur eine Funktion meines Programmes aufrufen, wenn es vorher umgekehrt passiert. Das ist schlecht.
Die DLL soll, wenn ein Ereignis in ihrem Code passiert, eine Funktion meines Programmes ausführen. Das muss dazu in meinem Fall leider sehr schnell gehen.MfG
Damit kannst Du Hunderte verschiedene Funktionen rufen.
Du musst nur passende Callback- Parameter festlegen/ übergeben.
Erster Paramer z.B. Funktionsnummer, die weiteren was passendes oder NULL.Du rufst zwar immer nur die eine Funktion, die kann aber dann die Funktion verteilen im Hauptprogramm.
Hab das mal in ner DLL gemacht, die ein Bild usmessen soll aber keine Oberfläche hat. Mit passenden Parmetern werden dann in einer Callback- Funktion die nötigen Mess- Koordinaten abgefragt. Die Eingabe der Koordinaten erfolgt dabei immer passend im Hauptprogramm in der visuellen Oberfläche.
Gruss
frank
-
Es geht nicht um Performance, aber es soll nicht Sekunden lang dauern...
Nochmals:
Mein Programm soll Variablen in einer DLL verändern können, welche in einem fremden Prozess ausgeführt wird (Funktion ausführen, welche die Variable verändert?).
Und die DLL soll unabhängig eine Funktion meines Programmes ausführen können.Wie mache ich das?
Wie kann mein Programm eine Funktion einer DLL ausführen, welche per CreateRemoteThread() in einen fremden Prozess geladen wurde?
Und wie kann die DLL, welche im fremden Prozess ausgeführt wird, eine Funktion meines Programmes ausführen?
Würde mir bitte jemand ein Codebeispiel geben...MfG
-
Die lösung ist wie o.g. IPC!
Vielleicht reicht ja schon eine COM-Artige message schleife...DLL:
//------------ DLL SERVER ---------------------------------------------------- LRESULT DllFunc1(); INT UserMessageId = 0; LRESULT CALLBACK DllMessageHandler(HWND hWnd, INT msg, WPARAM wParam, LPARAM lParam) { // Kein switch wg. nicht const UserMessageId if(msg == WM_CLOSE) PostQuitMessage(0); else if(msg == UserMessageId) return DllFunc1(); // MAGIE else return DefWindowProc(hWnd, msg, wParam, lParam); } void InitDllThread() { WNDCLASS cls1 = {0}; cls1.lpfnWndProc = DllMessageHandler; cls1.lpszClassName = _T("KlasseKlasse"); RegisterClass(&cls1); UserMessageId = RegisterWindowMessage("CallDllFunc1"); HWND hWnd = CreateWindow(_T("KlasseKlasse"), _T("WichtigerEindeutigerName"), 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); MSG msg; while(1) { if(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { if(msg == WM_QUIT) break; TranslateMessage(&msg); // Brauch man das überhaupt? DispatchMessage(&msg); } else Sleep(100); // Wir wollen die CPU nicht überhitzen // Könnten hier aber andere sachen machen(GetMessage // wäre auch möglich, wenn wir wirklich nichts wollen). } } LRESULT DllFunc1() { printf("Diese funktion wurde durch eine externe aufforderung aufgerufen!"); return 0; } //------------------------ CLIENT ------------------------------------------- int main(int argc, _TCHAR* argv[]) { INT UserMessageId = RegisterWindowMessage("CallDllFunc1"); HWND hWnd = FindWindow(_T("KlasseKlasse"), _T("WichtigerEindeutigerName")); // DllFunc1 aufrufen SendMessage(hWnd, UserMessageId, NULL, NULL); // Beenden der dll SendMessage(hWnd, WM_QUIT, NULL, NULL); }So ich hoffe nun, dass das richtig ist(ich hab das noch nie benutzt!).
-
Die bösen seiten des zu-faul-zum-einloggen-seins: Bei RegisterWindowMessage: _T vor den string!
Und der rückkanal funktionier ziemlich gleich, nur dass eben der client nun ein unsichtbares! fenster erstellt, und die dll SendMessge benutzt.
-
Danke erstmal, das werd ich beizeiten ausprobieren.
Aber, geht es nicht noch einfacher als dass die DLL und mein Programm jeweils ein unsichtbares Fenster erzeugen müssen?MfG
-
Named Pipes, oder sockets oder shared Memory.
Nur musst du bei den WindowMessages kein eigenes nachrichtenprotokoll etc. schreiben, was die arbeit schon erleichtern kann, aber was eigentlich kein problem ist.
-
Named pipes werde ich mir noch googeln, shared memory hört sich jedoch simpel an. Bekomme ich dazu ein einfaches Beispiel?
MfG
-
http://msdn2.microsoft.com/en-us/library/aa366551(VS.85).aspx
hier sollte alles stehen, nur dass du den zugriff auf das file mapping noch mit einem event/semaphore synchronisieren solltest.