找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2461|回复: 1

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

[复制链接]
  • TA的每日心情

    2018-6-1 15:26
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    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
    复制代码

  • TA的每日心情
    奋斗
    2017-11-16 15:31
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    3

    主题

    14

    回帖

    151

    积分

    注册会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-11-23 15:55 , Processed in 0.366478 second(s), 26 queries .

    Powered by Discuz! X3.5 Licensed

    © 2001-2024 Discuz! Team.

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