函式位址替換是一種更為簡單、常見的hook方式,比如對security_ops、sys_call_table等結構中的函式進行替換,來完成自己的安全許可權控制。
其中security_ops是lsm框架中所使用的,sys_call_table是系統呼叫表結構。當然了,這些結構目前在核心中都已經是唯讀資料結構了,如果想直接進行函式替換的話,首先就是考慮解決關閉寫保護的問題。在下面的模組例子中,演示了重置cr0暫存器寫保護位 及其 修改記憶體頁表項屬性值兩種關閉寫保護方式,有興趣的朋友可對照**進行查閱。
除此之外,linux核心還提供了一些註冊函式,允許直接註冊自己的鉤子函式來實現各種功能,比如netfilter框架下的註冊函式nf_register_hook等。
接下來以替換sys_call_table中的sys_open為例來寫了乙個小模組,說明下如何進行函式位址替換以及寫保護關閉。該模組已在centos6 系列系統編譯並測試過,使用其他系統的朋友可能需要進行一些微調。
使用insmod裝載時,需要加上kallsyms_lookup_name_address引數,eg: insmod **.ko kallsyms_lookup_name_address=0x***,其中kallsyms_lookup_name_address的值可通過 cat /proc/kallsyms | grep kallsyms_lookup_name獲取。
#include #include #include #include #include #include #include #include #define hook_hook_table_name "sys_call_table"
typedef void (*sys_call_ptr_t)(void);
typedef unsigned long (* kallsyms_lookup_name_t)(const char *name);
typedef long (* hook_sys_open_t)(const char __user *filename, int flags, int mode);
static ulong kallsyms_lookup_name_address;
static kallsyms_lookup_name_t hook_lookup_name;
static ulong g_wpbit_val = 0;
static pgprot_t g_orig_pgprot;
static ulong hook_table_addr;
static ulong orig_sys_open_addr;
/* *要替換的鉤子函式
* */
long hook_new_sys_open(const char __user *filename, int flags, int mode)
/* *通過暫存器關閉寫保護
* */
static void hook_clear_wpbit1(void)
/* * 寫保護位恢復函式
* */
static void hook_recover_wpbit1(void)
/* *關閉記憶體頁寫保護標記
* */
static void hook_clear_wpbit2(void)
}}/*
*恢復記憶體頁寫保護標記
* */
static void hook_recover_wpbit2(void)
}}/*
*鉤子函式注入的地方
*此處通過對系統呼叫表,進行函式位址替換
* */
static int hook_do_hijack1(void *arg)
static int hook_do_hijack2(void *arg)
static int hook_recover_hijack1(void *arg)
static int hook_recover_hijack2(void *arg)
static int hook0_init(void)
static void hook0_exit(void)
module_init(hook0_init);
module_exit(hook0_exit);
module_param(kallsyms_lookup_name_address, ulong, 0644);
module_license("gpl");
linux核心hook技術之跳轉指令偏移值
在另一篇博文中提到了指令覆蓋和指令注入的hook方式,使用覆蓋和注入方式完成核心函式hook,需要有很多的注意事項,而且容易被檢測工具檢測。這篇博文則聊一下如何通過替換跳轉指令偏移值來完成核心函式的hook,這種hook技術也可以稱為inline hook。事先做個準備工作,手頭正好有centos ...
linux核心hook技術之指令覆蓋與注入
說到hook,傳統意義上,大家都會覺得跟注入和劫持掛鉤。在linux核心中,也可以通過指令覆蓋和注入的方式進行hook,來完成自己的業務邏輯,實現自己的功能需求。一部分人喜歡稱這種hook技術為inline hook。具體hook細節在以下編寫的驅動例子程式中給出了,例子中標註了詳細的注釋,大家可對...
Hook 核心函式技術細節
剛開始看到通過 ssdt 來 hook zw 核心函式的方法時不是很了解,等把 zw 反彙編後才發現技術細節.原來也沒什麼新鮮的,就是找到目標函式在 ssdt 中的位置 偏移量 位置 4 然後儲存並替換偏移量處的值為自己新的函式位址就行了。這種技術現在已是老掉牙了,不過在實際的軟體開發中也比較常用,...