linux核心hook技術之跳轉指令偏移值

2021-10-20 19:39:29 字數 2123 閱讀 8095

在另一篇博文中提到了指令覆蓋和指令注入的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 然後儲存並替換偏移量處的值為自己新的函式位址就行了。這種技術現在已是老掉牙了,不過在實際的軟體開發中也比較常用,...