#include "stdafx.h"
//原函数类型定义
typedef int (WINAPI* MsgBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
MsgBoxW OldMsgBoxW = NULL;//指向原函数的指针
FARPROC pfOldMsgBoxW;  //指向函数的远指针
BYTE OldCode[5]; //原系统API入口代码
BYTE NewCode[5]; //原系统API新的入口代码 (jmp xxxxxxxx)
HANDLE hProcess = NULL;//本程序进程句柄
HINSTANCE hInst = NULL;//API所在的dll文件句柄
void HookOn();
void HookOff();
void GetApiEntrance();
void OnBnClickedBtnStartHook();
void OnBnClickedBtnCallMsgBox();
void OnBnClickedBtnStopHook();
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{TRACE(lpText);HookOff();//调用原函数之前,记得先恢复HOOK呀,不然是调用不到的//如果不恢复HOOK,就调用原函数,会造成死循环//毕竟调用的还是我们的函数,从而造成堆栈溢出,程序崩溃。int nRet = ::MessageBoxW(hWnd, _T("MessageBoxW被HOOK了"), lpCaption, uType);HookOn();//调用完原函数后,记得继续开启HOOK,不然下次会HOOK不到。 return nRet;
}//开启钩子的函数
void HookOn()
{ASSERT(hProcess != NULL);DWORD dwTemp = 0;DWORD dwOldProtect;//修改API函数入口前5个字节为jmp xxxxxxVirtualProtectEx(hProcess, pfOldMsgBoxW, 5, PAGE_READWRITE, &dwOldProtect);WriteProcessMemory(hProcess, pfOldMsgBoxW, NewCode, 5, 0);VirtualProtectEx(hProcess, pfOldMsgBoxW, 5, dwOldProtect, &dwTemp);}//关闭钩子的函数
void HookOff()
{ASSERT(hProcess != NULL);DWORD dwTemp = 0;DWORD dwOldProtect;//恢复API函数入口前5个字节VirtualProtectEx(hProcess, pfOldMsgBoxW, 5, PAGE_READWRITE, &dwOldProtect);WriteProcessMemory(hProcess, pfOldMsgBoxW, OldCode, 5, 0);VirtualProtectEx(hProcess, pfOldMsgBoxW, 5, dwOldProtect, &dwTemp);
}//获取API函数入口前5个字节
//旧入口前5个字节保存在前面定义的字节数组BYTE OldCode[5]
//新入口前5个字节保存在前面定义的字节数组BYTE NewCode[5]
void GetApiEntrance()
{HMODULE hmod = ::LoadLibrary(_T("User32.dll"));OldMsgBoxW = (MsgBoxW)::GetProcAddress(hmod, "MessageBoxW");pfOldMsgBoxW = (FARPROC)OldMsgBoxW;if (pfOldMsgBoxW == NULL){MessageBox(NULL, _T("获取原API入口地址出错"), _T("error!"), 0);return;}_asm{lea edi, OldCode        //获取OldCode数组的地址,放到edimov esi, pfOldMsgBoxW //获取原API入口地址,放到esicld   //方向标志位,为以下两条指令做准备movsd //复制原API入口前4个字节到OldCode数组movsb //复制原API入口第5个字节到OldCode数组}NewCode[0] = 0xe9;//实际上0xe9就相当于jmp指令_asm{lea eax, MyMessageBoxW //获取我们的MyMessageBoxW函数地址mov ebx, pfOldMsgBoxW  //原系统API函数地址sub eax, ebx             //int nAddr= UserFunAddr – SysFunAddrsub eax, 5           //nAddr=nAddr-5mov dword ptr[NewCode + 1], eax //将算出的地址nAddr保存到NewCode后面4个字节//注:一个函数地址占4个字节}HookOn();
}void OnBnClickedBtnStartHook()
{DWORD dwPid = ::GetCurrentProcessId();hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwPid);GetApiEntrance();printf("Hook已启动");
}void OnBnClickedBtnCallMsgBox()
{HWND m_hWnd = GetConsoleWindow();::MessageBoxW(m_hWnd, _T("这是正常的MessageBoxW"), _T("Hello"), 0);
}//停止HOOK
void OnBnClickedBtnStopHook()
{HookOff();printf("Hook未启动");
}void main()
{OnBnClickedBtnStartHook();OnBnClickedBtnStopHook();OnBnClickedBtnCallMsgBox();
}

原作者的程序是窗口的

我提取了下,改成dos了

原作者连接

API Hook 自身 MessageBoxW相关推荐

  1. 基于API HOOK的软件行为分析系统

    基于API HOOK的软件行为分析系统 目录 软件安全课程设计 1 基于API HOOK的软件行为分析系统 1 一.课程设计题目 1 基于API HOOK的软件行为分析系统 1 二.课程编码:1306 ...

  2. API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)

    一个完整的hook,如果hook程序是以dll形式生成的,是分两步:1.完成dll本身的设计和生成,2.完成dll注入程序的设计和生成 本文完成第一步. 第二步在http://blog.csdn.ne ...

  3. Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook

    (转载兼整理)Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook 这厮此文写的相当实用,不知道为啥不好好整理一下,得,我代劳了吧.作者:l04m33@gmail.com ...

  4. (转载兼整理)Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook

    这厮此文写的相当实用,不知道为啥不好好整理一下,得,我代劳了吧.作者:l04m33@gmail.com,原文.去看一眼就知道我干嘛干这个脏活儿了... 感觉这篇文章有上首页的素质,可惜不是我自己写的, ...

  5. API Hook完全手册

    注:本文是根据我两年前写的一个系统行为监测程序写成(参考了一些书籍和文章).最近在论坛上看到有不少人在问关于API Hook的问题,便写成此文,希望能对朋友们在写API Hook代码的时候能够有所帮助 ...

  6. API Hook在TA中的应用

    摘要: API Hook技术可以在自动化测试时可以实现我们平时测试时做不到的事情,通过目标进程的窗口层次和该技术结合,基本上可以将自动测试覆盖率达到85%以上, 不能达到100%是因为有一部分UI信息 ...

  7. API hook 单步调试

    [原创]详谈HOOK API的技术 - 论坛原创(汇编层面)        http://forum.eviloctal.com/thread-19092-1-1.html      Windows系 ...

  8. Windows内核API HOOK 之 Inline Hook

    来源:CSDN   作者:daiwen 名字起得好,Inline hook,乍一听,似乎很高深.此处的Inline,我以为,意指将汇编代码直接写入内核API的内存区域.Inline Hook不像用户态 ...

  9. api hook 例子,截获封包(转载)

    api hook 例子,截获封包(转载) api hook 例子,截获封包(转载) 有时候我们需要对其它应用程序发送和接收的网络数据进行拦截,比如要对IE发送的HTTP头进行分析,得到请求的地址等.这 ...

最新文章

  1. 1012. 数字分类 java_PAT-B-1012. 数字分类(Java)
  2. 强化学习(二)- 动态规划(Dynamic Programming)
  3. 【认证课程】NP 理论复习之ospf(一)
  4. Mysql安装 定期弹出黑框作用及关闭
  5. Microsoft Exchange 2010 安装配置
  6. 中职计算机技术教学计划,中职计算机教学计划
  7. JVM Java内存区域 与 内存溢出 (系列号1)
  8. 鸿蒙王者荣耀想要转区吗,王者荣耀:跨系统角色转移功能终于上线,想要成功转区,这九点常识必须要知道!...
  9. 聊聊 Java 中 HashMap 初始化的另一种方式
  10. 个人JS脚本验证大全[转]
  11. 微信web H5 安卓无法播放的解决方案
  12. Windows下VMware准备IOS开发环境
  13. 【源代码】Python制作的赛车小游戏,逆行飙车
  14. 学妹问我没有实际项目经验,简历要怎么写?
  15. 我是穷人,可以不买开发板了吗?---QEMU 模拟arm系统
  16. 总结702考研复习DAY26
  17. <<算法很美>>——(三)十大排序算法(下)
  18. 校园网高清视频下载器
  19. 2020年小美赛B赛题(+译文)和思路记录
  20. 办公文档被误删如何用EasyRecovery恢复

热门文章

  1. java读取mysql数据库配置文件_java读取properties文件的方法
  2. 20个新鲜的和鼓舞人心的电子商务网站
  3. Day1——提权学习之提权基础
  4. python webkitformboundary_python 免杀验证
  5. 【软件工程】软件计划
  6. java队列遍历多叉树_多叉树的设计、建立、层次优先遍历和深度优先遍历.pdf
  7. 主键的概念作用及特点
  8. 卫生系统招聘计算机专业知识,医疗卫生系统招聘考试(医学影像专业知识)题库及答案.doc...
  9. PHPCMS v9.6.0 调用标签整理
  10. WEB:warmup