detours, x86 kernel hook 以及 x64 kernel hook

Windows API Hook实战:从Inline Hook原理到C++实现与Detours应用 在Windows系统编程与软件安全领域,API拦截(Hook)是一项核心技术,它允许开发者在函数调用过程中插入自定义代码,实现对系统行为的监控与修改。其原理主要分为修改导入地址表的IAT Hook和直接覆盖函数机器码的Inline Hook两种方式。这项技术的核心价值在于为调试分析、安全监控、性能优化等场景提供了底层解决方案。通过理解内存保护、指令备份、蹦床函数等关键机制,开发者能够构建稳定的拦截系统。在实际工程中,微软Detours库封装了线程安全、指令修复等复杂细节,是生产环境的首选工具。本文以C++实 阅读详情
 X86 Kernel Hook
早些年,我把detours1.5移植到x86核心层,工作的不错,我一直用它来hook系统一些内部函数,有时候也用来hook IoCreateFile这类导出函数。让detours1.5在核心工作稳定并不是一件困难的事情。可能有些c/c++的麻烦,但是很快就可以解决。唯一需要注意的地方是detours1.5用VirtualProtect来让内存READ_WRITE_EXECUTE,在核心层有2种方法,第一种是群众所喜闻乐见的清除cr0,第二种是在核心层通过调用native api做VirtualProtect的事情。
detours的方法对比import/export方法有一些很明显的好处,其最大的好处是可以用来hook内部函数。而且由于hook的方法是直接修改函数体,所以不管调用者怎么玩花样,都很难绕过hook。
detours的缺点主要如下:
1,detours x86无法hook小于5字节的函数
2,detours x86需要一个完备的反汇编器和解释器,实际上detours代码中并不包含这个,因此,如果需要写一个函数阻止他人hook,可以这么写:
  proc near
      xor eax,eax
      jeax 1
      int 3
      ... // do something
    proc end
注意到这里的这个jmp,因为eax肯定为0,所以该int3不会被调用,而被detours过的代码则很可能走到int3上去了,为了让detours的代码不走到int3,detours必须能够解析出前面3行代码的意思,并且修正jeax 1为jeax 1+(trampoline-function)。用类似的技术,也可以欺骗detours。
3,detours x86无法处理如下函数:
  proc near
flag: ... // 函数前5个字节
    .... //do something
    jmp flag
    .... // do something
    proc end
该函数执行体中有一个jmp,跳到前5个字节。可是被detours过之后,该函数的前5个字节被修改了,而且改成了jmp trampoline。为了能够让detours可以处理此操作,必须反汇编解析整个函数体,用2种所描述的方法修改jmp flag。

综上述,detours思路很好,但是存在缺陷,要搞定这些缺陷,需要完整反汇编器。

X64 Kernel Hook
最近有一个需求要在x64下实现类似的hook模块,我找到了detours2.1,给MS发了email,MS的答复是,包含64bit的detours2.1,需要10000 USD。
于是我就删掉了MS的email,开始自己动手来做这个事情了。我大致说一下原理和需要注意的地方。

x64 hook和x86 hook的原理相似,都是修改原函数的首地址。不同的是,x64下不存在
jmp 64_address这种指令,x86下要跨4G跳转,必须是jmp [64_address],对应的汇编码不再是e9 xxxxxxxx,而是ff15 [xxxxxxxx],其中xxxxxxxx保存的是一个64_address。注意xxxxxxxx依然是32位,所以,该内存也必须和function处于同一个4G。

这个限制对于普通的代码编译来说,并不存在太大的问题,因为很少有exe超过4G的。所以编译器生成的代码依然使用e9 xxxxxxxx。对于import的dll来说,通常都是call [xxxxxxxx],以前是这样,现在还是这样,不同的是,[xxxxxxxx]以前指向32位的地址,现在指向64位的地址。这样一来,dll加载的位置和exe所在的位置不在同一个4G也没有关系了。

对于detours来说,受上面所述特性影响的是,trampoline通常位于heap memory/nonpaged pool,new_function位于我们自己所写代码的dll/driver中,old_function位于我们所需要hook的那个模块中。这里面存在一个基本矛盾是,new_function通常和old_function分别处于2个不同dll或者.sys中,系统很可能把他们加载到了距离很远的空间中,也即abs(new_function-old_function)>4G。这样一来,就无法使用e9 xxxxxxxx,而必须使用ff15 [xxxxxxxx]了,而且xxxxxxxx是一个32的偏移,所以[xxxxxxxx]还不能位于我们的dll/sys中。

