实现kernel-mode inline function hook的简单方法

做X64 shadow SSDT HOOK引擎那些事儿~~ 废话不多少 我做HOOK引擎遇到的事儿~~~ 先看一下代码 ,里面有详细地址 .text:FFFFF97FFF072744 NtUserGetForegroundWindow proc near     ; DATA XREF: .text:FFFFF97FFF0D20E0o .text:FFFFF97FFF072744                                  阅读详情

看了uty的《kernel inline hook 绕过vice检测》,思路很好,但实现起来麻烦了点。
这里以CmEnumerateKey为例介绍实现inline hook的简单方法,尽量依靠编译器做更多的事情。

1、编写fake_CmEnumerateKey,在其中对CmEnumerateKey的调用做后续处理。

NTSTATUS
fake_CmEnumerateKey(
IN PCM_KEY_CONTROL_BLOCK KeyControlBlock,
IN ULONG Index,
IN KEY_INFORMATION_CLASS KeyInformationClass,
IN PVOID KeyInformation,
IN ULONG Length,
IN PULONG ResultLength
)
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("[cmhook] nt!CmEnumerateKey() called./n"));

status = JMP_CmEnumerateKey(KeyControlBlock, Index, KeyInformationClass, KeyInformation, Length, ResultLength);

return status;
}

2、取得CmEnumerateKey的地址,备份前7个字节,之后修改CmEnumerateKey的前5个字节为jmp xxxxxxxx(fake_CmEnumerateKey入口偏移地址)。

// 保存原始的7个字节代码
BYTE g_cOrigCode[7] = {0};

// JMP xxxxxxxx
BYTE g_cHookCode[5] = { 0xe9, 0, 0, 0, 0 };

RtlCopyMemory(g_cOrigCode, (BYTE*)CmEnumerateKey, 7);

// calc jmp offset
*( (ULONG*)(g_cHookCode+1) ) = (ULONG)fake_CmEnumerateKey - (ULONG)CmEnumerateKey - 5;

DisableWriteProtect(&ulAttr);
RtlCopyMemory((BYTE*)CmEnumerateKey, g_cHookCode, 5);
EnableWriteProtect(ulAttr);

3、编写__declspec(naked) JMP_CmEnumerateKey,这个例程实现CmEnumerateKey被修改个7个字节的代码,并转入nt!CmEnumerateKey+7处开始执行。

__declspec(naked)
NTSTATUS
JMP_CmEnumerateKey(
IN PCM_KEY_CONTROL_BLOCK KeyControlBlock,
IN ULONG Index,
IN KEY_INFORMATION_CLASS KeyInformationClass,
IN PVOID KeyInformation,
IN ULONG Length,
IN PULONG ResultLength
)
{
__asm
{
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
_emit 0x90
}
}

JMP_CmEnumerateKey的主要实现代码在程序运行时进行填充,以下是实现代码:

BYTE jmp_orig_code[7] = { 0xEA, 0, 0, 0, 0, 0x08, 0x00 };

// jmp 0008:nt!CmEnumerateKey+7
*( (ULONG*)(jmp_orig_code+1) ) = (ULONG)((BYTE*)CmEnumerateKey + 7);

DisableWriteProtect(&ulAttr);

//
// CmEnumerateKey修改之前的前7个字节的代码
// 6a18         push 18h
// 68d0de4d80   push offset nt!`string'+0xf8 (804dded0)
//
RtlCopyMemory((BYTE*)JMP_CmEnumerateKey, g_cOrigCode, 7);

// jmp 0008:nt!CmEnumerateKey+7
RtlCopyMemory((BYTE*)JMP_CmEnumerateKey+7, jmp_orig_code, 7);
EnableWriteProtect(ulAttr);

这里要注意一个细节,虽然只CmEnumerateKey修改了前5个字节,但这5个字节里面包含两条指令(共7个字节),因此要保存前7个字节。
修改前:

