![]() |
Re: Datei in ein Bytearray einlesen
Schau dir mal die
ReadLibrary Funktion der uallKernel von ![]() 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) |
Re: Datei in ein Bytearray einlesen
Delphi 2009 findet angeblich ein paar Fehler in der uallKernel.pas.
Code:
Daher kann ich das (im Moment) leider nicht benutzen.
[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' Vielleicht hat jemand ja Zeit und Lust sich die PEUtil Unit anzuschaun :D |
Re: Datei in ein Bytearray einlesen
du sollst dir da auch nur die entsprechende Funktion rauskopieren
|
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. |
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. |
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:
MfG
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; |
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 (
![]() ![]() Und weils mir grad aufgefallen ist: ValidatePE überprüft auf das falsche Magic. Das richtige Magic ist "PE\0\0". |
Re: Datei in ein Bytearray einlesen
Zitat:
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 |
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 =) |
Re: Datei in ein Bytearray einlesen
Zitat:
Delphi-Quellcode:
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.
P.EntryPoint := PCardinal( @FileData[P.PE_Offset+$28] )^;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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