jmp address windows hook

Windows API Hook实战:从Inline Hook原理到C++实现与Detours应用 在Windows系统编程与软件安全领域,API拦截(Hook)是一项核心技术,它允许开发者在函数调用过程中插入自定义代码,实现对系统行为的监控与修改。其原理主要分为修改导入地址表的IAT Hook和直接覆盖函数机器码的Inline Hook两种方式。这项技术的核心价值在于为调试分析、安全监控、性能优化等场景提供了底层解决方案。通过理解内存保护、指令备份、蹦床函数等关键机制,开发者能够构建稳定的拦截系统。在实际工程中,微软Detours库封装了线程安全、指令修复等复杂细节,是生产环境的首选工具。本文以C++实 阅读详情
以下代码是sysnap早期发表的inlinehook ObReferenceObjectByHandle()的代码。大部分看懂了,但是有些看不懂,google也查了,qq群也问了。哪位高手有时间给科普下哈~ 可怜下偶们菜鸟吧。。。

__declspec(naked) T_ObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
)
{
_asm
{
mov edi,edi //执行被修改的前5个字节
push ebp
mov ebp,esp

push [ebp+0x1c] //参数压栈
push [ebp+0x18]
push [ebp+0x14]
push [ebp+0x10]
push [ebp+0xc]
push [ebp+8] //this parameter is object handle

call MyObReferenceObjectByHandle //调用我们的功能函数 
cmp eax,1 
jz end

mov eax,ObReferenceObjectByHandle //正常运行原来的函数
add eax,5 
jmp eax 

end:
mov [ebp+8],-1 //如果不想让这个函数正常运行..无效句柄就可以
mov eax,ObReferenceObjectByHandle 
add eax,5 //protected the function can success runing 
jmp eax //start run ObReferenceObjectByHandle
}

//对原来函数是否要让其正常运行的判断由MyObReferenceObjectByHandle完成
int MyObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
)
{
PEPROCESS Process;
KIRQL oldIrql;
int JmpOffSet;
unsigned char Code[5]={0x8b,0xff,0x55,0x8b,0xec}; //mov edi,edi push ebp mov ebp,esp
unsigned char JmpCode[5] = { 0xe9, 0x00, 0x00, 0x00, 0x00 }; //jmp address

if(*PsProcessType == ObjectType) //判断句柄所属对象类型是不是*PsProcessType
{
oldIrql = KeRaiseIrqlToDpcLevel();

__asm
{
CLI 
MOV eax, CR0 
AND eax, NOT 10000H 
MOV CR0, eax
}

RtlCopyMemory(ObReferenceObjectByHandle,Code,5);//恢复inline hook以便正确调用ObReferenceObjectByHandle 
ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,&Process,NULL);

//Procee + 0x174 is this process file name
//this file is im protected
if(_stricmp((char*)((char*)Process+0x174), ProtectName) == 0 )//判断是不是我们要保护的进程
{
//JmpOffset is int type
//JmpOffset Pointer the function qian 5 byte
JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;

//get jmp address to jmp+1 - jmp+4
RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );

__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

KeLowerIrql(oldIrql);
return 1;
}

//否则再次HOOK这个函数
JmpOffSet= (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
RtlCopyMemory ( JmpCode+1, &JmpOffSet, 4 );
RtlCopyMemory ( ObReferenceObjectByHandle, JmpCode, 5 );

__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

KeLowerIrql(oldIrql);
} 
return 0;
}



PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

__asm
{
CLI 
MOV eax, CR0 
AND eax, NOT 10000H 
MOV CR0, eax
}

和

__asm
{
MOV eax, CR0
OR eax, 10000H
MOV CR0, eax
STI
}

是什么意思,大概在google上查了下,貌似和打开/管理 中断请求有关系。。。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀?
sudami
2009-07-13, 23:27:18
多打基础,就会懂了. 比如你不清楚-5的意思,需要了解Intel指令相关...
不要一口吃个胖子. :3:
emc
2009-07-14, 00:51:49
to sudami:

