Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CopyMemory: Buffer in ein Array kopieren (https://www.delphipraxis.net/78743-copymemory-buffer-ein-array-kopieren.html)

Neotracer64 10. Okt 2006 14:47


CopyMemory: Buffer in ein Array kopieren
 
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:

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. :)

Neotracer64 11. Okt 2006 16:39

Re: CopyMemory: Buffer in ein Array kopieren
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 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