Linux內核之文件驅動隨筆

前言

? ? ? ? 近期需要實現linux系統文件防護功能,故此調研了些許知識,如何實現文件防護功能從而實現針對文件目錄防護功能。當被保護的目錄,禁止增刪改操作。通過內核層面實現相關功能,另外在通過跟應用層面交互從而實現具體的業務功能。好了,話不多說,直接開始本文的主題,詳情請見下文(下文實現介紹為ubuntu18.x版本)。

一.查看系統內核函數定義

如上所示,在系統中,每個系統函數都定義一個函數對應的原型號,如上mkdir方法定義的類型宏號表示。紅框中,當時終端使用mkdir,內核中最終通過_SYSCALL調用sys_mkdir方法。

sys_mkdir方法的定義:

如上為函數原型的定義,可通過上述的函數定義進行攔截從而實現相關的業務功能。(注:在新的系統架構中,現在都通過寄存器來實現相關的函數定義,例如:

asmlinkage long hook_sys_mkdir(struct pt_regs *regs) {char __user *pathname = (const char __user *)regs->di; // x86_64 的第一個參數umode_t mode = (umode_t)regs->si; // 第二個參數// 鉤子邏輯printk("mkdir: path=%s, mode=%o\n", pathname, mode);// 調用原始系統調用return orig_sys_mkdir(regs);
}

上述的方法定義,省略了函數的個數定義,從而使系統的攔截調用更加的方便靈活,所需的參數直接從pt_regs結構中直接獲取,靈活方便,不用再定義每個方法各自的參數個數以及相關的定義方法。?

二.系統攔截調用實現

????????如下通過自定義鉤子函數來實現系統函數mkdir的攔截調用步驟

? ? ? ? 1.定義鉤子函數

asmlinkage long hook_sys_mkdir(struct pt_regs *regs);
typedef asmlinkage long (*sys_mkdir_ptr)(struct pt_regs *regs);
static sys_mkdir_ptr origin_mkdir;

? ? ? ? 2.獲取系統函數符號表? ?

? ? ? ? 注:不同系統可能獲取符號表方式存在偏差,另外如果和應用層交互時,也可以通過應用層通過netlink將對應的符號表地址傳入內核當中。??

kallsyms_lookup_name_t get_kallsyms_lookup_name(void)
{int ret;kallsyms_lookup_name_t pfun;static struct kprobe kp ={.symbol_name = "kallsyms_lookup_name",};ret = register_kprobe(&kp);if (ret < 0){printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);return NULL;}pfun = (kallsyms_lookup_name_t)kp.addr;unregister_kprobe(&kp);return pfun;
}static int obtain_sys_call_table_addr(unsigned long *sys_call_table_addr)
{unsigned long temp_sys_call_table_addr;kallsyms_lookup_name_t fn_kallsyms_lookup_name = 0;fn_kallsyms_lookup_name = get_kallsyms_lookup_name();if (fn_kallsyms_lookup_name == NULL){printk("Fail to get_allsyms_lookup_name\n");return -1;}temp_sys_call_table_addr = fn_kallsyms_lookup_name("sys_call_table");/* Return error if the symbol doesn't exist */if (0 == temp_sys_call_table_addr){printk("Can not found sys_call_table\n");return -1;}printk("Found sys_call_table: %p", (void *)temp_sys_call_table_addr);*sys_call_table_addr = temp_sys_call_table_addr;return 0;
}

? ? ? ? 3.進行鉤子操作

????????因系統具備寫保護,進行hook時需要先關閉寫保護,鉤子完成之后再將寫保護恢復(函數的hook放在如下disable_cr0和enable_cr0之間)。

寫保護和恢復保護函數處理:? ?

unsigned int disable_cr0(void)
{unsigned int cr0 = 0;unsigned int ret;asm volatile ("movq %%cr0, %%rax": "=a"(cr0));ret = cr0;//清理第16位的標志位cr0 &= 0xfffeffff;asm volatile ("movq %%rax, %%cr0"::"a"(cr0));return ret;
}void enable_cr0(unsigned int val)
{asm volatile ("movq %%rax, %%cr0": : "a"(val));
}

? ? ? ? 函數鉤子更換

// sys_call_table_addr為上述步驟獲取的函數符號表地址void set_hook(){disable_cr0();origin_mkdir = ((unsigned long *)(sys_call_table_addr))[__NR_mkdir];enable_cr0();
}

? ? ? ? 4.mkdir鉤子運行流程

? ? ? ? 自定義函數進行對mkdir函數的攔截,進行自己的業務處理,正常情況再調用原始內核函數

