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上运行的实用程序/工具。 谢谢

.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 […]

如何在Windows PE 32位可执行文件中为我的代码洞创造空间

所以我想在minesweeper.exe(典型的Windows XP扫雷游戏,链接: 扫雷 )中为我的代码洞穴腾出空间。 所以我通过CFF资源pipe理器修改了文件的PE头,增加了.text部分的大小。 我尝试增加.text段的原始大小1000h(新大小是3B58),但Windows无法find入口点,游戏无法启动。 然后我尝试增加.rsrc部分的大小,添加一个新的部分,增加图像大小,但是这些尝试都没有成功,Windows说“这不是x32可执行文件”。 所以这里是一个问题:我如何为我的代码洞穴腾出空间? 我不想search编译器留下的空白空间,我想为我的代码打印1000h字节。 一个教程,以及如何做到这一点,而不破坏游戏的详细解释将是伟大的! (是的,我其实是黑客扫雷)

如何从页眉或页脚确定PE可执行文件的大小

假设你有一个数据stream或一个字节块你想雕刻,你怎么能确定可执行文件的大小? PE可执行格式中有许多头文件,但是我可以使用哪些头文件来确定(如果可能)可执行文件的总长度? 这是一个文件格式的图片。

PE文件中没有.BSS

这是简短的控制台应用程序示例 static char buffer[4096]; int main() { for(int i=0;i<4096;i++) { buffer[i] = 1234; } return 0; } 据我所知,由编译器产生的'exe'文件应该包含.bss节来存储'buffer'variables。 我正在使用Tiny C编译器,生成的文件不包含任何对.bss的引用。 DOS Header Magic number: 0x5a4d (MZ) Bytes in last page: 144 Pages in file: 3 Relocations: 0 Size of header in paragraphs: 4 Minimum extra paragraphs: 0 Maximum extra paragraphs: 65535 Initial (relative) SS value: […]