我不认为有任何可靠的方法来做到这一点。机器代码格式非常复杂,比汇编文件更复杂。它不是真的可能采取编译的二进制(例如,在ELF格式),并产生一个源汇编程序,将编译为相同(或相似足够)的二进制。为了理解差异,比较GCC编译直接到汇编程序(gcc -S)的输出和objdump在可执行文件(objdump -D)的输出。

有两个主要的复杂性,我可以想到。首先,机器代码本身不是与汇编代码的1对1对应,因为像指针偏移的东西。

例如,考虑C语言的Hello world:

int main()

{

printf("Hello, world!\n");

return 0;

}

这将编译为x86汇编代码:

.LC0:

.string "hello"

.text

movl $.LC0, %eax

movl %eax, (%esp)

call printf

其中.LCO是命名常量,printf是共享库符号表中的符号。与objdump的输出进行比较:

80483cd: b8 b0 84 04 08 mov $0x80484b0,%eax

80483d2: 89 04 24 mov %eax,(%esp)

80483d5: e8 1a ff ff ff call 80482f4

首先,常量.LC0现在只是内存中某些随机偏移 – 很难创建一个在正确位置包含此常量的汇编源文件,因为汇编器和链接器可以自由选择这些常量的位置。

其次,我不完全确定这一点(它取决于诸如位置无关代码之类的事情),但我相信printf的引用实际上并没有编码在那个代码的指针地址,但ELF头包含一个查找表,其在运行时动态地替换其地址。因此,反汇编代码不完全对应于源汇编代码。

总而言之,源程序集具有符号,而编译的机器代码具有难以逆转的地址。

第二个主要复杂性是汇编源文件不能包含原始ELF文件头中存在的所有信息,例如要动态链接的库以及原始编译器放置的其他元数据。这将是很难重建这。

像我说的,有可能一个特殊的工具可以操纵所有这些信息,但是不可能简单地生成可以重新组装回可执行文件的汇编代码。

如果你有兴趣修改可执行文件的一小部分,我建议一个更微妙的方法,而不是重新编译整个应用程序。使用objdump获取您感兴趣的函数的汇编代码。手动将它转换为“源汇编语法”(这里,我希望有一个工具,实际上生成反汇编在与输入相同的语法) ,并根据需要修改它。当你完成后,重新编译那些函数,并使用objdump找出修改后的程序的机器代码。然后,使用十六进制编辑器将新机器代码手动粘贴到原始程序的相应部分的顶部,注意新代码与旧代码的字节数完全相同(或者所有偏移都是错误的)。如果新代码较短,可以使用NOP指令将其填充。如果它更长,你可能会有麻烦,并可能需要创建新的功能,并调用它们。

linux修改可执行程序,反汇编,修改,然后重新组装一个Linux可执行文件相关推荐

  1. linux网卡没有显示link,以下显示是一个Linux系统的网络配置信息:eth0 Link encap:..._考试资料网...

    单项选择题以下显示是一个Linux系统的网络配置信息: eth0 Link encap:Ethernet HWaddr 00:0C:29:F5:B4:79 inet addr:192.168.2.38 ...

  2. 每天一个linux命令目录

    开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每天一个linux命令.学习的主要参考资料为: 1.<鸟哥的linux私房菜> 2.http://codingstan ...

  3. linux 脚本设置时间戳,修改linux系统时间的方法(date命令)

    命令格式为: date -s 时间字符串 例如只修改系统的日期,不修改时间(时分秒) date -s 2012-08-02 或只修改时间不修改日期 date -s 10:08:00 当然也可以同时修改 ...

  4. Kali Linux 2020.1快速修改root用户密码

    Kali Linux 2020.1快速修改root用户密码 安装Kali Linux 2020.1系统过程中,将要求创建一个普通用户.而且,在安装过程中没有设置过root密码.由于大部分软件需要roo ...

  5. 中修改环境变量_超详干货!Linux环境变量配置全攻略

    Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量的配置方法. 下面所有例子的环境说明如下: 系统:Ubuntu 14.0 用户名:uusama 需要配置M ...

  6. [分享]运维分享一一阿里云linux系统mysql密码修改脚本

    [分享]运维分享一一阿里云linux系统mysql密码修改脚本     大象吃豆子 级别: 小白 发帖 12 云币 27 加关注 写私信 只看楼主 更多操作楼主  发表于: 2014-09-30 编写 ...

  7. linux下root密码修改方法

    linux下root密码修改方法 以root身份登陆,执行: passwd 用户名   修改密码. useradd 用户名   添加用户. 具体的如下:    #passwd   root    输入 ...

  8. linux hosts文件如何修改_3 种方法教你在 Linux 中修改打开文件数量限制

    当文件被打开访问时,操作系统临时分配一个名为文件句柄的数字.主内存的一个特殊区域是为文件句柄预留的,这个区域的大小决定了一次可以打开多少个文件. Linux上的进程受到许多限制,这些限制也阻碍它们正确 ...

  9. linux密码过期不修改,Linux解决用户密码过期但不用修改密码的方法

    linux 如果你设置了密码策略(密码有效期设定),到期不修改密码,系统在你登陆的时候会要求你更改密码,不更改便不让你登陆.如果你想不修改密码,延长你的账户有效期的话,可以用chane这个命令.下面来 ...

最新文章

  1. 精选SpringBoot+Vue开发的开源系统(前端+后端+小程序)
  2. 从ViewDragLayout中学到的一些事实
  3. pycharm以及flask的安装
  4. MATLAB从入门到精通:搭建一个 简单的Bp神经网络(附代码)
  5. android web通讯录,Android手机开发之通讯录
  6. 应用Mongoose开发MongoDB(1)数据库连接
  7. 商城系统功能多不是运营的关键,但是功能多,真香!
  8. 心理测评软件php mysql_中小学版心理测评档案管理系统
  9. 【企业微信点餐系统】
  10. scintilla下载地址及scintilla文档教程
  11. 【洛谷】P3376 【模板】网络最大流
  12. c语言太极图编程语言,C语言画图之 画个太极图
  13. 搜索引擎SEO 入门学习摘要笔记
  14. 论文阅读三:GHM《Gradient Harmonized Single-stage Detector》
  15. 神经网络压缩库Distiller学习
  16. python 离线安装驱动
  17. JKD 下载、安装、配置
  18. linux上u盘怎么加密,linux使用luks加密硬盘或u盘
  19. python调用IDM
  20. arduino蓝牙linux,Arduino Tian 开发板 Arduino yun升级 wifi 蓝牙 Linux限量

热门文章

  1. 【Linux】Linux 中文出现乱码问题的解决
  2. 老年机按键串号_为什么老人机依然很多人在用?
  3. linux删除默认路由
  4. linux部署前后端分离项目命令笔记
  5. android底层重构,【理论】【转】Android项目重构之路:实现篇
  6. nodejs cluster_NodeJS 极简教程 lt;1gt; NodeJS 特点 amp; 使用场景
  7. 九度搜索引擎点击优化_吉林免费seo优化工具
  8. 【BZOJ-3730】震波 动态点分治 + 树状数组
  9. python---字符编码
  10. sublime安装AngularJS插件