From 9887da7af5432e7e1b6562f53a92ba4b68123dae Mon Sep 17 00:00:00 2001 From: gmestanley Date: Sat, 19 Nov 2022 15:25:02 -0300 Subject: [PATCH] patterns/ne: Adding pattern file for NE executables (#58) * Update pe.hexpat Implementing a number of things and fixing others * Update pe.hexpat Adding the readonlyData pattern * Update pe.hexpat Testing putting the number of tabs on Github to 4 instead of 8 (so that comments on the code for the Sections don't break) * Update pe.hexpat Reverting change that turned out to be needless * Update pe.hexpat Actually sending the `products[while($ != richHeaderEndPosition)]` to `products[while($ < richHeaderEndPosition)]` change * Add files via upload Adding NE test file * Add files via upload Adding NE pattern file * Update ne.hexpat Fixing the error with the entry table assignment * Update README.md Added the NE pattern file to the list of patterns --- README.md | 1 + patterns/ne.hexpat | 264 +++++++++++++++++++++++++ tests/patterns/test_data/ne.hexpat.exe | Bin 0 -> 54720 bytes 3 files changed, 265 insertions(+) create mode 100644 patterns/ne.hexpat create mode 100644 tests/patterns/test_data/ne.hexpat.exe diff --git a/README.md b/README.md index 216be75..519bdc4 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Hex patterns, include patterns and magic files for the use with the ImHex Hex Ed | BMP | `image/bmp` | [`patterns/bmp.hexpat`](patterns/bmp.hexpat) | OS2/Windows Bitmap files | | ELF | `application/x-executable` | [`patterns/elf.hexpat`](patterns/elf.hexpat) | ELF header in elf binaries | | PE | `application/x-dosexec` | [`patterns/pe.hexpat`](patterns/pe.hexpat) | PE header, COFF header, Standard COFF fields and Windows Specific fields | +| NE | | [`patterns/ne.hexpat`](patterns/ne.hexpat) | NE header and Standard NE fields | | Intel HEX | | [`patterns/intel_hex.hexpat`](patterns/intel_hex.hexpat) | [Intel hexadecimal object file format definition]("https://en.wikipedia.org/wiki/Intel_HEX") | | MIDI | `audio/midi` | [`patterns/midi.hexpat`](patterns/midi.hexpat) | MIDI header, event fields provided | | WAV | `audio/wav` | [`patterns/wav.hexpat`](patterns/wav.hexpat) | RIFF header, WAVE header, PCM header | diff --git a/patterns/ne.hexpat b/patterns/ne.hexpat new file mode 100644 index 0000000..53ce444 --- /dev/null +++ b/patterns/ne.hexpat @@ -0,0 +1,264 @@ +#include + +#pragma bitfield_order right_to_left + +struct DOSHeader { + char signature[2]; + u16 lastPageSize; + u16 numberOfPages; + u16 relocations; + u16 headerSizeInParagraphs; + u16 minimumAllocatedParagraphs; + u16 maximumAllocatedParagraphs; + u16 initialSSValue; + u16 initialRelativeSPValue; + u16 checksum; + u16 initialRelativeIPValue; + u16 initialCSValue; + u16 relocationsTablePointer; + u16 overlayNumber; + u8 overlayInformation[0x20]; + u32 neHeaderPointer; +}; + +u16 dosMessageOffset; +u16 pointedCodeOffset; + +fn finddosmessage() { + for (u8 i = 0, $+i < std::mem::read_unsigned(0x3C, 4), i = i + 1) { + if (std::mem::read_unsigned($+i, 1) == 0xBA) { // MOV instruction + dosMessageOffset = std::mem::read_unsigned($+i+1, 2); + break; + } + } +}; + +fn findpointingcode() { + for (u8 i = 0, $+i < std::mem::read_unsigned(0x3C, 4), i = i + 1) { + if (std::mem::read_unsigned($+i, 1) == 0xE8) { // CALL instruction + pointedCodeOffset = std::mem::read_unsigned($+i+1, 2); + return true; + } + } + return false; +}; + +fn isdosdata(char c) { + return c == 0x0D || c == '$'; +}; + +struct DOSStub { + if (findpointingcode()) { + u8 pointingCode[3]; + u8 code[while(std::mem::read_unsigned($, 1) != 0x00)] @ addressof(this) + pointedCodeOffset + 3; + char message[while(!isdosdata(std::mem::read_unsigned($, 1)))]; + char data[while(std::mem::read_string($-1, 1) != "$")]; + } + else { + finddosmessage(); + if (dosMessageOffset > 0) { + u8 code[while($ != addressof(this) + dosMessageOffset)]; + char message[while(!isdosdata(std::mem::read_unsigned($, 1)))]; + char data[while(std::mem::read_string($-1, 1) != "$")]; + } + else { + char code[while(std::mem::read_unsigned($, 1) != 0x00)]; + } + } +}; + +struct FileHeader { + DOSHeader dosHeader; + DOSStub dosStub @ dosHeader.headerSizeInParagraphs * 16; +}; + +FileHeader fileHeader @ 0x00; + +enum DGroupType : u8 { + NoAutoData, + SingleData, + MultipleData, + Null +}; + +fn formatDGroupType(u8 value) { + DGroupType dgroup = value; + + return dgroup; +}; + +enum AppType : u8 { + None, + Fullscreen, + WinPMCompatible, + UsesWinPM +}; + +fn formatAppType(u8 value) { + AppType app = value; + + return app; +}; + +bitfield ProgramFlags { + dGroupType : 2 [[format("formatDGroupType")]]; + globalInitialization : 1; + protectedModeOnly : 1; + instructions86 : 1; + instructions286 : 1; + instructions386 : 1; + instructionsX87 : 1; +}; + +bitfield ApplicationFlags { + applicationType : 2 [[format("formatAppType")]]; + padding : 1; + os2Application : 1; + reserved : 1; + imageError : 1; + nonConforming : 1; + dll : 1; +}; + +enum OSType : u8 { + Unknown = 0x00, + OS2 = 0x01, + Win16 = 0x02, + DOS4 = 0x03, + Win32 = 0x04, + BorlandOSServices = 0x05, + PharlapDOSExtenderOS2 = 0x81, + PharlapDOSExtenderWindows = 0x82 +}; + +bitfield OS2EXEFlags { + longFilename : 1; + protectedMode : 1; + proportionalFonts : 1; + gangloadArea : 1; +}; + +struct NEHeader { + char signature[2]; + u8 majorLinkerVersion; + u8 minorLinkerVersion; + u16 entryTableOffset; + u16 entryTableLength; + u32 fileCRC; + ProgramFlags programFlags; + ApplicationFlags appFlags; + u16 autoDataSegmentIndex; + u16 initHeapSize; + u16 initStackSize; + u32 entryPoint; + u32 initialStackPointer; + u16 segmentCount; + u16 moduleReferenceCount; + u16 nonResidentNamesTableSize; + u16 segmentTableOffset; + u16 resourceTableOffset; + u16 residentNamesTableOffset; + u16 moduleReferenceTableOffset; + u16 importedNamesTableOffset; + u8 *nonResidentNamesTablePointer[nonResidentNamesTableSize] : u32; + u16 moveableEntryCount; + u16 fileAlignmentSizeShiftCount; + u16 resourceCount; + OSType targetOS; + OS2EXEFlags os2ExeFlags; + u16 thunksReturnOffset; + u16 segmentReferenceThunksOffset; + u16 minimumCodeSwapAreaSize; + u8 expectedMinorWindowsVersion; + u8 expectedMajorWindowsVersion; +}; + +NEHeader neHeader @ fileHeader.dosHeader.neHeaderPointer; + +bitfield SegmentTableFlags { + dataSegment : 1; + typeMask : 2; + padding : 1; + moveable : 1; + padding : 1; + preloaded : 1; + padding : 1; + containsRelocationInfo : 1; + padding : 1; + discardPriority : 4; +} [[right_to_left]]; + +struct SegmentTable { + u16 segmentDataPointer; + u16 segmentLength; + SegmentTableFlags segmentTableFlags; + u16 minimumAllocationSize; +}; + +SegmentTable segmentTable[neHeader.segmentCount] @ addressof(neHeader) + neHeader.segmentTableOffset; + +bitfield BlockFlags { + padding : 4; + moveable : 1; + shared : 1; + preload : 1; + padding : 9; +}; + +struct ResourceTypeInformationBlock { + u8 *resourcePointer : u16; + u16 resourceLength; + BlockFlags flags; + u16 resourceID; + u32 reserved; +}; + +struct ResourceRecord { + u16 typeID; + u16 numberOfResources; + u32 reserved; + ResourceTypeInformationBlock blocks[numberOfResources]; +}; + +struct ResourceTable { + u16 alignmentShiftCount; + ResourceRecord records[neHeader.resourceTableEntryCount]; + u8 stringLength; + char string[stringLength]; +}; + +ResourceTable resourceTable[neHeader.resourceCount] @ addressof(neHeader) + neHeader.resourceTableOffset; + +struct ResidentName { + u8 stringLength; + char string[stringLength]; + u16 ordinalNumber; +}; + +ResidentName residentNameTable[while($+1 < addressof(neHeader) + neHeader.moduleReferenceTableOffset)] @ addressof(neHeader) + neHeader.residentNamesTableOffset; + +struct ModuleReference { + u16 moduleNameOffset; +}; + +ModuleReference moduleReferenceTable[neHeader.moduleReferenceCount] @ addressof(neHeader) + neHeader.moduleReferenceTableOffset; + +struct ImportedNameTable { + u8 stringLength; + char string[stringLength]; +}; + +ImportedNameTable importedNameTable[while($ < addressof(neHeader) + neHeader.entryTableOffset)] @ addressof(neHeader) + neHeader.importedNamesTableOffset; + +enum EntryDataType : u8 { + Unused, + Fixed = 0x01 ... 0xFE, + Moveable +}; + +struct EntryTable { + u8 entryCount; + EntryDataType segmentIndicator; +}; + +EntryTable entryTable[neHeader.entryTableLength/2] @ addressof(neHeader) + neHeader.entryTableOffset; diff --git a/tests/patterns/test_data/ne.hexpat.exe b/tests/patterns/test_data/ne.hexpat.exe new file mode 100644 index 0000000000000000000000000000000000000000..d3b7d34b75fafdba086a88f60e1e4e3f14c35f22 GIT binary patch literal 54720 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