? ? ? ? 注:在某些系統上,可能在內核中調用了其他的函數,例如麒麟系統,mkdir命令,內核中調用的不是sys_mkdir,雖然可以通過上述查詢到,但是實際上調用的是sys_mkdirat.所以在ko中直接進行sys_mkdirat的hook即可。如何查看某個命令內核真正調用哪個內核函數,可以通過strace命令進行查看,例如mkdir命令查看,如下:(ubuntu18.04)

root@ubuntu:~# strace -e trace=mkdir,mkdirat mkdir Test
mkdir("Test", 0777)                     = 0
+++ exited with 0 +++
root@ubuntu:~# 

如上,輸出執行輸出結果,mkdir,那么說明調用內核的sys_mkdir方法。?

? ? ?麒麟v10,aarch64架構,跟上述不一致,詳情見:

[root@localhost]# strace -e trace=mkdir,mkdirat mkdir Test
mkdirat(AT_FDCWD, "Test", 0777)         = 0
+++ exited with 0 +++
[root@localhost]#

上述結果輸出mkdirat,跟上述ubuntu差別很大,表示mkdir命令對應調用的是系統內核的sys_mkdirat函數。

綜上兩種情況,再編寫系統攔截方法時,一定需要注意不同結構系統存在的偏差,依據實際情況而定再行決定處理相關hook方式函數。?

asmlinkage long origin_mkdir (struct pt_regs *regs)
{int ret;char *filename = NULL;char *regs_filename = (char *)(regs->di);int file_len = strnlen_user(regs_filename, MAX_PATH);filename = kmalloc(file_len, GFP_KERNEL);if (filename == NULL){printk("Fail to kmalloc\n");goto end;}ret = strncpy_from_user(filename, regs_filename, file_len);if (ret < 0){printk("Fail to strncpy_from_user\n");goto end;}printk("current opetation filename:  %s\n", filename);
end:if (filename){kfree(filename);}return old_sys_mkdir(regs);
}

? ? ? ? 5.恢復系統原始函數? ?

? ? ? ? 卸載該驅動文件記得恢復系統原始函數,避免發生崩潰問題。

// sys_call_table_addr為上述步驟獲取的函數符號表地址void restore_hook()
{disable_cr0();((unsigned long *)(sys_call_table_addr))[__NR_mkdir] = origin_mkdir ;enable_cr0();
}

如上就是一個mkdir函數的完成hook過程的步驟,上述的分布代碼將在如下第三標題中完美整合從而實現一個完整的調用并且實現生成一個ko文件可以進行使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76750.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76750.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76750.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用大模型實現地理領域文檔中英文自動化翻譯

一、 背景描述 在跨國性企業日常經營過程中&#xff0c;經常會遇到專業性較強的文檔翻譯的需求&#xff0c;例如法律文書、商務合同、技術文檔等&#xff1b;以往遇到此類場景&#xff0c;企業內部往往需要指派專人投入數小時甚至數天來整理和翻譯&#xff0c;效率低下&#x…

鴻蒙Flutter倉庫停止更新?

停止更新 熟悉 Flutter 鴻蒙開發的小伙伴應該知道&#xff0c;Flutter 3.7.12 鴻蒙化 SDK 已經在開源鴻蒙社區發布快一年了&#xff0c; Flutter 3.22.x 的鴻蒙化適配一直由鴻蒙突擊隊倉庫提供&#xff0c;最近有小伙伴反饋已經 2 個多月沒有停止更新了&#xff0c;不少人以為停…

(七)深入了解AVFoundation-采集:采集系統架構與 AVCaptureSession 全面梳理

引言 在 iOS 開發中&#xff0c;AVFoundation 是構建音視頻功能的強大底層框架。而在音視頻功能中&#xff0c;“采集”往往是最基礎也是最關鍵的一環。從攝像頭捕捉圖形、到麥克風獲取聲音&#xff0c;構建一條高效且穩定的采集鏈是開發高質量音視頻應用的前提。 本系列將逐…

QML ShaderEffect(著色器效果)組件

ShaderEffect 是 QML 中用于實現自定義著色器效果的組件&#xff0c;允許開發者使用 GLSL 著色器語言創建圖形效果。 核心屬性 基本屬性 屬性類型默認值說明fragmentShaderstring""片段著色器代碼vertexShaderstring""頂點著色器代碼blendingbooltrue是…

基于javaweb的SSM教材征訂與發放管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

大模型學習筆記------Llama 3模型架構之分組查詢注意力(GQA)

大模型學習筆記------Llama 3模型架構之分組查詢注意力&#xff08;GQA&#xff09; 1、分組查詢注意力&#xff08;GQA&#xff09;的動機2、 多頭注意力&#xff08;Multi-Head Attention, MHA&#xff09;3、 多查詢注意力 (Multi-Query Attention&#xff0c;MQA)4、 分組查…

matlab 環形單層柱狀圖

