Linux内核分析(-)——反编译C代码
2015-03-08 22:08
148 查看
翁高剑 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
初学网易云课堂的Linux内核分析课程,从反编译一个简单的C程序开始,编译用的main.c程序如下:
在Linux系统中打开超级终端(快捷键 Ctrl+Shift+T),输入命令:gcc -S -o main.s main.c -m32
在目录下会生成main.s文件,在初始生成的main.s文件中会有很多的以.开头的语句(如下图)
都是一些辅助的链接文件,实际运行的时候是不起作用的,可以删除,删除掉以.开头的语句的完整汇编程序如下:
简单分析下这个汇编程序,程序中包括3个函数,其中一个为main主函数,函数先从main函数开始运行,此时计算机会创建一个内存堆栈,寄存器ebp指向堆栈的栈底,寄存器esp指向堆栈的栈顶,了解这些就可以开始分析代码了
main:
pushl %ebp //创建堆栈把ebp存入第一个内存中,栈顶向下移动一位(pushl 表示的
//是32的操作)
movl %esp, %ebp //把栈底ebp移动到栈顶
subl $4, %esp //栈顶向下移一位
movl $6, (%esp) //往寄存器esp中写入数字6
call f //调用函数f,此时寄存器epi会写入函数f所在的地址
addl $1, %eax //将当前寄存器eax中的数据加1即11+1=12
leave //实际表示:movl %ebp,%esp popl %ebp
ret
f:
pushl %ebp //把ebp存入内存中,此时ebp是第1个内存地址
movl %esp, %ebp //把栈底ebp移动到栈顶
subl $4, %esp //栈顶向下移一位
movl 8(%ebp), %eax //变址寻址,将ebp寄存器往上两位的数据存入寄存
//器eax中
molv %eax, (%esp) //把寄存器eax中的数据存入当前内存中
call g //调用函数g,此时寄存器epi会写入函数g所在的地址
leave //实际表示:movl %ebp,%esp popl %ebp
ret //返回到主函数继续执行call f后面的语句
g:
pushl %ebp //把ebp存入内存中,此时ebp是第4个内存地址
movl %esp, %ebp //把栈底ebp移动到栈顶
movl 8(%ebp), %eax //变址寻址,将ebp寄存器往上两位的数据即6存入
//寄存器eax中
addl $5, %eax //将eax寄存器中的数据加上5,即6+5=11
popl %ebp //将ebp出栈
ret //返回 到f函数继续执行call g后面的语句
以上就是该汇编程序的简单分析,算是对第一堂课所学内容的一个总结,如有错误请不吝赐教。
2015年3月8日夜
初学网易云课堂的Linux内核分析课程,从反编译一个简单的C程序开始,编译用的main.c程序如下:
在Linux系统中打开超级终端(快捷键 Ctrl+Shift+T),输入命令:gcc -S -o main.s main.c -m32
在目录下会生成main.s文件,在初始生成的main.s文件中会有很多的以.开头的语句(如下图)
都是一些辅助的链接文件,实际运行的时候是不起作用的,可以删除,删除掉以.开头的语句的完整汇编程序如下:
简单分析下这个汇编程序,程序中包括3个函数,其中一个为main主函数,函数先从main函数开始运行,此时计算机会创建一个内存堆栈,寄存器ebp指向堆栈的栈底,寄存器esp指向堆栈的栈顶,了解这些就可以开始分析代码了
main:
pushl %ebp //创建堆栈把ebp存入第一个内存中,栈顶向下移动一位(pushl 表示的
//是32的操作)
movl %esp, %ebp //把栈底ebp移动到栈顶
subl $4, %esp //栈顶向下移一位
movl $6, (%esp) //往寄存器esp中写入数字6
call f //调用函数f,此时寄存器epi会写入函数f所在的地址
addl $1, %eax //将当前寄存器eax中的数据加1即11+1=12
leave //实际表示:movl %ebp,%esp popl %ebp
ret
f:
pushl %ebp //把ebp存入内存中,此时ebp是第1个内存地址
movl %esp, %ebp //把栈底ebp移动到栈顶
subl $4, %esp //栈顶向下移一位
movl 8(%ebp), %eax //变址寻址,将ebp寄存器往上两位的数据存入寄存
//器eax中
molv %eax, (%esp) //把寄存器eax中的数据存入当前内存中
call g //调用函数g,此时寄存器epi会写入函数g所在的地址
leave //实际表示:movl %ebp,%esp popl %ebp
ret //返回到主函数继续执行call f后面的语句
g:
pushl %ebp //把ebp存入内存中,此时ebp是第4个内存地址
movl %esp, %ebp //把栈底ebp移动到栈顶
movl 8(%ebp), %eax //变址寻址,将ebp寄存器往上两位的数据即6存入
//寄存器eax中
addl $5, %eax //将eax寄存器中的数据加上5,即6+5=11
popl %ebp //将ebp出栈
ret //返回 到f函数继续执行call g后面的语句
以上就是该汇编程序的简单分析,算是对第一堂课所学内容的一个总结,如有错误请不吝赐教。
2015年3月8日夜
相关文章推荐
- Linux内核-双向循环链表代码分析
- LINUX内核延时研究与函数代码分析
- APK反编译jd-gui代码分析(草稿记录)
- 云课堂 Linux内核分析 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- Java反编译代码分析(一)
- Linux内核2.6.14源码分析-双向循环链表代码分析
- 从linux内核代码分析操作系统启动过程
- APK反编译后代码分析(一)
- linux内核启动代码分析
- Linux内核分析,c程序汇编代码分析--第一周
- Linux内核源码分析-链表代码分析
- Linux内核代码分析--slab.c
- linux内核进程切换代码分析(图不错)
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
- 【转+原】Android代码反编译及分析
- Linux内核延时研究与函数代码分析
- APK反编译后代码分析(二)
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
- Linux内核分析:完成一个简单的时间片轮转多道程序内核代码