查看Ubuntu Linux内核函数反汇编代码

查看Ubuntu Linux内核函数反汇编代码,第1张

查看Ubuntu Linux内核函数反汇编代码

说明:本文单纯为快捷记录 *** 作方法之用,没有解释技术细节,如果想了解具体原理请另寻其他资料。

内核是构成计算机 *** 作系统核心的程序。它是在计算机启动(即启动)时首先加载到内存(物理上由RAM芯片组成)的内容,并且在计算机运行的整个过程中它都保留在内存中。

Linux内核源码编译结束后生成的文件为vmlinux,这是一个ELF可执行文件,可以被反汇编。但不可以被引导

vmlinuz是vmlinux经过压缩后生成的可引导可执行文件。可引导意味着它能够将 *** 作系统加载到内存中,以便计算机变得可用并且可以运行应用程序。

vmlinuz 不应与vmlinux混淆,后者是非压缩和不可引导形式的内核。vmlinux 通常只是生成 vmlinuz 的中间步骤。

以下 *** 作将vmlinuz转换为vmlinux,以达到查看内核函数源代码的目的。

实验环境为Ubuntu 12.04 32位3.13.0-32-generic内核。

调用内置脚本将vmlinuz转换为vmlinux。

/usr/src/linux-headers-3.13.0-32/scripts/extract-vmlinux /boot/vmlinuz-3.13.0-32-generic > vmlinux

转换后,使用objdump反汇编。

objdump -D vmlinux > vmlinux.dump

查询sys_read的地址。可知位于0xc1184e00

user@user-VirtualBox:~/Desktop/test1$ sudo grep sys_read /proc/kallsyms
[sudo] password for dop: 
c1135af0 T sys_readahead
c1184e00 T sys_read
c1185470 T sys_readv
c1188fc0 T sys_readlinkat
c11890b0 T sys_readlink
c11e3470 t proc_sys_read
c11e3bc0 t proc_sys_readdir

由于刚才生成的dump文件过大,直接在dump中查找该地址耗费时间较多。我们查询其行号,然后用seq指令查询下方内容即可。

user@user-VirtualBox:~/Desktop/test1$ egrep -in c1184e00 vmlinux.dump
499288:c1184e00:	55                   	push   %ebp
^C
user@user-VirtualBox:~/Desktop/test1$ sed -n "$((499288)),$((499500))"p vmlinux.dump
c1184e00:	55                   	push   %ebp
c1184e01:	89 e5                	mov    %esp,%ebp
c1184e03:	83 ec 20             	sub    x20,%esp
c1184e06:	89 5d f4             	mov    %ebx,-0xc(%ebp)
c1184e09:	89 75 f8             	mov    %esi,-0x8(%ebp)
c1184e0c:	89 7d fc             	mov    %edi,-0x4(%ebp)
c1184e0f:	e8 40 e3 50 00       	call   0xc1693154
c1184e14:	be f7 ff ff ff       	mov    xfffffff7,%esi
c1184e19:	8b 45 0c             	mov    0xc(%ebp),%eax
...

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zaji/5681351.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存