1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| function VAllocMem(Size: Integer): Pointer; begin Result := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE); end;
procedure VFreeMem(var P); begin VirtualFree(Pointer(P), 0, MEM_FREE); end;
function PEFile.OpenPeFile(Filename: String):Boolean; var aFile : hFile; ofStruct : _OFSTRUCT; BytesRead : Cardinal; begin result := FALSE; aFile := OpenFile(Pchar(Filename),ofStruct,OF_READ); if(GetLastError<>0) then showmessage(SysErrorMessage(GetLastError)); dwFileSize := GetFileSize(aFile,nil); If aFile <> 0 Then begin If ReadFile(aFile,DosHeader,SizeOf(DosHeader),BytesRead,nil) Then begin If DosHeader.e_magic = IMAGE_DOS_SIGNATURE Then begin SetFilePointer(aFile, DosHeader._lfanew, nil, FILE_BEGIN); If ReadFile(aFile,NtHeader,SizeOf(NtHeader),BytesRead,nil) Then begin result := True; FirstSection := DosHeader._lfanew + sizeof(IMAGE_NT_HEADERS); SectionNum := NtHeader.FileHeader.NumberOfSections; pmemory:=VAllocMem(dwFileSize); SetFilePointer(aFile, 0, nil, FILE_BEGIN); ReadFile(aFile,pmemory^,dwFileSize,BytesRead,nil); Copymemory(@SectionHeaders,Pointer(Integer(pmemory)+FirstSection),SectionNum*SizeOf(_IMAGE_SECTION_HEADER)); end; end; end; end; CloseHandle(aFile); end; |