nicht namentlich bekannte Funktionen aus einer DLL aufrufen
-
Hich hab für ein Projekt DLLs erzeugt die Code aus einer Anwendung heraus "Auslagern"
Die Funktionen in den DLLs sind alle vom gleichen Typ, nur haben sie unterschiedliche Namen.
Besteht eine Möglichkeit diese Namen herauszufunden? Denn GetProcAddress benötigt ja den Namen der Funktion? Also praktisch sowas wie tdump...
-
AntonWert schrieb:
Denn GetProcAddress benötigt ja den Namen der Funktion?
GetProcAddress () nimmt auch die Ordnungszahl einer Funktion :
// liefert Funktionsadresse mit der Ordnungszahl 0x0111 aus KERNEL32.DLL FARPROC fp = GetProcAddress (LoadLibrary("KERNEL32"),(LPCSTR)(0x0111));
-
Habe das eben mal ausprobieren wollen, aus:
GetProcAddress(dll, "_TestRoutine");habe ich
GetProcAddress(dll, (LPCSTR)(0x0000));gemacht, denn tdump lieferte mir:
Turbo Dump Version 5.0.16.4 Copyright (c) 1988, 1998 Borland International Display of File PROJECT2.DLL EXPORT ord:0000='_TestRoutine'Leider endete das ganze mit einer Zugriffsverletzung. Ist 0 nicht die Ordnungszahl? Wenn ja, wie komme ich an diese?
-
AntonWert schrieb:
Ist 0 nicht die Ordnungszahl?
tdump ohne Parameter aufgerufen liefert noch eine wichtige Information zur Ordnungszahl :
Turbo Dump Version 5.0.16.4 Copyright (c) 1988, 1998 Borland International Display of File KERNEL32.DLL (...) Exports from KERNEL32.dll 949 exported name(s), 949 export addresse(s). [b]Ordinal base is 1.[/b] [b]Ordinal[/b] RVA Name ------- -------- ---- 0000 0000a634 ActivateActCtx 0001 000392a3 AddAtomA 0002 00022469 AddAtomW 0003 0007096f AddConsoleAliasA 0004 00070931 AddConsoleAliasW (...) (!!! [b]Ordinal[/b] ist in dezimaler Schreibweise !!!)Für die Ordnungszahl gilt :
[b]Ordnungszahl = Ordinal + Ordinal base[/b]
-
Super, das war's
Hätte auch darauf kommen können 1 zu addieren 
Wenn Du dich so gut auskennst: besteht denn auch eine Möglichkeit die Anzahl der Funktionen herauszufinden? So wie es aussieht wird ja bei 1 begonnnen durchzunummerieren. Somit könnte man praktisch alle Funktionen nacheinander durchgehen.
-
AntonWert schrieb:
So wie es aussieht wird ja bei 1 begonnnen durchzunummerieren.
Nicht unbedingt. Wenn man eine DLL erstellt, kann man den Linker so einstellen, dass die "Ordinal base" auch grösser 1 ist.
AntonWert schrieb:
besteht denn auch eine Möglichkeit die Anzahl der Funktionen herauszufinden ?
Die steht im Dump als " xxx export addresse(s)".
-
AntonWert schrieb:
besteht denn auch eine Möglichkeit die Anzahl der Funktionen herauszufinden ?
Die steht im Dump als " xxx export addresse(s)".
Schon aber ich dachte jetzt an mein eigenes Programm, tdump ausühren und die Daten auswerten ist ein etwas umständlicher Weg. Wie macht denn tdump dies eigentlich?
-
TDUMP kennt das PE-Format und kann es analysieren. Formatspezifische Informationen dazu findest du z.B. hier, so daß du dir, wenn dir das nicht zu viel Aufwand ist, einen solchen Parser selbst schreiben kannst.
-
AntonWert schrieb:
Schon aber ich dachte jetzt an mein eigenes Programm, tdump ausühren und die Daten auswerten ist ein etwas umständlicher Weg.
Umstand gegen Umstand :
// Ermittelt die Anzahl aller Funktionen in einer zur Laufzeit geladenen DLL // !!! Enthält kein Fehlerhandling !!! DWORD ImageAddr = (DWORD) LoadLibrary ("WSOCK32"); IMAGE_DOS_HEADER MZHeader = *(IMAGE_DOS_HEADER *) (ImageAddr); IMAGE_NT_HEADERS PEHeader = *(IMAGE_NT_HEADERS *) (ImageAddr + MZHeader.e_lfanew); IMAGE_EXPORT_DIRECTORY EDHeader = *(IMAGE_EXPORT_DIRECTORY *)(ImageAddr + PEHeader.OptionalHeader.DataDirectory[0].VirtualAddress); DWORD AnzahlNamen = EDHeader.NumberOfNames; // tdump -> "xxx exported name(s)" DWORD AnzahlFunktionen = EDHeader.NumberOfFunctions; // tdump -> "xxx export adresse(s)" DWORD OrdinalBase = EDHeader.Base; // tdump -> "Ordinal base"Und das ist erst der Anfang.