好吧,我在看看,但是,希望你能帮我解释下,我提出的问题 谢谢。
xacker
2009-07-14, 14:00:47
代码写的有点复杂 中间还夹带了一些汇编 对于新手 确实不大容易理解 
建议LZ 去网上找个C写的R3的detours HOOK 单步调试一下就知道了
六月
2009-07-14, 18:26:22
PsProcessType
这个是什么,在哪定义?一般是用来做什么的。。。

进程类型咯..一般用0就行了.我也不是很清楚这个意思,你参考下就好
-------------------------------------------------------------------------------
oldIrql = KeRaiseIrqlToDpcLevel();
这条语句做什么的?并且返回值oldIrql是什么啊?

保存当前IRQL级别并提高IRQL级别,就是为了不让其他线程调度进来用的...就是提高IRQL中断级别,防止其他线程调度而产生的中断.不过我也不太明白,他这里用了cli关中断了,为什么还要提高IRQL的权限,不太明白,cli关中断的原理不太明白.他这里的IRQL提权是关了软中断,我想cli也是这个意思吧..

-------------------------------------------------------------------------
JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么最后还要减5呀? 

这个我也不知道怎么解释了,自己HOOK一下,算一下应该就明白了!
轩辕小聪
2009-07-14, 18:35:08
如果楼主从没接触过inline hook,那么就如4楼所说应该从Ring3的inline hook开始学,而不是Ring0。
楼主的疑问,并不只是对怎样进行inline hook的疑问,还有一些是不熟悉驱动编程导致的。

PsProcessType是ObReferenceObjectByHandle传入的ObjectType参数,在得到进程的Object的时候使用,楼主参考DDK中关于ObReferenceObjectByHandle的描述,就会知道它是怎么回事了。

oldIrql = KeRaiseIrqlToDpcLevel();
同样参考DDK就会知道这个函数的作用,以及它的返回值(旧的IRQL)

操作CR0的那段则是暂时禁用写保护。

JmpOffSet = (char*)T_ObReferenceObjectByHandle - (char*)ObReferenceObjectByHandle - 5;
为什么减5,这涉及到机器码jmp命令的偏移是怎么计算的,这是inline hook的基础,楼主如果搞不清楚这个,可以说楼主根本没接触过inline hook。

另外这一段代码也做得并不是很好,因为需要在替代函数中反复HOOK和UNHOOK,这是比较容易出问题的一种方式,不是inline hook提倡的方式。
emc
2009-07-14, 21:34:22
谢谢4喽和5喽的解释。

to 轩辕小聪:

我之前学习驱动,只是看了“楚狂人”所写的“windows驱动编程基础教程”,并且调试了helloworld和ioctrl的那2个代码。
之前我有参考ddk document中的ObReferenceObjectByHandle()中,但是没有找到"PsProcessType"的解释,而且参看sysnap的代码中并没有定义和解释PsProcessType,现在我只是知道用它来判断一个对象是不是一个进程。
不过谢谢大家的解释了,我自己在google下吧。
achillis
2009-07-14, 22:17:11
Hook完全可以在ring3下练习~
emc
2009-07-14, 23:05:29
to achillis:

inline hook 可以在ring3写练习?
hatling
2009-07-15, 00:20:22
to achillis:

inline hook 可以在ring3写练习?

看来你还没明白什么是inline
radarhp
2009-07-15, 00:45:44
-5 不就是因为写入了5个字节长度的跳转指令呗。。。
一个比一个神秘
六月
2009-07-15, 10:57:36
to achillis:

inline hook 可以在ring3写练习?

inline hook意思就是在函数体内hook 进入到过滤函数,比如可以通过jmp ,call,push等.实现转入过滤函数(就是你写的判断函数)...这就是inline hook 和R0 R3没关系,只是一种方式而已...

inline反正意思就是在函数体内挂钩..
achillis
2009-07-15, 17:53:03
那么多的hook教程,似乎没有一篇足够凝炼~
emc
2009-07-16, 09:09:13
to 13#:

貌似那些hook教程都直接是code....

Windows API Hook实战:Frida动态注入与MessageBox拦截 动态代码插桩技术是现代软件逆向分析与安全研究中的核心方法,它允许在不修改源代码的情况下,实时监控和修改程序行为。其原理是通过在目标进程内存中注入代码,拦截函数调用、读写内存或寄存器数据。这项技术的核心价值在于提供了对闭源软件的深度可观测性和可控性,广泛应用于漏洞挖掘、恶意软件分析、软件调试与功能扩展等场景。Frida作为当前最流行的动态插桩框架,以其跨平台特性和JavaScript API降低了技术门槛。本文以Windows平台为背景,深入讲解如何使用Frida对MessageBoxW等系统API进行Hoo 阅读详情

相关推荐

Win10 X64 HOOK KiUserExceptionDispatcher

Win10 X64 HOOK KiUserExceptionDispatcher HOOK.ASM extrn NewKiUserExceptionDispatcher : proc extrn OrgKiUserExceptionDispatcher : proc extrn OldKiUserExceptionDispatcher : proc .data .code ;hook public MyKiUserExceptionDispatcher MyKiUserExceptionDi

瞎捣鼓 2750

使用修改为jmp指令的方式hook 32位函数

要填写jmpInstruction的最后4个字节,我们需要它们之间的偏移量payload函数和jmp指令之后的指令。//32位相对跳转jump操作码为E9,后面带着1个32位操作数作为跳转偏移量。

AppNinja 开发手记 483

Windows平台Frida逆向实战:从Hook到主动调用的完整指南

动态代码插桩技术是现代软件逆向分析与安全测试的核心方法之一,它允许在程序运行时监控和修改其行为。其原理是通过向目标进程注入代理代码,拦截函数调用、读写内存或执行自定义逻辑,从而实现对程序内部机制的深度探查。这项技术的核心价值在于无需源代码即可进行动态分析,广泛应用于软件调试、漏洞挖掘、协议分析和安全加固等领域。在Windows桌面应用逆向场景中,针对C++、C#等原生程序的分析需求尤为常见,例如分析软件授权验证、理解数据存储格式或自动化GUI操作。Frida作为一款强大的动态插桩框架,通过其独特的客户端-服

weixin_30706691的博客 406

JMP方法HOOK

 JMP  HOOK  IAT  detours Win9x   系统中,系统DLL被装入实际的物理存储器,然后映射到每个进程的0x80000000~0xBFFFFFFF共享内存区,如果修改这段区域的DLL代码,则对于所有进程都有效(实际Win98对主要的系统DLL作了保护,除非进入ring0才能修改)。        Win2000/NT   的进程空间不存在共享内存区,尽管DLL被装入

gezi322的专栏 1849

游戏逆向实战:通过Hook技术动态提取Lua脚本源码

在游戏开发与安全分析领域,脚本语言如Lua因其轻量级和易嵌入性被广泛用于游戏逻辑驱动。理解其加载机制是进行运行时分析的基础,Lua虚拟机通过API函数将源代码编译为字节码执行。Hook技术通过拦截关键函数调用,能在不破坏原有流程的前提下捕获内存数据,这一原理在游戏逆向、安全审计等场景中具有重要价值。本文聚焦于**luaL_loadbuffer**和**内存操作**等核心热词,详细阐述了如何定位函数地址、实现内联Hook,并构建一个能够动态提取加密或打包Lua脚本的Dump工具,为分析游戏逻辑架构提供了实用的

weixin_33968104的博客 414

深入解析Frida底层引擎Gum:从Hook原理到跨平台插桩实战

