- 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
- Local DLLModule As Dword,FuncAddr As Dword,tOldPoint As Dword
- DLLModule = LoadLibrary(module) '加载将被HOOK的DLL
- FuncAddr = GetProcAddress(DLLModule, api) '获取函数地址
- If FuncAddr = %NULL Then Exit Function '判断API地址获取失败就退出
- If Peek(Byte,FuncAddr) = &HE9 Then Exit Function '判断函数是否被Hook 是就退出
- If IsFalse(pSize) Then pSize = SizeOfHook(FuncAddr) '判断是否有pSize参数 否则自动获取
- If IsTrue(VirtualProtect(ByVal FuncAddr, pSize, %PAGE_READWRITE, tOldPoint)) Then '修改内存属性页为可写
- '---------------------------------------------------------------------- '下面是为Hook做准备工作
- nextHook = VirtualAlloc(ByVal %NULL,%PAGE_SIZE, %MEM_COMMIT,%PAGE_READWRITE) '申请内存空间
- CopyMemory (ByVal nextHook,ByVal FuncAddr,pSize) '读取n字节保存
- Poke Byte,nextHook+pSize,&HE9 '汇编的Jmp就是机器码的E9
- Poke Dword,nextHook+pSize+1,FuncAddr-nextHook-5 'Jmp后面跟着的地址,也就是被Hook的API函数地址
- Poke Dword,nextHook+pSize+5,FuncAddr '保存被Hook API函数的地址
- '---------------------------------------------------------------------- '下面是修改原函数跳转
- Poke Byte,FuncAddr,&HE9 '汇编的Jmp就是机器码的E9
- Poke Dword,FuncAddr+1,lpcallbackFunc-FuncAddr-5 'Jmp后面跟着的地址,也就是自己的函数地址
- FlushInstructionCache(GetCurrentProcess, ByVal FuncAddr, pSize) '确保执行更改
- VirtualProtect(ByVal FuncAddr, pSize, tOldPoint, tOldPoint) '恢复原来的属性
- Function = %TRUE '设置函数返回为真
- End If
- End Function
- Function UnHookAPI(ByRef nextHook As Dword, Opt ByVal pSize As Dword) As Long
- Local lOldAddrs As Dword,tOldPoint As Dword
- If IsFalse(pSize) Then pSize = SizeOfHook(nextHook) '判断是否有pSize参数 否则自动获取
- If nextHook Then
- If Peek(Byte,nextHook+pSize) = &HE9 Then '判断函数是否被Hook
- lOldAddrs = Peek(Dword,nextHook+pSize+5) '读取原API函数地址
- VirtualProtect(ByVal lOldAddrs, pSize, %PAGE_READWRITE, tOldPoint) '修改内存属性页为可写
- CopyMemory (ByVal lOldAddrs,ByVal nextHook,pSize) '恢复被修改的跳转
- FlushInstructionCache(GetCurrentProcess, ByVal lOldAddrs, pSize) '确保执行更改
- VirtualProtect(ByVal lOldAddrs, pSize, tOldPoint, tOldPoint) '恢复原来的属性
- If VirtualFree(ByVal nextHook, %NULL, %MEM_RELEASE) Then '释放内存空间
- nextHook = %NULL '把自己函数地址设为NULL
- Function = %TRUE '设置函数返回为真
- End If
- End If
- End If
- End Function