Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei in ein Bytearray einlesen (https://www.delphipraxis.net/134374-datei-ein-bytearray-einlesen.html)

brechi 21. Mai 2009 11:33

Re: Datei in ein Bytearray einlesen
 
Schau dir mal die

ReadLibrary Funktion der uallKernel von http://uall.cheat-project.com/uallCollection/

da wird eine DLL/EXE von Platte geladen und der EP ausgelesen, das solltest du übernehmen können (direkt über CreateFileA, alterantiv kannst du auch file of byte oder filestream nehmen)

Linguini 21. Mai 2009 12:05

Re: Datei in ein Bytearray einlesen
 
Delphi 2009 findet angeblich ein paar Fehler in der uallKernel.pas.

Code:
[DCC Fehler] uallKernel.pas(1468): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'
[DCC Fehler] uallKernel.pas(1473): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'
[DCC Fehler] uallKernel.pas(1475): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'
[DCC Fehler] uallKernel.pas(1569): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'
[DCC Fehler] uallKernel.pas(1574): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'
[DCC Fehler] uallKernel.pas(1576): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'
Daher kann ich das (im Moment) leider nicht benutzen.

Vielleicht hat jemand ja Zeit und Lust sich die PEUtil Unit anzuschaun :D

brechi 21. Mai 2009 12:31

Re: Datei in ein Bytearray einlesen
 
du sollst dir da auch nur die entsprechende Funktion rauskopieren

Fridolin Walther 21. Mai 2009 12:32

Re: Datei in ein Bytearray einlesen
 
Die imagehlp.dll scheint immer noch ein gut gehütetes Geheimnis zu sein, obwohl sie selbst bei Windows 95 und NT4 schon an Bord ist ...
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  imagehlp, windows;

function GetEntrypointOfFile(Filename : AnsiString) : Cardinal;
var
  Image : TLoadedImage;
begin
  Result := 0;
  if MapAndLoad(PAnsiChar(Filename), nil, @Image, false, true)
    then
      begin
        result := Image.FileHeader^.OptionalHeader.AddressOfEntryPoint;
        UnMapAndLoad(@Image);
      end;
end;

begin
  writeln(ParamStr(0), ' --> ', GetEntrypointOfFile(AnsiString(ParamStr(0))));
  readln;
end.

himitsu 21. Mai 2009 12:34

Re: Datei in ein Bytearray einlesen
 
Einfach mal einiges ersetzten und schauen ob's läuft
Char > AnsiChar
PChar > PAnsiChar
String > PAnsiString
die WinAPI-Fuktionen von xyz(...) nach xyzA(...) ändern

und hoffen, daß intern nicht noch ein paar andere Funktionen genutzt werden, welche jetzt auch Wide-Versionen sind.

mr_emre_d 21. Mai 2009 12:50

Re: Datei in ein Bytearray einlesen
 
Die Funktion GetEntryPoint verlangt ein ByteArr. welches das ganze Image enthält.

Dh. du musst zuerst einmal eine Variable vom Typ TByteArr definieren;
dann lädst du die Image-Datei rein. Anschließend übergibts du der Funktion die
verlangten zwei Parameter und bekommst ein EntryPoint zurückgeliefert.

Der zweite Parameter ist eine Struktur, deren Aufbau du dir in der Unit anschauen kannst.

Wie du schon siehst, wird in der eigentlich GetEntryPoint Routine das PE_Offset Element benötigt - Dazu musst du vorher noch GetPEOffset() aufrufen.

Bevor du jedoch irgendetwas mit dem ByteArr-Image anstellst, prüf nach ob es eine Valide (Exe)Image Datei ist (->ValidateEXEFile und ValidatePEFile müssen beide True zurückliefern).

Viel Glück

EDIT:
Delphi-Quellcode:
function easyGetEntryPoint(Filename: String): Cardinal; // für dich vereinfachte form
var
  F: File of Byte;
  RawFileData: TByteArr;
  PEParams: TParameters;
begin
  Result := INVALID_HANDLE_VALUE;
  if not FileExists( Filename ) then
    Exit;
  // -Einlesen
  AssignFIle( F, Filename );
  Reset( F );
  SetLength( RawFileData, FileSize( F ) );
  BlockRead( F, RawFileData[0], Length(RawFileData) );
  CloseFile( F );
  // -Validieren
  if not ValidateExeFile( RawFileData ) then
    Exit;
  FillChar( PEParams, SizeOf(PEParams), 0 );
  GetPEOffset( RawFileData, PEParams );
  if not ValidatePEFile( RawFileData, PEParams.PE_Offset ) then
    Exit;
  // EntryPoint ermitteln
  GetEntryPoint( RawFileData, PEParams );
  SetLength( RawFileData, 0 );
  Result := PEParams.EntryPoint;
end;
MfG

Fridolin Walther 21. Mai 2009 12:58

Re: Datei in ein Bytearray einlesen
 
Der PEUtils.pas Code ist übrigens grausam. Du weißt schon das für die kompletten PE Header Konstrukte Strukturen (MSDN-Library durchsuchenIMAGE_FILE_HEADER, MSDN-Library durchsuchenIMAGE_OPTIONAL_HEADER) existieren, oder? Genauso frag ich mich grad wozu der Aufwand mit dem Array? In den meisten Fällen castest Du den eh zu irgend nem Pointer. Da kannst die Datei gleich direkt mappen und den Pointer auf die gemappte Datei rumreichen. Sehr sehr unschön das Ganze.

Und weils mir grad aufgefallen ist: ValidatePE überprüft auf das falsche Magic. Das richtige Magic ist "PE\0\0".

mr_emre_d 21. Mai 2009 13:08

Re: Datei in ein Bytearray einlesen
 
Zitat:

Zitat von 0xF30FC7
Der PEUtils.pas Code ist übrigens grausam. Du weißt schon das für die kompletten PE Header Konstrukte Strukturen (MSDN-Library durchsuchenIMAGE_FILE_HEADER, MSDN-Library durchsuchenIMAGE_OPTIONAL_HEADER) existieren, oder?

Weiß ich :lol:

Nur zu dieser Zeit wusste ich es nicht.
Außerdem finde ich es besser, wenn man es sich selbst aufbaut. Dann lernt man eben durch das Recherchieren alle Elemente kennen :P

MfG

Linguini 21. Mai 2009 13:13

Re: Datei in ein Bytearray einlesen
 
@mr_emre_d

<3
Vielen Dank für deine Hilfe und deine Geduld ;)
Das gilt natürlich auch für alle anderen.

Ich denke das Ermitteln der ImageBase bekomm ich nun allein hin =)

Fridolin Walther 21. Mai 2009 13:13

Re: Datei in ein Bytearray einlesen
 
Zitat:

Zitat von mr_emre_d
Außerdem finde ich es besser, wenn man es sich selbst aufbaut. Dann lernt man eben durch das Recherchieren alle Elemente kennen :P

Ja, nur baut man dann nicht sowas:
Delphi-Quellcode:
  P.EntryPoint := PCardinal( @FileData[P.PE_Offset+$28] )^;
Irgendwelche Konstanten zu haben ist immer übel. Wenn Du schon keine eigene Struktur bauen wolltest, dann wäre wenigstens das Definieren einer Konstante sinnvoll gewesen (const PE_ENTRYPOINT_OFFSET = $28), die man im Code dann verwendet. Jemand. der die PE-COFF Spec jetzt nicht unbedingt im Kopf oder neben sich liegen hat, wird niemals wissen, was die Konstante da ist und wozu sie gut ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr.
Seite 2 von 3     12 3      

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