Articles of 可移植可执行文件

如何在Linux中将PE(Portable Executable)格式转换为ELF格式

将PE二进制文件转换为ELF二进制文件的最佳工具是什么? 以下是这个问题的一个简短的动机: 假设我有一个简单的C程序。 我编译它使用gcc的Linux(这给ELF),并使用'i586-mingw32msvc-gcc'的Windows(这给了一个PE二进制文件)。 我想分析这两个二进制文件的相似之处,使用Bitblaze的静态分析工具 – 藤( http://bitblaze.cs.berkeley.edu/vine.html ) 现在葡萄藤没有很好的支持PE二进制文件,所以我想转换PE-> ELF,然后进行比较/分析。 由于所有的分析都必须在Linux上运行,所以我更喜欢在Linux上运行的实用程序/工具。 谢谢

Main()被调用之前Windows做了什么?

Windows必须做一些事情来parsingPE头,在内存中加载可执行文件,并将命令行parameter passing给main() 。 使用OllyDbg我已经设置debugging器打破在main(),所以我可以查看调用堆栈: 好像符号不见了,所以我们不能得到函数的名字,就像看到的内存地址一样。 但是我们可以看到main的调用者是kernel32.767262C4 ,它是ntdll.77A90FD9的被调用者。 ntdll.77A90FA4堆栈底部,我们看到返回到ntdll.77A90FA4 ,我认为这是第一个运行可执行程序的函数。 看起来像传递给该函数的值得注意的参数是Windows的“结构化exception处理程序”地址和可执行文件的入口点。 那么这些函数究竟如何将程序加载到内存中并准备好执行入口点呢? debugging器在main()之前显示OS执行的整个进程的内容?

当'OrdinalBase`字段设置为1时,kernel32.dll如何导出一个0的序号?

看看它加载到内存中的kernel32.dll,我看到下面的导出序号表: (gdb) x /400hd $eax 0x776334b0 <Wow64Transition+71576>: 3 4 5 6 7 8 9 10 0x776334c0 <Wow64Transition+71592>: 11 12 13 14 15 16 17 18 0x776334d0 <Wow64Transition+71608>: 19 20 21 22 23 24 25 26 0x776334e0 <Wow64Transition+71624>: 27 28 29 30 31 32 33 34 0x776334f0 <Wow64Transition+71640>: 35 36 37 38 39 40 41 42 […]

PE头“subsystem”字段的作用是什么?

我有几个关于PE“子系统”领域的问题,可能会有一定的重叠。 为了避免垃圾邮件这个地方与每个问题分开,我以为我会问他们在一起,然后重新问分开的东西没有得到解决。 希望这是OK … 我知道IMAGE_SUBSYSTEM_WINDOWS_CUI使操作系统“预先附加”进程到控制台,或者是其父进程,或者如果需要的话创build一​​个新的控制台。 IMAGE_SUBSYSTEM_WINDOWS_GUI不这样做。 在现代版本的Windows中,这两者之间是否还有其他区别? 过去有没有更多? 那么其他值呢,他们是用Windows来拒绝一个EXE,还是让Windows模拟一个不同的API呢? 这个“模拟”过程是否可以由最终用户扩展,或者这是否被硬编入到操作系统?

.rdata和.idata片段有什么区别?

我在IDA注意到,我分析的PE文件不仅有.rdata部分,还有.idata 。 有什么不同?

PE – 区分数据和function导出

我试图find一种方法来找出在IDA出口是数据出口,哪些是真正的function出口。 例如,让我们来看看Microsoft的msftedit.dll的导出条目: 而CreateTextServices是一个真正的导出函数: IID_IRichEditOle是数据导出,IDA没有意识到将数据作为代码进行IID_IRichEditOle : 有人知道一个可靠的方法来区分两者吗? 帮助将不胜感激。 提前致谢。

Windows下的确定性构build

最终目标是比较在完全相同的环境中从完全相同的源构build的2个二进制文件,并能够确定它们确实在function上是等同的。 其中一个应用就是将QA时间集中在发布之间实际发生变化的事情上,以及一般的更改监视。 与PE格式串联的MSVC自然使得这很难做到。 到目前为止,我发现并中和了这些事情: PE时间戳和校验和 数字签名目录条目 debugging器部分时间戳 PDB签名,年龄和文件path 资源时间戳 VS_VERSION_INFO资源中的所有文件/产品版本 数字签名部分 我parsingPE,find所有这些东西的偏移量和大小,并比较二进制文件时忽略字节范围。 像魅力一样工作(好吧,我已经运行了几个testing)。 我可以看出,只要编译器版本和所有源代码和头文件都相同,在Win Server 2008上构build的版本为1.0.2.0的已签名可执行文件就等于未签名的版本10.6.6.6,即构build在我的Win XP开发箱上。 这似乎适用于VC 7.1 – 9.0。 (用于发布版本) 有一个警告。 两个版本的绝对path 必须相同, 必须具有相同的长度。 cl.exe将相对path转换为绝对path,并将它们与编译器标志一起放入对象中等等。 这对整个二进制文件有不成比例的影响。 path中的一个字符改变将导致一个字节在这里和那里改变整个.text部分(然而,许多对象被链接,我怀疑)。 改变path的长度导致明显更多的差异。 在obj文件和链接的二进制文件中。 感觉像编译标志的文件path被用作某种散列,这使得它成为链接的二进制,甚至影响了不相关的编译代码片段的放置顺序。 所以这里是三部分的问题(总结为“现在怎么办?”): 我应该放弃整个项目,回家,因为我正在努力打破MS的物理定律和公司政策? 假设我处理绝对path问题(在策略级别或通过查找一个神奇的编译器标志),还有什么其他的东西我应该注意? (像__TIME__ 这样的东西确实意味着改变了代码,所以我不介意那些不被忽略的东西) 有没有办法强制编译器使用相对path,或欺骗它认为path不是它是什么? 最后一个原因是美观的Windows文件系统烦人。 你只是永远不知道什么时候删除一些价值的源和对象和svn元数据将失败,因为stream氓文件locking。 至less创造新的根总是成功,而有剩余的空间。 同时运行多个构build也是一个问题。 运行一堆虚拟机,而一个解决scheme,是一个相当沉重的。 我想知道是否有办法为一个进程和它的subprocess设置一个虚拟文件系统,以便几个进程树将同时看到不同的 “C:\ build”目录,只对它们是私有的。重量级的虚拟化… 更新:我们最近打开GitHub上的工具。 请参阅文档中的比较部分。

计算PE文件中入口点的文件偏移量

在 Finding the Entry Point (EP) in memory and disk 有关于如何findexe文件中入口点的文件偏移量的信息。 在这里我可以读到 EP(File)= AddressOfEntryPoint – BaseOfCode + .text [PointerToRawData] + FileAlignment 然而,当我自己计算这个(我使用了几个不同的exe文件),我得出的结论是 入口点在EXE文件中的偏移量= AddressOfEntryPoint + .text [PointerToRawData] – .text [VirtualAddress] 从IMAGE_OPTIONAL_HEADER获取AddressOfEntryPoint,从IMAGE_SECTION_HEADER获取其他两个值。 该网页上的信息是否为假? 添加FileAlignment就像他们似乎错了,这是没有道理的。 还是呢? 文件alignment表明我应该使用模或其他来计算一个值。 如果BaseOfCode和FileAlignment是相同的值(主要是他们),它不会干扰将它们添加到计算,但它是如何有意义?

如何确定EXE(或DLL)是否参与ASLR,即可重定位?

如何确定EXE(或DLL)是否参与ASLR,即可重定位? 我想检查我的系统上的一些EXE是否可以重定位并参与ASLR。 我知道链接器的默认行为是剥离基重定位,以便EXE不可重定位? 我如何从FileAlyzer这样的工具看到图像是否参与ASLR?

PE目录的名称

我正在研究PE解剖器,遇到了一些相当不寻常的事情。 PE格式的目录的名称和顺序似乎根据你的外观而有所不同: 来自PEReader(perdr) : #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data #define […]