文章目录[隐藏]
windows中三个最重要的动态链接库,Kenerl32.dll, User32.dll, GDI32.dll.HOOK API截获的是应用程序对系统API的调用,它在应用程序对系统API的调用之前截获此调用动作,让其转而调用我们所定义的函数(内容可能是进行一些操作 后再调用原系统API)。
Kernel32主要负责管理内存,线程,进程。
User32.dll主要用来执行与界面相关的任务,如创建窗口和发送消息;
GDI32.DLL主要是绘制图像和显示文字处理,基本用户界面等特性,如创建窗口和发送消息。
我们要对系统的APi下钩子,不是一件简单事情,因为,微软并不希望你对系统的链接库动手脚,建议你看看以下文章:
API HOOK
Windows下Hook API技术
作为API Hook的第一课,我们采用了系统的信息框,给他下钩子,弹出我们自定义的内容,我们将会在下一课单独编写一个DLL,在调用MessageBoxA 时,加载我们的DLL.
API hook 流程
1、 获取模块的句柄GetModuleHandleA
2、获取API地址,入口地址GetProcAddress
3、把内存地址设置为可读写
4、保存原来的入口地址数据,保存API入口前8个字节
5、跳转到我们的函数入口地方
6、内存映射
API hook 源码
.版本 2 .支持库 spec .局部变量 模块句柄, 整数型 ' 获取模块的句柄 ' MessageBoxA (, , , ) 模块句柄 = GetModuleHandleA (“User32.dll”) 调试输出 (模块句柄) ' 获取API地址,入口地址 api函数地址 = GetProcAddress (模块句柄, “MessageBoxA”) 调试输出 (api函数地址) .如果真 (api函数地址 = 0) 信息框 (“获取API函数地址失败!!”, 0, , ) 返回 () .如果真结束 ' 把内存地址设置为可读写 VirtualProtect (api函数地址, 8, 64, OldProtect) ' 保存原来的入口地址数据,保存API入口前8个字节 oldData = 指针到字节集 (api函数地址, 8) ' 跳转到我们的函数入口地方 newDate = { 184 } + 到字节集 (&myMessageBoxA) + { 255, 224 } ' 内存映射 写到内存 (newDate, api函数地址, 8)
myMessageBoxA
.版本 2 .子程序 myMessageBoxA, 整数型 .参数 hWnd, 整数型, , 窗口句柄 .参数 lpText, 文本型, , 提示内容 .参数 lpCaption, 文本型, , 提示标题 .参数 uType, 整数型, , 提示图标和按钮类型 lpText = lpText + “----------API劫持成功!!” lpCaption = lpCaption + “----------API劫持成功!!” ' 先停止HOOK .如果真 (取字节集长度 (oldData) > 0) 写到内存 (oldData, api函数地址, ) .如果真结束 MessageBoxA (hWnd, lpText, lpCaption, uType) ' 恢复HOOK 写到内存 (newDate, api函数地址, 8) 返回 (0)
教程获取下载:
百度网盘链接:https://pan.baidu.com/s/158ikKVjIwaoF4438MG4fhA
提取码:加QQ群:521068947 群文件下载
资源教程交流①群:521068947
511遇见QQ: 272586593