HOOK技术大揭秘 编程中hook有什么用( 四 )


执行系统调用的时候 , CPU将从用户模式切换到内核模式 , 进入内核后 , 将会根据系统调用的API编号 , 去找到对应的系统服务函数 , 实现对应API的功能 。
操作系统将所有的系统服务函数地址 , 存放在了一个表格中 , 这个表格就是系统服务描述符表 。 在Linux上 , 这个表格的名字叫sys_call_table , 在Windows上 , 它叫KeServiceDescriptorTable , 简称SSDT 。

HOOK技术大揭秘 编程中hook有什么用

文章插图

Windows上的SSDT向来是兵家必争之地 , 安全软件为了监控应用程序的行为 , 通常都会替换SSDT表格中的系统服务函数地址为它们的函数 。 当系统调用触发时 , 安全软件将会及时知晓 , 并通过应用程序的参数来判定是否“放行”这次调用 。
IDT HOOK
内核中除了记录系统服务的SSDT , 还有一个非常重要的表格:中断描述符表IDT 。
IDT用于记录CPU执行过程中遇到中断、异常等情况时 , 该转向哪里去处理这些情况的函数地址 。
HOOK IDT有一个注意事项 , 不同于SSDT是全局唯一的 , IDT是与CPU核心紧密相关的 , 对于多核处理器 , 会对应多个IDT表 。 如果想通过HOOK IDT中的函数来搞事情的话 , 可能需要同时处理多个表 。

HOOK技术大揭秘 编程中hook有什么用

文章插图

除了直接修改函数指令和修改函数指针之外 , 还有一类特殊的HOOK , 它们通过系统提供的机制拦截某些消息、通知 , 从而有机会介入监听、拦截 。
IRP HOOK
在Windows系统上 , 用户程序和内核驱动之间的交互是通过一种称为IRP的数据结构实现的 , 你可以简单将其理解为应用程序发送了一个消息下去 , 这个消息就是一个IRP 。
而接收消息的目标 , 是驱动程序创建的设备Device 。 注意 , 这个设备不一定是物理设备 , 也可能完全不存在的虚拟设备 , 驱动程序可以任意创建一个不存在的设备 。
Windows内核中提供了驱动设备的挂载操作 , 允许别的驱动程序对指定设备进行挂载 , 从而可以截获发送给该设备的“消息” , 这种HOOK方式被称为IRP HOOK 。

HOOK技术大揭秘 编程中hook有什么用

文章插图

国内一些安全软件为了互相攻击 , 经常用这种方式拦截对方驱动程序的消息 , 从而可以“保护”自己不被对方干掉 。
TDI HOOK && NDIS HOOK
这两种HOOK方式与Windows内核中的网络子系统密切相关 。
Windows内核中的网络结构是分层式设计 。 从最上层的API socket层、到TCP/IP协议栈层、再到底层的网卡驱动程序 , 分了很多个层次 。
而层与层之间的交互 , 是通过一系列标准接口来实现的 , 其中最重要的两个接口标准就是TDI和NDIS 。 TDI封装了不同协议栈的差异(Windows不止支持TCP/IP协议栈)提供给上层统一的调用接口 。 NDIS则封装了底层不同网卡的驱动程序接口差异 , 提供给上层统一的收发数据包接口 。
Windows为了扩展性支持 , 允许类似防火墙之类的软件通过这些接口接入 , 从而能够截获到网络通信流量 , 进行安全审计 。
既然开了这些接口 , 一些流氓软件和木马病毒也就盯上了它们 , 通过这些接口就能轻松监听、篡改网络数据 , 达到邪恶的目的 。

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。