读可执行文件直到下一个MZ

时间:2012-11-09 07:22:05

标签: c# .net

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

mz二进制东西1 - 我想要的那个 mz binary stuff 2

0x77,0x90 == MZ

1 个答案:

答案 0 :(得分:0)

您需要为每个IMAGE_SECTION_HEADERpinvoke)结构获取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();
    }
}

Detailed PE/PE+ description