Linux内核分析——分析C程序的反汇编内容
来源:互联网 发布:金盾网络电视台正规吗 编辑:程序博客网 时间:2024/06/05 16:59
作者:耿介之
原创作品转载请注明出处 :http://blog.csdn.net/jiezhi2013/article/details/44132493
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
1.C程序代码
首先我们写一段小程序:
main.c
int g(int x){ return x + 5;}int f(int x){ return g(x) + 1;}int main(void){ return f(2) + 3;}
2.反汇编
gcc -S -o main.s main.c -m32
得到如下文件
main.s
.file"main.c".text.globlg.typeg, @functiong:.LFB0:.cfi_startprocpushl%ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl%esp, %ebp.cfi_def_cfa_register 5movl8(%ebp), %eaxaddl$5, %eaxpopl%ebp.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc.LFE0:.sizeg, .-g.globlf.typef, @functionf:.LFB1:.cfi_startprocpushl%ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl%esp, %ebp.cfi_def_cfa_register 5subl$4, %espmovl8(%ebp), %eaxmovl%eax, (%esp)callgaddl$1, %eaxleave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc.LFE1:.sizef, .-f.globlmain.typemain, @functionmain:.LFB2:.cfi_startprocpushl%ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl%esp, %ebp.cfi_def_cfa_register 5subl$4, %espmovl$2, (%esp)callfaddl$3, %eaxleave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc.LFE2:.sizemain, .-main.ident"GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2".section.note.GNU-stack,"",@progbits
g:pushl%ebpmovl%esp, %ebpmovl8(%ebp), %eaxaddl$5, %eaxpopl%ebpretf:pushl%ebpmovl%esp, %ebpsubl$4, %espmovl8(%ebp), %eaxmovl%eax, (%esp)callgaddl$1, %eaxleaveretmain:pushl%ebpmovl%esp, %ebpsubl$4, %espmovl$2, (%esp)callfaddl$3, %eaxleaveret
3.汇编分析
分析当然从main函数开始:- pushl %ebp:将当前ebp(堆栈基指针)压栈,同时esp(堆栈顶指针)向下移动1个单位(32位下即4个字节);
- movl %esp, %ebp:将esp的值赋给ebp;
- subl $4, %esp:将esp下移1个单位(堆栈是从上而下的,所以减去4实则为栈顶加1个单位);
- movl $2, (%esp):将值2压栈;
- call f:call可以分解为两个动作,pushl %eip(*)和movl $24, %eip(*),这里的$24其实就是把下一行的地址复制给eip(指令寄存器,存放当前指令的下一条指令的地址),ebp下移一个单位,下面从f函数执行:
- 其中 pushl %ebp,movl%esp, %ebp,subl$4, %esp三条指令和前面的1,2,3是一样的,略过;
- movl 8(%ebp), %eax:ebp+8即为ebp往上两个单位的位置,我们知道其实指向第4步压入的值2并将其复制为eax(累加器);
- movl %eax, (%esp):将eax赋值给esp;
- call g:同5;
- g函数中的pushl %ebp,movl%esp, %ebp,movl8(%ebp), %eax同上;
- addl $5, %eax:把5加给eax,通过上面我们知道eax现在的值是2,所以现在eax值为2+5 = 7;
- popl %ebp:上一个压入ebp是在g函数的开始,所以这里相当于把ebp指向进入g函数之前的位置了,esp也相应的移到上个单位;
- ret:即return,相当于popl %eip,而上一个eip是在进入g函数的时候压入的(即call g),至此g函数执行完,继续回到f函数执行,(所计算的值7还保存在eax里)。
- addl $1, %eax:再把eax加1,此时eax的值为8;
- leave:相当于movl $esp, %eip和popl %ebp两条指令。此时esp指向main函数的call f的下一条指令,ebp指向main函数的ebp了。
- ret:同上
- addl $3, %eax:eap的值为11了。
- leave:同上;
- ret:同上。
至此,我们把这一小段反汇编代码看完了。
4.总结
其实我们可以看到,这段C程序在计算机内的执行,其实都是建立在对堆栈操作的基础上的。而堆栈的操作基本也是对栈底、栈顶的操作,所以理解了上面诸如,push、pop、move等操作后,我们就可以对一些简单的程序进行汇编分析了。
0 0
- Linux内核分析——分析C程序的反汇编内容
- 《Linux内核分析》(一)——反汇编一个简单的C程序并分析其汇编代码的执行
- MOOC课程《Linux内核分析》——反汇编一个简单的C程序
- Linux内核分析——反汇编一个简单C程序
- Linux内核分析-反汇编一个简单的C程序并简单分析
- Linux内核分析学习_Week1_反汇编一个简单的C程序
- Linux内核分析一:反汇编一个简单的C程序
- 第1节 反汇编一个简单的C程序【Linux内核分析】
- Linux内核分析之一——简单C程序的汇编代码工作过程分析
- linux内核分析1--反汇编分析
- Linux内核分析---汇编简单C程序
- 《linux内核分析》作业一:反汇编一个C语言程序并分析汇编代码执行过程
- 云课堂 Linux内核分析 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 云课堂-linux内核分析:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- Linux内核分析课程--通过反汇编一个简单的c程序,分析汇编代码并理解计算机如何工作的
- Linux内核分析实验1——汇编一个简单的C程序
- linux内核分析——简单代码反汇编为汇编代码分析
- 反汇编一个简单的C程序,分析汇编代码
- Java与C/C++有什么区别
- DML DDL DCL区别
- UNP 卷一的服务器时间获取例子
- Robotium学习笔记四
- 挑战jquery(一)实现水平幻灯片
- Linux内核分析——分析C程序的反汇编内容
- ZOJ 1636 Evaluate Matrix Sum
- leetcode Integer to Roman
- poj 一类开关问题
- 反汇编代码分析
- 如何选择项目语言(项目笔记)
- lecture13-BP算法的讨论和置信网
- 1010. 一元多项式求导 (25)
- css样式大全