【问题标题】:How to convert PE(Portable Executable) format to ELF in linux如何在 Linux 中将 PE(Portable Executable) 格式转换为 ELF
【发布时间】:2010-04-02 18:01:07
【问题描述】:

将 PE 二进制文件转换为 ELF 二进制文件的最佳工具是什么?

以下是这个问题的简要动机:

  1. 假设我有一个简单的 C 程序。
  2. 我使用 gcc for linux 编译它(这会产生 ELF),并使用 'i586-mingw32msvc-gcc' for Windows(这会产生一个 PE 二进制文件)。
  3. 我想使用 Bitblaze 的静态分析工具 vine(http://bitblaze.cs.berkeley.edu/vine.html) 分析这两个二进制文件的相似之处
  4. 现在 vine 对 PE 二进制文件没有很好的支持,所以我想转换 PE->ELF,然后继续我的比较/分析。

由于所有分析都必须在 Linux 上运行,我更喜欢在 Linux 上运行的实用程序/工具。

谢谢

【问题讨论】:

  • 嗨,阿曼!您想在 Linux 上运行 Windows 二进制文件吗?将可执行文件从 PE 转换为 ELF 不是解决方案!
  • @SiuChingPong:我想比较一下两者,我已经更新了描述,以便人们可以提供答案。
  • @Aman:我明白了。你的问题现在更清楚了。我认为我对这个主题不够熟悉,无法回答你的问题,但我可以尽我所能给你一些建议。我访问了你发布的链接,没有提到任何关于 PE 或 ELF 的内容,所以它可能也适用于 PE。只需使用 MinGW 或 Cygwin 编译即可尝试。你知道二进制文件的“代码部分”是什么吗?我想如果你能把它解压并保存到一个文件中,Vine 或许可以分析这个“裸二进制”。以下是一些可能有用的关键字:binutils、objdump、objcopy、nm、readelf、ld、lld、ar、as。
  • 如果您觉得我的 cmets 有用,请不要忘记 +1 :-)。
  • @SiuChingPong:当我运行 vine 的分析时,有一条警告消息说该工具尚未准备好用于 PE 二进制文件。

标签: linux binary elf portable-executable


【解决方案1】:

可以将 EXE 重新构建为 ELF 二进制文件,但由于缺少操作系统,生成的二进制文件在加载后很快就会出现段错误。

这是一种方法。

总结

  1. 转储 EXE 文件的节标题。
  2. 从 EXE 中提取原始部分数据。
  3. 将原始节数据封装在 GNU 链接描述文件 sn-ps 中。
  4. 编写链接描述文件以构建 ELF 二进制文件,包括上一步中的那些脚本。
  5. 使用链接描述文件运行 ld 以生成 ELF 文件。
  6. 运行新程序,并观察它的段错误,因为它没有在 Windows 上运行(它会尝试调用导入地址表中不存在的函数)。