kd> u nt!CmEnumerateKey
nt!CmEnumerateKey:
80605f54 6a18            push    18h
80605f56 68d0de4d80      push    offset nt!`string'+0xf8 (804dded0)
80605f5b e80839f2ff      call    nt!_SEH_prolog (80529868)
80605f60 e829abffff      call    nt!CmpLockRegistry (80600a8e)
80605f65 8b4508          mov     eax,dword ptr [ebp+8]
80605f68 f6400502        test    byte ptr [eax+5],2
80605f6c 7407            je      nt!CmEnumerateKey+0x21 (80605f75)
80605f6e be7c0100c0      mov     esi,0C000017Ch

修改后:

kd> u nt!CmEnumerateKey
nt!CmEnumerateKey:
80605f54 e999143279      jmp     cmhook+0x3f2 (f99273f2)
80605f59 4d              dec     ebp
80605f5a 80e808          sub     al,8
80605f5d 39f2            cmp     edx,esi
80605f5f ff              ???
80605f60 e829abffff      call    nt!CmpLockRegistry (80600a8e)
80605f65 8b4508          mov     eax,dword ptr [ebp+8]
80605f68 f6400502        test    byte ptr [eax+5],2

–
by CDrea
 

C++ HOOK技术实战:逆向提取游戏Lua脚本的原理与应用 在软件逆向工程与安全分析领域,HOOK技术是一种核心的代码拦截与流程控制方法。其原理是通过修改程序执行流程,在目标函数执行前后插入自定义代码,实现对函数调用、参数传递等行为的监控与干预。这项技术的核心价值在于能够在不修改原始程序逻辑的前提下,动态分析其内部运行机制,广泛应用于安全审计、漏洞挖掘、行为监控和自动化测试等场景。特别是在游戏安全与逆向分析中,结合x86架构特性与C++底层操作能力,通过内联HOOK精准拦截Lua虚拟机加载函数,可以高效提取运行时脚本。本文以【游戏实战】为例,深入解析如何利用HOOK 阅读详情

相关推荐

Hook技术实战:运行时拦截与导出游戏Lua脚本

在游戏开发与安全分析领域,脚本语言如Lua因其轻量级和热更新能力被广泛用于实现游戏逻辑。其核心原理在于,游戏运行时需将Lua脚本(源码或编译后的字节码)加载到虚拟机中解析执行。通过API Hook这一关键技术,我们可以动态拦截游戏进程对Lua加载函数的调用,从而在内存中捕获脚本内容。这项技术的核心价值在于,它绕过了静态解包可能遇到的加密或混淆,直接从运行时内存中获取原始逻辑,为游戏逻辑分析、模组开发和安全研究提供了透明视角。应用场景包括对使用标准Lua或tolua/xlua等框架的游戏进行逆向学习与调试。本

weixin_33898876的博客 374

detours, x86 kernel hook 以及 x64 kernel hook

detours, x86 kernel hook 以及 x64 kernel hookhttp://bbs.driverdevelop.com/htm_data/92/0702/99096.html我假设读者已经非常熟悉detours,阅读此文只是为了增强对detours的理解以及为了实现x64 hook。有关detours原理部分不再多讲。X86 Kernel Hook早些年,我把det

基岩的专栏 1842

自研APK加固方案:从原理到实现,构建代码资源全加密防护体系

在移动应用安全领域,代码保护与反逆向是开发者面临的核心挑战。其基本原理是通过加密、混淆等技术手段,将应用的核心逻辑与资源进行隐藏,防止静态分析与动态调试。这项技术的核心价值在于显著提升应用的逆向工程门槛,保护知识产权与商业逻辑。在应用场景上,尤其适用于对安全有极致要求或需深度定制防护策略的金融、游戏及企业级应用。本文聚焦于自研APK加固方案,深入剖析如何通过自定义的加密算法与运行时Hook技术,实现对DEX字节码、资源文件及SO库的全方位加密隐藏,从而构建独特的安全壁垒,有效对抗自动化脱壳与主流逆向手段。

weixin_33910759的博客 437

【亲测免费】 探索KernelHook:一种强大的内核钩子技术

探索KernelHook:一种强大的内核钩子技术 项目简介 是一个开源的项目,由开发者smallzhong创建,它提供了一种在Linux内核中实现高效、安全的钩子(hook)机制的方法。通过此项目,开发者可以轻松地插入自定义代码到内核关键函数中,以实现对系统行为的监控、调试或增强。 技术分析 KernelHook的核心在于它的钩子实现策略。项目利用了内核模块(kernel module)和动态代码...

gitblog_00060的博客 1601

Seed-2.0-Code:前端开发范式的协议化重构

前端工程正从命令式配置走向声明式协议——Seed-2.0-Code 以 YAML 驱动的三层抽象(意图层、契约层、执行层)重新定义开发本质。它不替代 TypeScript 或 React,而是通过语义化工程协议,将散落的构建、Mock、路由、类型、部署等能力统一调度;其落地形态 TRAE 实现了 Vibe Coding 工作流,即‘意图声明→缺口识别→精准补缺→状态验证’的闭环,显著降低新人上手门槛与高熵项目维护成本。该范式已深度影响面试评估标准与一人团队交付能力,标志着前端开发从‘写代码’迈向‘定义工程契

weixin_34008805的博客 398

Linux服务器深度防御实战:基于seccomp与eBPF的内核级安全加固

在Linux服务器安全领域,系统调用是用户空间程序与内核交互的核心接口,而内核则是系统安全的最终防线。seccomp(安全计算模式)通过为进程定制系统调用白名单,严格遵循最小权限原则,从根源上限制进程能力,防止权限滥用。eBPF(扩展伯克利包过滤器)则提供了在内核中安全、高效运行自定义程序的能力,实现了对网络、系统调用等事件的动态监控与实时响应。这两项技术的结合,将安全防线从传统的网络边界延伸至内核内部,实现了从静态配置到动态策略、从边界防御到深度防御的范式转变。其技术价值在于,即便攻击者突破了应用层防线,

快马扬鞭须努力! 465

linux kernel 5.0 inline hook框架

linux kernel inline hook

qq_42931917的博客 1687

Linux系统用户态根据虚拟地址获取物理地址的方式

之前做项目的时候,也会遇到过根据页表,由虚拟地址翻译物理地址的需求,一般的做法是HACK内核,在内核中加入HACK代码,思路无非就是通过页表进行转换,但是现在有了一种新的方式,这种方式下,不需要HACK内核,也不需要重新编译内核,便能够根据进程的虚拟地址,得到它的物理地址,下面展开介绍。

tugouxp的专栏 4831

Linux Kernel 学习笔记10:hook函数

(本章基于:Linux-4.4.0-37) linux 内核中有一套hook函数机制,可在不同hook点位置监控网络数据包,并执行丢弃、修改等操作。网络防火墙就是通过此机制实现的。 注册注销hook函数: linux/netfilter.h 注册钩子函数: int nf_register_hook(struct nf_hook_ops *reg); 注销: void

stone8761的专栏 1万+

【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02

宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_

weixin_49199313的博客 107

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04

编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017)

weixin_49199313的博客 399

Suterusu Rootkit: Inline Kernel Function Hooking on x86 and ARM

http://www.poppopret.org/ Suterusu Rootkit: Inline Kernel Function Hooking on x86 and ARM Posted on January 7, 2013 by mncoppola Table of Contents Introduction...

weixin_34362875的博客 193

内核三步走实现Inline Hook

内核三步走实现Inline Hook,介绍如何挂钩内核函数的模版

Linux内核编码风格规范与实践指南

代码规范是软件开发中的基础工程实践,直接影响代码的可读性和可维护性。Linux内核作为全球最大的开源项目,其编码风格规范以实用性和一致性著称,采用8字符制表符缩进和80列行宽限制等特色规则。在函数设计方面强调单一职责原则,合理使用goto进行错误处理,体现了工程实践中的灵活取舍。通过checkpatch.pl等自动化工具保证规范落地,这种将编码规范与工具链深度整合的做法,为大型项目开发提供了重要参考。内核编码哲学中体现的实用主义优先原则,对现代C语言开发具有普遍指导意义。

weixin_30938149的博客 327

代码复现——SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架

根据《SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs》(《SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架》)论文思路,简单复现代码,以实现SymAgent中的Agent-Planner和Agent-Executor模块。Agent-Planner利用大语言模型的归纳推理能力从知识图谱中提取符号规则,指导高效的问题分解。

qq_60040306的博客 1605

基恩士PLC编程避坑指南:局部变量@前缀的3个隐藏陷阱与实战解决方案

本文深入剖析了基恩士PLC编程中使用@前缀创建局部变量的三大隐藏陷阱,包括在线调试时的数据丢失、数据类型冲突以及子程序复用时的地址覆盖问题。针对每个陷阱,提供了预定义变量、强类型规范和基址参数传递等实战解决方案,帮助中高级工程师提升代码健壮性与可维护性。

weixin_29171087的博客 102

Linux内核代码风格规范与实践指南

代码风格规范是软件开发中确保可读性和可维护性的重要基础。在操作系统内核开发领域,统一的代码风格尤为关键,它直接影响着代码审查效率、协作开发质量以及长期维护成本。Linux内核作为全球最大的开源项目之一,其代码风格规范经过数十年演进,形成了以8字符缩进、80列行限制、K&R括号风格为核心的标准化体系。这些规范不仅考虑了终端显示、跨平台兼容性等工程实践需求,还通过严格的命名约定、错误处理模式(如goto清理)和内存管理准则(kmalloc/kfree),确保了内核代码在性能关键场景下的可靠性。对于从事嵌入式系统

weixin_30718391的博客 441

网格聚类 Grid Clustering/Grid-based Clustering

本文主要简单介绍了网格聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型参数等。

JasonH2021的博客 4827

juju reactive charm (by quqi99)

sudo snap install charm --classic mkdir -p /bak/work/charms/layers export JUJU_REPOSITORY=/bak/work/charms export LAYER_PATH=$JUJU_REPOSITORY/layers cd $LAYER_PATH charm create simple cd simple sudo ...

技术并艺术着 8717

基于反相器的超声波发生和气泡检测电路

本文主要介绍了关于超声波的两种电路——基于反相器的振荡电路和基于逻辑们的气泡检测电路

xehagy的博客 1955

SRRC型号核准的模块豁免规则解析——如何利用完整型模块简化设备认证流程

本文详细解析了SRRC型号核准中模块豁免规则的应用,重点介绍了完整型模块的技术定义、豁免条件及实际应用场景。通过合理利用完整型模块,企业可显著简化设备认证流程,缩短上市周期并降低成本。文章还提供了模块选型指南和常见问题解决方案,帮助工程师高效应对SRRC认证挑战。

weixin_29306011的博客 933

Rust与WebAssembly高性能开发实战指南

WebAssembly(WASM)是一种可在现代浏览器中运行的二进制指令格式,通过提供接近原生代码的执行效率,突破了JavaScript的性能瓶颈。其核心原理是将C++/Rust等语言编译为可移植的字节码,与JavaScript形成优势互补。在图像处理、密码学运算等计算密集型场景中,Rust+WASM组合可带来8倍以上的性能提升。本文以图像滤波器为例,详细解析如何通过wasm-pack工具链实现Rust到WASM的交叉编译,利用web-sys进行DOM操作,并针对WASM体积优化、多线程实践等工程难题提供解

culuo8053的博客 461

YOLOv11改进策略【卷积层】| CVPR2025 GBConv轻量门控瓶颈卷积 低秩瓶颈降参 + 门控聚焦形态,强效捕捉纤细目标

裂缝形态不规则、纹理纤细,传统卷积参数大、计算冗余,且无法动态聚焦裂缝形态;背景噪声强易干扰特征提取,需要轻量且能自适应聚焦裂缝形态的卷积单元,因此提出轻量门控瓶颈卷积 GBC。

Limiiiing的博客 851

【Keepalived】AlmaLinux 9.8源码安装Keeplived-2.4.0

Keepalived 2.4.0在AlmaLinux 9.8上的安装过程 发现Keepalived 2.4.0在CentOS 7.9上预编译报错,转而在AlmaLinux 9.8上成功安装。步骤如下: 安装依赖环境:yum install -y curl gcc gcc-c++ openssl openssl-devel pcre pcre-devel zlib zlib-devel bash-completion,但libnl相关包未能安装 单独安装gcc和gcc-c++成功 预编译时提示缺少OpenSS

cnskylee的博客 226

数学建模学习(5):最全概率分析之图表绘制详解,内容比较多,建议收藏

(1) 绘制正整数频率使用 tabulate(X) (2)

全栈川川 4591

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 810
上一篇: 突破icesword实现文件隐藏
下一篇: Usermode api hook removal
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值