HOOK -- IAT HOOK 本进程MessageBox
下面转自网上的,给读者共享,本来自己写点的,但是一直在讲课,没有时间,姑且先复制粘贴下)
========================================================================================
结合网上资料、使用IAT HOOK截获MessageBox函数、、、
步骤如下
1..写一个自己的MessageBox函数注意调用约定为__stdcall、、
2..定义一MessageBox函数指针如下
typedef int (__stdcall *pOldMBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType);
3..遍历本进程的导入表寻找MessageBox的地址、、
4..修改MessageBox所在THUNK的地址为自己写的函数地址、、代码如下:
#include <windows.h>
HANDLE pBegin = GetModuleHandle(NULL);
PBYTE pBegin2 = (PBYTE)pBegin;
PIMAGE_DOS_HEADER DOS = PIMAGE_DOS_HEADER(pBegin2);
PIMAGE_NT_HEADERS NT = PIMAGE_NT_HEADERS(pBegin2+DOS->e_lfanew);
PIMAGE_OPTIONAL_HEADER OPTION = &(NT->OptionalHeader);
PIMAGE_IMPORT_DESCRIPTOR IMPORT = PIMAGE_IMPORT_DESCRIPTOR(OPTION->DataDirectory[1].VirtualAddress + pBegin2);
typedef int (__stdcall *pOldMBox)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType);
pOldMBox pMBox = NULL;
int __stdcall HookMBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)
{
if (NULL == pMBox)
{
return MessageBox(hWnd,lpText,lpCaption,uType);
}
else
{
return pMBox(NULL,"哈哈! IAT HOOK到了","HOOK",MB_OK);
}
}
int ReAPI(const char* DllName, const char* FunName)
{
while (IMPORT->Name)
{
char* OurDllName = (char*)(IMPORT->Name + pBegin2);
if (0 == strcmpi(DllName , OurDllName))
{
break;
}
IMPORT++;
}
PIMAGE_IMPORT_BY_NAME pImportByName = NULL;
PIMAGE_THUNK_DATA pOriginalThunk = NULL;
PIMAGE_THUNK_DATA pFirstThunk = NULL;
pOriginalThunk = (PIMAGE_THUNK_DATA)(IMPORT->OriginalFirstThunk + pBegin2);
pFirstThunk = (PIMAGE_THUNK_DATA)(IMPORT->FirstThunk + pBegin2);
while (pOriginalThunk->u1.Function) //记住是Function
{
DWORD u1 = pOriginalThunk->u1.Ordinal; //记住是Ordinal
if ((u1 & IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG) //说明MSB不是1 不是以序号导入
{
pImportByName = (PIMAGE_IMPORT_BY_NAME)((DWORD)pOriginalThunk->u1.AddressOfData + pBegin2);
char* OurFunName = (char*)(pImportByName->Name); //下边的计算也可以
//char* OurFunName2 = (char*)((DWORD)pOriginalThunk->u1.AddressOfData + pBegin2 + 2);
if (0 == strcmpi(FunName,OurFunName))
{
//获取以pFirstThunk开始的内存的信息并将其保存到MEMORY_BASIC_INFORMATION结构中
MEMORY_BASIC_INFORMATION mbi_thunk;
VirtualQuery(pFirstThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
//VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);
//修改以pFirstThunk开始的内存的的保护属性为PAGE_READWRITE并将原保护属性保存到&dwOLD中
DWORD dwOLD;
VirtualProtect(pFirstThunk,sizeof(DWORD),PAGE_READWRITE,&dwOLD);
//更改真正MessageBoxA的地址为自己写的HookMBox函数的地址、、
//将真正的地址付给先前定义的函数指针
//结果正确的话就是当本程序调用messagebox的时候程序转去执行咱的HookMBox函数
//并且在咱的HookMBox函数中咱还调用了真正的messagebox函数、、
pMBox =(pOldMBox)(pFirstThunk->u1.Function);
pFirstThunk->u1.Function = (PDWORD)HookMBox;
//恢复之前更改的内存的保护属性为人家自己的、、
VirtualProtect(pFirstThunk,sizeof(DWORD),dwOLD,0);
break;
}
}
pOriginalThunk++;
pFirstThunk++;
}
return 0;
}
int main()
{
ReAPI("User32.dll","MessageBoxA");
MessageBox(NULL,"没有HOOK到","HOOK",MB_OK);
}
HOOK -- IAT HOOK 本进程MessageBox相关推荐
- C/C++:Windows编程—IAT Hook实例(程序启动拦截)
C/C++:Windows编程-IAT Hook实例(程序启动拦截) 前言+思路 本文默认读者有IAT Hook的相关的基础知识了哈,记录笔者在IAT Hook实战中遇到到问题以及解决思路. 笔者想实 ...
- 深入IAT HOOK
在上一篇文章手动打造一个弹窗程序中,我们自己手写了一份导入表,在调用函数的时候,我们CALL的是导入地址表的一个地址,为什么要调用这里,而且在构造导入表的时候,导入名称表(INT)和导入地址表(IAT ...
- Hook技术:IAT Hook详细讨论修改IAT地址和恢复
IAT Hook是Ring3层常用的Hook之一,主要思路大家都知道,就是修改IAT中的函数地址. 之前写过讨论IAT的帖子:<PE结构:导入表中的双桥结构>:https://blog.c ...
- 应用层勾子IAT HOOK(源码)
//www.yjxsoft.com 2010.6.26 //文件名 IAT.H #include <windows.h> VOID __stdcall mySleep(DWORD m) { ...
- EAT/IAT Hook
标 题: EAT/IAT Hook 作 者: Y4ng 时 间: 2013-08-21 链 接: http://www.cnblogs.com/Y4ng/p/EAT_IAT_HOOK.html #in ...
- 二、C++反作弊对抗实战 (进阶篇 —— 14.利用内存加载+重定向绕过inline iat hook)
下面是成功绕过inline hook的运行效果: 一.前言 在前面的章节中讲述了inline hook.iat hook.seh/veh hook等原理以及代码实现,也在讲述inline hook时顺 ...
- IAT hook与inline hook的区别
IAT hook 导入表hook原理:修改导入表中某函数的地址到自己的补丁函数.IATHook 通过GetProcAddress获取目标函数地址 在程序内存中找到所在dll的导入表 查找目标函数地址保 ...
- 无法启动此程序,因为计算机中丢失iathook.dll,通过IAT+Hook调试Windows自定义未处理异常过滤器.pdf...
2009年第12期 计算机系统应用 Hoo n 通过IAT d k调试Wiows自定义未处理 异常过滤器① WindowsCustomFiltersforUnhandled IATHook Debug ...
- 通过Hook API调用打造进程监控程序
*(收藏)http://hi.baidu.com/linuxetc/blog/item/1b91c813b017e4035baf53a7.html Hook(钩子)是Windows消息处理过程中的一个 ...
最新文章
- linux命令:vim
- WPF Datagrid with some read-only rows - Stack Overflow
- 【转】前端精选文摘:BFC 神奇背后的原理
- 男人的快乐可以多简单?
- mysql32位的能装在64位的电脑上吗,mysql32位能装64位电脑【excle中怎么将log值变回原来的数据库】...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解...
- java程序实验报告_实验报告一
- 使用Spark Shell开发运行Spark程序
- 触目惊心,北邮计算机学院女神居然每天看这些公众号
- request域中放入参数几种方法
- ffmpeg+java截取视频帧
- 蓝色蝴蝶(好听的毕业歌)
- STM32F103的AD采样非线性问题
- Windows将鼠标单击转换为双击的原理
- 【历史上的今天】12 月 28 日:冯·诺伊曼诞生;林纳斯·托瓦兹出生;CSDN 正式上线
- 项目学习--谷粒商城
- 为什么亿级数据量时要使用位图?位图和布隆过滤器有什么关系?
- Unregistere
- 超赞!Win10自带系统修复工具DISM使用说明
- iphone补电代码大全_手机资讯:iPhone ICCID激活策略和运营商查询地址大全
热门文章
- Log4j的layout配置
- 函数式接口作为方法的参数案例
- 有状态服务和无状态服务的区别与联系
- Response_案例1_路径_绝对路径
- SpringBoot_web开发-扩展与全面接管SpringMVC
- signature=94f3cd0155e1d8c8ff09aa94177adccd,研擬顆粒流與連體數值耦合方法模擬山崩產生之震動訊號...
- 简易 IM 双向通信电脑端 GUI 应用——基于 Netty、WebSocket、JavaFX 、多线程技术等
- 不使用 Maven 等构建工具,而使用原始方法在 IntelliJ IDEA 中整合 Tomcat 部署 Web 应用
- linux下c的学习
- 如何进行MaxCompute 用户认证?