根据以上的分析,最后可以得出如下算法:
1,找到需要hook的函数地址
2,解析从函数起始地址开始,至少6+8=14个字节的代码。代码不能断开。以上2个过程和detourx86一样,不同的是,detoursx86之需要e9 xxxxxxxx,也就是说只需要5个字节,而我们必须用ff15 [xxxxxxxx]。如果函数体小于14个字节,这意味着该函书无法detours。
不过函数体小于14字节多半是因为里面执行了一个call或者jmp,那么解析该代码,把函数起始地址设置为jmp之后的地址,重新进行2过程。
3,把这14或者15,16...个字节拷贝到预先分配的一块内存中,我们叫它trampoline。
4,把前6个字节改为ff15 [0],也即ff15 00000000
5,在随后的8个字节中保存new_function的起始地址
6,修正trampoline中的14字节的代码,如果里面有jmp,call等跳转语句,修改偏移量,这时候通常又需要跨4G的跳转,那么按照上面的方法修改之,trampoline的字节数可能会增加。
7,在trampoline的代码之后,插入ff15 [0],并且在随后的8个字节中填充old_function+14。

trampoline可以预先分配一个100字节的buffer,初始化全部填充为nop,在进行7的时候,可以从trampoline的底部,也即100-14的位置开始填入ff,15,00,00,00,00, 64_bit_old_function+14(15,16...)。

以上算法的缺点和x86 detours的缺点一样,第一条为无法hook函数体小于14字节的函数。

14个字节相当大,有时候这个缺陷不可忍受,为此,介绍一种更为肮脏的手段。

代码加载到内存中时,通常有很多废空间,也即,在这些空间中,只有nop,或者永远不会执行。用IDA可以找到这些空间。如果能够找到足够大到,以至于可以保存一个64位地址的空间的话,那么可以只修改前5个字节为jmp [xxxxxxxx],同时只拷贝5个字节到trampoline。trampoline的底部14个字节照旧。

以上就是x64下的detours过程。

有一个x64下需要注意的问题,vc8不支持x64下的_asm关键字,所以
_asm{
cli
mov eax,cr0
and eax,not 1000h
mov cr0,eax }不能再用
取而代之的是
_disable();
uint64 cr0=__readcr0();
cr0 &= 0xfffffffffffeffff;
__writecr0(cr0);
当然还可以继续用native api,不过以上方法简洁而且为广大群众所喜闻乐见。有关于_disable等函数,请查阅新版msdn。

至于IA64,我对此一无所知。

顺便说几点:
1,EM64T的cpu上可以run win64os,但是,不知为何,vmware无法在EM64T的cpu上install/run win64os。而amd64 cpu上即便安装的是win32 os,也可以在其上的vmware里install/run win64os。
2,softice已经停止开发,而且不支持x64,只有virtual模式才支持。鉴于其已经停止开发,建议大家都使用windbg。
3,idapro 5.0反汇编x64的代码,错误百出,一团乱麻,基本上需要先U再C。
因为14字节的限制太大,以至于始终觉得不爽。后来想到了一个解决方案。

假设原函数是old_func,新函数是new_func,那么分配trampoline的时候,用某些技术方法,限定分配出的内存和old_func在同一个4G。可以通过VirtualAlloc实现,具体方法可以是多次改变第一个参数,调用VirtualAlloc,直到返回值不为NULL为止。

这样一来,detours的逻辑改变为:

1,首先把old_func的前5个字节拷贝到trampoline+14,然后修改为jmp offset,也即e9 trampoline-5-old
2,trampoline的前6字节为ff15 [0],接下来的8个字节为new_func_address
3,trampoline+14+5之后的5个字节为jmp (trampoline+14+5+5 - (old_func_addr+5))

这样调用old的时候,会首先执行jmp offset到trampoline,trampoline又jmp到了new_func,new_func调用old的时候,会直接跳到trampoline+14处,执行原来的前5个字节,然后再jmp会原函数体。

如此,一切都完美了 :)
 
