徐上一篇文章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相关推荐

  1. 《windows核心编程系列》二谈谈ANSI和Unicode字符集

    第二章:字符和字符串处理 使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是 ...

  2. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  3. 《Windows核心编程(第5版•英文版)》暨《深入理解.NET(第2版•英文版)》有奖书评/读书笔记征集活动

    <Windows核心编程(第5版•英文版)>暨<深入理解.NET(第2版•英文版)>有奖书评/读书笔记征集活动 图灵公司自成立以来,得到了CSDN的很多专家和朋友的帮助.为了感 ...

  4. chHANDLE_DLGMSG(windows核心编程)讲解

    看完<Windows程序设计>后开始看<windows核心编程>, 结果看第一个案例的时候就很惊人的发现,Jeffery大牛的代码很深奥.乍一看好像没有包含<window ...

  5. C#学习路线:C#入门经典 -> CLR VIA C# -> WINDOWS核心编程

    C#入门经典:入门阶段 CLR VIA C#:理论基础 WINDOWS核心编程:理论提升

  6. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  7. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  8. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  9. 结束处理程序——Windows核心编程学习手札之二十三

    结束处理程序 --Windows核心编程学习手札之二十三 使用SEH可以只关注程序要完成任务,而运行中发生的错误,系统将会发现并通知.Windows引入SHE是为了便于操作系统的开发,使用SHE所造成 ...

最新文章

  1. Eclipse中git检出、更新、提交、合并分支、以及解决冲突
  2. java抢答器代码_java竞争抢答器
  3. [上海]LinkCoder第四期活动——Jeffrey Richter:Win 8应用开发与.NET4.5
  4. 对于java反射的理解
  5. html tab与jQuery,使用jquery实现div的tab切换实例代码
  6. 绘图解谜:公钥、私钥、证书
  7. C++ vector是什么?应该如何理解
  8. Julia:从交易流水动态计算可用资金
  9. int、String、char、Array之间的转换,这一篇够了!!!
  10. 零基础必看的Html5+Css3+移动端前端教程(一)
  11. 360手机助手下载|360手机助手下载
  12. OpenWrt增加Led
  13. 基于kettle8的web端调度监控平台
  14. 深度|人脸图像的技术原理及在电商业务中的应用
  15. 无线局域网CSMA/CA协议
  16. 长沙互联网公司和生活成本
  17. 计算机音乐制作手册,计算机音乐制作手册
  18. [024] 11大Java开源中文分词器的使用方法和分词效果对比
  19. oracle ebs 期间 打开,OraEBSR12AP应付发票业务操作02:应付会计期间打开
  20. css之前端5种布局方式之table布局、float布局、absolute布局、flexbox布局、grid布局

热门文章

  1. python自带的解释器和编辑器叫什么_(四)python自带解释器(LDIE)的使用
  2. 如何查看Android项目的gradle版本和路径
  3. 怎么在html中加横条,如何在HTML中插入一行?html横线标签hr全新讲解
  4. layui table 复选框数据_Python操作三大数据库 Mysql
  5. aix oracle调整逻辑卷的大小,AIX上增加逻辑卷时报错误0516-787 extendlv: Maximum allocation for logical volume(示例代码)...
  6. vagrant 常用的几个命令
  7. 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
  8. java里面string什么意思_java中string什么意思
  9. 礼县职业中等专业学校计算机,礼县职业中等专业学校
  10. echarts 按需引入模_【React】react项目引入echarts插件