转自:http://blog.csdn.net/u011192270/article/details/50224267

前言:本文主要介绍几种反汇编的方法。

gcc

gcc的完整编译过程大致为:预处理->编译->汇编->链接

前三个步骤分别对应了-E、-S、-c三个选项。

今天我要介绍的第一种方法就是使用-S这个选项。

源程序main.c:

/*************************************************************************  > File Name: main.c  > Author: AnSwEr  > Mail: 1045837697@qq.com  > Created Time: 2015年12月08日 星期二 20时06分19秒 ************************************************************************/ #include<stdio.h> int i = 1; int main(void) {  ++i;  printf("%d\n",i);  return 0; }

执行以下命令:

gcc -S -o main.s main.c

查看汇编源程序main.s:

    .file   "main.c".globl  i.data.align 4 .type i, @object .size i, 4 i: .long 1 .section .rodata .LC0: .string "%d\n" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl i(%rip), %eax addl $1, %eax movl %eax, i(%rip) movl i(%rip), %eax movl %eax, %esi movl $.LC0, %edi movl $0, %eax call printf movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2" .section .note.GNU-stack,"",@progbits

哈哈,大家看是不是成功了?至于汇编程序的具体解释则不在本文的讨论范畴。

最后介绍一下gcc的具体过程:
参考: https://github.com/1184893257/simplelinux/blob/master/gcc.md#top

编译阶段 命令 截断后的产物
    C源程序
预处理 gcc -E 替换了宏的C源程序(没有了#define,#include…), 删除了注释
编译 gcc -S 汇编源程序
汇编 gcc -c 目标文件,二进制文件, 允许有不在此文件中的外部变量、函数
链接 gcc 可执行程序,一般由多个目标文件或库链接而成, 二进制文件,所有变量、函数都必须找得到

objdump

objdump是linux下一款反汇编工具,能够反汇编目标文件、可执行文件。

主要选项:

objdump -f
显示文件头信息objdump -d
反汇编需要执行指令的那些sectionobjdump -D
与-d类似,但反汇编中的所有sectionobjdump -h 显示Section Header信息 objdump -x 显示全部Header信息 objdump -s 将所有段的内容以十六进制的方式打印出来

目标文件

反汇编:

gcc -c -o main.o main.c
objdump -s -d main.o > main.o.txt
  • 1
  • 2

查看汇编文件:


main.o:     文件格式 elf64-x86-64Contents of section .text:0000 554889e5 8b050000 000083c0 01890500 UH.............. 0010 0000008b 05000000 0089c6bf 00000000 ................ 0020 b8000000 00e80000 0000b800 0000005d ...............] 0030 c3 . Contents of section .data: 0000 01000000 .... Contents of section .rodata: 0000 25640a00 %d.. Contents of section .comment: 0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4. 0010 382e322d 31397562 756e7475 31292034 8.2-19ubuntu1) 4 0020 2e382e32 00 .8.2. Contents of section .eh_frame: 0000 14000000 00000000 017a5200 01781001 .........zR..x.. 0010 1b0c0708 90010000 1c000000 1c000000 ................ 0020 00000000 31000000 00410e10 8602430d ....1....A....C. 0030 066c0c07 08000000 .l...... Disassembly of section .text: 0000000000000000 <main>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # a <main+0xa> a: 83 c0 01 add $0x1,%eax d: 89 05 00 00 00 00 mov %eax,0x0(%rip) # 13 <main+0x13> 13: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 19 <main+0x19> 19: 89 c6 mov %eax,%esi 1b: bf 00 00 00 00 mov $0x0,%edi 20: b8 00 00 00 00 mov $0x0,%eax 25: e8 00 00 00 00 callq 2a <main+0x2a> 2a: b8 00 00 00 00 mov $0x0,%eax 2f: 5d pop %rbp 30: c3 retq 

可执行文件

反汇编:

gcc -o main main.c
objdump -s -d main > main.txt

查看汇编文件(由于文件较大,只取部分展示):

Disassembly of section .init:00000000004003e0 <_init>:4003e0:   48 83 ec 08 sub $0x8,%rsp 4003e4: 48 8b 05 0d 0c 20 00 mov 0x200c0d(%rip),%rax # 600ff8 <_DYNAMIC+0x1d0> 4003eb: 48 85 c0 test %rax,%rax 4003ee: 74 05 je 4003f5 <_init+0x15> 4003f0: e8 3b 00 00 00 callq 400430 <__gmon_start__@plt> 4003f5: 48 83 c4 08 add $0x8,%rsp 4003f9: c3 retq Disassembly of section .plt: 0000000000400400 <printf@plt-0x10>: 400400: ff 35 02 0c 20 00 pushq 0x200c02(%rip) # 601008 <_GLOBAL_OFFSET_TABLE_+0x8> 400406: ff 25 04 0c 20 00 jmpq *0x200c04(%rip) # 601010 <_GLOBAL_OFFSET_TABLE_+0x10> 40040c: 0f 1f 40 00 nopl 0x0(%rax) 0000000000400410 <printf@plt>: 400410: ff 25 02 0c 20 00 jmpq *0x200c02(%rip) # 601018 <_GLOBAL_OFFSET_TABLE_+0x18> 400416: 68 00 00 00 00 pushq $0x0 40041b: e9 e0 ff ff ff jmpq 400400 <_init+0x20>

