linux核心hook技術之函式位址替換

2021-10-21 02:15:23 字數 2202 閱讀 6388

函式位址替換是一種更為簡單、常見的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 然後儲存並替換偏移量處的值為自己新的函式位址就行了。這種技術現在已是老掉牙了,不過在實際的軟體開發中也比較常用,...