В общем понадобилось находить начало и размер оверлея в ехе-файлах для дальнейших манипуляций (импорт\экспорт),
придумал такое: глянуть данные последней секции и определить её конец (PointerToRawData + SizeOfRawData), дальше вроде идёт оверлей.
Я ничего не упустил в данном методе? или есть получше\проще варианты?
Код:
#IMAGE_DOS_SIGNATURE = $5A4D ; MZ - IMAGE_DOS_HEADER \ e_magic #IMAGE_DOS_SIGNATURE_REVERSED = $4D5A ; ZM - IMAGE_DOS_HEADER \ e_magic #IMAGE_NT_SIGNATURE = $00004550 ; PE00 Procedure GetImageBaseSize(FullFilePath$) Protected *DOS_Header.IMAGE_DOS_HEADER = AllocateMemory(SizeOf(IMAGE_DOS_HEADER)) Protected *NT_Headers.IMAGE_NT_HEADERS = AllocateMemory(SizeOf(IMAGE_NT_HEADERS)) Protected *Section_Headers.IMAGE_SECTION_HEADERS = AllocateMemory(SizeOf(IMAGE_SECTION_HEADERS)) Protected hFileInfo = ReadFile(#PB_Any, FullFilePath$, #PB_File_SharedRead) If hFileInfo ReadData(hFileInfo, *DOS_Header, SizeOf(IMAGE_DOS_HEADER)) If *DOS_Header\e_magic = #IMAGE_DOS_SIGNATURE Or *DOS_Header\e_magic = #IMAGE_DOS_SIGNATURE_REVERSED FileSeek(hFileInfo, *DOS_Header\e_lfanew) ReadData(hFileInfo, *NT_Headers, SizeOf(IMAGE_NT_HEADERS)) Else Debug("ERROR: no valid DOS HEADER SIGNATURE.") ProcedureReturn #False EndIf If Not *NT_Headers\Signature = #IMAGE_NT_SIGNATURE ; PE00 Debug("ERROR: no valid NT HEADER SIGNATURE.") ProcedureReturn #False EndIf ReadData(hFileInfo, *Section_Headers, SizeOf(IMAGE_SECTION_HEADERS)) CloseFile(hFileInfo) Protected LastSection = *NT_Headers\FileHeader\NumberOfSections - 1 ProcedureReturn *Section_Headers\ish[LastSection]\PointerToRawData + *Section_Headers\ish[LastSection]\SizeOfRawData Else Debug("ERROR: Cannot read file: " + FullFilePath$) EndIf EndProcedure Filename$ = "c:\PureBasic\PureBasic.exe" OverlyOffset = GetImageBaseSize(Filename$) If OverlyOffset If FileSize(Filename$) <> OverlyOffset Debug "Overlay offset: 0x" + Hex(OverlyOffset) Debug "Overlay size: 0x" + Hex(FileSize(Filename$) - OverlyOffset) Else Debug "Overlay not found" EndIf EndIf
Отредактировано Lin (26.10.2021 20:48:53)