我的API HOOK库
API HOOK有两种做法,一种是SetWindowHookEx,简单易用,但如果做其它的HOOK,如HOOK OpenProcess,就需要修改内存地址了,内存地址可以通过WriteProcessMemory来修改,先将调用函数的地址改成自己的(jmp到自己的函数),然后需要时,再改回来。
#pragma once #ifdef _M_IX86
template <typename T>
class Hooker
{
protected:
static DWORD HookFunction(LPCWSTR lpModule, LPCSTR lpFuncName, PROC lpFunction)
{
DWORD dwAddr = (DWORD) GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
BYTE jmp [] =
{
0xe9, //jmp
0x00, 0x00, 0x00, 0x00, //address
0xc3 //retn
}; ReadProcessMemory(GetCurrentProcess(), (LPVOID) dwAddr, MemoryAddress(), , ); DWORD dwCalc = ((DWORD) lpFunction - dwAddr - ); //((to)-(from)-5) memcpy(&jmp[], &dwCalc, ); //build the jmp WriteProcessMemory(GetCurrentProcess(), (LPVOID) dwAddr, jmp, , ); return dwAddr;
} static BOOL UnHookFunction(LPCWSTR lpModule, LPCSTR lpFuncName)
{
DWORD dwAddr = (DWORD) GetProcAddress(GetModuleHandle(lpModule), lpFuncName); if (WriteProcessMemory(GetCurrentProcess(), (LPVOID) dwAddr, MemoryAddress(), , ))
return TRUE; return FALSE;
} static BYTE* MemoryAddress()
{
static BYTE backup[];
return backup;
}
};
#elif _M_AMD64
template <typename T>
class Hooker
{
protected:
static UINT64 HookFunction(LPCWSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction)
{
UINT64 dwAddr = (UINT64) GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
BYTE jmp [] =
{
0x48, 0xb8, //jmp
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, //address
0x50, 0xc3 //retn
}; ReadProcessMemory(GetCurrentProcess(), (LPVOID) dwAddr, MemoryAddress(), , ); UINT64 dwCalc = (UINT64) lpFunction; memcpy(&jmp[], &dwCalc, ); //build the jmp WriteProcessMemory(GetCurrentProcess(), (LPVOID) dwAddr, jmp, , nullptr); return dwAddr;
} static BOOL UnHookFunction(LPCWSTR lpModule, LPCSTR lpFuncName)
{
UINT64 dwAddr = (UINT64) GetProcAddress(GetModuleHandle(lpModule), lpFuncName); if (WriteProcessMemory(GetCurrentProcess(), (LPVOID) dwAddr, MemoryAddress(), , ))
return TRUE; return FALSE;
} static BYTE* MemoryAddress()
{
static BYTE backup[];
return backup;
}
};
#endif
值得注意的是,64位和32位的注入字节有些许不同。
由于目前Visual Studio 2013 Preview实现的C++类中,还是不允许有非int静态变量,但却允许函数中有静态变量,所以我将目标指针数据备份到静态成员中:
static BYTE* MemoryAddress()
{
static BYTE backup[];
return backup;
}
然后,在使用时,从Hooker继承一个类即可:
class MessageBoxHooker : Hooker<MessageBoxHooker>
{
public:
static void BeginHook()
{
HookFunction(L"user32.dll", "MessageBoxW", (PROC) MyMessageBoxW);
}
static void StopHook()
{
UnHookFunction(L"user32.dll", "MessageBoxW");
}
private:
static int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
StopHook();
int x = MessageBox(hWnd, L"hooked", lpCaption, uType);
BeginHook();
return x;
}
};
要开启Hook,只需调用:
MessageBoxHooker::BeginHook();
这个API HOOK库我使了一个模板,之所以用模板是因为C++函数指针不包含实例的指针。这种使用模板来解决C++指针的缺点的做法很常见,ATL也是这样实现的。
本文提供的代码可以随意引用,但请充分测试后再部署,出问题本人不承担任何责任,欢迎有任何建议和补充~
我的API HOOK库的更多相关文章
- API HOOK库
API HOOK库 API HOOK有两种做法,一种是SetWindowHookEx,简单易用,但如果做其它的HOOK,如HOOK OpenProcess,就需要修改内存地址了,内存地址可以通过Wri ...
- 10分钟API Hook MessageBox
10分钟API Hook MessageBox 分类: C++2012-04-12 22:52 877人阅读 评论(4) 收藏 举报 hookwinapidllthreadpython编程 转载注明出 ...
- Detours HOOK 库 过滤LoadLibraryExW
Detours HOOK 库 Hook 过滤LoadLibraryExW 一丶简介 1.1 Detours库简介 Detours是微软提供的HOOK库.为我们Hook提供了方便.再也不用手撸 HOOK ...
- Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术
catalogue 1. 引言2. 使用注册表注入DLL3. 使用Windows挂钩来注入DLL4. 使用远程线程来注入DLL5. 使用木马DLL来注入DLL6. 把DLL作为调试器来注入7. 使用c ...
- 进程动态拦截注入API HOOK
最近工作中遇到一个问题,需要通过程序界面进行判断程序的运行状态,刚开始认为很简单,不就是一个窗体控件获取,获取Button的状态和Text.刚好去年干过该事情,就没太在意,就把优先级排到后面了,随着项 ...
- API Hook基本原理和实现
API Hook基本原理和实现 2009-03-14 20:09 windows系统下的编程,消息message的传递是贯穿其始终的.这个消息我们可以简单理解为一个有特定意义的整数,正如我们看过的老故 ...
- API HOOK介绍 【转】
什么是“跨进程 API Hook”? 众所周知Windows应用程序的各种系统功能是通过调用API函数来实现.API Hook就是给系统的API附加上一段小程序,它能监视甚至控制应用程序对API函数的 ...
- 【译】值得推荐的十大React Hook 库
十大React Hook库 原文地址:https://dev.to/bornfightcompany/top-10-react-hook-libraries-4065 原文作者:Juraj Pavlo ...
- 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)
信鸽推送 .NET 服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...
随机推荐
- java_前端_autocomplete_搜索框自动匹配提示
效果图: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> < ...
- eclipese with gdbserver and Jlink configuration
最近的项目,很感动于linux和gdbserver内容,I think must write something to record it . 各位对不起,图片挂了.. Ok, at first I' ...
- 【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨
原文:[高德地图API]从零开始学高德JS API(二)地图控件与插件——测距.圆形编辑器.鼠标工具.地图类型切换.鹰眼鱼骨 摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装 ...
- Struts2 整合jQuery实现Ajax功能(2)
1.1.1 Action利用struts2-json-plugin-X.X.X.jar响应Json格式信息: 1. function removerecordbyid(recordid) ...
- canvas绘制自定义的曲线,以椭圆为例,通俗易懂,童叟无欺
本篇文章,将讲述如何通过自定义的曲线函数,使用canvas的方式进行曲线的绘制. 为了通俗易懂,将以大家熟悉的椭圆曲线为例,进行椭圆的绘制.至于其他比较复杂的曲线,用户只需通过数学方式建立起曲线函数, ...
- POJ 1201 && HDU 1384 Intervals(差动制动系统)
职务地址:POJ 1201 HDU 1384 依据题目意思.能够列出不等式例如以下: Sj-Si>=c; Si-S(i-1)>=0; S(i-1)-Si>=-1; 然后用最短路s ...
- POJ 1579-Function Run Fun(内存搜索)
Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16503 Accepted: 8514 ...
- vue实现ajax滚动下拉加载,同时具有loading效果
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 处理程序“svc-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决办法:以管理员运行命令:C: ...
- 【转】 教你如何创建类似QQ的android弹出菜单
原文地址:http://www.apkbus.com/android-18034-1-1.html 大家可能看到android的自带的系统菜单比较难看,如图: 2011-12-4 23:13 上传 下 ...