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

导出的DLL函数不是按字面顺序排列的?

那么今天我遇到了一个怪事 前一段时间,我写了自己的GetProcAddress版本来获取远程进程的函数地址。 我显然花了很多时间阅读PE体系结构来找出解决这个问题的最好方法。 从PECOFF v8规范(我认为它是最新的官方规范)中,有关于Export Name Pointer Table的以下符号: 导出名称指针表是到导出名称表中的地址数组(RVA)。 指针每个都是32位,并且与图像库相关。 这些指针在词汇上sorting以允许二进制search。 所以在编写我的GetProcAddress版本的时候就考虑了这个问题。 很显然,在使用线性search的二进制search的情况下,在导出表中引用KERNEL32.dll(1300+个导出的函数)会有很好的效率提升。 这工作了一段时间,直到今天,当我遇到一个奇怪的问题。 看起来,Kernel32中的一些导出函数实际上并不是按照词汇顺序排列的,而这是抛弃了我的二分查找。 以下是使用我将在下面发布的函数导出的Dll转储的摘录: Ordinal: 810 Name: K32QueryWorkingSetEx Ordinal: 811 Name: LCIDToLocaleName Ordinal: 812 Name: LCMapStringA Ordinal: 813 Name: LCMapStringEx Ordinal: 814 Name: LCMapStringW Ordinal: 815 Name: LZClose Ordinal: 816 Name: LZCloseFile Ordinal: 817 Name: LZCopy Ordinal: 818 Name: LZCreateFileW Ordinal: 819 Name: […]

可移植可执行的结构说

我正在学习可移植可执行文件的结构。 我通过MSDN文章,但我有点困惑。 我对他们精确的结构和function有一些困惑。 任何人都可以帮助我,或者请参阅我的一个很好的文章呢?

如何创build包括mysql-ODBC,所有DLL和OCX文件的Windows便携式应用程序?

我有一个应用程序,编程在VB6需要一些DLL文件和OCX文件安装在Windows 7中。 我已经有一个使用innosetup创build的安装程序,其中包含所有需要的文件,并且还安装了用于Windows的x86 连接器 – ODBC ( x86,64位) 如果我只是把所有的文件放入一个文件夹安装doesent工作,我得到的错误 组件MSDATGRD.OCX或其某个依赖关系未正确注册:文件丢失或无效 我试图searchmsdatgrd.ocx portableapp,但没有主意 是否有一个简单的解决方法,使这个应用程序无需安装运行? 您可以将我想要打包的文件下载到PortableApp中。 我试图用依赖沃克打开Setup.exe,但不幸的是我没有足够的专业知识来使用该工具。 这里有一个截图 虽然依赖walker的输出似乎是欺骗性的,请看这里: 赢7,64位,DLL的问题 无论如何:我在这里下载了这9个文件并打包 ,现在它显示了更多的其他文件丢失:pastebin.com/8LawEbuk 7这个doesent似乎导致任何地方导致依赖沃克太旧 我正在寻找一些非常简单的东西,不pipe最终的文件大小,因为我不是一个Windows程序员

C库从Linux读取EXE版本?

有一个我可以在Linux中使用的库,它将返回Explorer版本选项卡中列出的Windows EXE文件的属性? 这些是像产品名称,产品版本,说明等字段。 对于我的项目,EXE文件只能从内存中读取,而不能从文件中读取。 我想避免将EXE文件写入磁盘。

Win32 PE中的某个部分是否包含可执行代码,初始化数据和单元化数据的组合?

Win32 PE中的某个部分是否包含可执行代码,初始化数据和单元化数据的组合? 部分是否可以包含代码和(未)初始化数据的任意组合作为部分数据,还是部分只能包含一种types的数据? 它是具有标志决定其属性的部分标题的“ Characteristics字段,但我不确定是否可以将其混合起来? 下面我包含了官方PE文档中的标志: IMAGE_SCN_CNT_CODE 0x00000020 该部分包含可执行代码。 IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 该部分包含已 初始化的数据。 IMAGE_SCN_CNT_UNINITIALIZED_ DATA 0x00000080 该 部分包含未初始化的数据。

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 。 有什么不同?