Linux内核之vmlinuz反汇编
本文介绍在Fedora上对Linux内核的vmlinuz进行反汇编。如果内核是debug版本,可以用来查看某个函数的源代码。
1. 安装kernel-devel软件包
dnf -y install kernel-devel
2. 提取vmlinux
- vmlinux是一个包括Linux kernel的静态链接的可运行文件。
- vmlinuz是vmlinux经过gzip和objcopy制作出来的压缩文件。
/usr/src/kernels/$(uname -r)/scripts/extract-vmlinux /boot/vmlinuz-$(uname -r) > vmlinux
3. 反汇编vmlinux
objdump -D vmlinux > vmlinux.out
4. 查看vmlinux里的函数
这里以函数tcp4_proc_init为例。/proc/kallsyms存储了所有的内核符号表,/boot/System.map则存储了静态的内核符号表。有关System.map,请阅读这里。
e.g.
root# grep tcp4_proc_init /proc/kallsyms
ffffffffa37dd330 t tcp4_proc_init_net
ffffffffa479d258 T tcp4_proc_init root# grep tcp4_proc_init /boot/System.map-$(uname -r)
ffffffff817dd330 t tcp4_proc_init_net
ffffffff8279d258 T tcp4_proc_init root# egrep -in ffffffff8279d258 vmlinux.out
:ffffffff8279d258: e8 ff callq 0xffffffff81a019f0
:ffffffff8279d96d: e8 e6 f8 ff ff callq 0xffffffff8279d258 root# N=
root# sed -n "$((N-5)),$((N+5))"p vmlinux.out
ffffffff8279d24e: e8 7d fe callq 0xffffffff810ae6d0
ffffffff8279d253: eb bd jmp 0xffffffff8279d212
ffffffff8279d255: 5b pop %rbx
ffffffff8279d256: 5d pop %rbp
ffffffff8279d257: c3 retq
ffffffff8279d258: e8 ff callq 0xffffffff81a019f0
ffffffff8279d25d: c7 c7 ca mov $0xffffffff8231ca40,%rdi
ffffffff8279d264: e9 d3 fb fe jmpq 0xffffffff8175a590
ffffffff8279d269: e8 ff callq 0xffffffff81a019f0
ffffffff8279d26e: c7 c7 c8 mov $0xffffffff8231c860,%rdi
ffffffff8279d275: e8 d3 fb fe callq 0xffffffff8175a590
函数tcp4_proc_init()的源代码如下:
/* https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/net/ipv4/tcp_ipv4.c?h=v4.16.9#n2392 */
static int __net_init tcp4_proc_init_net(struct net *net)
{
return tcp_proc_register(net, &tcp4_seq_afinfo);
} static void __net_exit tcp4_proc_exit_net(struct net *net)
{
tcp_proc_unregister(net, &tcp4_seq_afinfo);
} static struct pernet_operations tcp4_net_ops = {
.init = tcp4_proc_init_net,
.exit = tcp4_proc_exit_net,
}; int __init tcp4_proc_init(void)
{
return register_pernet_subsys(&tcp4_net_ops);
} void tcp4_proc_exit(void)
{
unregister_pernet_subsys(&tcp4_net_ops);
}
从L2394,我们可以看出tcp4_proc_init()调用了函数register_pernet_subsys(), 重新查看vmlinux.out验证一下。
root# egrep 'T register_pernet_subsys' /boot/System.map-$(uname -r)
ffffffff8175a590 T register_pernet_subsys root# sed -n "$N, $((N+20))"p vmlinux.out > /tmp/
root# egrep -in retq /tmp/
:ffffffff8279d28a: c3 retq root# sed -n '1,11'p /tmp/ | cat -n
ffffffff8279d258: e8 ff callq 0xffffffff81a019f0
ffffffff8279d25d: c7 c7 ca mov $0xffffffff8231ca40,%rdi
ffffffff8279d264: e9 d3 fb fe jmpq 0xffffffff8175a590
ffffffff8279d269: e8 ff callq 0xffffffff81a019f0
ffffffff8279d26e: c7 c7 c8 mov $0xffffffff8231c860,%rdi
ffffffff8279d275: e8 d3 fb fe callq 0xffffffff8175a590
ffffffff8279d27a: c0 test %eax,%eax
ffffffff8279d27c: 0c je 0xffffffff8279d28a
ffffffff8279d27e: c7 c7 c0 d0 mov $0xffffffff8214d0c0,%rdi
ffffffff8279d285: e8 b4 c1 fe callq 0xffffffff810a943e
ffffffff8279d28a: c3 retq
root# sed -n '1,11'p /tmp/ | cat -n | egrep ffffffff8175a590
ffffffff8279d264: e9 d3 fb fe jmpq 0xffffffff8175a590
ffffffff8279d275: e8 d3 fb fe callq 0xffffffff8175a590
参考资料:
Linux内核之vmlinuz反汇编的更多相关文章
- Linux内核编译与安装
2013-04-16 Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.L ...
- linux内核学习之一 简单c语言反汇编
(我是第一次发技术博客的菜鸟,恳请大家指导!!) 一 由简单c程序生成汇编代码 首先给出本次我们要反汇编的简单c语言程序:(够简单吧~) 在linux环境中使用下面的命令条件编译: 生成汇编文件sh ...
- Linux内核之vmlinux与vmlinuz
因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux vmlinux是一个包括linu ...
- Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程
Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
- linux内核编程笔记【原创】
以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...
- 【转】Linux内核调试方法总结
目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_sta ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
随机推荐
- 50本.NTE、C#相关技术书籍免费下载
场景 近期囤积了一大批编程教程和电子书资料.至于视频教程,我一般是看完之后整理成相应的博客进行记录,一般不会再云盘中进行存取,因为很占空间. 至于电子书资料,很多,就是得一点点整理归纳. 近期我的公众 ...
- MES助力日立电梯提升精细化管理水平
项目背景介绍 日立电梯在2008年到2012年期间分别在五地工厂(上海.广州.天津.成都.扶梯)上线了ERP系统,在后续的使用时间里,逐渐发现现有ERP系统对于生产现场管理,产品质量追溯,产能控制等方 ...
- CoreData数据库搭建
1.首先创建父类吧重用的代码写在里边 #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @inte ...
- OC-bug: Undefined symbols for architecture i386: "_OBJC_CLASS_$_JPUSHRegisterEntity", referenced from:
bug的提示: Undefined symbols for architecture i386: "_OBJC_CLASS_$_JPUSHRegisterEntity", refe ...
- ROW_NUMBER()实现分页
1. 在数据表基础上面添加一个自增的一列记录行数(虚拟的实际数据库不存在,不会影响数据库结构)的列当然也顺便起一个别名(我这里起了一个rowNum) 2.由于rowNum是一个虚拟的.若直接使用会报' ...
- router-link路由传参
router-link传参 [注意] 1.使用params方式传参时,只支持name跳转: 案例如下: 2.使用query传参,注意:两种都支持 案例如下 .
- Linux sh、source和.命令执行.sh文件的区别
sh文件介绍 .sh为Linux的脚本文件,我们可以通过.sh执行一些命令,可以理解为windows的.bat批处理文件. 点命令 .命令和source是同一个命令,可以理解为source的缩写,简称 ...
- Golang调用Python
https://yq.aliyun.com/articles/117329 Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言.Python很适合让搞算法的写写模型, ...
- InfoQ一波文章:菜鸟核心技术/Intel发布CPU新架构3D堆栈法/BDL/PaddlePaddle/百度第三代Spider/Tera
菜鸟智慧新物流核心技术全解析 孟靖 阅读数:63192018 年 12 月 14 日 16:00 2018 年天猫双 11 全球狂欢节已正式落下帷幕,最终成交额定格在 2135 亿元,物流订单 ...
- Python进阶-Ⅹ 正则表达式(RexEx)、re模块
1.正则表达式(RexEx)常用知识 2.python中re模块的初步使用 1).findall方法 ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配 ...