Dll: Reihenfolge der „Ordinal“ und „hint“ – Werte beeinflussen



  • Hallo Leute,

    zur Ansteuerung einer Hardware mit einer kommerziellen Software (die bisher kein Interface für diese Hardware aufweist) über ein DLL, habe ich zur genaueren Analyse einer ähnlichen, schon existierenden Dll zunächst eine Proxy Dll gebaut. Das Ganze schien für andere Dll zunächst auch gut zu funktionieren, jedoch wird in diesem speziellen Fall eine Funktion von der Software nicht gefunden, obwohl diese von der Proxy Dll exportiert wird. Ein Vergleich der Dumpbin /exports Ausgabe offenbart folgendes:
    proxy DLL:

    ordinal hint RVA name
    1 0 000115B4 _CopyOptionsA = @ILT+1455(_func0@0)
    2 1 000115AF _CopyOptionsB = @ILT+1450(_func1@0)
    3 2 00011596 _FileSettingsC = @ILT+1425(_func2@0)
    ...
    209 D0 000114E2 _ShowAQ8 = @ILT+1245(_func208@0)
    211 D1 0001132A _SignalAExQ12 = @ILT+805(_func210@0)
    210 D2 0001151E _SignalAChangedQ8 = @ILT+1305(_func209@0)
    212 D3 000112CB _SingleABCQ8 = @ILT+710(_func211@0)
    ...

    Original DLL:

    ordinal hint RVA name
    1 0 00007DA0 _CopyOptionsA
    2 1 00007FB0 _CopyOptionsB
    3 2 00007D40 _FileSettingsC
    ….
    209 D0 00003E60 _ShowAQ8
    210 D1 00005330 _SignalAChangedQ8
    211 D2 00005350 _SignalAExQ12
    212 D3 00007690 _SingleABCQ8

    Leider stürzt die Software mit einer Fehlermeldung ab, dass der Einstiegspunkt “_ SignalAChangedQ8” nicht gefunden wurde. Der einzige Unterschied zwischen dem Original und der proxy Dll ist die Reihenfolge der exportierten Funktionen anhand der „ordinal“ Zahl, sowie die Reihenfolge von „hint“.

    Original:

    Ordinal 210 entspricht hint D1
    Ordinal 211 entspricht hint D2

    Proxy Dll:

    Ordinal 211 entspricht hint D1
    Ordinal 210 entspricht hint D2

    Hier noch ein Auszug aus dem DEF- File der proxy Dll:
    _ShowAQ8 = func208 @209
    _SignalAChangedQ8 = func209 @210
    _SignalAExQ12 = func210 @211
    _SingleABCQ8 = func211 @212

    Obwohl ich jetzt nicht wirklich weiß, ob die veränderte Reihenfolge der exportierten Funktionen in der selbstgebauten Dll die Fehlermeldung verursacht, würde ich gerne für Versuchszwecke auf diese Reihenfolge Einfluss nehmen wollen.
    Kann mir jemand eine Tipp geben ?

    MfG.


  • Mod

    Wird die Fehlermeldung von Windows Lader gemeldet oder ist das eine individuelle Medlung aus der Software.

    Vielleicht erwartet die Software bestimmten Code an der Stelle der Funktion, z.B. als Schutz.

    Zu Deiner Frage kan ich nichts sagen.



  • Hallo Martin,

    vielen Dank für Deine Antwort. Vermutlich werden die Fehlermeldungen von der benannten Software generiert (keine Windows Lader).
    Das Kernproblem scheint mir die Reihenfolge der exportierten Funktionen zu sein – eigentlich werden die Funktionen immer in der Reihenfolge der Ordinal- Zahlen exportiert (so zumindest meine Beobachtung).
    Nur hier kommt aus welchen Gründen auch immer, die 211 vor der 210. So etwas ist mir bisher noch nicht passiert.

    MfG



  • Hallo Leute,

    beim Herumexperimentieren habe ich gefunden, dass die Reihenfolge der exportierten DLL- Funktionen an Hand der hint- Nummer sich weder nach den Ordinalzahlen, noch nach der Reihenfolge der Funktionen im Def – File richtet, sondern nach den Namen der exportierten Funktionen selbst:

    ordinal hint RVA name
    209 0 00011127 _a = @ILT+290(_func208@0)
    210 1 00011131 _b = @ILT+300(_func209@0)
    211 2 000110FF _c = @ILT+250(_func210@0)
    212 3 000110F0 _d = @ILT+235(_func211@0)

    ordinal hint RVA name
    212 0 000110F0 _a = @ILT+235(_func211@0)
    211 1 000110FF _b = @ILT+250(_func210@0)
    210 2 00011131 _c = @ILT+300(_func209@0)
    209 3 00011127 _d = @ILT+290(_func208@0)

    Beinflussbar scheint diese Reihenfolge zumindest auf MS Ebene nicht zu sein. Die hint- Nummer ist allerdings für den erfolgreichen Import der Dll-Funktionen in bestimmten Fällen von Bedeutung.

    MfG.



  • Also ich behaupte mal dass die hint Nummer eine Erfindung von Dependency-Walker ist.
    Nach meinem Kenntnissstand sind auf jeden Fall nur die Export-Nummer und der Export-Name von Bedeutung.




  • Mod

    Dem letzten beiden Artikeln von dot entsprechend müsste man davon ausgehen. dass hier evtl. ein Fehler in DumpBin für Unterschiede sorgt.

    Liegen die Exports offensichtlich ja in einer Tabelle linear und die Ordnale sind nichts anderes als die Slot Adresse.



  • Mit viel Handarbeit kann man die nummerische Ordnung der exportierten Funktionen beeinflussen:
    Datei A:
    ordinal hint RVA name
    11 A 00011046 _DialogQ12 = @ILT+65(_func10@0)
    13 B 00011064 _InitAllQ8 = @ILT+95(_func12@0)
    12 C 00011069 _InitQ8 = @ILT+100(_func11@0)
    14 D 000110B4 _OptionsDialogQ12 = @ILT+175(_func13@0)

    Die Funktion _InitQ8 wurde im Def File nach _IniaQ8 umbenannt, wodurch die formale nummerische Ordnung hergestellt ist:

    Datei B:
    ordinal hint RVA name
    11 A 00011046 _DialogQ12 = @ILT+65(_func10@0)
    12 B 00011069 _IniaQ8 = @ILT+100(_func11@0)
    13 C 00011064 _InitAllQ8 = @ILT+95(_func12@0)
    14 D 000110B4 _OptionsDialogQ12 = @ILT+175(_func13@0)

    Mit einem guten HEX Editor einfach das „a“ in _IniaQ12 wieder gegen ein „t“ tauschen:

    Datei C:
    ordinal hint RVA name
    11 A 00011046 _DialogQ12 = @ILT+65(_func10@0)
    12 B 00011069 _InitQ8 = @ILT+100(_func11@0)
    13 C 00011064 _InitAllQ8 = @ILT+95(_func12@0)
    14 D 000110B4 _OptionsDialogQ12 = @ILT+175(_func13@0)

    In Datei C wird die Funktion „_InitQ8“ schließlich gefunden. Der binäre Vergleich der beiden Dateien A & C ergibt keine, für mich bemerkenswerte Unterschiede - außer, dass in A:
    _DialogQ12._InitAllQ8._InitQ8._OptionsDialogQ12.

    und in C:
    _DialogQ12._InitQ8._InitAllQ8._OptionsDialogQ12.

    steht.
    Offensichtlich spielt die Reihenfolge also eine entscheidende Rolle beim Importieren von Dll Funkionen durch bestimmte Software.

    MfG.



  • Das ist wohl keine gute Idee, denn die Export Table muss afaik eben sortiert sein, da der Loader Symbole über eine Binärsuche in der Export Table auflöst. Wie in den verlinkten Artikeln erklärt, ist der Import über Ordinalzahl nicht unbedingt eine gute Idee...


Anmelden zum Antworten