我可以通过定义大小轻松读取整个可执行文件,或者我想读取多少字节,但是如果我想从头开始读取它直到下一个“MZ”怎么办?如果 2 个文件绑定在一起,我只想抓取前半部分,不知道它的大小。
mz binary stuff 1 - 我想要的那个 mz binary stuff 2
0x77, 0x90 == MZ
您需要为每个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();
}
}