Windows API Hook实战:通过Inline Hook绕过微信单实例限制 互斥体是Windows操作系统中用于实现进程间同步的核心内核对象,其核心原理是通过命名实现全局唯一性,确保关键资源在同一时刻只能被一个进程访问。API拦截技术,特别是Inline Hook,通过修改目标函数在内存中的指令,能够在不修改原始程序文件的前提下,精准控制其行为。这项技术在软件调试、安全研究和功能扩展等领域具有重要价值。在应用场景上,它可以用于分析程序行为、实现热修复或绕过特定限制。本文以微信客户端的单实例检测机制为例,深入探讨了如何通过Hook CreateMutexW函数,并结合Detours库 阅读详情

相关推荐

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

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

weixin_33898876的博客 374

编译64位Detours(其他vs版本同理)

该方法最实用,少INCLUDE文件你搜到后,就将该文件所在的目录添加到系统环境变量INCLUDE里面,少LIB文件你就将它的目录添加到系统环境变量LIB里面,少了添啥。将上述选项中的/WX修改为/WX-,/WX 是警告被视为错误,而 /WX- 是警告不被视为错误。目录中的include目录中,这样就可以在你项目.cpp中直接引用detours.h头文件。detours.lib生成成功,并会自动将detours.h、detver.h拷贝到。在vs中编译使用了Detours库的项目时,报上述错误。

zhaopeng01zp的博客 1387

Windows API拦截实战:Detours库原理与应用详解

在Windows系统编程中,API拦截是一种关键技术,它允许开发者在无需修改原始二进制文件的情况下,改变函数执行流程。其核心原理是通过指令修补和跳转机制,在目标函数入口处插入跳转指令,重定向到自定义函数。这项技术的核心价值在于实现无侵入式的系统监控、性能分析和安全增强。在应用场景上,它广泛用于性能剖析、行为监控、补丁修复和调试工具开发。本文聚焦于微软Detours库,深入解析其通过指令修补实现API钩子的工作机制,并演示如何通过DLL注入实现进程内函数拦截,为系统级开发和逆向工程提供实用解决方案。

weixin_33898876的博客 324

Detour hook库x86 x64编译

Detours Detours是经过微软认证的一个开源Hook库,编译好的下载地址:https://download.youkuaiyun.com/download/qing666888/10593942 Detours 4.0.1现在是MIT许可下的开源软件。Detours在GitHub上,网址为https://github.com/Microsoft/Detours。源代码与Detours 3...

qing666888的专栏 1万+

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

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

weixin_33968104的博客 414

Hook技术入门:从企业微信登录流程理解用户态Hook原理与实践

Hook(钩子)技术是软件开发和逆向工程中的一项基础而强大的技术,它允许开发者在程序执行流程中插入自定义代码,从而实现对函数调用的拦截、监控或修改。其核心原理是通过修改目标函数在内存中的指令,使其跳转到开发者定义的代理函数,在代理函数中执行自定义逻辑后再选择性地调用原始函数。这项技术的价值在于能够在不修改原始程序源码的情况下,深度监控或改变其行为,广泛应用于软件调试、安全分析、自动化测试和功能扩展等场景。在自动化办公和即时通讯工具(如企业微信)的集成开发中,Hook技术常被用于实现登录状态维持、消息监听等高

csdndownload11123的博客 364

x64内核hook

x64中系统提供了api帮助我们进行hook,主要是如下三个函数 PsSetCreateProcessNotifyRoutineEx,这个函数的作用就是当进程创建的时候会通知你., PsSetCreateThreadNotifyRoutine,这个函数的作用是 当线程创建的时候会通知你。 PsSetLoadImageNotifyRoutine,这个函数的作用是 当模块加载的时候会通知你。 ...

liuhaidon1992的博客 1773

Detours x86 与 x64 位编译好的静态库

Detours x86 与 x64 位编译好的静态库

detours, x86 kernel hook 以及 x64 kernel hook [转自驱动开发网]

  HuYuguang 2007-02-09 14:08 我假设读者已经非常熟悉detours,阅读此文只是为了增强对detours的理解以及为了实现x64 hook。有关detours原理部分不再多讲。X86 Kernel Hook早些年,我把

xiaoqiangvs007的专栏 5604

64位系统下编译Detours的傻瓜式处理

在64位系统下编译Detours会报错。本资源是帮助那些编译遇到困难的朋友。包内包含Detours需要修改的代码,以及一个编译用的批处理文件,一个readme。 详情请参阅 http://blog.youkuaiyun.com/genesisbible/article/details/6771988

HOOKAPI——detours_X64库

64位版本的detours库并附带文档,微软64位 HOOKAPI ,有需要的可以学习,64位HOOK编程

