2025年微信hook是什么(微信hook开源)

微信hook是什么(微信hook开源)什么是 HOOK 技术 病毒木马为何惨遭杀软拦截 商业软件为何频遭免费激活成功教程 系统漏洞为何能被补丁修复 这一切的背后到底是人性的扭曲 还是道德的沦丧 尽请收看今天的专题文章 什么是 HOOK 技术 上面是开个玩笑 言归正传 今天来聊的话题就是安全领域一个非常重要的技术 HOOK 技术 HOOK 英文意思是 钩子 在计算机编程中 HOOK 是一种 劫持 程序原有执行流程

大家好,我是讯享网,很高兴认识大家。



什么是HOOK技术?

病毒木马为何惨遭杀软拦截?

商业软件为何频遭免费激活成功教程?

系统漏洞为何能被补丁修复?

这一切的背后到底是人性的扭曲,还是道德的沦丧,尽请收看今天的专题文章:《什么是HOOK技术?》

上面是开个玩笑,言归正传,今天来聊的话题就是安全领域一个非常重要的技术:HOOK技术。

HOOK,英文意思是“钩子”

在计算机编程中,HOOK是一种「劫持」程序原有执行流程,添加额外处理逻辑的一种技术。

按照这个定义,其实我们Python中的装饰器和Java中的注解,这种面向切面编程的手法在某种程度上来说,也算是HOOK。

不同的是,本文要探讨的HOOK并非属于程序原有的逻辑,而是在程序已经编译成可执行文件甚至已经在运行中的时候,如何劫持和修改程序的流程。

按照劫持的目标不同,常见的HOOK有以下这些类型:

接下来,咱们挨个来看一下。

程序和代码是给程序员们看的,计算机要运行,最终是要编译成CPU的机器指令才能执行。

Inline HOOK的目标就是直接修改程序编译后的指令,属于最基础也最常见的HOOK技术。

下面我们以一个实例来感受一下Inline HOOK的效果:

输出:

代码中定义了目标函数functionA和hook函数hookFunction。

第一次调用,输出显示调用了原函数。

然后安装一个HOOK,准备了一条jmp指令,覆盖函数入口处的指令。此时观察覆盖前后的函数指令变化对比:

再次调用该函数,则一进入就发生跳转,我们安装的HOOK函数得到了执行。

所以第二次输出显示HOOK函数得到了调用。 

 大部分情况下,我们习惯于在函数入口处执行HOOK,但这并不是绝对的,还需要具体问题具体分析。比如如果我们需要等待函数执行完毕时拿到返回值才能介入处理,这个时候就需要在函数return的地方进行HOOK。甚至有可能需要在函数中途某个地方介入,这个时候就需要更进一步的对函数的反编译指令进行分析,确定HOOK的点位和处理逻辑。

执行Inline HOOK非常关键的几点:

Inline HOOK由于是直接在CPU机器指令层面上的操作,所以首先是无法做到跨平台。同时,还需要对CPU的指令集有一定程序的了解,具备一定的汇编语言功底。

好在,IT行业从来不缺造轮子的人,已经有不少优秀的开源项目将Inline HOOK封装成库,比如:Detours

除了直接修改函数的机器指令,还有一类HOOK,它们修改的是某些重要的函数指针,从而达到劫持执行的目的。

形形**的函数指针,就衍生出各式各样的HOOK技术。

一个程序的所有代码一般不会全部都编译到一个模块中,分拆到不同的模块既有利于合作开发,也有利于代码管理,降低耦合。

动态链接库就提供了这样的能力,将不同的模块编译成一个个的动态库文件,在使用时引入调用。


讯享网

在Windows平台上,动态链接库一般以DLL文件的形式存在,主程序模块一般是EXE文件形式存在。无论是EXE还是DLL,都是属于PE文件。

一个模块引用了哪些模块的哪些函数,是被记录在PE文件的导入表IAT中。这个表格位于PE文件的头部,里面记录了模块的名字,函数的名字。

在模块加载时,模块加载器将解析对应函数的实际地址,填入到导入表中。

通过修改导入表IAT中函数的地址,这种HOOK叫IAT HOOK

SEH是Windows操作系统上结构化异常处理的缩写,在代码中通过try/except来捕获异常时,操作系统将会在线程的栈空间里安置一个异常处理器(其实就是一个数据结构),里面定义了发生异常时该去执行哪里的代码处理异常。

异常处理可以多级嵌套,那多个异常处理就构成了一个链表,存在于栈空间之上。 

 当发生异常时,操作系统系统就从最近的异常处理器进行寻求处理,如果能处理则罢了,不能处理就继续寻求更上一级的异常处理器,直到找到能处理的异常处理器。如果都没法处理,那对不起,只好弹出那个经典的报错对话框,进程崩溃。 

 SEH HOOK针对的目标就是修改这些异常处理器中记录的函数指针,当异常发生时就能获得执行,从而劫持到执行流!因为这些异常处理器都位于线程的栈空间,修改起来并非难事。

C++是一门面向对象的编程语言,支持面向对象的三大特性:封装性、继承性、多态性。

其中的多态性,各个C++编译器基本上都是通过一种叫虚函数表的机制来实现。

下面通过一个实际的例子来感受一下虚函数表在C++多态性上发挥的作用。

输出: 

 通过上面的输出,可以看到,fish和cat对象都只占据4个字节。因为这两个类都没有成员变量,唯一需要存储的就是一个虚函数表指针。

以cat对象为例,看一下它的地址,是0x005cfc30: 

 看一下这个地址起始的4个字节,是什么: 

 虚表指针是0x000d9b90(这里需要注意字节顺序)。

通过这个地址,找到虚函数表,里面有两个函数地址: 

 查看这两个地址,都是指向了一个jmp指令,分别跳到了Cat类的两个虚函数。 

 

 通过上面的实例,总结一下对象、虚函数表和虚函数代码之间的关系如下图所示: 

 每个包含虚函数的类对象,在内存中都有一个指针,位于对象头部,指向的是一个虚函数表,表中的每一项都是虚函数地址。

类继承后,如果重写了父类的虚函数,子类对象指向的表格中对应函数的地址将会更新为子类的函数。

这样,使用父类指针指向子类对象,通过指针调用虚函数时,就能调用到子类重写的虚函数,从而实现多态性。

既然是记录函数地址的表格,那就有存在被篡改的可能,这就是C++ virtable HOOK。

通过篡改对应虚函数的地址,实现对相应函数调用的拦截。

实施这种HOOK,需要逆向分析目标C++对象的结构,掌握虚函数表中各个函数的位置,才能精准打击。

上面几种HOOK,修改的都是应用层的函数指针,而操作系统内核中还有一些非常重要的表格,它们的表项中记录了一些更加关键的函数,HOOK这些表格中的函数是非常高危的操作,操作不当将导致操作系统崩溃。当然,高风险高回报,HOOK这些函数,能实现一些非常强大的功能,是病毒、木马、安全软件非常爱干的事情。

系统调用是操作系统提供给应用程序的编程接口API,应用程序通过这些API得以操作计算机的资源(如进程、网络、文件等)。

执行系统调用的时候,CPU将从用户模式切换到内核模式,进入内核后,将会根据系统调用的API编号,去找到对应的系统服务函数,实现对应API的功能。

操作系统将所有的系统服务函数地址,存放在了一个表格中,这个表格就是系统服务描述符表。在Linux上,这个表格的名字叫sys_call_table,在Windows上,它叫KeServiceDescriptorTable,简称SSDT。 

 Windows上的SSDT向来是兵家必争之地,安全软件为了监控应用程序的行为,通常都会替换SSDT表格中的系统服务函数地址为它们的函数。当系统调用触发时,安全软件将会及时知晓,并通过应用程序的参数来判定是否“放行”这次调用。

内核中除了记录系统服务的SSDT,还有一个非常重要的表格:中断描述符表IDT。

IDT用于记录CPU执行过程中遇到中断、异常等情况时,该转向哪里去处理这些情况的函数地址。

HOOK IDT有一个注意事项,不同于SSDT是全局唯一的,IDT是与CPU核心紧密相关的,对于多核处理器,会对应多个IDT表。如果想通过HOOK IDT中的函数来搞事情的话,可能需要同时处理多个表。 

 除了直接修改函数指令和修改函数指针之外,还有一类特殊的HOOK,它们通过系统提供的机制拦截某些消息、通知,从而有机会介入监听、拦截。

在Windows系统上,用户程序和内核驱动之间的交互是通过一种称为IRP的数据结构实现的,你可以简单将其理解为应用程序发送了一个消息下去,这个消息就是一个IRP。

而接收消息的目标,是驱动程序创建的设备Device。注意,这个设备不一定是物理设备,也可能完全不存在的虚拟设备,驱动程序可以任意创建一个不存在的设备。

Windows内核中提供了驱动设备的挂载操作,允许别的驱动程序对指定设备进行挂载,从而可以截获发送给该设备的“消息”,这种HOOK方式被称为IRP HOOK。 

 国内一些安全软件为了互相攻击,经常用这种方式拦截对方驱动程序的消息,从而可以“保护”自己不被对方干掉。

这两种HOOK方式与Windows内核中的网络子系统密切相关。

Windows内核中的网络结构是分层式设计。从最上层的API socket层、到TCP/IP协议栈层、再到底层的网卡驱动程序,分了很多个层次。

而层与层之间的交互,是通过一系列标准接口来实现的,其中最重要的两个接口标准就是TDINDIS。TDI封装了不同协议栈的差异(Windows不止支持TCP/IP协议栈)提供给上层统一的调用接口。NDIS则封装了底层不同网卡的驱动程序接口差异,提供给上层统一的收发数据包接口。

Windows为了扩展性支持,允许类似防火墙之类的软件通过这些接口接入,从而能够截获到网络通信流量,进行安全审计。

既然开了这些接口,一些流氓软件和木马病毒也就盯上了它们,通过这些接口就能轻松监听、篡改网络数据,达到邪恶的目的。

Windows操作系统的UI交互是以消息来驱动的,用户的键盘输入、鼠标操作都会**作系统以消息的形式发送到各个应用程序处理。

Windows提供了API接口,可以被程序用于捕获这些消息,从而实现一些特定的功能。

这种机制叫做Windows消息钩子,最常见的就要数键盘钩子了,在十多年前流氓软件和木马病毒大行其道的时候,这些恶意软件经常喜欢通过这种方式来监听用户的键盘输入,从而来盗取密码(当然,现在肯定是不行的了)。

以上就是要介绍的全部HOOK技术了。当然有HOOK,就有反HOOK,很多安全软件都会检查关键的位置是否被篡改。不仅如此,因为流氓软件随意修改系统,Windows从Win7 x64开始加入了PatchGuard机制,针对操作系统核心数据结构都加入了定时检测机制,一旦发现被篡改,立刻蓝屏给你看,而且在随着系统升级换代,这个检查的粒度和强度变得越来越强。

最后来回到文章开头的几个问题:

病毒木马为何惨遭杀软拦截?

因为安全软件在内核中HOOK了大量的关键位置,病毒木马的进程、文件、网络行为都将受到监控,一举一动都难逃杀软的眼睛,想要拦截易如反掌。

商业软件为何频遭免费激活成功教程?

通过逆向分析加上Inline HOOK,激活成功教程者可以篡改掉商业软件的注册校验机制,让校验函数返回成功,绕开软件的限制。

系统漏洞为何能被补丁修复?

统一通过Inline HOOK,操作系统能够修改原来有bug的代码,转而执行修复后的新版本,解决系统漏洞。

点击下方即可免费领取技术文档

你看,技术就是一柄双刃剑,善或恶,一念之间。

小讯
上一篇 2025-06-12 14:33
下一篇 2025-05-01 20:38

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/178958.html