在另一篇博文中提到了指令覆蓋和指令注入的hook方式,使用覆蓋和注入方式完成核心函式hook,需要有很多的注意事項,而且容易被檢測工具檢測。這篇博文則聊一下如何通過替換跳轉指令偏移值來完成核心函式的hook,這種hook技術也可以稱為inline hook。
事先做個準備工作,手頭正好有centos 6系列作業系統,還有乙個熱騰騰剛出鍋的vmlinux。通過 gdb vmlinux,所示如下:
如所示,sys_open通過call指令呼叫了do_sys_open函式,我們通過 cat /proc/kallsyms | grep sys_open cat /proc/kallsyms | grep do_sys_open可以找到函式的真實位址。
其中call指令的指令碼是0xe8,call指令後面的4位元組是偏移值offset。
offset = 要跳轉的函式位址 - call指令當前位址 + 5,其中5表示call指令占用了5個位元組。
我們可以通過kallsyms_lookup_name找到sys_open和do_sys_open的函式位址,則可以從sys_open開始逐字節查詢指令碼,從而找到call do_sys_open的指令位置,將call後面的偏移值替換稱新的偏移值即可完成do_sys_open函式的hook功能。
#include #include #include #include #include #include #define hook0_hook_first_name "sys_open"
#define hook0_hook_second_name "do_sys_open"
typedef unsigned long (* kallsyms_lookup_name_t)(const char *name);
typedef long (* hook0_do_sys_open_t)(int dfd, const char __user *filename, int flags, int mode);
static ulong kallsyms_lookup_name_address;
static void *hook0_function_first;
static void *hook0_function_second;
static kallsyms_lookup_name_t hook0_lookup_name;
static ulong g_wpbit_val = 0;
/* *鉤子函式
* 通俗點說就是想為所欲為的地方
* */
static long hook0_new_function(int dfd, const char __user *filename, int flags, int mode)
/* *寫保護關閉函式
* */
static void hook0_clear_wpbit(void)
/* * 寫保護位恢復函式
* */
static void hook0_recover_wpbit(void)
/* *鉤子函式注入的地方
*此處主要通過修改偏移值來實現的
* */
static int hook0_do_hijack(void *arg)}}
hook0_recover_wpbit();
return 0;
}static int hook0_recover_hijack(void *arg)}}
return 0;
}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");
該**也是在centos 6系列的系統上編譯和測試過,使用其他系統的朋友可能需要進行一些微調整。
整體來看,替換跳轉指令偏移的hook方式比**覆蓋和注入的方式更友好一些,至少不用擔心堆疊平衡的問題,操作起來也更為簡單。不過使用這種方式hook的注入點,對傳統意義上的hook檢測工具就沒有這麼友好了。
linux核心hook技術之函式位址替換
函式位址替換是一種更為簡單 常見的hook方式,比如對security ops sys call table等結構中的函式進行替換,來完成自己的安全許可權控制。其中security ops是lsm框架中所使用的,sys call table是系統呼叫表結構。當然了,這些結構目前在核心中都已經是唯讀資...
linux核心hook技術之指令覆蓋與注入
說到hook,傳統意義上,大家都會覺得跟注入和劫持掛鉤。在linux核心中,也可以通過指令覆蓋和注入的方式進行hook,來完成自己的業務邏輯,實現自己的功能需求。一部分人喜歡稱這種hook技術為inline hook。具體hook細節在以下編寫的驅動例子程式中給出了,例子中標註了詳細的注釋,大家可對...
Hook 核心函式技術細節
剛開始看到通過 ssdt 來 hook zw 核心函式的方法時不是很了解,等把 zw 反彙編後才發現技術細節.原來也沒什麼新鮮的,就是找到目標函式在 ssdt 中的位置 偏移量 位置 4 然後儲存並替換偏移量處的值為自己新的函式位址就行了。這種技術現在已是老掉牙了,不過在實際的軟體開發中也比較常用,...