托管可执行文件结构■严峻■问题:运行环境头在哪里????
最近在研究.NET元数据和托管exe文件的结构。在研究过程中我发现了一个巨大的问题:运行环境头的内容不对!
通过自制的dump程序进行分析,得知一个托管exe文件中运行环境头定位在0x2008处,大小为0x48(72bytes)。可在这里读到的运行环境头内容如下:
>>>>>>>>>> RVA [ 0x00000000 00002008 ] <<<<<<<<<<
IMAGE_COR20_HEADER:
cb : 0x9DB5D5AA
MajorRuntimeVersion : 0x2062
MinorRuntimeVersion : 0x9DC3
MetaData_RVA : 0x9DD2EE0F
MetaData_Size : 0x9DEDC76B
Flags : 0x9DFBB15F
EntryPointToken : 0x9E310AB0
Resources_RVA : 0x9E4A2C44
Resources_Size : 0x9E7843D2
StrongNameSignature_RVA : 0x9E7D5020
StrongNameSignature_Size : 0x9EA9F204
CodeManagerTable_RVA : 0x9EEF53CE
CodeManagerTable_Size : 0x9F0122EA
VTableFixups_RVA : 0x9F0EE929
VTableFixups_Size : 0x9F14C639
ExportAddressTableJumps_RVA : 0x9F210B7C
ExportAddressTableJumps_Size : 0x9F4D1785
ManagedNativeHeader_RVA : 0x9F574813
ManagedNativeHeader_Size : 0x9F62915C
这明显是错误的。
再看另一个:
>>>>>>>>>> RVA [ 0x00000000 00002008 ] <<<<<<<<<<
IMAGE_COR20_HEADER:
cb : 0x7B021203
MajorRuntimeVersion : 0x00AA
MinorRuntimeVersion : 0x0400
MetaData_RVA : 0xAB7B0212
MetaData_Size : 0x12040000
Flags : 0x00AC7B02
EntryPointToken : 0x02120400
Resources_RVA : 0x0000AA7B
Resources_Size : 0x02125904
StrongNameSignature_RVA : 0x0000AD7B
StrongNameSignature_Size : 0x7B021204
CodeManagerTable_RVA : 0x040000AB
CodeManagerTable_Size : 0x002F2859
VTableFixups_RVA : 0x01120A00
VTableFixups_Size : 0x0000BD7C
ExportAddressTableJumps_RVA : 0x00B87B04
ExportAddressTableJumps_Size : 0x48280400
ManagedNativeHeader_RVA : 0x130A0000
ManagedNativeHeader_Size : 0x017B0204
这也出现着明显的错误。
我的dump是用C#写的,不过为了验证,我用C也写了一个。两者算法不同(C#是一个字节一个字节读取数据,C是整个结构一起读取)得到的结果是一样的,那么也就是说得到的该结构RVA和Size的数据是没有问题的。
(还有,这个0x2008的位置也是我通过读取文件获得的,尽管每次这个值都是固定的,我还是实际地获取了一下的。)
那么现在只有一个解释:运行环境头不在0x2008!!那么,它在哪呢?请高手指点。