DetoursNT架构详解:x86/x64/ARM多架构支持全解析

DetoursNT是一个创新的钩子库项目,其核心优势在于仅依赖NTDLL.DLL,无需修改原始代码即可实现高效的API钩子功能。本文将深入解析DetoursNT的架构设计,重点探讨其对x86、x64、ARM及ARM64多架构的支持机制,帮助开发者全面了解这一轻量级钩子解决方案的实现原理与应用价值。 ## 核心架构设计:NTDLL依赖的极简实现 DetoursNT的架构设计围绕"最小依赖"理念展

gitblog_00506的博客 831

分享一个大神的hook示例,理论上能Hook任意地址和获取寄存器数据

分享一个大神的hook示例,理论上能Hook任意地址和获取寄存器数据

VC++内联钩子实战:从原理到实现Windows API Hook

API Hook(应用程序编程接口钩子)是一种在Windows平台广泛使用的底层技术,其核心原理是通过拦截和修改函数调用流程,实现对系统或应用程序行为的监控与干预。这项技术通过修改目标函数在内存中的机器码,插入自定义跳转指令,从而在执行流到达目标函数时,能够先执行开发者预设的代理函数。从技术价值看,API Hook为软件调试、行为分析、性能监控和安全研究提供了强大的底层观察与控制能力,尤其适用于需要实时追踪系统调用、分析软件内部逻辑或实现兼容性修复等场景。结合热词中提到的“系统全局”监控需求,内联钩子(In

weixin_30388677的博客 334

别再问ARM麒麟怎么装微信了!手把手教你用铠大师搞定Windows软件(飞腾/海思芯片实测)

本文详细介绍了如何在ARM架构的信创电脑(如飞腾/海思芯片)上使用铠大师安装和运行Windows软件,解决微信、Office等常用软件的兼容性问题。通过实测数据对比,铠大师在性能和易用性上显著优于传统方案,为麒麟系统用户提供了一套完整的解决方案。

weixin_28736355的博客 903

数据库系统概论课后习题答案(第五版 王珊、萨师煊)

第1章 绪论 1 .试述数据、数据库、数据库系统、数据库管理系统的概念。 答: ( l )数据( Data ) :描述事物的符号记录称为数据。数据的种类有数字、文字、图形、图像、声音、正文等。数据与其语义是不可分的。解析在现代计算机系统中数据的概念是广义的。早期的计算机系统主要用于科学计算,处理的数据是整数、实数、浮点数等传统数学中的数据。现代计算机能存储和处理的对象十分广泛,表

早知晓的博客 11万+

内核级HOOK要走到头了吗?Patching the kernel for x64-Based Systems

Patching Policy for x64-Based SystemsChanges in policy related to patching the kernel for the Microsoft Windows Server 2003 Service Pack 1 Operating SystemMicrosoft® Windows® Server 2003 SP1 and later

2629

abaqus运行报错 WindowsError:[Error 2]

abaqus提交job总是提示“WindowsError [Error 2”,报这个错误,可能是由于安装其他软件改变了abaqus软件的路径导致,总结了看到的教程,按照下面的方法可以解决这个问题。 步骤一:找到你的abaqus安装路径(我是按照一个安装视频安装的,安装路径为SIMULI1),然后找到SIMULIA文件夹,点击进入后找到commands文件夹,将这个路径复制下来。 步骤二:我的电脑右键属性,在左侧中找到高级系统设置并...

az101za的博客 1万+

C++实现D3D11双架构Hook:原理、源码与工程实践

在Windows图形编程与系统安全领域,API钩子(Hook)技术是监控和修改程序行为的基础手段。其核心原理是通过拦截目标函数调用,插入自定义代码逻辑,实现对程序执行流的控制。这项技术在软件调试、性能分析、安全研究及游戏工具开发中具有重要价值,常用于实现帧率监控、画面后处理、内存读写检测等功能。针对Direct3D 11(D3D11)这一主流图形接口,稳定的Hook实现需要深入理解COM组件模型和虚函数表(VTable)机制。本文聚焦于一套采用现代方案的C++源码,它通过VTable Hook等关键技术,支

weixin_30509393的博客 377

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

MagicDraw-用例图

MagicDraw-用例图

木头征的博客 3132
上一篇: 将dll从进程模块列表中移除并保持正常运行
下一篇: 从内存中加载Pe文件
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值