Linux 内核镜像分析

文章目录

前言

介绍了vmlinux的来源,以及分析方法;

一、概述

在linux系统中,vmlinux(vmlinuz)是一个包含linux kernel的静态链接的可执行文件,文件类型可能是linux接受的可执行文件格式之一(ELF、COFF或a.out),vmlinux若要用于调试时则必须要在引导前增加symbol table。
应用场景:

  • 用于调试,但需要包含调试信息
  • 编译出来的内核原始文件,可以被用来制作后面zImage,bzImage等启动Image
  • UBoot不能直接使用vmlinux

相关内容:

  • vmlinux是静态编译出来的最原始的 ELF 文件,包括了内核镜像、调试信息、符号表等内容;其中 "vm" 代表 "Virtual Memory",现在一般都是虚拟内存模式,这个是相对于 8086 的实地址而言。
  • vmlinuz是被压缩的linux内核,是可以被引导的,有两种详细的表现形式:zImage和bzImage(big zImage)。
  • zImage是vmlinuz经过gzip压缩后的文件,适用于小内核
  • bzImage是vmlinuz经过gzip压缩后的文件,适用于大内核
  • uImage 是 uboot 专用的镜像文件,它是在 zImage 之前加上一个长度为 0x40 的头信息,包括了该镜像文件的类型、加载位置、生成时间、大小等信息。

zImage、bzImage 中均包含一个微型的 gzip 用于解压缩内核并引导,两者的不同之处在于: zImage 解压缩内核到低端内存 (第一个640K),bzImage 解压缩内核到高端内存 (1M以上)。也就是,它们之间最大的差别是对于内核体积大小的限制。

由于 zImage 内核需要放在实模式 1MB 的内存之内,所以其体积受到了限制,目前采用的内核格式大多采用的是 bzImage ,这种格式没有 1MB 内存限制。arm 中常用的是 zImage,而 x86 中常用的是 bzImage 。

vmlinuz的位置:

复制代码
wsk@wsk:/boot$ ll
total 71848
drwxr-xr-x  4 root root     4096 Nov 20  2021 ./
drwxr-xr-x 24 root root     4096 Nov 20  2021 ../
-rw-r--r--  1 root root   217414 Aug 19 22:30 config-4.15.0-156-generic
drwxr-xr-x  5 root root     4096 Nov 19 23:49 grub/
-rw-r--r--  1 root root 60783850 Nov 20  2021 initrd.img-4.15.0-156-generic
drwx------  2 root root    16384 Nov 20 00:10 lost+found/
-rw-------  1 root root  4083154 Aug 19 22:30 System.map-4.15.0-156-generic
-rw-------  1 root root  8453792 Aug 19 22:35 vmlinuz-4.15.0-156-generic

可启动的镜像文件常被称为 vmlinuz 或 zImage。

二、bzImage

在x86 平台下,vmlinuz通常为bzImage格式,如

root@localhost boot\]# file vmlinuz-3.10.0-957.el7.x86_64 vmlinuz-3.10.0-957.el7.x86_64: Linux kernel x86 boot executable bzImage, version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) #1 S, RO-rootFS, swap_dev 0x6, Normal VGA

其创建过程如下:

2.1 镜像分析

Linux下大量工具都是对 ELF 文件进行解析,因此,若我们想要逆向对 Linux 内核镜像进行二进制的分析,就需要先将 vmlinuz 文件还原成 vmlinux 文件。

工具准备:

Linux内核提供了脚本来实现vmlinuz 到 vmlinux 的转换------下载地址 extract-vmlinux。但在 Centos 和 Ubuntu 下可以通过包管理器直接安装,如下。

复制代码
# in centos
yum install kernel-devel
# in ubuntu 
apt-get install linux-headers-$(uname -r)

安装完成后,extract-linux脚本将保存在

  • Centos: /usr/src/kernels/$(uname -r)/scripts/extract-vmlinux
  • Ubuntu: /usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux

文件转换:

复制代码
/usr/src/kernels/$(uname -r)/scripts/extract-vmlinux vmlinuz-$(uname -r) > vmlinux

ELF 文件解析:

使用extract-linux 提取后的文件可以直接使用objdump, readelf等工具进行解析。需要注意的是,此时的vmlinux中并没有符号信息,符号名相关的内容保存在/boot/System.map文件中。

三、zImage

zImage是ARM linux常用的一种压缩镜像文件,它是由vmlinux经过objcopy , objcopy实现由vmlinux的elf文件拷贝成纯二进制数据文件加上解压代码经gzip压缩而成,命令格式是#make zImage.这种格式的Linux镜像文件多存放在NAND上. 适用于小内核的情况,它的存在是为了向后的兼容性。

zImage的生成过程可以由下图概括:

3.1 镜像分析

使用vmlinux-to-elf 工具可以将二进制文件恢复成带符号的elf文件
vmlinux-to-elf

这里之所以不直接反汇编zImage,是因为zImage是根据vmlinux生成的原始二进制文件,而不再是标准的ELF文件,此时objdump命令无法识别它。

参考链接

  1. Linux vmlinux文件
  2. Linux 内核编译
  3. Linux内核镜像格式
  4. linux之vmlinux、vmlinuz、System.map和/proc/kallsyms简介
相关推荐
wdxylb4 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20075 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪6 小时前
关于Linux内核中头文件问题相关总结
linux
Lovyk8 小时前
Linux 正则表达式
linux·运维
Fireworkitte9 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil90010 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char10 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘1211 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
华强笔记14 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发15 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建