找回密码
 立即注册
查看: 3120|回复: 1

[源码分享] 按键精灵HOOK钩子(风琪仙)

[复制链接]

13

主题

21

回帖

320

积分

中级会员

积分
320
QQ
类人猿 发表于 2017-8-23 12:45:44 | 显示全部楼层 |阅读模式
本帖最后由 类人猿 于 2017-8-23 12:53 编辑
  1. Declare Function SetRec Lib  "user32" Alias  "SetRect"(ByVal 矩形 As Any,ByVal 左边 As Long,ByVal 顶边 As Long,ByVal 右边 As Long,ByVal 底边 As Long) As Long
  2. Declare Function LocalAlloc  Lib "kernel32" Alias "LocalAlloc" (ByVal wOemChar As Long,ByVal wOmChar As Long) As Long
  3. Declare Function LocalFree Lib "kernel32" Alias "LocalFree" (ByVal hMem As Long) As Long
  4. Declare Function LocalSize Lib "kernel32" (ByVal hMem As Long) As Long
  5. Declare Sub RtlMoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal h As Any, ByRef f As Any, ByVal Length As Long)
  6. Declare Function CallWindowProcA Lib  "user32.dll" Alias  "CallWindowProcA"(ByVal 前1窗口函数地址 As Long,byref 窗口句柄 As Long,ByVal 消息值 As Long,ByVal 附加参数1 As Long,ByVal 附加参数2 As Long) As Long
  7. Declare Function RtlFillMemory Lib  "kernel32.dll" Alias  "RtlFillMemory"(ByVal 目的内存 As String,ByVal 长度 As Long,ByVal 填充内容 As Any) As Long
  8. Declare Function LoadLibraryA Lib  "kernel32.dll" Alias  "LoadLibraryA"(ByVal 动态链接库名称 As String) As Long
  9. Declare Function GetProcAddress Lib  "kernel32.dll" Alias  "GetProcAddress"(ByVal 模块句柄 As Long,ByVal 进程名称 As String) As Long
  10. Declare Function GetModuleHandleA Lib  "kernel32.dll" Alias  "GetModuleHandleA"(ByVal 模块名 As String) As Long
  11. Declare Function SetWindowsHook Lib  "user32.dll" Alias  "SetWindowsHookExA"(ByVal 钩子类型 As Long,ByVal 回调函数地址 As Long,ByVal 实例句柄 As Long,ByVal 线程ID As Long) As Long
  12. Declare Function UnhookWindowsHookEx Lib  "user32.dll" Alias  "UnhookWindowsHookEx"(ByVal 钩子句柄 As Long) As Long



  13. Sub Hook_安装系统钩子(钩子类型, QUI窗口句柄)
  14. Dim u
  15. Pint_call=构造回调函数(QUI窗口句柄)//构造回调函数,取回函数指针
  16. H_Hook = SetWindowsHook(钩子类型, Pint_call, GetModuleHandleA(0), 0)//安装系统钩子

  17. //传入钩子句柄到回调函数,用于呼叫下一钩子。
  18.         u = LocalAlloc(0, 16)
  19.         SetRec u, H_Hook, 0, 0, 0
  20.         RtlMoveMemory P_call_parameter + 12, u, 4
  21.         LocalFree u
  22. End Sub


  23. Function Hook_取回调指针数据()
  24. If P_call_Point > 0 Then
  25.         Hook_取回调指针数据 = 读内存数值(P_call_Point, 4) & "|"
  26.         Hook_取回调指针数据 =Hook_取回调指针数据&读内存数值(P_call_Point+4, 4) & "|"
  27.         Hook_取回调指针数据 =Hook_取回调指针数据& 读内存数值(P_call_Point+8, 4) & "|"
  28.         Hook_取回调指针数据 = Hook_取回调指针数据 & 读内存数值(P_call_Point + 12, 4) & "|"
  29.         Hook_取回调指针数据 = Hook_取回调指针数据 & 读内存数值(P_call_Point+ 16, 4)
  30. End If
  31. TracePrint P_call_Point
  32. End Function

  33. Function 构造回调函数(窗口句柄)
  34. Dim code,Send_API,Hook_Next,Copy_Memory
  35. P_call_parameter = LocalAlloc(0, 16)//分配内存装载回调函数返回的结果
  36. P_call_Point = LocalAlloc(0, 20)


  37. Send_API=取Dll函数地址("user32", "SendMessageA")
  38. Hook_Next=取Dll函数地址("user32", "CallNextHookEx")
  39. Copy_Memory=取Dll函数地址("kernel32.dll", "RtlMoveMemory")

  40. code = "187," + 整数到字节码(P_call_parameter)// mov ebx,P_call_parameter  将数据指针赋予EBX
  41. code = code + ",139,69,8"//                     mov eax,[ebp+8]      读取第1个参数,并赋给数据指针  
  42. code = code + ",137,3"//                        mov [ebx],eax
  43. code = code + ",139,69,12"//                    mov eax,[ebp+0CH]    读取第2个参数,并赋给数据指针
  44. code = code + ",137,67,4"//                     mov [ebx+4],eax
  45. code = code + ",139,69,16"//                    mov eax,[ebp+10H]    读取第3个参数,并赋给数据指针
  46. code = code + ",137,67,8"//                     mov [ebx+8],eax

  47. code = code + ",184," + 整数到字节码(Copy_Memory)// mov eax,Copy_Memory
  48. code = code + ",106,20,255,117,16,104," + 整数到字节码(P_call_Point)+",255,208"
  49.                                              // push 20
  50.                                               //push dword ptr[ebp+10H]
  51.                                               //push P_call_Point
  52.                                               //call eax
  53. code = code + ",184," + 整数到字节码(Send_API)// mov eax,Send_API     
  54. code = code + ",106,0,106,0,104,103,4,0,0,104," + 整数到字节码(窗口句柄)
  55.                                              // push 0
  56.                                              // push 0
  57.                                              // push 1127
  58.                                              // push 窗口句柄   
  59. code = code + ",255,208"//                      call eax
  60. code = code + ",184," + 整数到字节码(Hook_Next)//mov eax,Hook_Next
  61. code = code + ",255,117,16,255,117,12,255,117,8,255,115,12,255,208,195"
  62.                                              // push dword ptr[ebp+10H]
  63.                                              // push dword ptr[ebp+0cH]
  64.                                              // push dword ptr[ebp+08H]
  65.                                              // push dword ptr[ebx+0cH]
  66.                                              // call eax
  67.                                              // ret
  68.                                             
  69. 构造回调函数 = 写内存代码(split(code, ","))
  70. TracePrint code
  71. TracePrint 构造回调函数
  72. End Function

  73. Sub Hook_释放钩子
  74.     UnhookWindowsHookEx H_Hook//释放钩子
  75.         LocalFree P_call_parameter//释放回调参数数据指针
  76.         LocalFree P_call_Point//释放回调指针数据指针
  77.         P_call_parameter = 0
  78.         P_call_Point = 0
  79.         LocalFree Pint_call//释放函数指针
  80. End sub

  81. Function 写内存代码(字节数组)
  82.     Dim  i,临时数组
  83.     //写一个函数本身需要的汇编代码到内存,这个写的方试比汇编慢,用于支持第二步的进行。
  84.     临时数组 = Array(83, 51, 192, 51, 219, 139, 93, 12, 138, 69, 16, 136, 3, 91, 195)//汇编代码,写内存字节
  85.     Ccode = LocalAlloc(0, UBound(临时数组) + 1)
  86.     临时地址 = LocalAlloc(0, 16)
  87.     For i = 0 To UBound(临时数组)
  88.         Call SetRec (临时地址, 临时数组(i), 0, 0, 0)
  89.         Call RtlMoveMemory (Ccode+i, 临时地址, 1        )//拷贝到代码地址
  90.     Next
  91.     //申请内存装载汇编代码,及内存清零处理。
  92.     CS_code = LocalAlloc(0, UBound(字节数组) + 1)
  93.     RtlFillMemory CS_code, UBound(字节数组) + 1, 0
  94.     //把主代码写到内存
  95. //    MessageBox  UBound(字节数组)
  96.     For i = 0 To UBound(字节数组)
  97.         Call CallWindowProcA(Ccode, CS_code + i, Cint(字节数组(i)), 0, 0)//卡在这里
  98.         TracePrint  "Ccode="&Ccode   & " CS_code + i="&  CS_code + i & "Cint(字节数组(i))="& Cint(字节数组(i))
  99.     Next
  100.     //返回和释放资源
  101.     写内存代码 = CS_code
  102.     TracePrint  CS_code
  103.     LocalFree Ccode
  104.     LocalFree 临时地址
  105. End Function

  106. Function Hook_取回调数据(序列)
  107. If P_call_parameter <> 0 Then
  108.         Select Case 序列
  109.         Case 1
  110.          Hook_取回调数据 = 读内存数值(P_call_parameter, 4)
  111.         Case 2
  112.          Hook_取回调数据 = 读内存数值(P_call_parameter + 4, 4)
  113.         Case 3
  114.          Hook_取回调数据=读内存数值(P_call_parameter+8, 4)
  115. End Select
  116. End If
  117. End Function

  118. Function 取Dll函数地址(dll名, 函数名)
  119.     Dim i,字节组,文本数组,字节数组,模块句柄,文_本_指_针
  120.     文_本_指_针 = LocalAlloc(0, len(函数名) + 1)
  121.     For i = 1 To len(函数名)
  122.         字节组=字节组&Asc(mid(函数名,i,1))&","               
  123.     Next
  124.     字节组 = 字节组 & "0"//Null结束符
  125.     文本数组 = split(字节组, ",")
  126.     字节数组 = 文本数组
  127.     For i = 0 To UBound(文本数组)
  128.         字节数组(i)=Cint(文本数组(i))
  129.     Next
  130.     字符_指针 = 写内存代码(字节数组)
  131.     模块句柄 = GetModuleHandleA(dll名)//先尝试获取模块句柄
  132.     If 模块句柄 <= 0 Then
  133.         模块句柄=LoadLibraryA(dll名)//如果模块没有加载,则加载
  134.     End If
  135. //    MessageBox  模块句柄
  136.     取Dll函数地址=GetProcAddress(模块句柄,字符_指针)
  137.     LocalFree 字符_指针        
  138. End Function

  139. Function 整数到字节码(整数)
  140. Dim 商, 余, 临时数

  141. 商 = 整数
  142. 临时数 = 整数

  143. While (商 \ 256<>0) //转换
  144. 商 = 临时数 \ 256
  145. 余 = 临时数 mod 256
  146. 整数到字节码=整数到字节码+cstr(余)+","
  147. 临时数=商
  148. Wend
  149. 余 = 整数 mod 256
  150. 整数到字节码=整数到字节码+cstr(商)+","

  151. //TracePrint 整数到字节码

  152. //格式处理
  153. If 整数 <= 65535 Then
  154. 整数到字节码 = 整数到字节码 + "0,0"
  155. ElseIf 整数 <= 16711680 + 65535 Then
  156. 整数到字节码 = 整数到字节码 + "0"
  157. Else
  158. 整数到字节码=Left(整数到字节码,Len(整数到字节码)-1)
  159. End If
  160. End Function

  161. Function 读内存数值(内存地址, 字节数)
  162. Dim i
  163. char = space(2)
  164. For i = 0 To 字节数-1
  165.         RtlMoveMemory char , 内存地址+i, 1
  166.         读内存数值=读内存数值+AscB(char)*256^i
  167. Next
  168. End Function
复制代码

3

主题

14

回帖

151

积分

注册会员

积分
151
a1441578177 发表于 2017-8-24 19:01:39 | 显示全部楼层
有没有鼠标键盘钩子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|虫虫联盟 ( 备案号:蜀ICP备15018121号-1 )

GMT+8, 2026-4-20 13:37 , Processed in 2.389566 second(s), 26 queries .

Powered by Discuz! X5.0 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表