易语言API hook MessageBoxA

511遇见

我们要对系统的APi下钩子,不是一件简单事情,因为,微软并不希望你对系统的链接库动手脚,建议你看看以下文章:
API HOOK
Windows下Hook API技术

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)

教程获取下载:


发布日期:

所属分类: 易语言 标签: