博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你不能不知道到的Hook!
阅读量:4325 次
发布时间:2019-06-06

本文共 2727 字,大约阅读时间需要 9 分钟。

Hook是什么?

    hook翻译之后是钩子的意思,hook的用途主要是用来拦截消息的,看到这里大家可能会迷茫,What is a hook?所以这时就不得不普及一下操作系统的原理。

    举个例子:假如你是一名游戏热衷者,在玩游戏时,你要释放技能那么你就会对键盘鼠标进行操作,表面上你是直接操作游戏,其实中间经过了几个环节。

                  首先,你操作键盘鼠标,那么计算机底层键盘鼠标的驱动就会收到一个消息。

                  然后,这个驱动会把消息传个操作系统。

                  其次,操作系统会判断这个消息是作用在哪个程序上。

                  最后,操作系统会把这个事件传给相应的程序,那么,你就可以看到你操作游戏的样子了。

做自己的Hook!

    好!说了这些,大家想想假如你写了一个hook,在别人的电脑上拦截了这个消息,操作系统就不知道这个消息,你可以把这个消息通过网络发到你的电脑,那个那台电脑的一举一动你都清楚....(当然我教大家这个不是希望你们做坏事,而是同过hook更深入学习计算     机    和保护自己电脑),下面我来同过一个简单的程序来让大家了解hook。

1 int main()2 {3     MessageBox(NULL, L"Hello world", L"this",MB_OK);4     system("pause");5     return 0;6 }

  这是一段简单的程序,其功能是为了显示一个对话窗口。这个对话窗口操作系统已经帮我们写好了,我们实际上是在调用这段代码。好!大家想一下我们能不能在调用这个函数之前截断这个调用,让程序调用自己的函数。(想想做插件是不是这个原理)答案是肯定的,我们能够截断这个消息并让他调用自己的函数。下面我们来代码实现一下。

1 int WINAPI myMSG( HWND hWnd, 2                   LPCTSTR IpText,  3                   LPCTSTR IpCaption, 4                   UINT uType) 5 { 6  7     printf("哈哈你的消息被我截断了");  9     return 1;10 }

     这是我写的一个函数(注意:函数返回值和参数一定要和MessageBox一样,这样接口才能对上,不然会报错),我们要让程序执行我们的函数,那么我们就要写一个钩子。

1 bool Hook() 2 { 3     //获取调用代码的首地址 4     PROC p = GetProcAddress(GetModuleHandle(L"user32.dll"), "MessageBoxW"); 5     if (!p) return 0; 6  7            BYTE b[5] = { 0 }; 8     //0xE9无条件跳转(学过汇编的同学应该知道) 9     b[0] = 0xE9;10        //计算偏移地址。 偏移地址 = 跳转地址-MessageBox的地址 11     *(DWORD*)(b + 1) = (DWORD)myMSG - (DWORD)p - 5;12        /*通过上面三行代码,这个数组储存的代码意思是(无条件跳转到我的函数地址位置)*/13 14         //在计算位置的内存中写入数据15     WriteProcessMemory(GetCurrentProcess(), p, b, 5, NULL);16     return 1;17 }

     我已经写好了一个钩子,下面我放出完整程序的代码

1  #include 
2 #include
3 4 int WINAPI myMSG( HWND hWnd, 5 LPCTSTR IpText, 6 LPCTSTR IpCaption, 7 UINT uType) 8 { 9 printf("哈哈你的消息被我截断了");10 return 1;11 }12 13 bool Hook()14 {15 //获取调用代码的首地址16 PROC p = GetProcAddress(GetModuleHandle(L"user32.dll"), "MessageBoxW");17 if (!p) return 0;18 19 BYTE b[5] = { 0 };20 //0xE9无条件跳转(学过汇编的同学应该知道)21 b[0] = 0xE9;22 //计算偏移地址。 偏移地址 = 跳转地址-MessageBox的地址 23 *(DWORD*)(b + 1) = (DWORD)myMSG - (DWORD)p - 5;24 /*通过上面三行代码,这个数组储存的代码意思是(无条件跳转到我的函数地址位置)*/25 26 //在计算位置的内存中写入数据27 WriteProcessMemory(GetCurrentProcess(), p, b, 5, NULL);28 return 1;29 }30 int main() 31 { 32 Hook(); 33 MessageBox(NULL, L"Hello world", L"this",MB_OK); system("pause");34 return 0; 35 }

 

    首先我们把Hook注释掉运行。运行结果如下。

     如何加上hook,你会发现一件令人兴奋的事情,并没有弹出对话框。运行结果如下

 

   通过这个例子相信大家对hook有了一些了解,现在大家肯能会有一个疑问,我能跳转,能不能回去呢,答案是能的。我也给大家提供一个点思路ReadProcessMemory()用这个api来保存原来的段地址和内存中的代码,回去时在利用WriteProcessMemory()再跳转一次,就可以会到原来调用的代码处了,这些是不是很棒,大家可以回家自行试验,也可以巩固一下今天所学的知识。

 

转载于:https://www.cnblogs.com/StringSir/p/6354254.html

你可能感兴趣的文章
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_13、jar包方式运行web项目文件上传和访问...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_17、SpringBootTest单元测试实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第三节SpringBoot热部署devtool和配置文件自动注入实战_14、SpringBoot2.x使用Dev-tool热部署...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_19、SpringBoot个性化启动banner设置debug日志...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第三节SpringBoot热部署devtool和配置文件自动注入实战_16、注解配置文件自动映射到属性和实体类实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_20、SpringBoot2.x配置全局异常实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_18、SpringBoot测试进阶高级篇之MockMvc讲解...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_23、SpringBoot2.x启动原理概述...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_21、SpringBoot2.x配置全局异常返回自定义页面...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_32..SpringBoot2.x持久化数据方式介绍...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_34、SpringBoot整合Mybatis实操和打印SQL语句...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_36、SpringBoot整合mybatis之事务处理实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_38、源码编译安装Redis4.x...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_33、SpringBoot2.x整合Mybatis3.x注解实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_35、事务介绍和常见的隔离级别,传播行为...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_42、SpringBoot常用定时任务配置实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_44、新日志框架LogBack介绍...
查看>>