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:在调试模 ...
随机推荐
- linux应用管理
desktop文件的几个位置: /usr/share/applications ~/.local/share/applications /usr/local/share/applications li ...
- block注意事项
1.block的声明和注意事项 #import "ZYViewController.h" @interface ZYViewController () @end /*用typede ...
- 终端的乐趣--Linux下有趣的终端命令或者工具【转】
转自:https://blog.csdn.net/gatieme/article/details/52144603 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- c语言的布尔量
#include <stdio.h> #include <stdbool.h> int main() { bool b = true; bool t = false; ; }
- mysql中的case when then 的用法
将立立饭饭的性别变更为女 ,烦烦 嗯嗯 问我的性别变更为男 update `table` set sex = ( case when sname in('立立','饭饭') then '女' else ...
- JS高阶---定时器相关
首先看几个问题: [主体] (1)定时器真的时定时执行的吗? 顺序验证: 测试结果: 接下来对上述代码做下修改,增加一个长时间工作的消耗,此时再来验证下定时器运行的精准度 结果如下: (2)定时器回调 ...
- pdfium 保存pdf
// // Created by svenj on 2019/2/3. // extern "C" { #include <unistd.h> #include < ...
- 201871020225-牟星源《面向对象程序设计(java)》第七周学习总结
201871020225-牟星源<面向对象程序设计(java)>第七周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...
- 【使用篇二】SpringBoot整合Servlet(1)
两种方式: 通过注解扫描完成 Servlet组件的注册 通过方法完成 Servlet组件的注册 一.通过注解扫描完成 Servlet 组件的注册 1. 编写Servlet类 /** * SpringB ...
- 创建maven父子项目(九)
一.父子-聚合项目 通过 maven 可以创建父子-聚合项目. 所谓的父子项目,即有一个父项目,有多个子项目.这些子项目,在业务逻辑上,都归纳在这个父项目下,并且一般来说,都会有重复的jar包共享.所 ...