В общем понадобилось находить начало и размер оверлея в  ехе-файлах для дальнейших манипуляций (импорт\экспорт),
придумал такое: глянуть данные последней секции и определить её конец (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)