![]() |
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:
Mit der letzten CopyMemory-Anwesiung krachts. Und zwar gibt es dubiose read-Fehler an diversen Speicheraddressen.
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 Als Vorlage habe ich ein C++ Source, indem es wie folgt gelöst wurde: Zitat:
Also hat einer eine Idee was schiefläuft? Danke im Vorraus. :) |
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