本文介绍在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反汇编的更多相关文章

  1. Linux内核编译与安装

    2013-04-16    Linux内核介绍  Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.L ...

  2. linux内核学习之一 简单c语言反汇编

    (我是第一次发技术博客的菜鸟,恳请大家指导!!) 一  由简单c程序生成汇编代码 首先给出本次我们要反汇编的简单c语言程序:(够简单吧~) 在linux环境中使用下面的命令条件编译: 生成汇编文件sh ...

  3. Linux内核之vmlinux与vmlinuz

    因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux   vmlinux是一个包括linu ...

  4. Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程

    Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...

  5. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  6. linux内核编程笔记【原创】

    以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...

  7. 【转】Linux内核调试方法总结

    目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_sta ...

  8. Linux内核调试方法总结

    Linux内核调试方法总结 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2   ...

  9. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

随机推荐

  1. 在使用 Fortify进行源码扫描时需要做对项目需要做什么?

    1.一般我们的项目都是svn 或git 进行管理的,为了扫出异常的问题 做好把   “” .svn    “”  文件删除 2.把我们的项目需要的jar 文件放到一个文件夹内同项目一起进行扫描.这样为 ...

  2. 2.dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据

    作者:中华石杉 面试题 dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? 面试官心理分析 上一个问题,说说 dubbo ...

  3. MS17-010漏洞利用复现

    MS17-010漏洞利用复现 准备环境: win7靶机 IP地址:172.16.15.118 Kali攻击机 IP地址:172.16.15.50 首先我们需要查看一下靶机是否开启445端口 打开kal ...

  4. 【IDE_IntelliJ IDEA】idea中设置类和方法的注释模板

    参考博文:idea生成类注释和方法注释的正确方法

  5. 201777010217-金云馨《面向对象程序设计(java)》第十四周学习总结

      项目 内容   这个作业属于哪个课程   https://www.cnblogs.com/nwnu-daizh/   这个作业的要求在哪里 https://www.cnblogs.com/nwnu ...

  6. 唐敬博-201871010118 《面向对象程序设计(java)》第七周学习总结

    在博客园撰写博客(随笔),总结7周实验内容,作业格式要求如下: 博文名称:学号-姓名<面向对象程序设计(java)>第七周学习总结(1分) 博文正文开头格式:(2分) 项目 内容 这个作业 ...

  7. 201871010134-周英杰《面向对象程序设计(java)》第十六周学习总结

    项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/ ...

  8. javascript高级实战学习

    学习目标: - 理解面向对象开发思想 - 掌握 JavaScript 面向对象开发相关模式 - 掌握在 JavaScript 中使用正则表达式 - typora-copy-images-to medi ...

  9. SpingBoot四——前后端分离

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:https://www.cnblogs.com/by-dream/p/11336057.html 根据之前的教程,我们已经可以独立 ...

  10. MySQL数据库 介绍,安装,基本操作

    - 数据库介绍: 1.随意存放在一个文件中的数据,数据的格式千差万别 tank|123 jason:123 sean~123 2.软件开发目录规范 - Project: - conf - bin - ...