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
想对作者说点什么? 我来说一句

HookAPI HookAPI HookAPI

2008年11月03日 499KB 下载

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

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