linux kernel 5.0 inline hook框架
github:https://github.com/WeiJiLab/kernel-hook-framework
一、项目介绍
Usually we want to hack a kernel function,
-
to insert customized code before or after a certain kernel function been called, or
-
to totally replace a function with new one.
How can we manage that? Well it’s time to bring inline hook technique to kernel space. By replacing the first few instructions of a specific function to conditionless jump, and store the original instructions to a trampoline function, we can customizing the functions calling, and do whatever we want do in the hook function. Isn’t is exciting?
二、代码结构
-
src/
The hook framework itself. In normal cases, you needn’t modify its code, unless you are trying to fix bug, because we want to keep it as simple and independent to any customization. After compile, you will get hookFrame.ko. -
sample/
The customized hook/replacement functions. Write your code here, and you can take hook_vfs_read.c, replace_vfs_open.c as reference when writing your own function. Also in module.c, you can get a general view of how to register your function to hook framework. After compile, hookFrameTest.ko will be generated.
root@curtis-Aspire-E5-471G:/home/curtis/code/kernel-hook-framework# tree ./
./
├── make_hook_frame.sh
├── readme.md
├── sample
│ ├── aftvermagic.sh
│ ├── hook_fuse_open.c
│ ├── hook_vfs_read.c
│ ├── include
│ │ ├── common_data.h
│ │ ├── hijack_arm64.h
│ │ ├── hijack_arm.h
│ │ ├── hijack_x86_64.h
│ │ ├── hijack_x86.h
│ │ └── hook_framework.h
│ ├── Makefile
│ ├── module.c
│ ├── prevermagic.sh
│ └── replace_vfs_open.c
└── src├── aftvermagic.sh├── arch│ ├── arm│ │ ├── hijack_arm.c│ │ └── hijack_arm.h│ ├── arm64│ │ ├── hijack_arm64.c│ │ └── hijack_arm64.h│ ├── x86│ │ ├── common.c -> ../x86_64/common.c│ │ ├── distorm -> ../x86_64/distorm│ │ ├── hijack_x86.c│ │ └── hijack_x86.h│ └── x86_64│ ├── common.c│ ├── distorm│ │ ├── config.h│ │ ├── decoder.c│ │ ├── decoder.h│ │ ├── distorm.c│ │ ├── distorm.h│ │ ├── instructions.c│ │ ├── instructions.h│ │ ├── insts.c│ │ ├── insts.h│ │ ├── mnemonics.c│ │ ├── mnemonics.h│ │ ├── operands.c│ │ ├── operands.h│ │ ├── prefix.c│ │ ├── prefix.h│ │ ├── textdefs.c│ │ ├── textdefs.h│ │ ├── wstring.h│ │ └── x86defs.h│ ├── hijack_x86_64.c│ └── hijack_x86_64.h├── framework│ ├── hijack_operation.c│ ├── module.c│ ├── proc_interface.c│ ├── stack_safety_check.c│ ├── symbol_resolver.c│ ├── write_map_page.c│ └── write_page.c├── include│ └── common_data.h├── Makefile└── prevermagic.sh
三、编译测试
Sometimes you will find the vermagic of hookFrame.ko and hookFrameTest.ko different from your target kernel. You can pass the target kernel’s vermagic string to make:
- 测试环境
root@curtis-Aspire-E5-471G:/home/curtis/code/kernel-hook-framework# uname -a
Linux curtis-Aspire-E5-471G 5.15.0-52-generic #58~20.04.1-Ubuntu SMP Thu Oct 13 13:09:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
root@curtis-Aspire-E5-471G:/home/curtis/code/kernel-hook-framework# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
- 测试代码编译
# install bbe to modify vermagic string within .ko
# bbe用来修改内核模块的vermagic字符串
root@curtis-Aspire-E5-471G:/home/curtis/code/kernel-hook-framework# apt-get install bbe# 查看编译环境gcc版本
root@curtis-Aspire-E5-471G:~# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
.....# 查看目标环境内核驱动vermagic
root@curtis-Aspire-E5-471G:/home/kmodule/kprobe_example# modinfo probe_example.ko
filename: /home/curtis/write_code/kmodule/kprobe_example/probe_example.ko
license: GPL
srcversion: C2BF47FCD744ABC53E80FE1
depends:
retpoline: Y
name: probe_example
vermagic: 5.15.0-52-generic SMP mod_unload modversions
parm: symbol:string
# 编译内核驱动,发现如果带vermagic将会错误修改/generated/utsrelease.h
root@curtis-Aspire-E5-471G:/home/kernel-hook-framework/sample# make x86_64 KDIR=/usr/lib/modules/5.15.0-52-generic/build CROSS_COMPILE=x86_64-linux-gnu- vermagic="5.15.0-52-generic SMP mod_unload modversions"# 编译示例驱动
root@curtis-Aspire-E5-471G:/home/kernel-hook-framework/sample# make x86_64 KDIR=/usr/lib/modules/5.15.0-52-generic/build CROSS_COMPILE=x86_64-linux-gnu-
make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- KBUILD_EXTRA_SYMBOLS=/home/curtis/code/kernel-hook-framework/sample/../src/Module.symvers EXTRA_CFLAGS="-D_ARCH_X86_64_ -I/home/curtis/code/kernel-hook-framework/sample/include -fno-pic" -C /usr/lib/modules/5.15.0-52-generic/build M=/home/curtis/code/kernel-hook-framework/sample modules
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-52-generic'
warning: the compiler differs from the one used to build the kernelThe kernel was built by: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0You are using: x86_64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
WARNING: Symbol version dump "/home/curtis/code/kernel-hook-framework/sample/../src/Module.symvers" is missing.Modules may not have dependencies or modversions.You may get many unresolved symbol warnings.CC [M] /home/curtis/code/kernel-hook-framework/sample/hookFrameTest.mod.oLD [M] /home/curtis/code/kernel-hook-framework/sample/hookFrameTest.koBTF [M] /home/curtis/code/kernel-hook-framework/sample/hookFrameTest.ko
Skipping BTF generation for /home/curtis/code/kernel-hook-framework/sample/hookFrameTest.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-52-generic'# 编译hook framework
root@curtis-Aspire-E5-471G:/home/curtis/code/kernel-hook-framework/src# make x86_64 KDIR=/usr/lib/modules/5.15.0-52-generic/build CROSS_COMPILE=x86_64-linux-gnu-
make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- EXTRA_CFLAGS="-D_ARCH_X86_64_ -I/home/curtis/code/kernel-hook-framework/src -I/home/curtis/code/kernel-hook-framework/src/arch/x86_64 -fno-pic -fno-stack-protector" -C /usr/lib/modules/5.15.0-52-generic/build M=/home/curtis/code/kernel-hook-framework/src modules
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-52-generic'
warning: the compiler differs from the one used to build the kernelThe kernel was built by: gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0You are using: x86_64-linux-gnu-gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0......LD [M] /home/curtis/code/kernel-hook-framework/src/hookFrame.oMODPOST /home/curtis/code/kernel-hook-framework/src/Module.symversCC [M] /home/curtis/code/kernel-hook-framework/src/hookFrame.mod.oLD [M] /home/curtis/code/kernel-hook-framework/src/hookFrame.koBTF [M] /home/curtis/code/kernel-hook-framework/src/hookFrame.ko
Skipping BTF generation for /home/curtis/code/kernel-hook-framework/src/hookFrame.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-52-generic'
尝试安装驱动试试看,有没有Hook成功。
# 安装hook框架
root@curtis-Aspire-E5-471G:/home/kernel-hook-framework/src# insmod hookFrame.ko
[23927.370331] Symbol save_stack_trace_tsk not found!
[23927.370348] Your kernel should be "CONFIG_STACKTRACE && !CONFIG_ARCH_STACKWALK", skip stack safety check and use as your risk!!!
[23927.373527] load hook framework success!# 安装测试驱动,从结果来看已经Hook成功了
root@curtis-Aspire-E5-471G:/home/kernel-hook-framework/sample# insmod hookFrameTest.ko
[24036.218182] reading /usr/lib/modules/5.15.0-52-generic/modules.builtin.bin
[24036.218200] in replaced vfs_open
[24036.218206] reading /sys/module/hookFrameTest/initstate
[24036.218215] reading /sys/module/hookFrameTest/initstate
[24036.218224] in replaced vfs_open
[24036.218239] in replaced vfs_open
[24036.218244] reading /sys/module/hookFrameTest/refcnt
[24036.218250] reading /sys/module/hookFrameTest/refcnt
[24036.218537] all hijacked target disabled and removed
[24036.218542] unload hook framework test!
Hook成功了并打印了打开文件的绝对路径。

