32位系统直接传统Hook就Ok了,但是64位系统就不行了,需要改动一下汇编代码
64位系统Hook需求
1.目标进程64位
2.注入程序64位
3.dll64位
以上条件必须都满足方可Hook64程序
--------------------------------------------------------------------------------------------------------
全局监控进程创建思路
Hook组员管理器explorer.exe
因为用户点击软件启动时实际上是由资源管理器负责创建进程的
资源管理器调用的创建进程API:CreateProcessW
所以我们只需要Hook CreateProcessW即可
然后回调函数中添加过滤放行或禁止就好了
效果图
测试环境:Win7 64bit
当我们点击某个应用程序时
当我们点击【是】,程序正常打开
但是当我们点击【否】,那么就嘿嘿了
--------------------------------------------------------------------------------------------------------
进程保护思路
Hook任务管理就可以了
任务管理器结束进程调用的API:Openprocess, TerminateProcess
不过我们只需要Hook OpenProcess就OK了
因为OpenProcess有我们想要的参数dwProcessId,有了进程Id就在回调中过滤了
还有 TerminateProcess第一个参数是个HANDLE
只要HANDLE错误,他就无法结束进程
而HANDLE是通过OpenProcess得到的
效果图
我准备好的保护目标
当我们试图结束它
任务管理器就会提示
--------------------------------------------------------------------------------------------------------
核心代码就是64位Hook
下面放出来APIHook64Class
APIHook64Class.h
复制代码
APIHook64Class.cpp
复制代码
64位系统Hook需求
1.目标进程64位
2.注入程序64位
3.dll64位
以上条件必须都满足方可Hook64程序
--------------------------------------------------------------------------------------------------------
全局监控进程创建思路
Hook组员管理器explorer.exe
因为用户点击软件启动时实际上是由资源管理器负责创建进程的
资源管理器调用的创建进程API:CreateProcessW
所以我们只需要Hook CreateProcessW即可
然后回调函数中添加过滤放行或禁止就好了
效果图
测试环境:Win7 64bit
当我们点击某个应用程序时
当我们点击【是】,程序正常打开
但是当我们点击【否】,那么就嘿嘿了
--------------------------------------------------------------------------------------------------------
进程保护思路
Hook任务管理就可以了
任务管理器结束进程调用的API:Openprocess, TerminateProcess
不过我们只需要Hook OpenProcess就OK了
因为OpenProcess有我们想要的参数dwProcessId,有了进程Id就在回调中过滤了
还有 TerminateProcess第一个参数是个HANDLE
只要HANDLE错误,他就无法结束进程
而HANDLE是通过OpenProcess得到的
效果图
我准备好的保护目标
当我们试图结束它
任务管理器就会提示
--------------------------------------------------------------------------------------------------------
核心代码就是64位Hook
下面放出来APIHook64Class
APIHook64Class.h
- #ifndef APIHOOK64CLASS_H_
- #define APIHOOK64CLASS_H_
- #include <Windows.h>
- class APIHook64
- {
- private:
- unsigned char code[12];
- unsigned char oldcode[12];
- FARPROC addr;
- public:
- APIHook64();
- BOOL Hook(char *dllName,char *apiName,long long callfunc,BOOL bHook=TRUE);
- };
- #endif
- #include "APIHook64Class.h"
- APIHook64::APIHook64()
- {
- /*
- mov eax,0x12345678
- push eax
- ret
- */
- unsigned char c[12] = { 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xC3 };
- RtlMoveMemory(APIHook64::code, c, 12);
- memset(APIHook64::oldcode, 0, 12);
- addr = NULL;
- }
- BOOL APIHook64::Hook(char *dllName, char *apiName, long long callfunc, BOOL bHook)
- {
- BOOL bOk = FALSE;
- DWORD dwOldProtect = 0;
- long long api = callfunc;
- HANDLE hPro = GetCurrentProcess();
- if (!APIHook64::oldcode[0])
- {
- addr = GetProcAddress(LoadLibrary(dllName), apiName);
- RtlMoveMemory(APIHook64::code+2, &api, 8);
- if (VirtualProtectEx(hPro, addr, 12, PAGE_EXECUTE_READWRITE, &dwOldProtect))
- {
- RtlMoveMemory(APIHook64::oldcode, addr, 12);
- }
- }
- if (bHook)
- {
- bOk = WriteProcessMemory(hPro, addr, APIHook64::code, 12, NULL);
- }
- else {
- bOk = WriteProcessMemory(hPro, addr, APIHook64::oldcode, 12, NULL);
- }
- VirtualProtectEx(hPro, addr, 12, dwOldProtect, &dwOldProtect);
- CloseHandle(hPro);
- return bOk;
- }