AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CopyMemory: Buffer in ein Array kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

CopyMemory: Buffer in ein Array kopieren

Ein Thema von Neotracer64 · begonnen am 10. Okt 2006 · letzter Beitrag vom 11. Okt 2006
Antwort Antwort
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#1

CopyMemory: Buffer in ein Array kopieren

  Alt 10. Okt 2006, 14:47
Ich versuche die Section Headers einer Portable Execuatble für Win32 in ein dafür geschaffenes Array zu kopieren.
Dies gehe ich wie folgt an:
(Code aufs relevante gekürzt)

Delphi-Quellcode:
var
  aFile : hFile;
  ofStruct : _OFSTRUCT;
  BytesRead : Cardinal;
  DosHeader : IMAGE_DOS_HEADER;
  NtHeader : IMAGE_NT_HEADERS;
  dwFileSize : DWORD;
  pmemory : Pointer;
  FirstSection : DWORD;
  SectionNum : DWORD;
  SectionHeaders : Array[1..20] of _IMAGE_SECTION_HEADER ; // Das besagte Array
  newSectionOffset : DWORD;

...
aFile := OpenFile(Pchar(Filename),ofStruct,OF_READ); // Execuatble öffnen
dwFileSize := GetFileSize(aFile,nil); // Größe rausfinden
...
ReadFile(aFile,DosHeader,SizeOf(DosHeader),BytesRead,nil) // DosHeader einlesen
...
SetFilePointer(aFile, DosHeader._lfanew, nil, FILE_BEGIN); // FilePointer an den Anfang des Ntheaders setzen
...
ReadFile(aFile,NtHeader,SizeOf(NtHeader),BytesRead,nil) // NtHeader einlesen
...
FirstSection := DosHeader._lfanew + sizeof(IMAGE_NT_HEADERS); // Addresse des ersten Sectionheaders
SectionNum := NtHeader.FileHeader.NumberOfSections; // Anzahl an Sections
pmemory := Pointer(GlobalAlloc(GMEM_FIXED or GMEM_ZEROINIT,dwFileSize)); //Speicher reservieren um die ganze Executable zu laden
SetFilePointer(aFile, 0, nil, FILE_BEGIN); // Filepointer auf Dateianfang
ReadFile(aFile,pmemory,dwFileSize,BytesRead,nil); // PE einlesen
Copymemory(@SectionHeaders,Pointer(Integer(pmemory)+FirstSection),SectionNum*SizeOf(_IMAGE_SECTION_HEADER));
//^^ Sectionheader einlesen
Mit der letzten CopyMemory-Anwesiung krachts. Und zwar gibt es dubiose read-Fehler an diversen Speicheraddressen.
Als Vorlage habe ich ein C++ Source, indem es wie folgt gelöst wurde:

Zitat von C++:
IMAGE_SECTION_HEADER image_section_header[MAX_SECTION_NUM];
...
CopyMemory(&image_section_header,pMem+dwRO_first_s ection,SectionNum*sizeof(IMAGE_SECTION_HEADER));
Also im Prinzip genauso.
Also hat einer eine Idee was schiefläuft?

Danke im Vorraus.
  Mit Zitat antworten Zitat
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#2

Re: CopyMemory: Buffer in ein Array kopieren

  Alt 11. Okt 2006, 16:39
Hat sich erledigt. *an den kopf schlag*

Delphi-Quellcode:
var
  aFile : hFile;
  ofStruct : _OFSTRUCT;
  BytesRead : Cardinal;
  DosHeader : IMAGE_DOS_HEADER;
  NtHeader : IMAGE_NT_HEADERS;
  dwFileSize : DWORD;
  pmemory : Pointer;
  FirstSection : DWORD;
  SectionNum : DWORD;
  SectionHeaders : Array[1..20] of _IMAGE_SECTION_HEADER ; // Das besagte Array
  newSectionOffset : DWORD;

...
aFile := OpenFile(Pchar(Filename),ofStruct,OF_READ); // Execuatble öffnen
dwFileSize := GetFileSize(aFile,nil); // Größe rausfinden
...
ReadFile(aFile,DosHeader,SizeOf(DosHeader),BytesRead,nil) // DosHeader einlesen
...
SetFilePointer(aFile, DosHeader._lfanew, nil, FILE_BEGIN); // FilePointer an den Anfang des Ntheaders setzen
...
ReadFile(aFile,NtHeader,SizeOf(NtHeader),BytesRead,nil) // NtHeader einlesen
...
FirstSection := DosHeader._lfanew + sizeof(IMAGE_NT_HEADERS); // Addresse des ersten Sectionheaders
SectionNum := NtHeader.FileHeader.NumberOfSections; // Anzahl an Sections
getMem(pmemory,dwFileSize); //Speicher reservieren um die ganze Executable zu laden -- ÄNDERUNG HIER!!!
SetFilePointer(aFile, 0, nil, FILE_BEGIN); // Filepointer auf Dateianfang
ReadFile(aFile,pmemory^,dwFileSize,BytesRead,nil); // PE einlesen -- ÄNDERUNG HIER!! pmemory^
Copymemory(@SectionHeaders,Pointer(Integer(pmemory)+FirstSection),SectionNum*SizeOf(_IMAGE_SECTION_HEADER));
//^^ Sectionheader einlesen
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:38 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