linux 下目标文件(默认扩展名是.o)和可执行文件都是 ELF 格式(文件内容按照一定格式进行组织)的二进制文件; 类似的,Windows 下 VISUAL C++ 编译出来的目标文件 (扩展名是.obj)采用 COFF 格式,而可执行文件 (扩展名是.exe)采用 PE 格式, ELF 和 PE 都是从 COFF 发展而来的。

因为 linux 下目标文件和可执行文件的内容格式是一样的, 所以 objdump 既可以反汇编可执行文件也可以反汇编目标文件。

总结

掌握了反汇编的方法,当你的程序遇到一些未知的变量错误等,可以直接反汇编来查看汇编代码,一切一目了然。PS:汇编我已经忘得差不多了。

参考

  1. https://github.com/1184893257/simplelinux

反馈与建议

  • 微博:@AnSwEr不是答案
  • github:AnSwErYWJ
  • 博客:AnSwEr不是答案的专栏
版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/u011192270/article/details/50224267

Linux下C程序的反汇编【转】相关推荐

  1. Linux下C程序的编辑,编译和运行以及调试

                                                                                                        ...

  2. qt调用linux 进程,Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u014746574/article/d ...

  3. Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本)

    Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本) 转载于:https://www.cnblogs.com/zhehan54/p/9549017.html

  4. linux c++ 程序运行时间,总结UNIX/LINUX下C++程序计时的方法

    前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序 ...

  5. linux 跟踪程序执行过程,用pvtrace和Graphviz实现对linux下C程序的函数调用跟踪

    用pvtrace和Graphviz实现对linux下C程序的函数调用跟踪 用pvtrace和Graphviz实现对linux下C程序的函数调用跟踪 1:功能介绍,使用本方法可以实现linux下C应用程 ...

  6. 解决Windows下Arm下Linux下Qt4程序的中文乱码问题

    解决Windows下Arm下Linux下Qt4程序的中文乱码问题 ################################################################### ...

  7. linux连接到程序,Linux下C程序的链接过程

    今天看到一个很有意思的小程序,它让我对Linux下C程序的编译链接有了一个全新的认识! 这个程序的就是写一个简单的输出"hello World!": 要求:1.不使用C运行库,写一 ...

  8. Linux下C程序的可扩展性.

    What I write, what I lose. 以下为个人关于Linux下C程序的可扩张性的一点想法. 可扩展性的应用场景: 1. 有两个项目都需要使用的一个相同功能的程序, 但是有些要求不一样 ...

  9. linux cat 进程,Linux下CAT程序的C实现

    Linux下CAT程序的C实现代码片段: #include #include #include #define BUFSIZ 1024 void error(char *fmt, ...){ va_l ...

最新文章

  1. 报告鼠标和键盘事件的一个程序(转)
  2. java程序设计 徐红_Java程序设计-徐红 王灿
  3. Windows 下安装Pytorch
  4. 【Linux】一步一步学Linux——getfacl命令(118)
  5. Conda 安装本地包
  6. android 线程太多,应用程序可能在其主线程上做了太多的工作。
  7. 书摘---创业36条军规1:创业是怎么回事
  8. 转载系列之一:浅析Hadoop文件格式
  9. unity urp raytrace体积光god ray效果
  10. Python基础之爬取豆瓣图书信息
  11. 分布式机器学习第3章 分布式机器学习框架
  12. 菜鸟使用RedHat Linux9.0极品笑话
  13. 此博客更新较慢,主要用于微信公众号“申龙斌的程序人生”的备份了
  14. quartus如何生成sof_如何高效利用Arm DesignStart计划开放的处理器核-工具篇
  15. 动态html函数的写法,如何将html div id的动态传递给js函数
  16. Python入门必学,用Python练习画个美队盾牌
  17. 亚马逊aws免费云服务器搭建总结
  18. (PTA)基础编程题目集
  19. 不敢说最快!但是这款CRAS C700绝对是我们见过最漂亮的SSD
  20. eclipse官方网址、各个版本的下载

热门文章

  1. python ftp文件夹文件递归上传推送
  2. dubbo总结——dubbo的使用场景
  3. 简述Zookeeper作注册中心
  4. 粗暴的手动更新方式等效git更新
  5. 51nod 最大M子段和系列
  6. ESXI5.5添加本地磁盘出错的解决
  7. .NET+IIS+MSSQL配置
  8. JavaCollection
  9. windows installer清理实用工具
  10. Robotics Research Laboratory