windows中三个最重要的动态链接库,Kenerl32.dll, User32.dll, GDI32.dll.HOOK API截获的是应用程序对系统API的调用,它在应用程序对系统API的调用之前截获此调用动作,让其转而调用我们所定义的函数(内容可能是进行一些操作 后再调用原系统API)。 
Kernel32主要负责管理内存,线程,进程。
User32.dll主要用来执行与界面相关的任务,如创建窗口和发送消息;
GDI32.DLL主要是绘制图像和显示文字处理,基本用户界面等特性,如创建窗口和发送消息。

易语言可以对接kafka吗 易语言对接api_易语言可以对接kafka吗

我们要对系统的APi下钩子,不是一件简单事情,因为,微软并不希望你对系统的链接库动手脚,建议你看看以下文章:
API HOOKWindows下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)