主要步骤:
1.安装qemu模拟器
2.下载Linux源码并编译内核
3.制作根文件系统镜像
4.添加c/s方式的客户端程序进menu os中,使其成为menu os的一个命令
5.构建gdb环境
6.跟踪分析添加的命令执行过程对Linux内核发出的系统调用请求
7.初始化menu os的网络功能
试验环境:Ubuntu 14.04.6 Linux version 4.4.0-142-generic gcc version 4.8.4
1.安装qemu模拟器
sudo apt install qemu
2.下载Linux源码并编译内核
下面是安装编译内核所依赖的库,千万不能少!
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev
配置编译内核(我选择i386默认配置,并且在menuconfig中选择了添加调试信息)
make defconfig #按照默认值生成.config make i386_defconfig #生成32位x86的配置文件,x86_64_defconfig为64为配置 make config #遍历选择编译内核功能 make allyesconfig #启用内核全部功能 make allnoconfig #内核功能选项全部为否 make menuconfig #开启文本菜单选项,对窗口有限制,尽量调大窗口 make 或 make -j* # *为cpu核心数
make menuconfig Kernel hacking—>Compile-time checks and compiler options ---> [*] Compile the kernel with debug info
升级当前系统内核(这步我没做,不知道会不会影响)
sudo make modules_install # ⚠️安装前通过系统快照备份系统,以防出现故障前功尽弃 sudo make install sudo update-grub reboot uname -a
3.制作根文件系统镜像
可以用Menu os,也可以用busybox来制作根文件系统镜像。
git clone https://github.com/mengning/menu.git cd menu sudo apt-get install libc6-dev-i386 # 在64位环境下编译32位需安装 make rootfs cd .. qemu-system-i386 -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img # make i386_defconfig qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -initrd rootfs.img
wget https://busybox.net/downloads/busybox-1.30.1.tar.bz2 tar -xvf busybox-1.30.1.tar.bz2 make help可以得到一些编译busybox的帮助信息 make defconfig make menuconfig修改如下配置: enable:Settings –> build options –> build busybox as a static binary(no share libs) make dd if=/dev/zero of=rootfs.img bs=1M count=128 mkfs.ext4 rootfs.img mkdir rootfs sudo mount -o loop rootfs.img rootfs 在busybox目录下 sudo make CONFIG_PREFIX=../rootfs/ install 在../rootfs/etc/network/interfaces添加lo设备,可以直接拷贝ubuntu下的/etc/network/interfaces sudo umount rootfs qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda init=/bin/ash"
最后在qemu上运行内核和menu os结果如下:
4.添加c/s方式的客户端程序进menu os中,使其成为menu os的一个命令
这部分下次补全吧,这周两个八强课考试。
5.构建gdb环境
前面编译内核时在menuconfig中:
make menuconfig Kernel hacking—>Compile-time checks and compiler options ---> [*] Compile the kernel with debug info
运行qemu命令:
qemu-system-x86_64 -kernel linux-5.0.1/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda init=/init nokaslr" -s -S
在另一个中段运行gdb运行如下命令:
file linux-5.0.1/vmlinux #加载符号表
target remote:1234 #建立gdb和gdbserver之间连接
break start_kernel #断点的设置可以在target remote之前,也可以在之后
#在设置好start_kernel处断点并且target remote之后可以继续运行,则在运行到start_kernel的时候会停下来,等待gdb调试命令的输入,可以使用list来显示断点处相关的源代码
#此后可以继续设置新的断点,...
按c让qemu上的Linux继续运行,结果如下:
上面出现了内核panic,估计是busybox制作的根文件系统有问题或者其他,还是用menu os吧。
6.跟踪分析添加的命令执行过程对Linux内核发出的系统调用请求
这部分下次补全吧,这周两个八强课考试。
7.初始化menu os的网络功能
这部分下次补全吧,这周两个八强课考试。