四、构建自己的Hook函数流程
- 获取原函数地址

- 调用hijack_target_prepare和hijack_target_enable使能hook函数。

相关文章:
linux kernel 5.0 inline hook框架
github:https://github.com/WeiJiLab/kernel-hook-framework 一、项目介绍 Usually we want to hack a kernel function, to insert customized code before or after a certain kernel function been called, or to totally replace a function with new one. How can we…...
【Java版oj】day12二进制插入、查找组成一个偶数最接近的两个素数
目录 一、二进制插入 (1)原题再现 (2)问题分析 (3)完整代码 二、查找组成一个偶数最接近的两个素数 (1)原题再现 (2)问题分析 (3࿰…...
【24】Verilog进阶 - 序列检测2
VL35 状态机-非重叠的序列检测 1 思路 状态机嘛,也是比较熟悉的朋友啦, 我就火速写出了STG。如下黑色所示: 2 初版代码 `timescale 1ns/1nsmodule sequence_test1(input wire clk ,input wire rst ,input wire data ,output reg flag ); //*************code**********…...
详解线段树 ---更新查询
目录 一.问题引入 二.线段树 1.什么是线段树 2.线段树的举例 三.构建线段树 1.思路分析 2.代码实现 四.更新 1.思路分析 2.代码实现 五.查询 1.思路分析 2.代码实现 一.问题引入 有n个整数的数组,我们要 求解下标从left到right的元素之和为多少(query操作),然后还…...
【C语言进阶:刨根究底字符串函数】strncpy、strncat、strncmp函数
再前几篇的博客中大家可能发现了,strcpy,strcat,strcmp 这三个函数在使用时对源字符串没有长度限制,几乎是将源字符串的内容全部进行操作。在VS编译器中的这些函数显得不安全了,因此VS会提醒你在其后加上 _s &#x…...
计算机面试常见问答题目
英语口语 自我介绍 Hello, teachers. My name is Wang Xu. I come from Ningxia. I graduated from the School of Computer Science, Xi an Jiaotong University, majoring in Internet of Things. Next, I will introduce myself from four aspects. First of all, I studi…...
mac pro m1:安装dump文件内存分析工具——MAT
0. 引言 本文主要针对mac m1下安装Jprofiler进行讲解,安装核心步骤同样适用于其他系统 1. 安装 如果使用的是eclipse可以在插件中直接安装MAT,因为我使用的是idea开发,所以选择独立安装MAT工具 1、下载地址:https://www.eclip…...
并发基础之线程池(Thread Pool)
目录前言何为线程池线程池优势创建线程池方式直接实例化ThreadPoolExecutor类JUC Executors 创建线程池线程池挖掘Executors简单介绍ThreadPoolExecutor核心类ThreadPoolExecutor 类构造参数含义线程池运行规则线程设置数量结语前言 相信大家都知道当前的很多系统架构都要求高…...
【C语言进阶】内存函数
天生我材必有用,千金散尽还复来。 ——李白 目录 前言 一.memcpy函数 1.实现memcpy函数 2.模拟实现memcpy函数 二.memmove函数 1.实现memmove函数 2.模拟实现memmove函数 三.memcpy函数和memmove函数的关系 四.memcm…...
Java开发 - ELK初体验
前言 前面我们讲过消息队列,曾提到消息队列也具有保存消息日志的能力,今天要说的EL看也具备这个能力,不过还是要区分一下功能的。消息队列的日志主要指的是Redis的AOF,实际上只是可以利用了消息队列来保存,却并不是消…...
AI_Papers周刊:第六期
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 2023.03.13—2023.03.19 文摘词云 Top Papers Subjects: cs.CL 1.UPRISE: Universal Prompt Retrieval for Improving Zero-Shot Evaluation 标题:UPRISE:改进零样本评估…...
JS运行环境、包管理、打包工具总结
🌳JS运行环境-node.js 运行环境就是代码解析和执行的程序,比如jvm等虚拟机,他们的主要工作就是根据设定的语法规则解析编译代码,然后运行代码。 js的语法规则遵循ES规范。 🍁node.js Node.Js官网 Node.js是一种基于Ch…...
day4网络编程(广播和组播)
1.广播 发送端(类似于客户端) 流程: 创建套接字 填充接收端(服务器)网络信息结构体 bind(非必须绑定) 设置允许广播 向接收端(服务器)发送数据 关闭套接字文件 #include <stdio.h> #in…...
Vue3 自动引入组件及函数、动态生成侧边栏路由
Vue3 自动引入组件及函数、动态生成侧边栏路由 1、安装依赖 npm install -D unplugin-auto-import unplugin-icons unplugin-vue-components插件使用说明 unplugin-auto-import 说明 —— 自动引入函数、组件 unplugin-vue-components 说明 —— 自动注册组件 unplugin-ic…...
人工智能交互系统界面设计
文章目录前言一、项目介绍二、项目准备三、项目实施1.导入相关库文件2.人脸信息验证功能3.语音交互与TCP数据通信4.数据信息可视化四、相关附件前言 在现代信息化时代,图形化用户界面(Graphical User Interface, GUI)已经成为各种软件应用和…...
蓝桥杯嵌入式第一课--创建工程
概述学习本节之前,必须要先安装好 keil5 以及 CubeMX 等软硬件环境,如果你已经安装完成,请告诉自己:考试现在开始!从CubeMX开始CubeMX是创建工程模板的软件,也是我们比赛时第一个要进行操作的软件。一、选择…...
Java面向对象:接口的学习
本文介绍了Java中接口的基本语法, 什么是接口, java中的接口 语法规则, 接口的使用,接口的特性,如何实现多个接口,接口间的继承,以及抽象类和接口的区别 Java接口的学习一.接口的概念二.Java中的接口1.接口语法规则2.接口的使用3.接口的特性4.实现多个接口5.接口间的继承三.抽象…...
西瓜视频登录页面
题目 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登录页面</title><style>td{width: 160px;height: 25px;}img{width: 20px;height: 20px;}.number, .password{background: rgba(0,0,0,.05);}.numbe…...
【springboot】常用快捷键:
Ctrl快捷键介绍Ctrl F在当前文件进行文本查找 (必备)Ctrl R在当前文件进行文本替换 (必备)Ctrl Z撤销 (必备)Ctrl Y删除光标所在行 或 删除选中的行 (必备)Ctrl X剪切光标所在行…...
宝塔控制面板常用Linux命令大全
宝塔面板是站长朋友们常见的一款服务器运维面板,可以通过 Web 端轻松管理服务器,提升运维效率。大家在服务器中安装宝塔面板会用到宝塔面板特定的脚本命令。今天这篇文章为大家整理汇总了宝塔面板常用Linux命令,这样方便大家收藏查找。 1、安…...
Qwen2多语言开发避坑手册:30种语言支持下的API调用最佳实践
Qwen2多语言开发避坑手册:30种语言支持下的API调用最佳实践 跨国业务开发者在处理多语言场景时,常常面临字符编码混乱、语言检测不准、API响应不稳定等痛点。本文将深入解析Qwen2多语言API的实战技巧,覆盖从基础调用到高级优化的全流程&#…...
从零到一:基于STM32与DH模型的六足机器人运动控制实践
1. 六足机器人入门:为什么选择STM32与DH模型? 第一次接触六足机器人是在大三的机器人竞赛上,看着那些机械腿灵活地交替移动,像极了自然界中的昆虫。当时我就想,如果能自己造一个该多酷啊!后来做毕业设计时&…...
Hot100-验证二叉搜索树
错误代码:/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {…...
OpenClaw+Qwen3-32B内容处理方案:自动生成公众号草稿并发布
OpenClawQwen3-32B内容处理方案:自动生成公众号草稿并发布 1. 为什么需要自动化内容发布 作为一个技术博主,我每周都要在公众号发布2-3篇原创文章。最让我头疼的不是写作本身,而是那些机械化的发布流程:调整Markdown格式、上传图…...
【大模型LLM学习】天池Deep Research Agent开发赛
前言 运气不错,这次压线前10,不过和top还是有差距的数据包括问题和答案可以在比赛官网获取,包括初赛的100题和复赛100题。赛题为输入query输出answer,通过搭建Search Agent,分解问题、多跳搜索识别线索,找…...
轴承3d模型为什么 WL 迭代在 3 次后就收敛了
很好的问题!让我解释一下为什么 WL 迭代在 3 次后就收敛了。 WL (Weisfeiler-Lehman) 图核收敛原理 核心机制 WL 算法通过迭代细化节点标签来捕获图的结构信息: 迭代 0: 使用初始标签(这里是面类型:圆柱面、圆环面、平面ÿ…...
Qwen3-0.6B-FP8服务器端集成:高并发API服务设计与实现
Qwen3-0.6B-FP8服务器端集成:高并发API服务设计与实现 想象一下这个场景:你的AI应用突然火了,用户量一夜之间翻了几十倍。早上打开监控面板,看到的不是增长曲线,而是满屏的“请求超时”和“服务器错误”。用户抱怨连连…...
每日60秒读懂世界|2026年3月20日:财政收入微增、A股普涨、小米SU7热销、国际能源与债务风险继续抬升
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
C语言实验避坑指南:头歌平台常见错误分析与调试技巧
C语言实验避坑指南:头歌平台常见错误分析与调试技巧 在头歌平台完成C语言实验时,许多初学者都会遇到各种令人头疼的错误。这些错误不仅影响实验进度,还可能打击学习信心。本文将深入分析头歌平台上最常见的三类错误——编译错误、逻辑错误和运…...
OpenClaw模型预热技巧:GLM-4.7-Flash快速响应关键任务的配置
OpenClaw模型预热技巧:GLM-4.7-Flash快速响应关键任务的配置 1. 为什么需要模型预热 上周三凌晨两点,我被一个紧急需求电话吵醒——客户的生产环境日志分析脚本突然崩溃,需要立即生成故障报告。当我睡眼惺忪地启动OpenClaw调用GLM-4.7-Flas…...
