易语言吧 关注:266,202贴子:1,662,542

【原创教程】制作一个简单的hook程序

只看楼主收藏回复

HOOK是一个很方便的技术,今天来说一下如何做一个简单的HOOK程序(如有不对请指正)
HOOK:钩子,对特定系统事件进行hook之后,一旦发生这个事件,hook程序就会收到系统通知,第一时间进行相应。每一个Hook都有一个相关联的指针列表,叫做 钩子链表,由系统来维护。
简单说,就是hook程序告诉系统,xx事件发生的时候提醒他一下,然后当xx事件发生了,系统就会先告诉他。(不太恰当)
那么,易语言里如何写呢?我们今天拿一个简单的鼠标按键HOOK来练习一下。
一共分三个小方块,大家不要插哦~我会痛的(//∇//)


IP属地:山东1楼2017-06-15 19:56回复
    1.首先要知道几个API函数:
    第一个:
    解释:
    SetWindowsHookExA:把一个应用程序定义的钩子安装到钩子链表里面
    原型:
    HHOOK WINAPI SetWindowsHookEx(
    __in int idHook, //钩子类型
    __in HOOKPROC lpfn, //回调函数地址
    __in HINSTANCE hMod, //实例句柄
    __in DWORD dwThreadId); //线程ID
    易语言中声明:
    .DLL命令 SetWindowsHookEx, 整数型, "user32", "SetWindowsHookExA", SetWindowsHookExA
    .参数 idHook, 整数型, ,
    .参数 lpfn, 子程序指针, ,
    .参数 hmod, 整数型, ,
    .参数 dwThreadId, 整数型, ,
    第二个:
    解释:
    UnhookWindowsHookEx:从钩子链表中删除
    原型:
    BOOL WINAPI UnhookWindowsHookEx(
    __in HHOOK hhk); //钩子句柄
    易语言中声明:
    .DLL命令 UnhookWindowsHookEx, 整数型, "user32", "UnhookWindowsHookEx", UnhookWindowsHookEx
    .参数 hHook, 整数型, ,
    第三个:
    解释:
    CallNextHookEx:把钩子信息传递到当前钩子链表的下一个
    原型:
    LRESULT WINAPI CallNextHookEx(
    _In_opt_ HHOOK hhk, //钩子句柄
    _In_ int nCode, //代码值
    _In_ WPARAM wParam, //附加参数1
    _In_ LPARAM lParam); //附加参数2
    易语言中声明:
    .DLL命令 CallNextHookEx, 整数型, "user32", "CallNextHookEx", CallNextHookEx
    .参数 hHook, 整数型, ,
    .参数 ncode, 整数型, ,
    .参数 wParam, 整数型, ,
    .参数 lParam, 整数型, ,


    IP属地:山东2楼2017-06-15 19:56
    收起回复
      2.其他解释
      第一个:回调函数
      回调函数:应用程序给Windows系统DLL或其它DLL调用的函数
      SetWindowsHookExA中参数三的回调函数:
      返回值类型为 整数型,参数有三个,类型全部是整数型
      例子:
      .子程序 钩子处理, 整数型
      .参数 代码值, 整数型
      .参数 参数一, 整数型
      .参数 参数二, 整数型
      第二个:钩子类型
      SetWindowsHookExA中参数一的钩子类型
      由于我们本次是鼠标按键HOOK,所以使用如下参数,如有其他需要请使用搜索引擎
      WH_MOUSE_LL(14):此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视


      IP属地:山东3楼2017-06-15 19:57
      收起回复
        3.实战


        IP属地:山东4楼2017-06-15 19:57
        回复
          纯文本代码:
          dll命令:
          .版本 2
          .DLL命令 SetWindowsHookEx, 整数型, "user32", "SetWindowsHookExA", , SetWindowsHookExA
          .参数 idHook, 整数型
          .参数 lpfn, 子程序指针
          .参数 hmod, 整数型
          .参数 dwThreadId, 整数型
          .DLL命令 UnhookWindowsHookEx, 整数型, "user32", "UnhookWindowsHookEx", , UnhookWindowsHookEx
          .参数 hHook, 整数型
          .DLL命令 CallNextHookEx, 整数型, "user32", "CallNextHookEx", , CallNextHookEx
          .参数 hHook, 整数型
          .参数 ncode, 整数型
          .参数 wParam, 整数型
          .参数 lParam, 整数型
          代码:
          .版本 2
          .支持库 spec
          .程序集 窗口程序集_启动窗口, , , by:回锅小肉肉
          .程序集变量 钩子句柄, 整数型, , , 句柄
          .子程序 __启动窗口_创建完毕
          钩子句柄 = SetWindowsHookEx (14, &钩子处理, 0, 0) ' 安装钩子,14 就对应着 WH_MOUSE_LL,钩子处理那个是指针所以要带上&
          .子程序 钩子处理, 整数型, , 回调函数哦
          .参数 代码值, 整数型
          .参数 参数一, 整数型
          .参数 参数二, 整数型
          ' 这里的 参数一 就是键代码,但是是API的键代码,具体请自行百度喽
          .判断开始 (参数一 = 513)
          调试输出 (“左键按下啦”)
          .判断 (参数一 = 514)
          调试输出 (“左键放开喽”)
          .判断 (参数一 = 516)
          调试输出 (“右键按下啦”)
          .判断 (参数一 = 517)
          调试输出 (“右键放开喽”)
          .判断 (参数一 = 519)
          调试输出 (“中键按下啦”)
          .判断 (参数一 = 520)
          调试输出 (“中键放开喽”)
          .默认
          .判断结束
          返回 (CallNextHookEx (钩子句柄, 代码值, 参数一, 参数二)) ' 继续往下传,如果不返回那么就不继续处理
          .子程序 __启动窗口_将被销毁
          .如果真 (钩子句柄 = 0) ' 以防万一
          UnhookWindowsHookEx (钩子句柄) ' 卸载钩子
          .如果真结束


          IP属地:山东5楼2017-06-15 19:59
          回复
            图片:

            dll命令的截图就不放了,直接复制粘贴就好


            IP属地:山东6楼2017-06-15 20:02
            收起回复
              一个滑稽都没发,憋的好难受
              希望大家支持哦
              教程是自己事先写好的,然后复制过来发帖,并且试验过。如果有错误请大家指出


              IP属地:山东7楼2017-06-15 20:03
              回复
                效果如图,如果钩子处理那里返回(1)就直接拦截,不往下传了~


                IP属地:山东8楼2017-06-15 20:07
                回复
                  没人


                  IP属地:山东9楼2017-06-15 20:08
                  收起回复
                    ddt,mua~,么么哒


                    来自Android客户端10楼2017-06-15 20:09
                    收起回复
                      对啦,大家不要看着介绍啥的很麻烦,其实看一眼最终代码很好理解哒!


                      IP属地:山东11楼2017-06-15 20:13
                      回复
                        一脸懵逼


                        IP属地:广东来自iPhone客户端12楼2017-06-15 20:33
                        收起回复
                          来顶


                          IP属地:山东来自Android客户端13楼2017-06-15 20:44
                          收起回复
                            其实,我不是很理解,为什么不把api也内镶去系统支持库


                            IP属地:广东来自Android客户端16楼2017-06-15 22:26
                            收起回复
                              大概理解了,就是系统发生了什么事件,易语言可以去获取系统发生了什么事件,对吧?


                              IP属地:江西来自Android客户端17楼2017-06-15 22:52
                              收起回复