Rah*_*han 3 .net c# filesize portable-executable
即使数据被附加到便携式可执行文件,它们仍然有效.据我所知,这是由于可执行代码的偏移+大小性质.
我有一个类似于Winzip的Zip2Exe的可执行打包应用程序.到目前为止,我一直在可压缩有效负载添加到可执行存根的末尾,后跟一个8字节值,表示有效负载的字节大小.
我想要做的是让可执行存根计算自己的大小,并假设剩余的字节作为有效负载而没有任何大小信息.这纯粹是出于好奇,而我真正想知道的是PE可以计算出自己的大小并检测是否有任何添加.
当然,我知道如果通过注入或其他方式更改了它自己的内容,它就无法验证它.
为了澄清这个问题,我想在.NET中使用一个函数来检查Assembly.GetExecutingAssembly().Location和计算附加有效负载的偏移量.如果此偏移量与文件大小相同,则不会有有效负载.
请注意,我对C#不太满意,所以这是一个普遍的答案.
由于Assembly.GetExecutingAssembly().Location似乎返回图像的路径,因此您有一个"平面"文件路径,即磁盘上的映像而不是内存中的映像.解析比在内存中更容易,并且您已经知道它是一个有效的PE文件,因此您可以跳过所有有效性检查.
当您使用C#浏览图像文件时,您可能需要检查" 使用托管代码探索pe文件头 "以及Pinvoke.net上的各种结构.
要查找图像文件末尾是否有有效负载:
e_lfanew会员查找IMAGE_NT_HEADERSNumberOfSections字段.IMAGE_SECTION_HEADER(pinvoke ; msdn)阵列上.此数组中的条目数是NumberOfSections字段(来自IMAGE_FILE_HEADER).PointerToRawData字段的最大/最高值IMAGE_SECTION_HEADER(这通常是数组中的最后一个条目,但您应该检查数组中的所有条目以确保).
IMAGE_SECTION_HEADER那个最高的PointerToRawData,得到的SizeOfRawData领域.
PointerToRawData和SizeOfRawData字段:如果结果小于文件大小,那么您将知道PE文件末尾有一个有效负载.简单(可视)示例:

上图代表IMAGE_SECTION_HEADER来自calc.exe的所有内容.正如您所看到的PointerToRawData(标记为"原始地址")的最高值是0xE3A00,相应的部分大小(SizeOfRawData标记为"原始大小")是0x600.
calc.exe的文件大小相同(933888字节):

因此,文件末尾没有有效负载.如果文件大小大于933888(由上述计算得出),则文件末尾会有一个有效负载.