![]() |
Datei in ein Bytearray einlesen
Hi,
eine ganz kurze Frage :D Wie kann ich eine Datei in ein Byte Array (TByteArr = Array of Byte) einlesen? Ich bräuchte nur einen kleinen Schubs in die richtige Richtung der verwendeten Unit/Funktion. Danke Linguini |
Re: Datei in ein Bytearray einlesen
reicht das schon als Schups? ;)
Delphi-Quellcode:
FileStream.Read(MyByteArray[0], Length(MyByteArray));
|
Re: Datei in ein Bytearray einlesen
Falls ne, dann *tritt,fg*:
Delphi-Quellcode:
type TByteArr = Array of Byte;
function ReadIn( const Filename: String ): TByteArr; var f: File of Byte; Err: String; begin if not FileExists(Filename) then Exit; {$i-} AssignFile( F, Filename ); Reset( F ); SetLength( Result, FileSize(F) ); BlockRead( F, Result[0], Length(Result) ); CloseFile( F ); {i-} Err := SysErrorMessage( IOResult ); if Err <> 0 then MessageBoxA( Handle, pChar( 'Error [' + IntToStr(IOResult) + ']'#13#10#13#10+Err ), 'Error', MB_OK or MB_ICONERROR ); end; |
Re: Datei in ein Bytearray einlesen
Es will leider immer noch nicht funktionieren =/
Ich versuche den Entrypoint eines Programmes herauszufinden, dazu benutze ich die Unit aus ![]()
Delphi-Quellcode:
Zwischen den Klammern will der ein : FileData:TByteArr; var P: TParameters
EntryPoint := PeUtils.GetEntryPoint();
Ich dachte ich mach das einfach mit:
Delphi-Quellcode:
Nur leider will das auch nicht...
PeUtils.GetEntryPoint(ReadIn(FileName))
[DCC Fehler] MeinProgramm.pas(3285): E2010 Inkompatible Typen: 'PEUtils.TByteArr' und 'MeinProgramm.TByteArr' Linguini |
Re: Datei in ein Bytearray einlesen
Liegt einfach nur daran das TByteArray an 2 verschiedenen Stellen definiert ist. Selbst wenn sie exakt gleich definiert sind bekommst du diese Meldung.
Warum hast du es eigentlich doppelt definiert? Wenn es bereits in PEUtils definiert ist, ist es doch überflüssig es noch einmal zu definieren. |
Re: Datei in ein Bytearray einlesen
Frag ich mich auch... :D
Delphi-Quellcode:
_File : TByteArr;
_File := ReadIn(fileName); PEUtils.GetEntryPoint(@_File,P) ;
Code:
Wie muss ich den 2. Übergabewert also P: Tparameters definieren?
FileData:TByteArr; var P: TParameters
Der 1. also FileData sollte jetzt ja stimmen. |
Re: Datei in ein Bytearray einlesen
seit wann gibt es eigentlich
Delphi-Quellcode:
und warum nicht gleich überall dieses verwenden?
// Types.pas
TByteDynArray = array of Byte; [add] na genauso wie es dasteht?
Delphi-Quellcode:
ist in GetEntryPoint FileData wirklich als Pointer definiert (sieht nicht so aus)
var _File: TByteArr;
P: TParameters; _File := ReadIn(FileName); PEUtils.GetEntryPoint(_File, P); // bzw.: PEUtils.GetEntryPoint(ReadIn(FileName), P); und wenn nicht, warum dann @_File? |
Re: Datei in ein Bytearray einlesen
Delphi-Quellcode:
Prozedur:
_File : TByteArr;
P: TParameters; PEUtils.GetEntryPoint(ReadIn(fileName), P) ;
Delphi-Quellcode:
Leider enthalte ich damit immer bei "P.EntryPoint := PCardinal( @FileData[P.PE_Offset+$28] )^;" eine Exception:
procedure GetEntryPoint( FileData: TByteArr; var P: TParameters );
begin P.EntryPoint := PCardinal( @FileData[P.PE_Offset+$28] )^; end;
Code:
Irgendwo ist noch der Wurm drin...
Erste Gelegenheit für Exception bei $7C812AFB. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00476ED9 in Modul 'PhosGenPro.exe'. Lesen von Adresse FF930040'. Prozess PhosGenPro.exe (1488)
In "fileName" liegt der Pfad zu der Datei. ReadIn ist die Prozedur, die mr_emre_d in diesem Thread bereits gepostet hat. Danke für eure super Hilfe bisher =) |
Re: Datei in ein Bytearray einlesen
Es darf auch gerne jemand Alternativen vorschlagen, um den EntryPoint und die ImageBase herauszufinden, falls es welche gibt^^
@Problem Vielleicht gibt es ein Problem mit der ReadIn Prozedur? |
Re: Datei in ein Bytearray einlesen
@Linguini: Bitte unterlasse zukünftig das pushen innerhalb von 24 Stunden :)
![]() |
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] )^;
|
Re: Datei in ein Bytearray einlesen
Da hast du recht.
Es war blöd von mir - vorallem bei einem Tutorial - so einen schlampigen Code geschrieben zu haben. Tut mir leid :P Falls der Wunsch besteht, einen nicht so schlampigen Quellcode zu veröffentlichen, dann kann ich dem evt. nachgehen. MfG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 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