如何在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上运行的实用程序/工具.

谢谢

解决方法

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

这是一种做法.

摘要

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

详细示例

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

$i686-pc-mingw32-objdump -h trek.exe

trek.exe:         file format pei-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 AUTO          00172600  00401000  00401000  00000400  2**2
                  CONTENTS,ALLOC,LOAD,READONLY,CODE
  1 .idata        00001400  00574000  00574000  00172a00  2**2
                  CONTENTS,DATA
  2 DGROUP        0002b600  00576000  00576000  00173e00  2**2
                  CONTENTS,DATA
  3 .bss          000e7800  005a2000  005a2000  00000000  2**2
                  ALLOC
  4 .reloc        00013000  0068a000  0068a000  0019f400  2**2
                  CONTENTS,DATA
  5 .rsrc         00000a00  0069d000  0069d000  001b2400  2**2
                  CONTENTS,DATA

>使用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

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

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

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

start = 0x516DE8;
ENTRY(start)
OUTPUT_FORMAT("elf32-i386")
SECTIONS {
    .text 0x401000 :
    {
        INCLUDE "code.ld";
    }
    .data 0x576000 :
    {
        INCLUDE "data.ld";
    }
    .bss 0x5A2000 :
    {
        . = . + 0x0E7800;
    }
}

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

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

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

$gdb elf_trek
(gdb) run
Starting program: /home/quasar/src/games/botf/elf_trek 

Program received signal SIGSEGV,Segmentation fault.
0x0051d8e6 in ?? ()
(gdb) bt
\#0  0x0051d8e6 in ?? ()
\#1  0x00000000 in ?? ()
(gdb) x/i $eip
=> 0x51d8e6:    sub    (%edx),%eax
(gdb) quit

该位置的IDA Pro输出

0051D8DB ; size_t stackavail(void)
0051D8DB proc    stackavail near
0051D8DB         push    edx
0051D8DC         call    [ds:off_5A0588]
0051D8E2         mov     edx,eax
0051D8E4         mov     eax,esp
0051D8E6         sub     eax,[edx]
0051D8E8         pop     edx
0051D8E9         retn
0051D8E9 endp    stackavail

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

猜你在找的Linux相关文章