![]() |
Auf Exports hin prüfen ohne DLL zu laden
Um zu verhindern das unnötige System Messagen angezeigt werden würde ich gerne die Exports prüfen
ohne die DLL mit LoadLibrary vorher zu laden. Hat da vielleicht jemand ein Code Schnipsel? (Man muss ja nicht alles neu erfinden) Wenn jemand falsche DLL's in meinem Ordner abgelegt hat und diese auch noch fehlerhaft sind dann nerven einfach die System Messagen die aufpoppen wenn ich diese vorher laden muss. EDIT: Hat sich erledigt hab ne Lösung gefunden! gruss |
AW: Auf Exports hin prüfen ohne DLL zu laden
na ja will euch die Lösung nicht verschweigen.
Delphi-Quellcode:
type
PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS; PIMAGE_EXPORT_DIRECTORY = ^IMAGE_EXPORT_DIRECTORY; function ImageNtHeader(Base: Pointer): PIMAGE_NT_HEADERS; stdcall; external 'dbghelp.dll'; function ImageRvaToVa(NtHeaders: Pointer; Base: Pointer; Rva: ULONG; LastRvaSection: Pointer): Pointer; stdcall; external 'dbghelp.dll'; procedure ImageExportedFunctionNames(const ImageName: string; NamesList: TStrings); var i: Integer; FileHandle: THandle; ImageHandle: THandle; ImagePointer: Pointer; Header: PIMAGE_NT_HEADERS; ExportTable: PIMAGE_EXPORT_DIRECTORY; NamesPointer: Pointer; Names: PAnsiChar; NamesDataLeft: Integer; begin //NOTE: our policy in this procedure is to exit upon any failure and return an empty list NamesList.Clear; FileHandle := CreateFile(PWideChar(ImageName),GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FileHandle=INVALID_HANDLE_VALUE then exit; try ImageHandle := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil); if ImageHandle = 0 then exit; try ImagePointer := MapViewOfFile(ImageHandle, FILE_MAP_READ, 0, 0, 0); if not Assigned(ImagePointer) then exit; try Header := ImageNtHeader(ImagePointer); if not Assigned(Header) then exit; if Header.Signature<>$00004550 then // "PE\0\0" as a DWORD. exit; ExportTable := ImageRvaToVa(Header, ImagePointer, Header.OptionalHeader.DataDirectory[0].VirtualAddress, nil); if not Assigned(ExportTable) then exit; NamesPointer := ImageRvaToVa(Header, ImagePointer, Cardinal(ExportTable.AddressOfNames), nil); if not Assigned(NamesPointer) then exit; Names := ImageRvaToVa(Header, ImagePointer, Cardinal(NamesPointer^), nil); if not Assigned(Names) then exit; NamesDataLeft := Header.OptionalHeader.DataDirectory[0].Size; for i := 0 to ExportTable.NumberOfNames-1 do begin NamesList.Add(string(Names)); // Locate the next name while (Names^<>chr(0)) and (NamesDataLeft>0) do begin inc(Names); dec(NamesDataLeft); end; inc(Names); end; finally UnmapViewOfFile(ImagePointer); // Ignore error as there is not much we could do. end; finally CloseHandle(ImageHandle); end; finally CloseHandle(FileHandle); end; end;
Delphi-Quellcode:
gruss
//Prüfroutine für Winamp-Plugins
function IsWinampPlugin(APlugin:string):LongBool; var ext : string; //dll : HMODULE; //Filename : string; Exported : TStringList; IntI : Integer; begin result := FALSE; ext := uppercase(ExtractFileExt(APlugin)); if (ext <> '.DLL') then exit; Exported := TStringList.Create; VisName := PWideChar(APlugin); ImageExportedFunctionNames(VisName, Exported); for IntI := 0 to Exported.Count - 1 do begin if (Exported.Strings[IntI] = 'winampVisGetHeader') then begin result := TRUE; break; end; end; Exported.Free; {Filename := uppercase(ExtractFileName(VisName)); // Nur DLL's laden mit vorhandenen VIS_ davor if not (LeftStr(Filename, 4) = 'VIS_') then exit; dll := LoadLibrary(VisName); if (dll = 0) then exit; if GetProcAddress(Dll, 'winampVisGetHeader') = nil then begin FreeLibrary(dll); exit; end; FreeLibrary(dll); result := TRUE; } end; |
AW: Auf Exports hin prüfen ohne DLL zu laden
Diese Funktion geht ohne Probleme unter 32Bit warum nicht mit 64Bit?
NamesPointer oder Names ist nil. Woran könnte es liegen? Eventuell das ich eine 32Bit DLL versuche mit einer 64Bit Anwendung auszulesen? Wenn ja dann ist es seltsam denn ich führe Sie ja gar nicht damit aus sondern will nur lesen ob der Einsprungs punkt vorhanden ist. (bsp. 'winampVisGetHeader') |
AW: Auf Exports hin prüfen ohne DLL zu laden
Hallo, ich vermute dass der PE Header für 64Bit Programme eine andere Sturktur hat. Da wirst Du wohl mal MSDN befragen müssen.
€: Ich habe dich falsch verstanden :-| Unter 64Bit wird die Word-Ausrichtung im Programm anders sein. Dein Record ist dann zu groß und ließt an der falschen Stelle. |
AW: Auf Exports hin prüfen ohne DLL zu laden
Zitat:
Denke sollte egal sein welchen PE Header die 64Bit hat. Damit lese ich nur aus. Oder? EDIT: Hmm.. Welcher Record? Kann mir nur vorstellen das einige Daten typen für 64Bit falsch sind.. aber welche :) Kompilieren läßt es sich ja. |
AW: Auf Exports hin prüfen ohne DLL zu laden
Zitat:
Der/die ersten PE-Header sind gleich. Dort steht dann auch drin, was die Binary bzw. PortableExecute für ein Format hat. (DOS, Win32, Win64 usw.) Und damit kannst du dann bestimmen welches DatenFormat die nachfolgenden Header/Strukturen haben. |
AW: Auf Exports hin prüfen ohne DLL zu laden
Zitat:
Eins davon schlägt immer fehl.
Delphi-Quellcode:
ExportTable := ImageRvaToVa(Header, ImagePointer, Header.OptionalHeader.DataDirectory[0].VirtualAddress, nil);
if not Assigned(ExportTable) then exit; NamesPointer := ImageRvaToVa(Header, ImagePointer, Cardinal(ExportTable.AddressOfNames), nil); if not Assigned(NamesPointer) then exit; Names := ImageRvaToVa(Header, ImagePointer, Cardinal(NamesPointer^), nil); if not Assigned(Names) then exit; |
AW: Auf Exports hin prüfen ohne DLL zu laden
Zitat:
Delphi-Quellcode:
Da stecken ja zwei Records dahinter. Wurden die nicht via
var
... Header: PIMAGE_NT_HEADERS; ExportTable: PIMAGE_EXPORT_DIRECTORY;
Delphi-Quellcode:
deklariert werden die wohl unter 64Bit eine andere Datenausrichtung haben.
packed record
Du könntest auch recht damit haben, das es Felder in den Records sind. PS: Ist immer wieder schön zu sehen das noch jemand mit den WinAmp Dlls rumspielt. |
AW: Auf Exports hin prüfen ohne DLL zu laden
Danke. Werde mal schauen wie ich das geregelt bekomme irgendwann fällt mir schon was ein :)
Mit den Plugins ist halt das Problem das diese alle 32Bitig sind bekanntlich kann man da ja auf normalen Wege 64Bit Anw.-> 32Bit.dll nichts machen. Aber wird schon. |
AW: Auf Exports hin prüfen ohne DLL zu laden
Das gibt dann aber noch mehr Probleme. Du musst die Funktionen ja dann auch geladen bekommen und der CPU füttern.
Ich würde mir wohl eine 32Bit exe schreiben mit der ich via IPC oder SharedMem rede. Das geht aber nur bei Sachen die nicht absolut zeitkritisch sind. Wenn ich das richtig sehe geht es dir um Visualisierung. Da sollte genug Luft für ein paar Millisekunden sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz