PB HOOKAPI函数

这段代码展示了如何使用汇编指令实现API Hook。通过LoadLibrary和GetProcAddress获取目标DLL及函数地址,然后检查并修改内存以实现函数Hook。UnHookAPI函数则用于解除Hook状态,恢复原函数行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1.  Function HookAPI(ByRef module As Asciiz, ByRef api As Asciiz, ByVal lpcallbackFunc As Dword,ByRef nextHook As Dword,Opt ByVal pSize As Dword) As Long
  2.     Local DLLModule As Dword,FuncAddr As Dword,tOldPoint As Dword
  3.     DLLModule = LoadLibrary(module)                                                     '加载将被HOOK的DLL
  4.     FuncAddr = GetProcAddress(DLLModule, api)                                           '获取函数地址
  5.     If FuncAddr = %NULL Then Exit Function                                              '判断API地址获取失败就退出
  6.     If Peek(Byte,FuncAddr) = &HE9 Then Exit Function                                    '判断函数是否被Hook 是就退出
  7.     If IsFalse(pSize) Then pSize = SizeOfHook(FuncAddr)                                 '判断是否有pSize参数 否则自动获取
  8.     If IsTrue(VirtualProtect(ByVal FuncAddr, pSize, %PAGE_READWRITE, tOldPoint)) Then   '修改内存属性页为可写
  9.         '----------------------------------------------------------------------         '下面是为Hook做准备工作
  10.         nextHook = VirtualAlloc(ByVal %NULL,%PAGE_SIZE, %MEM_COMMIT,%PAGE_READWRITE)    '申请内存空间
  11.         CopyMemory (ByVal nextHook,ByVal FuncAddr,pSize)                                '读取n字节保存
  12.         Poke Byte,nextHook+pSize,&HE9                                                   '汇编的Jmp就是机器码的E9
  13.         Poke Dword,nextHook+pSize+1,FuncAddr-nextHook-5                                 'Jmp后面跟着的地址,也就是被Hook的API函数地址
  14.         Poke Dword,nextHook+pSize+5,FuncAddr                                            '保存被Hook API函数的地址
  15.         '----------------------------------------------------------------------         '下面是修改原函数跳转
  16.         Poke Byte,FuncAddr,&HE9                                                         '汇编的Jmp就是机器码的E9
  17.         Poke Dword,FuncAddr+1,lpcallbackFunc-FuncAddr-5                                 'Jmp后面跟着的地址,也就是自己的函数地址
  18.         FlushInstructionCache(GetCurrentProcess, ByVal FuncAddr, pSize)                 '确保执行更改
  19.         VirtualProtect(ByVal FuncAddr, pSize, tOldPoint, tOldPoint)                     '恢复原来的属性
  20.         Function = %TRUE                                                                '设置函数返回为真
  21.     End If
  22. End Function
  23. Function UnHookAPI(ByRef nextHook As Dword, Opt ByVal pSize As Dword) As Long
  24.     Local lOldAddrs As Dword,tOldPoint As Dword
  25.     If IsFalse(pSize) Then pSize = SizeOfHook(nextHook)                                 '判断是否有pSize参数 否则自动获取
  26.     If nextHook Then
  27.         If Peek(Byte,nextHook+pSize) = &HE9 Then                                        '判断函数是否被Hook
  28.             lOldAddrs = Peek(Dword,nextHook+pSize+5)                                    '读取原API函数地址
  29.             VirtualProtect(ByVal lOldAddrs, pSize, %PAGE_READWRITE, tOldPoint)          '修改内存属性页为可写
  30.             CopyMemory (ByVal lOldAddrs,ByVal nextHook,pSize)                           '恢复被修改的跳转
  31.             FlushInstructionCache(GetCurrentProcess, ByVal lOldAddrs, pSize)            '确保执行更改
  32.             VirtualProtect(ByVal lOldAddrs, pSize, tOldPoint, tOldPoint)                '恢复原来的属性
  33.             If VirtualFree(ByVal nextHook, %NULL, %MEM_RELEASE) Then                    '释放内存空间
  34.                 nextHook = %NULL                                                        '把自己函数地址设为NULL
  35.                 Function = %TRUE                                                        '设置函数返回为真
  36.             End If
  37.         End If
  38.     End If
  39. End Function
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值