PB HOOKAPI函数

  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
阅读更多
个人分类: PowerBasic
上一篇多线程idhttp下载文件源代码
下一篇delphi 完美发言Call
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