contributed by < Hao-yu-lin
>
linux2021
Linux 核心版本:GNU/Linux 5.4.0-80-generic x86_64
依照執行流程分成三部分,探討程式碼
當使用下方的指令後,便會開始載入 module
由 /include/linux/module.h
內容得知
為程式的進入點
module_init():driver initialization entry point
module_exit():driver exit entry point
觀察_hideproc_init
得知,此程式主要在建立 hideproc 裝置環境,建立後執行init_hook()
建立 hook function
hook_install
此處做的事情是初始化 hook_ops
,主要目的是將 hook 內的 func 成員指向 hook_ftrace_thunk
hook_resolve_addr
在此處的目的就是找到 find_ge_pid
的函數 address
並保存在 hook->orig
中
接續探討 hook_ftrace_thunk
,將 自定義的 hook_find_ge_pid
透過更改 %rip 的下一步指令,強制跳轉到 hook function
當使用下方指令後,device 便會開始執行 device_write
指令
device_write
會根據你輸入在 buffer 內的指令,來執行 hide_process
或是 unhide_process
建立一個 proc,設定 id 為 PID,並將此 proc 連接到 hidden_proc
list 串的最尾巴
當使用下方指令後
由於 callback function 作用會導向執行 hook_find_ge_pid
,透過 is_hidden_proc
來遍歷 hidden_proc
若有符合的 pid,就會 pid ++ 直到不相符的 pid,此時就會因為找不到相符的 pid 而輸出找不到
透過 find_get_pid
取得 child 的 pid struct,藉由 get_pid_task
取得 task struct,再利用 real_parent
,來得到 parent 的 pid 即可
以下是原始尚未新增同時刪除 PPID 時的操作
若新增同時刪除 PPID
因為要重新編譯 code 此時發現 linux 當機了,此問題留到下一題解決
每當我 sudo rmmod hideproc,linux 就會直接當機
首先要把 MKDEV(dev_major, MINOR_VERSION)
,不然一直輸入看起來很不簡潔,首先釋放 hook 資源,利用已經寫好的 hook_remove
來釋放,接著對照 _hideproc_init
反向操作的回收資源
device_create
/ device_destroy
cdev_add
/ cdev_del
class_create
/ class_destroy
alloc_chrdev_region
/ unregister_chrdev_region
在實作嘗試刪除其他 pid,然後將其復原時發現,復原時他會一併復原,因此對 unhide_process
加點判斷式