动态代码插桩技术是现代软件分析、安全检测和逆向工程的核心手段,它允许在程序运行时注入和修改代码逻辑。其实现原理主要基于指令重写和上下文劫持,通过在目标函数入口插入跳转指令,将执行流导向自定义处理逻辑,再通过跳板机制(Trampoline)执行原始指令,从而实现对函数行为的监控、修改或替换。这项技术的核心价值在于提供了对程序行为的深度可见性和可控性,广泛应用于漏洞挖掘、恶意软件分析、性能剖析和软件保护等领域。在众多实现中,Frida框架以其易用性和强大功能著称,而其跨平台能力和稳定性的基石正是其底层执行引擎—

weixin_33770878的博客 377

hook模板x86/x64通用版(1)--x64下的jmp远跳、远call指令

我一直在寻找能用,通用,简短的x64远跳河远call指令 现在用的跟大家分享一下,哪位大牛有更好的希望可以指点一下。 还有pushad/popad在x64下有什么好的替代品么?求指点。 远跳: 代码: push 地址的低32位 mov dword ptr ss:[rsp+4],地址的高32位 ret 远call: 代码: call @next   //e8 00

yes2的专栏 4323

Unity il2cpp Hook实战:从内存注入到函数调用的完整方案

Hook技术是软件运行时动态修改程序行为的基础方法,通过拦截和重定向函数调用实现功能扩展或行为监控。其核心原理在于修改目标函数指针或指令,使执行流程跳转到自定义代码。在游戏开发、安全分析和性能监控领域,Hook技术具有重要价值,尤其适用于运行时调试、热修复和功能增强等场景。针对Unity引擎的il2cpp运行时环境,传统.NET Hook方案失效,需深入理解其内存布局与元数据系统。本文聚焦il2cpp Hook的实战实现,涵盖内存注入、函数拦截等关键步骤,并融入MinHook框架和Aetherim库的应用解

weixin_33724059的博客 497

JMP、Hook

#include "stdio.h"   #include "tchar.h"   #include "windows.h"         //offset=目标地址-(jmp指令起始地址+5)   //跳转指令解码:[0xe9][offset]   //  offset:有符号整型,四字节.它等于jmp指令的下一指令地址到目标地址的相对距离   //  计算公式:   // 

linuxheik的专栏 1193

游戏外挂检测与防御:从内存修改到Hook检测的工程实践

在游戏开发领域,客户端安全与反外挂是保障游戏公平性的核心技术。其原理主要围绕保护游戏进程的完整性,防止关键数据被篡改或执行流程被劫持。从技术价值看,有效的反外挂方案能维护游戏经济生态和玩家体验,是游戏长期运营的基石。常见的应用场景包括检测内存修改、识别函数钩子(Hook)以及防御模拟输入等作弊手段。本文聚焦于游戏外挂导致的客户端异常现象,如“屏幕滑不动”,深入探讨其背后的技术成因,并提供了从内存校验、模块检测到函数完整性检查的工程化解决方案,帮助开发者构建多层次防御体系。

weixin_30443813的博客 297

HDHook:内核Hook技术实现硬盘序列号和MAC地址软修改

在系统运维与驱动开发中,硬件信息的识别往往依赖硬盘序列号与MAC地址等底层标识。常规思路下,修改这类参数需要刷写固件或更换硬件,而内核Hook技术提供了一条软件层面的替代路径:通过拦截系统查询硬件信息的IRP请求,在数据返回前改写缓冲区内容,从而实现对序列号和MAC地址的“软修改”。这种方案具有全局生效、稳定性高的特点,适用于系统克隆、许可管理、兼容性测试等需要对硬件信息进行模拟的场景。HDHook作为一个开源项目,完整演示了驱动级Hook的工程实现,涵盖环境搭建、编译签名、参数配置与常见问题排查,为开发者

weixin_29741447的博客 208

HOOK挂钩技术

