可以将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, ALLOC, LOAD, DATA

2 DGROUP 0002b600 00576000 00576000 00173e00 2**2

CONTENTS, ALLOC, LOAD, DATA

3 .bss 000e7800 005a2000 005a2000 00000000 2**2

ALLOC

4 .reloc 00013000 0068a000 0068a000 0019f400 2**2

CONTENTS, ALLOC, LOAD, READONLY, DATA

5 .rsrc 00000a00 0069d000 0069d000 001b2400 2**2

CONTENTS, ALLOC, LOAD, READONLY, 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 编译pe,如何在PE中将PE(可移植可执行文件)格式转换为ELF相关推荐

  1. linux编译obs,如何在Ubuntu 18.04/16.04中安装OBS Studio 21.1

    OBS Studio是免费的开源直播和屏幕录制软件,一天前达到21.1个版本. 以下是如何在Ubuntu 18.04,Ubuntu 17.10,Ubuntu 16.04和/或Ubuntu 14.04中 ...

  2. linux编译mesa,如何在Ubuntu 16.04,17.10中安装Mesa 17.3.3

    最新的MESA 3D图形库17.3.3现在在Ubuntu-X team PPA存储库中为Ubuntu 16.04和Ubuntu 17.10提供. Mesa 17.3.3实现了OpenGL 4.5 AP ...

  3. python列表可以混合类型_如何在Python中将混合数据类型的列表转换为数据帧

    我有一个混合数据类型列表,如下所示:list = [['3D prototypes', 'Can print large objects', 'Autodesk Maya/Mudbox', '3D S ...

  4. python nonetype转换float_如何在Python中将NoneType值从聚合转换为float?

    我有一个Django模型.py具有如下定义的类的文件:class Cotizacion(models.Model): # Fields nombre = models.CharField(max_le ...

  5. c语言中123 234 345 456,如何在C中将数字从1123456789格式化为1,123,456,789?

    宝慕林4294392 您可以按以下方式递归执行此操作(请注意,INT_MIN如果使用二进制补码,则需要额外的代码来管理它):void printfcomma2 (int n) {    if (n & ...

  6. linux可执行文件格式

    http://blog.csdn.net/dadalan/article/details/2890957 可执行文件可以是具有不同格式的二进制文件,也可以是一个文本的脚本.可执行文件映像中包含了进程执 ...

  7. Linux编译和下载嵌入式实验,嵌入式实验6交叉编译及Linux简单程序设计实验

    <嵌入式实验6交叉编译及Linux简单程序设计实验>由会员分享,可在线阅读,更多相关<嵌入式实验6交叉编译及Linux简单程序设计实验(7页珍藏版)>请在人人文库网上搜索. 1 ...

  8. 如何在 Python 中将 Excel 文件转换为图像?Aspose快速搞定

    在各种情况下,需要将 Excel 电子表格嵌入到 Web 或桌面应用程序中.在这种情况下的解决方案之一是将 Excel 工作表转换为图像格式.在本文中,将学习如何在 Python中将Excel XLS ...

  9. 如何在C++中将Word格式转换为PDF?Aspose.Words快速解决

    在共享文档之前,通常使用Word到PDF的转换.可以使用各种在线Word到PDF转换器,可以转换单个或有限数量的Word文档.但是,随着新兴的MS Word自动化和报告生成解决方案,Word到PDF的 ...

最新文章

  1. 用 Python 制作数据大屏,超简单
  2. 防止酒后删库!日本人用 3 小时做了个酒精测试软件
  3. rsync源目录写法的一点小细节
  4. 一篇文章,带你全面的了解二叉树-记得点赞
  5. 苹果雪豹操作系统正式版_iOS 12.3.1正式版“意外”推送,iPhone修复诸多问题!...
  6. 〖前端开发〗HTML/CSS基础知识学习笔记
  7. 集合对偶律:分别用图文证明
  8. 拖拽批量上传图片如何保证 顺序_新手指南︱shopee店铺上架产品该如何操作?...
  9. eclipse maven 导出项目依赖的jar包
  10. Cookie中设置了 HttpOnly,Secure 属性,有效的防止XSS攻击,X-Frame-Options 响应头避免点击劫持...
  11. 高等数学(同济第七版上)课后习题及解答
  12. Kafka图形管理界面Kafka-eagle安装配置详解
  13. go语言对gif的抽帧压缩
  14. 基于单片机节水定时智能控制器设计-毕设课设资料
  15. 通过labview vision视觉模块写的带学习功能的OCR字符识别程序
  16. Python飞机大战(究极迫害版)
  17. c语言编程题大学,大学C语言程序设计(编程题).pdf
  18. Git版本回退的最佳方式
  19. 【RBF预测】基于RBF神经网络实现预测matlab源码
  20. IE7提示“出现运行时间错误,是否要进行调试?”的解决办法

热门文章

  1. 修改am335x 制作android sd启动卡的bug
  2. 海豚的屠宰场--海豚湾
  3. 宽带路由器常见故障排除
  4. 在ListView控件中绘底图
  5. httpModule一些细节
  6. pycharm在linux安装插件,Pycharm安装go插件,开始go之旅
  7. 使用 ES6 的浏览器兼容性问题
  8. nginx+lua+redis deny ip
  9. 改进了一下这个游戏的输出及思路,是不是好玩多了??:)
  10. 专业词汇---BUG部分-02