-1

我可以通过定义大小轻松读取整个可执行文件,或者我想读取多少字节,但是如果我想从头开始读取它直到下一个“MZ”怎么办?如果 2 个文件绑定在一起,我只想抓取前半部分,不知道它的大小。

mz binary stuff 1 - 我想要的那个 mz binary stuff 2

0x77, 0x90 == MZ

4

1 回答 1

0

您需要为每个IMAGE_SECTION_HEADER ( pinvoke ) 结构获取 SizeOfRawData 并从IMAGE_NT_HEADERS32/64结构中附加 SizeOfHeaders 。

首先,您需要从 PE/PE+ 文件中获取IMAGE_DOS_HEADER结构

之后,e_lfanew 字段会将您指向IMAGE_NT_HEADERS32/64结构。(如果 Magic == 0x10b -> PE。如果 Magic = 0x20b -> PE+ 文件)

您可以从IMAGE_FILE_HEADER结构中获得 sectionHeadersCount 的计数。

UInt32 startAddress = IMAGE_DOS_HEADER.e_lfanew + 4 + Marshal.SizeOf(typeof(IMAGE_FILE_HEADER)) + [IMAGE_FILE_HEADER][6].SizeOfOptionalHeader 

for(UInt32 loop = 0;loop < sectionHeadersCount;loop++)
{
    IMAGE_SECTION_HEADER section = /*Map offset to IMAGE_SECTION_HEADER structure Method*/(startAddress);
    startAddress += Marshal.SizeOf(typeof(IMAGE_SECTION_HEADER));//Offset to next section
}

// Example of Mapping function:
public T PtrToStructure<T>(UInt32 offset) where T : struct
{
    Byte[] bytes = this.ReadBytes(offset, (UInt32)Marshal.SizeOf(typeof(T)));

    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try
    {
         T result = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
         return result;
    } finally
    {
         handle.Free();
    }
}

详细的 PE/PE+ 说明

于 2012-11-09T09:00:18.113 回答