文章目录1.Address Hook1.1.PE的IAT1.2.PE的EAT1.3.PE的user32.dll的回调函数表1.4.IDT1.5.SSDT和ShadowSSDT1.6.C++类的虚函数表2.Inline Hook3.Hook位置 1.Address Hook 地址hook顾名思义,就是将原函数地址直接替换成hook函数地址 1.1.PE的IAT 因为IAT具体指某个PE模块的IAT,所以他的作用范围只针对被Hook的模块,且必须在以静态链接的方式调用API时才会被Hook,在使用LoadLib

醉等佳人归 1056

JMP 编写的HOOK挂接函数

替换原API函数入口实现挂钩,PE文件,动态链接实现通用替换类,实现代码攻击。另外有文档介绍了其工作原理,再次声明本代码核心类部分非原创。

从Frida动态Hook到二进制静态植入:逆向工程的硬核进阶

动态插桩技术,如Frida,通过在程序运行时注入脚本来实现函数Hook、内存修改和动态分析,其核心原理是拦截并改变目标进程的执行流。这项技术在安全研究、逆向工程和漏洞分析中具有重要价值,广泛应用于移动应用安全评估、恶意软件分析和软件调试等场景。然而,动态注入依赖外部环境且易被检测,促使工程师探索更底层的解决方案。通过深入理解ELF/PE等可执行文件格式,掌握节区、导入表、重定位等底层概念,可以将Hook逻辑从运行时脚本转化为静态的机器码,并直接植入二进制文件。这种静态植入技术实现了零运行时依赖和高隐蔽性,是

weixin_34025051的博客 474

hook api jmp调用底层windows

环境vs2019 c++控制台程序,这个主要是修改Kernel32.dll入口来使得在启动前就监听函数。

JMP Call hook

JMP与CALL HOOK之间的较量,攻防之战

MemorySharp 路线图展望:Hook、Pattern 与 Patching 机制何时到来?

MemorySharp 是一款基于 C# 的 Windows 内存编辑库,致力于提供「安全、强大、易用」的 API,帮助开发者向远程进程读取、注入数据与代码,实现进程间互操作。不少新手打开项目 README 都会发现,MemorySharp 路线图上长期挂着四个「coming soon」机制:Executor、Hook、Pattern 与 Patching。它们到底何时到来?本文结合项目现状、历史

gitblog_00086的博客 289

MTK Sensor驱动调试实战:从AP到SCP的完整流程解析

本文详细解析了MTK平台Sensor驱动从AP侧到SCP侧的完整调试流程。内容涵盖AP侧驱动集成、DTS配置、内核编译与验证,以及SCP侧Tinysys框架下的代码集成、Overlay配置与I2C设置等核心步骤,并分享了中断唤醒、功耗优化及传感器数据校准等实战经验与常见问题排查方法,为硬件驱动工程师提供了一份全面的实战指南。

weixin_29175469的博客 353

深入理解HOOK与注入:原理、实战与避坑指南

在软件开发与系统安全领域,如何在不修改源码的前提下改变程序运行行为,是开发者与安全工程师共同关注的课题。HOOK与注入作为两种核心实现手段,分别承担“拦截改道”与“插入送达”的职责:HOOK通过对导入表、指令前缀或虚函数表的改造,实现函数级监控与流程扭转;注入则将代码、模块或恶意负载送入目标环境。二者在Linux内核write hook透明加密、Android虚拟化、APM异常追踪及Web安全靶场中深度协同。理解inline hook的指令对齐与trampoline设计、区分依赖注入与攻击类注入的本质差异,

weixin_34348805的博客 445

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4408

FCN---训练cityspaces

未经允许,不要随意转载! 最近想试试用FCN训练自己的数据集,想想标注是一件很费劲的事,于是就想到了用其他库里的数据,这里选用了cityspaces,默认已经配置好FCN. 1、下载cityspaces https://www.cityscapes-dataset.com/ 需要注册一个账号 cityspaces包含2...

wangyu088的专栏 2030
上一篇: Detours x64
下一篇: 又是一个APIHOOK
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值