Einzelnen Beitrag anzeigen

Neotracer64

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

CopyMemory: Buffer in ein Array kopieren

  Alt 10. Okt 2006, 15: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