即使将数据附加到便携式可执行文件也是如此。据我所知,这是由于可执行代码的偏移+大小性质。
我有一个类似于Winzip的Zip2Exe的可执行打包应用程序。到目前为止,我一直在将可压缩的有效负载添加到可执行存根的末尾,然后是一个8字节的值,表示有效负载的字节大小。
我想要做的是让可执行存根计算自己的大小,并假设剩余的字节作为有效负载而没有任何大小信息。这纯粹是出于好奇,而我真正想知道的是PE可以计算出自己的大小并检测是否有任何东西被添加到其中。
当然,我了解如果通过注射或其他方式更改了内容,则无法验证其内容。
为了澄清这个问题,我想在.NET中检查Assembly.GetExecutingAssembly().Location
的函数,并确定附加有效负载的偏移量。如果此偏移量与文件大小相同,则不会有有效负载。
答案 0 :(得分:5)
请注意,我对C#不太满意,所以这是一般答案。
由于Assembly.GetExecutingAssembly().Location
似乎返回了图片的路径,因此您有一个" flat"文件路径,即磁盘上的映像而不是内存中的映像。解析比在内存中更容易,并且您已经知道它是一个有效的PE文件,因此您可以跳过所有有效性检查。
当您使用C#浏览图像文件时,您可能需要检查" Exploring pe file headers using managed code"以及Pinvoke.net上的各种结构。
查找图像文件末尾是否有有效负载:
e_lfanew
会员以查找IMAGE_NT_HEADERS NumberOfSections
字段。IMAGE_SECTION_HEADER
(pinvoke; msdn)的数组上。此数组中的条目数是NumberOfSections
字段(来自IMAGE_FILE_HEADER)。PointerToRawData
数组中所有IMAGE_SECTION_HEADER
字段的最大/最高值(这通常是数组中的最后一个条目,但您应该检查数组中的所有条目以确保)。
IMAGE_SECTION_HEADER
最高的PointerToRawData
获取SizeOfRawData
字段。
PointerToRawData
和SizeOfRawData
字段:如果结果小于文件大小,则会知道PE文件末尾有效负载。 简单(可视)示例:
上图代表calc.exe中的所有IMAGE_SECTION_HEADER
。正如您所看到的PointerToRawData
(标记为"原始地址')的最高值是0xE3A00,以及相应的章节大小(SizeOfRawData
,标记为"原始大小" )是0x600。
calc.exe的文件大小相同(933888字节):
因此,文件末尾没有有效负载。如果文件大小大于933888(由上述计算得出),则文件末尾会有一个有效负载。