AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Auf Exports hin prüfen ohne DLL zu laden
Thema durchsuchen
Ansicht
Themen-Optionen

Auf Exports hin prüfen ohne DLL zu laden

Ein Thema von EWeiss · begonnen am 25. Nov 2013 · letzter Beitrag vom 12. Jul 2021
Antwort Antwort
Seite 1 von 3  1 23      
EWeiss
(Gast)

n/a Beiträge
 
#1

Auf Exports hin prüfen ohne DLL zu laden

  Alt 25. Nov 2013, 17:25
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

Geändert von EWeiss (25. Nov 2013 um 18:26 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 25. Nov 2013, 21:35
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:
//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;
gruss

Geändert von EWeiss (25. Nov 2013 um 21:37 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 11:52
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')

Geändert von venice2 (12. Jul 2021 um 12:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
680 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 12:32
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.

Geändert von Sinspin (12. Jul 2021 um 12:35 Uhr)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 12:35
Hallo, ich vermute dass der PE Header für 64Bit Programme eine andere Sturktur hat. Da wirst Du wohl mal MSDN befragen müssen.
Hmm.. Es ist kein 64Bit Programm sondern eine 32Bit.DLL die ich mit einem 64Bit Programm auslesen will.
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.

Geändert von venice2 (12. Jul 2021 um 12:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 13:30
Hmm.. Es ist kein 64Bit Programm sondern eine 32Bit.DLL die ich mit einem 64Bit Programm auslesen will.
Denke sollte egal sein welchen PE Header die 64Bit hat. Damit lese ich nur aus. Oder?
Nein, natürlich nicht.

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 13:37
Hmm.. Es ist kein 64Bit Programm sondern eine 32Bit.DLL die ich mit einem 64Bit Programm auslesen will.
Denke sollte egal sein welchen PE Header die 64Bit hat. Damit lese ich nur aus. Oder?
Nein, natürlich nicht.

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.
Hmm.. Schwierig.
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;

Geändert von venice2 (12. Jul 2021 um 13:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
680 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 14:02
Hmm.. Welcher Record?
Kann mir nur vorstellen das einige Daten typen für 64Bit falsch sind.. aber welche
Kompilieren läßt es sich ja.
Delphi-Quellcode:
var
...
  Header: PIMAGE_NT_HEADERS;
  ExportTable: PIMAGE_EXPORT_DIRECTORY;
Da stecken ja zwei Records dahinter. Wurden die nicht via packed record deklariert werden die wohl unter 64Bit eine andere Datenausrichtung haben.
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#9

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 14:07
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
680 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Auf Exports hin prüfen ohne DLL zu laden

  Alt 12. Jul 2021, 14:32
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz