长沙住房和城乡建设部网站,网站技术开发文档模板,网站外包多少人做,今天河南重大新闻HOOK#xff08;钩子技术#xff09;
这里的hook我理解的意思就是通过拦截指令#xff0c;将指令换成自己想要的指令#xff0c;从而做道绕过原本的程序指令#xff0c;要修改这个指令#xff0c;要用汇编技术#xff0c;从二进制入手。
扩展#xff1a;
木马病毒之…HOOK钩子技术
这里的hook我理解的意思就是通过拦截指令将指令换成自己想要的指令从而做道绕过原本的程序指令要修改这个指令要用汇编技术从二进制入手。
扩展
木马病毒之所以会被拦截掉是因为现在的安全软件在内核中的HOOK了大量的关键位置使得病毒木马的进程、文件、网络行为都将受到监控一举一动都难逃杀软的眼睛想要拦截易如反掌。
商业软件通过逆向分析和lnline HOOK可以篡改掉商业软件的注册校验机制让校验函数返回成功绕开软件的限制。
系统漏洞如何被补丁修复的统一通过Inline HOOK操作系统能够修改原来有bug的代码转而执行修复后的新版本解决系统漏洞。 总结
以上就是要介绍的全部HOOK技术了。当然有HOOK就有反HOOK很多安全软件都会检查关键的位置是否被篡改。不仅如此因为流氓软件随意修改系统Windows从Win7 x64开始加入了PatchGuard机制针对操作系统核心数据结构都加入了定时检测机制一旦发现被篡改立刻蓝屏给你看而且在随着系统升级换代这个检查的粒度和强度变得越来越强。 Inline HOOK内联HOOK
以下是我自己个人的理解
这里也就是直接截取指令消息从而实现自己的目的 Inline HOOK内联HOOK的目标就是直接修改程序编译后的指令属于最基础也最常见的HOOK技术。 IAT挂钩
以下是我自己个人的理解
这里就要和dll劫持漏洞有点相似了这里因为程序会调用很多dll进行操作而为了方便调用这些dll所以会有一个PE文件的导入表IAT存在而我们要做的则是修改IAT表中的参数地址从而实现自己的操作比如实现自己的dll文件运行。 一个程序的所有代码一般不会全部都编译到一个模块中分拆到不同的模块既有利于合作开发也有利于代码管理降低耦合。
动态链接库就提供了这样的能力将不同的模块编译成一个个的动态库文件在使用时引入调用。
在Windows平台上动态链接库一般以DLL文件的形式存在主程序模块一般是EXE文件形式存在。无论是EXE还是DLL都是属于PE文件。
一个模块引用了哪些模块的哪些函数是被记录在PE文件的导入表IAT中。这个表格位于PE文件的头部里面记录了模块的名字函数的名字。
在模块加载时模块加载器将解析对应函数的实际地址填入到导入表中。
通过修改导入表IAT中函数的地址这种HOOK叫IAT HOOK。 SEH 钩子
以下是我自己个人的理解
这里的意思就是在操作系统异常是操作系统会向上报告错误如果上级处理不了就会报告给上上级要是一直处理不了则会弹出一个报错对话框而我们要修改的也正是这异常处理器中记录的函数指针当异常发生时就能获得执行从而劫持到执行流因为这些异常处理器都位于线程的栈空间修改起来并非难事。 SEH是Windows操作系统上结构化异常处理的缩写在代码中通过try/except来捕获异常时操作系统将会在线程的栈空间里安置一个异常处理器其实就是一个数据结构里面定义了发生异常时该去执行哪里的代码处理异常。
异常处理可以多级嵌套那多个异常处理就构成了一个链表存在于栈空间之上。 当发生异常时操作系统系统就从最近的异常处理器进行寻求处理如果能处理则罢了不能处理就继续寻求更上一级的异常处理器直到找到能处理的异常处理器。如果都没法处理那对不起只好弹出那个经典的报错对话框进程崩溃。 SEH HOOK针对的目标就是修改这些异常处理器中记录的函数指针当异常发生时就能获得执行从而劫持到执行流因为这些异常处理器都位于线程的栈空间修改起来并非难事。 C 可触发的 HOOK
以下是我自己个人的理解
这里也就是修改用c写的程序中的虚函数表中的地址从而实现自己的目的 C是一门面向对象的编程语言支持面向对象的三大特性封装性、继承性、多态性。
其中的多态性各个C编译器基本上都是通过一种叫虚函数表的机制来实现。
下面通过一个实际的例子来感受一下虚函数表在C多态性上发挥的作用。 #include iostream using namespace std; class Animal { public: virtual void breathe() { cout Animal breathe endl; } virtual void eat() { cout Animal eat endl; } }; class Fish : public Animal { public: virtual void breathe() { cout Fish breathe endl; } virtual void eat() { cout Fish eat endl; } }; class Cat : public Animal { public: virtual void breathe() { cout Cat breathe endl; } virtual void eat() { cout Cat eat endl; } }; int main() { Animal* animal nullptr; Fish* fish new Fish(); Cat* cat new Cat(); animal fish; animal-breathe(); animal-eat(); cout -------------- endl; cout sizeof(fish) sizeof(fish) endl; cout sizeof(cat) sizeof(cat) endl; cout -------------- endl; animal cat; animal-breathe(); animal-eat(); delete fish; delete cat; return 0; }
输出 通过上面的输出可以看到fish和cat对象都只占据4个字节。因为这两个类都没有成员变量唯一需要存储的就是一个虚函数表指针。 以cat对象为例看一下它的地址是0x005cfc30 看一下这个地址起始的4个字节是什么 虚表指针是0x000d9b90这里需要注意字节顺序。 通过这个地址找到虚函数表里面有两个函数地址 查看这两个地址都是指向了一个jmp指令分别跳到了Cat类的两个虚函数。 通过上面的实例总结一下对象、虚函数表和虚函数代码之间的关系如下图所示 每个包含虚函数的类对象在内存中都有一个指针位于对象头部指向的是一个虚函数表表中的每一项都是虚函数地址。
类继承后如果重写了父类的虚函数子类对象指向的表格中对应函数的地址将会更新为子类的函数。
这样使用父类指针指向子类对象通过指针调用虚函数时就能调用到子类重写的虚函数从而实现多态性。
既然是记录函数地址的表格那就有存在被篡改的可能这就是C virtable HOOK。
通过篡改对应虚函数的地址实现对相应函数调用的拦截。
实施这种HOOK需要逆向分析目标C对象的结构掌握虚函数表中各个函数的位置才能精准打击。
上面几种HOOK修改的都是应用层的函数指针而操作系统内核中还有一些非常重要的表格它们的表项中记录了一些更加关键的函数HOOK这些表格中的函数是非常高危的操作操作不当将导致操作系统崩溃。当然高风险高回报HOOK这些函数能实现一些非常强大的功能是病毒、木马、安全软件非常爱干的事情。 SSDT 挂钩
以下是我自己个人的理解
因为操作系统会提供给程序API接口来进行消息交互而在操作系统中会将所有的系统服务函数地址存放在一张表中而这张表在windows中叫做SSDT我们要修改的也正是这张表中的函数地址从而实现自己的操作。 系统调用是操作系统提供给应用程序的编程接口API应用程序通过这些API得以操作计算机的资源如进程、网络、文件等。
执行系统调用的时候CPU将从用户模式切换到内核模式进入内核后将会根据系统调用的API编号去找到对应的系统服务函数实现对应API的功能。
操作系统将所有的系统服务函数地址存放在了一个表格中这个表格就是系统服务描述符表。在Linux上这个表格的名字叫sys_call_table在Windows上它叫KeServiceDescriptorTable简称SSDT。 Windows上的SSDT向来是兵家必争之地安全软件为了监控应用程序的行为通常都会替换SSDT表格中的系统服务函数地址为它们的函数。当系统调用触发时安全软件将会及时知晓并通过应用程序的参数来判定是否“放行”这次调用。 IDT 挂钩
以下是我自己个人的理解
这里是在CPU异常的情况下会根据知道好的函数跳转道哪里去的操作而该转向哪里去处理这些情况的函数地址而这些地址会存放道一张表中让CPU进行查阅而这里有所不同的是CPU异常后可能跳转的次数有点多所有会有多种表存放了跳转的函数地址所以我们要进行修改的话必须知道每张表中的函数地址这样我们才可以进行函数地址的修改从而实现自己的操作。 内核中除了记录系统服务的SSDT还有一个非常重要的表格中断描述符表IDT。
IDT用于记录CPU执行过程中遇到中断、异常等情况时该转向哪里去处理这些情况的函数地址。
HOOK IDT有一个注意事项不同于SSDT是全局唯一的IDT是与CPU核心紧密相关的对于多核处理器会对应多个IDT表。如果想通过HOOK IDT中的函数来搞事情的话可能需要同时处理多个表。 除了直接修改函数指令和修改函数指针之外还有一类特殊的HOOK它们通过系统提供的机制拦截某些消息、通知从而有机会介入监听、拦截。 IRP HOOK
以下是我自己个人的理解
这个hook技术就是去截获驱动程序发送出去的消息并进行篡改从而实现自己想要的操作 在Windows系统上用户程序和内核驱动之间的交互是通过一种称为IRP的数据结构实现的你可以简单将其理解为应用程序发送了一个消息下去这个消息就是一个IRP。
而接收消息的目标是驱动程序创建的设备Device。注意这个设备不一定是物理设备也可能完全不存在的虚拟设备驱动程序可以任意创建一个不存在的设备。
Windows内核中提供了驱动设备的挂载操作允许别的驱动程序对指定设备进行挂载从而可以截获发送给该设备的“消息”这种HOOK方式被称为IRP HOOK。 国内一些安全软件为了互相攻击经常用这种方式拦截对方驱动程序的消息从而可以“保护”自己不被对方干掉。 TDI HOOK NDIS HOOK
以下是我自己个人的理解
这里就是在windows内核中的网络结构层次中进行截获消息之所以能够截获消息是因为TDI和NDIS这两个标准的接口因为这两个接口可以用来被理解成事用来分别向各层传递消息用的而windows为了扩展支持允许类似防火墙之类的软件通过这些接口接入从而能够截获到网络通信流量进行安全审计而我们也正是装了这个空子从而截获指令消息 这两种HOOK方式与Windows内核中的网络子系统密切相关。
Windows内核中的网络结构是分层式设计。从最上层的API socket层、到TCP/IP协议栈层、再到底层的网卡驱动程序分了很多个层次。
而层与层之间的交互是通过一系列标准接口来实现的其中最重要的两个接口标准就是TDI和NDIS。TDI封装了不同协议栈的差异Windows不止支持TCP/IP协议栈提供给上层统一的调用接口。NDIS则封装了底层不同网卡的驱动程序接口差异提供给上层统一的收发数据包接口。
Windows为了扩展性支持允许类似防火墙之类的软件通过这些接口接入从而能够截获到网络通信流量进行安全审计。
既然开了这些接口一些流氓软件和木马病毒也就盯上了它们通过这些接口就能轻松监听、篡改网络数据达到邪恶的目的。 Windows Message HOOK
以下是我自己个人的理解
这个就是应用与程序中的我们日常应用程序时程序和系统之间会有交互的而windows通过开启API接口和这些程序进行交互消息而也正是因为API接口的开启使得我们可以截获指令消息从而篡改 Windows操作系统的UI交互是以消息来驱动的用户的键盘输入、鼠标操作都会被操作系统以消息的形式发送到各个应用程序处理。 Windows提供了API接口可以被程序用于捕获这些消息从而实现一些特定的功能。 这种机制叫做Windows消息钩子最常见的就要数键盘钩子了在十多年前流氓软件和木马病毒大行其道的时候这些恶意软件经常喜欢通过这种方式来监听用户的键盘输入从而来盗取QQ密码当然现在肯定是不行的了。