天天看點

系統調用捕獲和分析—修改核心方法添加系統調用

本文為畢業設計過程中學習相關知識、動手實踐記錄下來的完整筆記,通過閱讀本系列文章,您可以從零基礎了解系統調用的底層原理并對系統調用進行攔截。由于本人能力有限,文章中可能會出現部分錯誤資訊,如有錯誤歡迎指正。

完整系列文章清單

系統調用捕獲和分析—通過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