如何在PE中将PE(可移植可执行文件)格式转换为ELF

前端之家收集整理的这篇文章主要介绍了如何在PE中将PE(可移植可执行文件)格式转换为ELF前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
将PE二进制文件转换为ELF二进制文件的最佳工具是什么?

以下是此问题的简要动机:

>假设我有一个简单的C程序.
>我使用gcc for linux编译它(这给了ELF),并使用’i586-mingw32msvc-gcc’用于Windows(这给出了一个PE二进制文件).
>我想使用Bitblaze的静态分析工具 – vine(http://bitblaze.cs.berkeley.edu/vine.html)分析这两个二进制文件的相似之处
>现在藤蔓没有对PE二进制文件的良好支持,所以我想转换PE-> ELF,然后进行我的比较/分析.

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

谢谢

@H_403_14@解决方法
可以将EXE重建为ELF二进制文件,但由于缺少操作系统,生成的二进制文件将在加载后很快发生段错误.

这是一种做法.

摘要

>转储EXE文件的节头.
>从EXE中提取原始部分数据.
>将原始节数据封装在GNU链接描述文件片段中.
>编写链接描述文件以构建ELF二进制文件,包括上一步中的脚本.
>使用链接描述文件运行ld以生成ELF文件.
>运行新程序,并将其视为未在Windows上运行的段错误(并尝试调用导入地址表中的函数,该函数不存在).

详细示例

>转储EXE文件的节头.我正在使用mingw交叉编译器包中的objdump来执行此操作.

  1. $i686-pc-mingw32-objdump -h trek.exe
  2.  
  3. trek.exe: file format pei-i386
  4.  
  5. Sections:
  6. Idx Name Size VMA LMA File off Algn
  7. 0 AUTO 00172600 00401000 00401000 00000400 2**2
  8. CONTENTS,ALLOC,LOAD,READONLY,CODE
  9. 1 .idata 00001400 00574000 00574000 00172a00 2**2
  10. CONTENTS,DATA
  11. 2 DGROUP 0002b600 00576000 00576000 00173e00 2**2
  12. CONTENTS,DATA
  13. 3 .bss 000e7800 005a2000 005a2000 00000000 2**2
  14. ALLOC
  15. 4 .reloc 00013000 0068a000 0068a000 0019f400 2**2
  16. CONTENTS,DATA
  17. 5 .rsrc 00000a00 0069d000 0069d000 001b2400 2**2
  18. CONTENTS,DATA

>使用dd(或十六进制编辑器)从EXE中提取原始部分数据.在这里,我只是要复制代码和数据部分(在本例中名为AUTO和DGROUP).您可能希望复制其他部分.

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

注意,我已经将文件偏移量和节大小从十六进制转换为十进制用作跳过和计数,但我在dd中使用512字节的块大小来加速进程(例如:0x0400 = 1024字节= 2阻止@ 512字节).
>将原始部分数据封装在GNU ld链接器脚本片段中(使用BYTE指令).这将用于填充部分.

  1. cat code.bin | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' >code.ld
  2. cat data.bin | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' >data.ld

>编写链接描述文件以构建ELF二进制文件,包括上一步中的脚本.注意我还为未初始化数据(.bss)部分留出了空间.

  1. start = 0x516DE8;
  2. ENTRY(start)
  3. OUTPUT_FORMAT("elf32-i386")
  4. SECTIONS {
  5. .text 0x401000 :
  6. {
  7. INCLUDE "code.ld";
  8. }
  9. .data 0x576000 :
  10. {
  11. INCLUDE "data.ld";
  12. }
  13. .bss 0x5A2000 :
  14. {
  15. . = . + 0x0E7800;
  16. }
  17. }

>使用GNU ld运行链接描述文件生成ELF文件.注意我必须使用仿真模式elf_i386,因为我使用的是64位Linux,否则将生成64位ELF.

  1. $ld -o elf_trek -m elf_i386 elf_trek.ld
  2. ld: warning: elf_trek.ld contains output sections; did you forget -T?
  3. $file elf_trek
  4. elf_trek: ELF 32-bit LSB executable,Intel 80386,version 1 (SYSV),statically linked,not stripped

>运行新程序,并观察它是否因为它未在Windows上运行而发生段错误.

  1. $gdb elf_trek
  2. (gdb) run
  3. Starting program: /home/quasar/src/games/botf/elf_trek
  4.  
  5. Program received signal SIGSEGV,Segmentation fault.
  6. 0x0051d8e6 in ?? ()
  7. (gdb) bt
  8. \#0 0x0051d8e6 in ?? ()
  9. \#1 0x00000000 in ?? ()
  10. (gdb) x/i $eip
  11. => 0x51d8e6: sub (%edx),%eax
  12. (gdb) quit

该位置的IDA Pro输出

  1. 0051D8DB ; size_t stackavail(void)
  2. 0051D8DB proc stackavail near
  3. 0051D8DB push edx
  4. 0051D8DC call [ds:off_5A0588]
  5. 0051D8E2 mov edx,eax
  6. 0051D8E4 mov eax,esp
  7. 0051D8E6 sub eax,[edx]
  8. 0051D8E8 pop edx
  9. 0051D8E9 retn
  10. 0051D8E9 endp stackavail

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

猜你在找的Linux相关文章