Export-Funktion von dll-Ordnungszahl nur nicht die Funktion zum ausblenden der Namen

In Visual Studio, ich will export-Funktion von dll-Ordnungszahl nur. In der Quelle, die ich definieren Funktion:

int my_function() { return 101; }     //without declspec(dllexport)

In der .def-Datei:

LIBRARY MyDll
    EXPORTS
        my_function @ 1 NONAME        //NONAME, export directory will not contain function name

Im Hauptprogramm verwende ich es wie folgt:

#pragma comment(lib, "MyDll.lib")

declspec(dllimport) int my_function();

int main(int argc, char* argv[])
{
    int a = my_function();

    return 0;
}

Den code kompiliert und links in Ordnung. NONAME Attribut wird dokumentiert, um export-Funktion von Ordnungszahl nur.

Export-Verzeichnis von MyDll hat NumberOfNames auf null gesetzt, so dass dll selbst enthält keine Informationen zu Namen. Exe-Datei-Import-Funktion von ordinalen Wert, also exe-Datei auch nicht enthalten-name-Informationen.

Ich habe versucht, verschiedene Konfigurationen (debug, release), noch Programm-links in Ordnung. Vielleicht lib-Datei enthält eine Art mapping zwischen Funktionsnamen und die Ordinalzahlen? Ich habe gelesen, dass die lib-Datei enthält eine Funktion thunks, damit wir etwas haben, wie dieses auch in lib-Datei:

my_function @ 1:
    jmp IAT[0]
my_another_function @ 2:
    jmp IAT[1]

– Und in-Datei exe-Datei-import-Tabelle:

OriginalFirstThunk           FirstThunk
 0x80000001 (@ 1)          0x80000001 (@ 1)   //ordinal 1 will go through IAT[0]
 0x80000002 (@ 2)          0x80000002 (@ 2)   //ordinal 2 will go through IAT[1]

– Und in-memory-exe-Datei-import-Tabelle:

OriginalFirstThunk           FirstThunk
 0x80000001 (@ 1)             IAT[0]
 0x80000002 (@ 2)             IAT[1]

Wenn ja, dann, um zu verbergen, Funktion name, den wir bieten sollten, nur dll-Datei, und das bedeutet, dass Benutzer benötigen, um zu laden dll mit LoadLibrary und verwenden GetProcessAddress? Was ich hier vermisst?

  • Wenn der code kompiliert und verlinkt fein, dann was genau ist Ihre Frage?
  • Ich will wissen, warum es links fein in der Erwägung, dass es nicht sein sollte.
  • „Ich habe gelesen, dass die lib-Datei enthält eine Funktion thunks“ – das ist nicht wahr.
  • was genau in Frage ?
  • Warum wir immer noch sind in der Lage, rufen Sie die Funktion mit gekennzeichnet NONAME, indem Sie seinen Namen?
  • Vielleicht sollte ich gesagt haben, „stubs“ statt „thunks“. Von lib-Datei meine ich die dll-import-Bibliothek.
  • Es scheint, dass der linker legt Namen Informationen in Bibliothek importieren, selbst wenn wir angeben, NONAME-Attribut. „dumpbin /exports MyDll.lib“ zeigen Ordinalzahl und der name.

InformationsquelleAutor igntec | 2016-12-28



One Reply
  1. 0

    Vom Exportieren von Funktionen aus einer DLL von Ordinalen und nicht nach Namen auf der MSDN-Website:

    Wenn Sie wollen zu optimieren Ihrer DLL-Datei Größe, die NONAME-Attribut für jede exportierte Funktion. Mit dem NONAME-Attribut, die Ordnungszahlen werden gespeichert in der DLL export-Tabelle anstelle der Funktionsnamen. Dies kann eine erhebliche Einsparungen erzielen, wenn Sie exportieren eine Vielzahl von Funktionen.

    In anderen Worten, NONAME betrifft nur die DLL nicht die Bibliothek importieren. Also das Verhalten, man beobachtet wird, als gedacht.

    Aus der Dokumentation für den EXPORT:

    Dem optional-Schlüsselwort PRIVATE wird verhindert, dass entryname wird in der import-Bibliothek generierten LINK.

    Also, wenn Sie sowohl für PRIVATE als auch NONAME sollte man die Ergebnisse, die Sie wollen. Aber diese Niederlagen der Zweck, eine import-Bibliothek in den ersten Platz, zumindest so weit wie diese Funktion geht. Es könnte nützlich sein, wenn Sie möchten, dass einige Funktionen, die aufgerufen werden kann über die import-Bibliothek, und einige, die nur zugegriffen werden kann, über GetProcAddress.

    Bevorzugen Sie vielleicht bieten einen alias für die Funktion, die die end-Benutzer können zu link, um es, z.B.,

    LIBRARY MyDll
        EXPORTS
            function1=my_function @ 1 NONAME
            function2=my_other_function @ 2 NONAME
    

    Dieser sollte den fake-Namen „function1“ und „function2“ in die Bibliothek importieren, so dass die end-Benutzer können eine Verknüpfung zu den Funktionen, die mit diesen Namen, während immer noch versteckt die geheimen Namen „my_function“ und „my_other_function“ sowohl in der import-Bibliothek und DLL. (Nicht, dass ich verstehe, warum die Namen müssen geheim sein in den ersten Platz, aber YMMV.)

    Disclaimer: ich habe nicht versucht, diese selbst, diese Antwort ist ausschließlich auf der Grundlage der Dokumentation.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.