详细示例

  1. 转储 EXE 文件的节标题。我正在使用来自mingw 交叉编译器包的objdump 来执行此操作。

    $ i686-pc-mingw32-objdump -h trek.exe trek.exe:文件格式pei-i386 部分: Idx 名称大小 VMA LMA 文件关闭 Algn 0 自动 00172600 00401000 00401000 00000400 2**2 内容、分配、加载、只读、代码 1.idata 00001400 00574000 00574000 00172a00 2**2 内容、分配、加载、数据 2 D组 0002b600 00576000 00576000 00173e00 2**2 内容、分配、加载、数据 3 .bss 000e7800 005a2000 005a2000 00000000 2**2 分配 4.reloc 00013000 0068a000 0068a000 0019f400 2**2 内容、分配、加载、只读、数据 5 .rsrc 00000a00 0069d000 0069d000 001b2400 2**2 内容、分配、加载、只读、数据
  2. 使用dd(或十六进制编辑器)从 EXE 中提取原始部分数据。在这里,我将复制代码和数据部分(在本例中名为 AUTO 和 DGROUP)。不过,您可能需要复制其他部分。

    $ dd bs=512 skip=2 count=2963 if=trek.exe of=code.bin $ dd bs=512 skip=2975 count=347 if=trek.exe of=data.bin

    注意,我已将文件偏移量和节大小从十六进制转换为十进制以用作 skipcount,但我在 dd 中使用了 512 字节的块大小来加快处理速度(例如:0x0400 = 1024 字节 = 2 个块 @ 512 字节)。

  3. 在 GNU ld 链接描述文件 sn-ps 中封装原始节数据(使用 BYTE 指令)。这将用于填充这些部分。

    猫码.bin | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' >code.ld 猫数据.bin | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' >data.ld
  4. 编写链接描述文件以构建 ELF 二进制文件,包括上一步中的那些脚本。请注意,我还为未初始化数据 (.bss) 部分留出了空间。

    开始 = 0x516DE8; 进入(开始) OUTPUT_FORMAT("elf32-i386") 部分{ .text 0x401000 : { 包括“code.ld”; } .data 0x576000: { 包括“data.ld”; } .bss 0x5A2000: { . = 。 + 0x0E7800; } }
  5. 使用 GNU ld 运行链接器脚本以生成 ELF 文件。注意我必须使用模拟模式elf_i386,因为我使用的是64位Linux,否则会产生64位ELF。

    $ ld -o elf_trek -m elf_i386 elf_trek.ld ld:警告:elf_trek.ld 包含输出部分;你忘了-T吗? $文件elf_trek elf_trek:ELF 32 位 LSB 可执行文件,Intel 80386,版本 1 (SYSV), 静态链接,未剥离
  6. 运行新程序,并观察它的段错误,因为它没有在 Windows 上运行。

    $ gdb elf_trek (gdb) 运行 启动程序:/home/quasar/src/games/botf/elf_trek 程序收到信号 SIGSEGV,分段错误。 0x0051d8e6 在?? () (gdb) BT \#0 0x0051d8e6 在?? () \#1 0x00000000 在 ?? () (gdb) x/i $eip => 0x51d8e6: 子 (%edx),%eax (gdb) 退出

    该位置的 IDA Pro 输出:

    0051D8DB ; size_t 堆栈可用(无效) 0051D8DB proc stackavail 附近 0051D8DB 推送 edx 0051D8DC 通话 [ds:off_5A0588] 0051D8E2 mov edx, eax 0051D8E4 mov eax, esp 0051D8E6 子 eax,[edx] 0051D8E8 流行 edx 0051D8E9 重新 0051D8E9 endp stackavail

考虑到 Wine 项目,对于将二进制文件移植到 Linux,这是毫无意义的。 对于像 OP 这样的情况,它可能是合适的。

【讨论】:

    【解决方案2】:

    我找到了一种更简单的方法来做到这一点。使用 strip 命令。

    例子

    strip -O elf32-i386 -o myprogram.elf myprogram.exe
    

    -O elf32-i386 让它以该格式写出文件。

    查看支持的格式运行

    strip --info
    

    我正在使用来自mxe 的strip 命令,在我的系统上它实际上被命名为/opt/mxe/usr/bin/i686-w64-mingw32.static-strip

    【讨论】:

      【解决方案3】:

      我不知道这是否完全符合您的需求,但是您可以选择使用您的 MinGW 版本的 gcc 进行交叉编译吗?

      我的意思是说:将 i586-mingw32msvc-gcc 直接编译为 ELF 格式的二进制文件(而不是您当前获得的 PE)是否符合您的需要。可以在 here 找到有关如何在另一个方向上做事的描述 - 我想这会有点 hacky 但完全有可能在另一个方向上为你工作(我必须承认我没有尝试过) .

      【讨论】:

        猜你喜欢
        • 2013-02-23
        • 2010-10-17
        • 2021-05-27
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 2016-12-19
        • 2016-07-23
        相关资源
        最近更新 更多