Windows核心编程_inlineHook
徐上一篇文章APIHOOK详解后,这篇文章我们写一个简单的Demo作为练习,一个Hook类,可以Hook当前进程下的所有API!
代码思路比上篇文章要清晰,简洁,这里就不做介绍了,因为上一篇文章已经介绍的很仔细了,本demo完全依照上一篇文章里的代码搬运而来
#include <windows.h>
/*
Hook类的实现
*/
#define HOOK_THIS 0 //hook自身//异常,Hook类,Windows下专用工具
#define PTR_NULL 0 //参数指针为NULL
#define MALLOC_PTR_NULL 1 //分配内存出错
#define NO_MOUDEHANDE 2 //没有找到模块句柄
#define NO_API 3 //没有API
#define ADM_ERROR 4 //获取内存页权限失败
#define READ_MOME 5 //读取内存页数据失败
#define DATA_NO 6 //上一次HOOK的data为空无法恢复
#define PTR_NO 7 //上一次HOOK的API地址为空
#define PRID_NO 8 //无法获取进程ID
#define USER_NO 9 //无法获取进程权限
#define PRID_NOMALLOC 10 //进程空间无法分配内存
#define NO_Kernel32 11
#define NO_CreateFCCO 12
class Hook {public://构造Hook(){Ini();}//析构~Hook() {Relese();}//初始化BOOL Ini() {//Hook自身,获取进程句柄My_HookHandle = GetCurrentProcess();if (My_HookHandle == NULL) {return NULL;}//初始化My_DllName = NULL;My_ApiName = NULL;My_ErrorState = 0;My_ApiPtr = 0;memset(My_Data, 0, 5);My_hInstance = 0;//获取模块句柄HMODULE hModule = NULL;GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,(LPCSTR)&My_HookHandle, //可以是任何函数,全局变量等的地址&hModule);My_hInstance = hModule;return TRUE;}//释放所使用的空间BOOL Relese() {My_HookHandle = NULL;if (My_DllName != NULL) {free(My_DllName);My_DllName = NULL;}if (My_ApiName != NULL) {free(My_ApiName);My_ApiName = NULL;}My_ErrorState = 100;My_ApiPtr = NULL;memset(My_Data, 0, 5);My_hInstance = 0;return TRUE;}//HookAPIBOOL HookApi(const char* DllName,const char *ApiName,ULONG JumpApiPtr) {//判断下空指针if (My_HookHandle == NULL || DllName == NULL || ApiName == NULL) {My_ErrorState = PTR_NULL;return FALSE;}//保留DllName和ApiNameif (My_DllName != NULL) {free(My_DllName);My_DllName = NULL;}My_DllName = (TCHAR *)malloc(strlen(DllName)+1);if (My_DllName == NULL) {My_ErrorState = MALLOC_PTR_NULL;return FALSE;}memset(My_DllName, 0, strlen(DllName) + 1);strcpy(My_DllName, DllName);//--Apinameif (My_ApiName != NULL) {free(My_ApiName);My_ApiName = NULL;}My_ApiName = (TCHAR *)malloc(strlen(ApiName) + 1);if (My_ApiName == NULL) {My_ErrorState = MALLOC_PTR_NULL;return FALSE;}memset(My_ApiName, 0, strlen(ApiName) + 1);strcpy(My_ApiName, ApiName);//获取模块句柄HMODULE hDll = GetModuleHandle(My_DllName);if (hDll == NULL) {My_ErrorState = NO_MOUDEHANDE;return FALSE;}//获取API接口地址FARPROC Api = GetProcAddress(hDll, ApiName
);if (Api == NULL) {My_ErrorState = NO_API;return FALSE;}My_ApiPtr = Api;//获取权限DWORD dwOldProtect; //用于存储之前的权限if (NULL == VirtualProtectEx(My_HookHandle, Api, 5, PAGE_READWRITE, &dwOldProtect)) {My_ErrorState = ADM_ERROR;return FALSE;}//保留原数据if (FALSE == ReadProcessMemory(My_HookHandle, Api, My_Data, 5, NULL)) {My_ErrorState = READ_MOME;return FALSE;}//地址转换ULONG Api_MoPtr = JumpApiPtr - (ULONG)&Api;Api_MoPtr = Api_MoPtr - 5;//将地址写入到操作码的后四位char My_FuncPtr[5] = { 0 };_asm{mov eax, Api_MoPtr //获取刚刚获得的地址mov dword ptr[My_FuncPtr + 1], eax //将算出的地址保存到Arr后面4个字节//注:一个函数地址占4个字节}My_FuncPtr[0] = 0xe9; //jump//地址写入DWORD dwOldProtectwrite;WriteProcessMemory(My_HookHandle, Api, &My_FuncPtr, 5, &dwOldProtectwrite);//权限恢复DWORD dwTemp;VirtualProtectEx(My_HookHandle, Api, 5, dwOldProtect, &dwTemp);My_ErrorState = 100; //执行正常return TRUE;}//恢复BOOL HookApiRecoVery() {//判断if (strlen(My_Data) == 0) {My_ErrorState = DATA_NO;return FALSE;}if (My_ApiPtr == NULL) {My_ErrorState = PTR_NO;return FALSE;}//获取权限DWORD dwOldProtect; //用于存储之前的权限if (NULL == VirtualProtectEx(My_HookHandle, My_ApiPtr, 5, PAGE_READWRITE, &dwOldProtect)) {My_ErrorState = ADM_ERROR;return FALSE;}//地址写入DWORD dwOldProtectwrite;WriteProcessMemory(My_HookHandle, My_ApiPtr, &My_Data, 5, &dwOldProtectwrite);//权限恢复DWORD dwTemp;VirtualProtectEx(My_HookHandle, My_ApiPtr, 5, dwOldProtect, &dwTemp);My_ErrorState = 100; //执行正常return TRUE;}//获取异常INT OpenSerErrorMessage() {return My_ErrorState;printf("%d", My_ErrorState);}private:HANDLE My_HookHandle; //进程句柄TCHAR * My_DllName; //模块名TCHAR * My_ApiName; //ApiNameUINT My_ErrorState; //异常错误码FARPROC My_ApiPtr; //Hook的ApiPtrTCHAR My_Data[5]; //Hook Api里的数据HMODULE My_hInstance; //当前模块句柄};
Windows核心编程_inlineHook相关推荐
- 《windows核心编程系列》二谈谈ANSI和Unicode字符集
第二章:字符和字符串处理 使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是 ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- 《Windows核心编程(第5版•英文版)》暨《深入理解.NET(第2版•英文版)》有奖书评/读书笔记征集活动
<Windows核心编程(第5版•英文版)>暨<深入理解.NET(第2版•英文版)>有奖书评/读书笔记征集活动 图灵公司自成立以来,得到了CSDN的很多专家和朋友的帮助.为了感 ...
- chHANDLE_DLGMSG(windows核心编程)讲解
看完<Windows程序设计>后开始看<windows核心编程>, 结果看第一个案例的时候就很惊人的发现,Jeffery大牛的代码很深奥.乍一看好像没有包含<window ...
- C#学习路线:C#入门经典 -> CLR VIA C# -> WINDOWS核心编程
C#入门经典:入门阶段 CLR VIA C#:理论基础 WINDOWS核心编程:理论提升
- 窗口消息——Windows核心编程学习手札之二十六
窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...
- 未处理异常和C++异常——Windows核心编程学习手札之二十五
未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...
- 异常处理程序和软件异常——Windows核心编程学习手札之二十四
异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...
- 结束处理程序——Windows核心编程学习手札之二十三
结束处理程序 --Windows核心编程学习手札之二十三 使用SEH可以只关注程序要完成任务,而运行中发生的错误,系统将会发现并通知.Windows引入SHE是为了便于操作系统的开发,使用SHE所造成 ...
最新文章
- Eclipse中git检出、更新、提交、合并分支、以及解决冲突
- java抢答器代码_java竞争抢答器
- [上海]LinkCoder第四期活动——Jeffrey Richter:Win 8应用开发与.NET4.5
- 对于java反射的理解
- html tab与jQuery,使用jquery实现div的tab切换实例代码
- 绘图解谜:公钥、私钥、证书
- C++ vector是什么?应该如何理解
- Julia:从交易流水动态计算可用资金
- int、String、char、Array之间的转换,这一篇够了!!!
- 零基础必看的Html5+Css3+移动端前端教程(一)
- 360手机助手下载|360手机助手下载
- OpenWrt增加Led
- 基于kettle8的web端调度监控平台
- 深度|人脸图像的技术原理及在电商业务中的应用
- 无线局域网CSMA/CA协议
- 长沙互联网公司和生活成本
- 计算机音乐制作手册,计算机音乐制作手册
- [024]	11大Java开源中文分词器的使用方法和分词效果对比
- oracle ebs 期间 打开,OraEBSR12AP应付发票业务操作02:应付会计期间打开
- css之前端5种布局方式之table布局、float布局、absolute布局、flexbox布局、grid布局
热门文章
- python自带的解释器和编辑器叫什么_(四)python自带解释器(LDIE)的使用
- 如何查看Android项目的gradle版本和路径
- 怎么在html中加横条,如何在HTML中插入一行?html横线标签hr全新讲解
- layui table 复选框数据_Python操作三大数据库 Mysql
- aix oracle调整逻辑卷的大小,AIX上增加逻辑卷时报错误0516-787 extendlv: Maximum allocation for logical volume(示例代码)...
- vagrant 常用的几个命令
- 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
- java里面string什么意思_java中string什么意思
- 礼县职业中等专业学校计算机,礼县职业中等专业学校
- echarts 按需引入模_【React】react项目引入echarts插件