本文為畢業設計過程中學習相關知識、動手實踐記錄下來的完整筆記,通過閱讀本系列文章,您可以從零基礎了解系統調用的底層原理并對系統調用進行攔截。由于本人能力有限,文章中可能會出現部分錯誤資訊,如有錯誤歡迎指正。
完整系列文章清單
系統調用捕獲和分析—通過ptrace擷取系統調用資訊
系統調用捕獲和分析—通過strace擷取系統調用資訊
系統調用捕獲和分析—必備的系統安全的知識點
系統調用捕獲和分析—使用LKM方法添加系統調用
文章目錄
- 編譯新核心
- 通過修改核心添加系統調用
編譯新核心
實驗環境使用ubuntu16.04,核心版本4.15.0-112-generic,安裝4.13.10版本核心。
安裝依賴環境
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
sudo apt-get install bison
sudo apt-get install libelf-dev
sudo apt-get install flex
sudo apt-get install vim-gtk
官網
https://www.kernel.org/
下載下傳linux-4.13.10.tar.xz,放到/usr/src目錄下,并解壓。
sudo cp ./linux-4.13.10.tar.xz /usr/src
cd /usr/src
sudo tar -xavf linux-4.13.10.tar.xz
檢視目前核心版本
uname -r
将目前核心目錄下的config檔案拷貝到下載下傳的新核心源碼根目錄
sudo cp /usr/src/linux-headers-4.15.0-112-generic/.config ./
[非必要] 配置選項
sudo make menuconfig
,加載.config檔案
選擇Load
和
ok
,
save
和
ok
,最後
exit
(可以了解為make menuconfig 就是make oldconfig的圖形版本。在将新的設定更新到.config中去的同時,将原來的.config檔案儲存為.config.old)。
進行配置
sudo make oldconfig
。
執行編譯
sudo make -j5
,
sudo make modules_install
出現報錯
make[1]: *** 沒有規則可制作目标“debian/canonical-certs.pem”,由“certs/x509
編輯剛才的config檔案,将其中CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"引号中内容删除。
安裝核心二進制映像
sudo make install
更新grub引導
sudo update-grub2
重新開機電腦
sudo reboot
,開機過程中按esc鍵選擇新版本核心進入。
使用
uname -r
檢視核心已被更新為新的版本。
make相關說明
直接make不加任何參數就是make all,包含make modules。
make bzImage是編譯系統核心;
make相當于執行了make bzImage和make modules。
make modules是單獨編譯子產品,驅動被配置成M的都是modules,modules不會被編譯進核心image,需要單獨安裝到rootfs。
make modules_install是把編譯好的子產品拷貝到系統目錄下(一般是/lib/modules/)。
make install是安裝核心二進制映像, 生成并安裝boot初始化檔案系統映像檔案。
make oldconfig是用目前的.config作為基礎,按互相依賴關系重新生成一個.config檔案。如果新生成的.config檔案和作為基礎的.config檔案不一緻。就把作為基礎的.config重命名為.config.old,用于恢複對.config的修改。
通過修改核心添加系統調用
在上面下載下傳解壓好核心源檔案後,進行下面的工作添加一個自定義的系統調用。
修改
/usr/src/linux-4.13.10/arch/x86/entry/syscalls/syscall_64.tbl
,添加系統調用号。

在目錄
/usr/src/linux-4.13.10/arch/x86/kernel/
下添加一個檔案syshello.c,其中是添加的系統調用。
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/sched.h>
int sys_hello(void){
printk("oh~ hello world");
return 5;
}
修改
/usr/src/linux-4.13.10/arch/x86/kernel/Makefile
檔案,添加編譯syshello.o檔案
修改
usr/src/linux-4.13.10/include/linux/syscalls.h
,檔案末尾增加函數聲明。(vim編輯器用shift+g跳到檔案末尾)
将目前核心目錄下的config檔案拷貝到下載下傳的新核心源碼根目錄
sudo cp /usr/src/linux-headers-4.15.0-112-generic/.config ./
,接下來和上面編譯核心的步驟一樣。
1.編輯剛才的config檔案,将其中CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"引号中内容删除。
2.sudo make clean
3.進行配置sudo make oldconfig
4.執行編譯sudo make -j5
5.sudo make modules_install
6.sudo make install
7.sudo update-grub2
8.sudo reboot
9.開機按esc鍵選進階選項,選擇新版本核心進入
10.uname -r驗證是否進入新版本核心系統
測試系統調用是否添加成功
準備測試程式a.c
#include <stdio.h>
#include <sys/syscall.h>
#include <unistd.h>
int main(){
int res = syscall(333); 333就是剛才添加的系統調用号
printf("res = %d\n", res);
}
編譯運作,dmesg檢視核心列印資訊
gcc -o a a.c
./a