AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datei in ein Bytearray einlesen

Ein Thema von Linguini · begonnen am 20. Mai 2009 · letzter Beitrag vom 21. Mai 2009
Antwort Antwort
Seite 2 von 3     12 3      
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#11

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 11:33
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)
  Mit Zitat antworten Zitat
Linguini

Registriert seit: 19. Mai 2009
95 Beiträge
 
#12

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 12:05
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
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#13

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 12:31
du sollst dir da auch nur die entsprechende Funktion rauskopieren
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#14

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 12:32
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.
Fridolin Walther
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 12:34
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#16

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 12:50
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
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#17

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 12:58
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".
Fridolin Walther
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#18

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 13:08
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

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

MfG
  Mit Zitat antworten Zitat
Linguini

Registriert seit: 19. Mai 2009
95 Beiträge
 
#19

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 13:13
@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 =)
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#20

Re: Datei in ein Bytearray einlesen

  Alt 21. Mai 2009, 13:13
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:  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.
Fridolin Walther
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:25 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