matlab 環形單層柱狀圖 matlab 環形單層柱狀圖 matlab 環形單層柱狀圖 圖片 圖片 【圖片來源粉絲】 我給他的思路是&#xff1a;直接使用風玫瑰圖可以畫出。 rose_bar 本次我的更新和這個有些不同&#xff01;是環形柱狀圖&#xff0c;可調節細節多&#xff1b; 只需要函數…

Docker--Docker網絡原理

虛擬網卡 虛擬網卡&#xff08;Virtual Network Interface&#xff0c;簡稱vNIC&#xff09; 是一種在軟件層面模擬的網卡設備&#xff0c;不依賴于物理硬件&#xff0c;而是通過操作系統或虛擬化技術實現網絡通信功能。它允許計算機在虛擬環境中模擬物理網卡的行為&#xff0…

linux基礎14--dns和web+dns

DNS&#xff1a;域名系統&#xff08;Domain Name System&#xff09; DNS協議是用來將域名轉換為IP地址或將IP地址轉換為相應的域名 DNS使用TCP和UDP端口53&#xff0c;給用戶提供解析時一般使用UDP53 對于每一級域名長度的限制是63個字符&#xff0c;域名總長度則不能超過2…

C++抽象基類定義與使用

在 C 中&#xff0c;抽象基類&#xff08;Abstract Base Class, ABC&#xff09; 是一種特殊的類&#xff0c;用于定義接口規范和約束派生類的行為。它通過純虛函數&#xff08;Pure Virtual Function&#xff09;強制要求派生類實現特定功能&#xff0c;自身不能被實例化。以下…

用selenium4 webdriver + java 搭建并完成第一個自動化測試腳本

自動化測試任務&#xff1a; 百度搜索自己的姓名。點擊第一個鏈接&#xff08;或者第二個&#xff09;&#xff0c;在新的頁面上&#xff0c;添加斷言&#xff0c;驗證你的名字是否存在。 實驗資料百度網盤下載路徑&#xff1a; 鏈接: https://pan.baidu.com/s/1nVlHX_ivres…

LLM大模型中的基礎數學工具—— 約束優化

Q26: 推導拉格朗日乘子法 的 KKT 條件 拉格朗日乘子法與 KKT 條件是啥&#xff1f; 拉格朗日乘子法是解決約束優化問題的利器。比如&#xff0c;想最小化函數 &#xff0c;同時滿足約束 &#xff0c;就構造拉格朗日函數 &#xff08; 是乘子&#xff09;。KKT 條件是解這類問…

net+MySQL中小民營企業安全生產管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 近些年來&#xff0c;隨著科技的飛速發展&#xff0c;互聯網的普及逐漸延伸到各行各業中&#xff0c;給人們生活帶來了十分的便利&#xff0c;中小民營企業安全生產管理系統利用計算機網絡實現信息化管理&#xff0c;使企業的中小民營企業安全生產管理發展和服務水平有顯…

論文閱讀:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey 生成式人工智能大型語言模型中的人工智能安全性:一項調查 https://arxiv.org/pdf/2407.18369 https://www.doubao.com…

【MySQL數據庫】表的約束

目錄 1&#xff0c;空屬性 2&#xff0c;默認值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主鍵primary key 6&#xff0c;自增長auto_increment 7&#xff0c;唯一鍵unique 8&#xff0c;外鍵foreign key 在MySQL中&#xff0c;表的約束是指用于插入的…

基于javaweb的SpringBoot校園失物招領系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

多模態大語言模型arxiv論文略讀(二十六)

Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ?? 論文標題&#xff1a;Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ?? 論文作者&#xff1a;Xinpeng Ding,…

“星睿O6” AI PC開發套件評測 - 部署PVE搭建All in One NAS服務器

Radxa O6平臺上部署PVE搭建All in One NAS服務器 Radxa O6是一款性能卓越的單板計算機&#xff0c;其強勁的硬件配置和多樣化的接口設計&#xff0c;使其成為家庭和小型企業理想的All in One服務器解決方案。值得一提的是&#xff0c;O6原生配備了兩個5G網口&#xff0c;便于直…

C++ linux打包運行方案(cmake)

文章目錄 背景動態庫打包方案動態庫轉靜態庫動態庫打到軟件包中 運行 背景 使用C編寫的一個小項目&#xff0c;需要打包成ubuntu下的可執行文件&#xff0c;方便分發給其他ubuntu執行&#xff0c;因為docker鏡像方案過于臃腫&#xff0c;所以需要把項目的動態庫都打在軟件包中…

Linux內核編譯(Ubuntu)

實驗內容&#xff1a;在系統中下載統一發行版本的版本號較高的內核&#xff0c;編譯之后運行自己編譯的內核&#xff0c;并使用uname-r命令查看是否運行成功。 實驗步驟&#xff1a; 1.查看實驗環境和內核版本 圖1 實驗環境 VMware中虛擬機Ubuntu&#xff08;24.04&#xff…