易语言 API hook其他进程

511遇见

511遇见

511遇见

测试文件

.版本 2
 
.程序集 窗口程序集_启动窗口
.子程序 _按钮1_被单击
信息框 (“APIHOOK测试”, 0, “APIHOOK测试”, )
.子程序 __启动窗口_创建完毕
 
.子程序 _按钮2_被单击
MessageBoxA (取窗口句柄 (), “MessageBoxA测试hook”, “MessageBoxA测试hook”, 0)

MessageBoxA

.版本 2
 
.DLL命令 MessageBoxA, 整数型, "user32.dll", "MessageBoxA", , 消息框
    .参数 hWnd, 整数型, , 窗口句柄
    .参数 lpText, 文本型, , 提示内容
    .参数 lpCaption, 文本型, , 提示标题
    .参数 uType, 整数型, , 提示图标和按钮类型

hook dll

.版本 2
.支持库 spec
 
.程序集 程序集1
.程序集变量 api函数地址, 整数型
.程序集变量 OldProtect, 整数型
.程序集变量 oldData, 字节集
.程序集变量 newDate, 字节集
 
.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码
hook ()
_临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
 
返回 (0)  ' 返回值被忽略。
.子程序 _临时子程序
 
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
 
.子程序 hook, , 公开
.局部变量 模块句柄, 整数型
 
' 获取模块的句柄
' 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, 整数型
.参数 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)

教程获取下载:


发布日期:

所属分类: 易语言 标签: