Frage

Meine Frage ist nicht genau das gleiche wie dieses (es ist nicht theoretisch ist, gibt es nur ein Hauptgewinde ohne Nachrichtenschleife, InitInstance und ExitInstance sind keine pass Anrufe).

Ich verwende eine Konsolenanwendung ohne Nachrichtenschleife; Diese App lädt eine exe mit der Funktion Loadlibrary, so dass sie ihre exportierten Funktionen nutzen können. Schlechte Nachrichten: die DllMain Funktion der exe nicht aufgerufen wird (und ich überprüft die Symbole Tabellen, eine def-Datei, DllMain richtig angezeigt wird); der Doc sagt es, wenn das geladene Modul ist eine DLL (auch genannt schlecht).

Was sind die Bedingungen (falls vorhanden), die zur Ausführung des DllMain-Funktion des exe führen könnte, wenn Loadlibrary aufgerufen wird (und vielleicht auch wieder, wenn Freelibrary genannt wird)?

Mit freundlichen Grüßen

War es hilfreich?

Lösung

Die naheliegendste Bedingung ist, dass der Prozess Loadlibrary () aufrufen explizit bekommt GetProcAddress ( „DllMain“) und nennt es dann.

Andere Tipps

Die Bedingungen sind:

1) Binary Wesen geladen wurde als DLL kompiliert (wenn gcc / ld verwenden bedeutet es --shared Option; Wenn Sie --shared verwenden, Datei führt eine DLL sein wird, und werden nicht ausgeführt, siehe unten)

2) IMAGE_FILE_DLL wird in PE-Datei-Header der Binärdatei gesetzt geladen werden. Wenn es gesetzt ist, ist Datei eine DLL und Windows-Linker wird für Sie seine DllMain() Funktion aufrufen, wenn es diese Datei in Ihrem Programm verknüpft (egal, wie es verknüpft ist - LoadLibrary() zur Laufzeit oder -llibraryname bei der Kompilierung). Dazu muss die Datei genügt auch (1). Aber mit dieser Flagge die Binärdatei nicht ausführbar sein, geladen wird. Wenn IMAGE_FILE_DLL nicht gesetzt ist, DllMain() wird nicht aufgerufen werden, wenn die Datei in das Programm geladen wird.

Kompilieren dll mit --shared und dann manuell entfernen IMAGE_FILE_DLL von seinem Header (dh durch Hex-Editor) wird nicht funktionieren - wenn Sie es ausführen, wird nur DllMain() ausgeführt werden, und fdwReason wird eine nicht definierte Anzahl (0x28ffd4 sein auf meinem Maschine).

Aktualisieren

Alle DLL und EXE-Dateien auf Windows sind PE-Dateien, ist der Unterschied, wie sie miteinander verbunden sind, und welche Flags sind in ihren Header gesetzt. Deshalb habe ich file being loaded schreiben, nicht dll being loaded.

Der letzte Absatz beschreibt auch das Szenario, in dem Sie die Datei als dll kompilieren, und es dann in exe drehen, indem sie mit ihrem Header Messing. Es funktioniert nicht.

Naming hat nichts damit zu tun (Sie einen beliebigen Namen wählen können, und mit etwas pexports + dlltool bastelt können Sie eine Importbibliothek für eine EXE-Datei erstellen und in der Lage als -lexenamewithoutextension zu verknüpfen

Zur Klarstellung:

  • , wenn Sie es ohne --shared kompilieren:
    • IMAGE_FILE_DLL nicht darin festgelegt werden, es runnable sein wird, aber DllMain () nicht aufgerufen werden, wenn Sie es verbinden.
  • , wenn Sie es mit --shared kompilieren:
    • IMAGE_FILE_DLL wird darin festgelegt werden, wird es nicht ausführbar sein, aber DllMain () wird aufgerufen, wenn Sie es verbinden.
  • , wenn Sie es ohne --shared kompilieren, wechseln dann auf die IMAGE_FILE_DLL Flagge in manuell:
    • es wird NICHT mehr runnable sein, und kein DllMain () wird aufgerufen, wenn Sie es verbinden.
  • , wenn Sie es mit --shared kompilieren, dann schalten Sie in den IMAGE_FILE_DLL Flag manuell:
    • wird es runnable, aber DllMain () anstelle von main () ausgeführt werden, und DllMain () nicht aufgerufen werden, wenn Sie es verbinden.

Tatsächlich ist die Bezeichnung „DllMain“ der Funktion von Windows-vollständig ignoriert wird (die alte Windows-API-Dokumentation von Windows NT 3.x dies ausdrücklich angegeben).

Wenn eine DLL nicht die Funktion DllMain geladen wird (), aber die Funktion, die in der Datei Eintrittspunkt befindet heißt.

Natürlich ist der Linker die DLL-Datei in einer Weise erstellen, dass DllMain () ist diese Funktion.

Doch für EXE-Dateien, die Entry-Funktion (das ruft WinMain ()) am Eintrittspunkt befindet.

Es ist also offensichtlich, dass Windows kann diese Funktion nicht aufrufen, wenn die EXE-Datei als DLL geladen werden.

die gute Antwort von MSalters Abschließen :

So, dann rufen Sie den „fake“ DllMain mit DLL_XXX_ATTACH kurz nach LoadLibrary- und den mit DLL_XXX_DETACH kurz vor Free, und manuell den anderen Anrufen tätigen.

Eine weitere folgende Implementierung eine Schnittstelle DLL zu erstellen und laden wäre, der auf seiner gefälschten DllMain automatisch die EXE-Rückruf könnte (ich weiß nicht, ob es funktionieren kann); aber es kann komplizierter sein als nur manuell die gefälschte DllMain in einer Reihe von Fällen aufrufen. (kann nicht Loadlibrary in einem DllMain)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top