你不能不知道到的Hook!

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("哈哈你的消息被我截断了"); 8
 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 <stdio.h>
 2 #include <Windows.h>
 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 int main()
14 {
15     Hook();
16     MessageBox(NULL, L"Hello world", L"this",MB_OK);
17     system("pause");
18     return 0;
19 }

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

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

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

如果中间有什么错误,还请高手能帮我指出。

时间: 2024-08-09 21:58:47

你不能不知道到的Hook!的相关文章

关于个人防火墙的真相

原文作者:MaD 原文标题:The truth aboutpersonal firewalls电子邮件:[email protected]作者国籍:俄罗斯 声明:1.本人翻译水平有限,有不当之请大家理解.如部分看不懂可以和原文对照.            2.欢迎转载,但请不要漏掉原文作者和翻译者的信息.            3.欢迎大家指出我翻译中的错误,我好改正. 内容:         有多种方式来保护你的计算机免受恶意软件的侵害,比如软件防火墙,病毒和Rootkit检 测软件等.所有这

HOOK钩子技术5 SSDT Inline Hook

原理 内联钩子的原理在R3和R0下是相同的,就是不改变SSDT表项,而是改变函数内部前几条指令. 内联钩子的典型伪函数为: 恢复原指令 执行目标操作,或改写参数 执行原函数 返回时重新挂钩 demo #include "stdafx.h" #ifdef __cplusplus extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

COM接口函数通用Hook方法

本文是我的本科学位论文, 今发表在此, 以示原创之据 第1章 绪论 研究背景 研究意义 相关技术简介 COM概述 COM内存模型描述及C语言和C++语言实现 调用约定 Hook API原理 Windows钩子原理及进程注入 开发及调试环境 第2章 问题抽象及关键技术研究 实验01:通过调试器查看C++类的虚函数表 实验02:通过函数指针调用C++虚函数 实验03:交换两个相同C++类的虚函数表 实验04-1:替换C++虚函数表中的虚函数(__thiscall)地址 实验04-2:替换C++虚函数

API HOOK介绍 【转】

什么是“跨进程 API Hook”? 众所周知Windows应用程序的各种系统功能是通过调用API函数来实现.API Hook就是给系统的API附加上一段小程序,它能监视甚至控制应用程序对API函数的调用.所谓跨进程也就是让自己的程序来控制别人程序的API调用了. API Hook 理论 通过对Win32 PE文件的分析(如果你还不熟悉PE文件格式,可以看看Iczelion的PE教程或者LUEVELSMEYER的<<The PE File Format>>).我们知道在PE文件中的

HOOK API(四)—— 进程防终止

HOOK API(四) —— 进程防终止 0x00        前言 这算是一个实战吧,做的一个应用需要实现进程的防终止保护,查了相关资料后决定用HOOK API的方式实现.起初学习HOOK API的起因是因为要实现对剪切板的监控,后来面对进程保护这样一个需求时,综合各方资料并自己动手实现HOOK OpenProcess() 和 TerminateProcess() 来从调用层实现进程的防终止.下面将进一步介绍实现的过程,也算是对学习的一个总结与实战. 主要参考:http://www.cnbl

使用 Git Hook 实现网站的自动部署

自动化能解放人类的双手,而且更重要的是,因为按照规定的流程来走,也减少了很多误操作的产生.不知道大家平时都是怎么样更新自己生产环境的代码的,FTP 覆盖旧文件.服务器定时任务去 build 最新的源码,还是有更高级的做法? 目前我在使用 Git Hook 来部署自己的项目.Git Hook 是 Git 提供的一个钩子,能被特定的事件触发后调用.其实,更通俗的讲,当你设置了 Git Hook 后,只要你的远程仓库收到一次 push 之后,Git Hook 就能帮你执行一次 bash 脚本. 下面是

ebtables hook

1 概述 netfliter框架不仅仅在ipv4中有应用,bridge,ipv4,ipv6,decnet 这四种协议中都有应用,其中ipv4中又分开了arp和ip的两种 其实netfliter是个大的框架,在ipv4中对应的应用层工具是iptables,在bridge中对应的应用层工具是ebtables,在arp中对应的应用层工具是arptables iptables 中有raw,filter,nat,mangle,security,5个table, ebtables 中有broute,filt

android hook getdeceiveid

很多手机软件使用了手机绑定.QQ,微信等.如果使用了不同的设备,则需要验证码. 要用一台手机来模拟与另一台手机一样环境,估计hook 系统的相关函数可以实现. 想着应该有现成的软件的,例如 smart imei 什么的,因为合约机用户非常需要这东东:)结果没找到. 查查相关的实现文档. android hook api http://blog.csdn.net/lingfong_cool/article/details/8109290 这是正规战法.进行级注入,即欺骗某个程序.这样做应该是比较稳

Android Hook技术

http://blog.csdn.net/u011068702/article/details/53208825 第一步.先爆项目demo照片,代码不多,不要怕 第二步.应该知道Java反射相关知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之Java反射机制研究 http://blog.csdn.net/u011068702/article/details/49863931 第三步.应该知道Java静态代理知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化