下面转自网上的,给读者共享,本来自己写点的,但是一直在讲课,没有时间,姑且先复制粘贴下)

========================================================================================

结合网上资料、使用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相关推荐

  1. C/C++:Windows编程—IAT Hook实例(程序启动拦截)

    C/C++:Windows编程-IAT Hook实例(程序启动拦截) 前言+思路 本文默认读者有IAT Hook的相关的基础知识了哈,记录笔者在IAT Hook实战中遇到到问题以及解决思路. 笔者想实 ...

  2. 深入IAT HOOK

    在上一篇文章手动打造一个弹窗程序中,我们自己手写了一份导入表,在调用函数的时候,我们CALL的是导入地址表的一个地址,为什么要调用这里,而且在构造导入表的时候,导入名称表(INT)和导入地址表(IAT ...

  3. Hook技术:IAT Hook详细讨论修改IAT地址和恢复

    IAT Hook是Ring3层常用的Hook之一,主要思路大家都知道,就是修改IAT中的函数地址. 之前写过讨论IAT的帖子:<PE结构:导入表中的双桥结构>:https://blog.c ...

  4. 应用层勾子IAT HOOK(源码)

    //www.yjxsoft.com 2010.6.26 //文件名 IAT.H #include <windows.h> VOID __stdcall mySleep(DWORD m) { ...

  5. EAT/IAT Hook

    标 题: EAT/IAT Hook 作 者: Y4ng 时 间: 2013-08-21 链 接: http://www.cnblogs.com/Y4ng/p/EAT_IAT_HOOK.html #in ...

  6. 二、C++反作弊对抗实战 (进阶篇 —— 14.利用内存加载+重定向绕过inline iat hook)

    下面是成功绕过inline hook的运行效果: 一.前言 在前面的章节中讲述了inline hook.iat hook.seh/veh hook等原理以及代码实现,也在讲述inline hook时顺 ...

  7. IAT hook与inline hook的区别

    IAT hook 导入表hook原理:修改导入表中某函数的地址到自己的补丁函数.IATHook 通过GetProcAddress获取目标函数地址 在程序内存中找到所在dll的导入表 查找目标函数地址保 ...

  8. 无法启动此程序,因为计算机中丢失iathook.dll,通过IAT+Hook调试Windows自定义未处理异常过滤器.pdf...

    2009年第12期 计算机系统应用 Hoo n 通过IAT d k调试Wiows自定义未处理 异常过滤器① WindowsCustomFiltersforUnhandled IATHook Debug ...

  9. 通过Hook API调用打造进程监控程序

    *(收藏)http://hi.baidu.com/linuxetc/blog/item/1b91c813b017e4035baf53a7.html Hook(钩子)是Windows消息处理过程中的一个 ...

最新文章

  1. linux命令:vim
  2. WPF Datagrid with some read-only rows - Stack Overflow
  3. 【转】前端精选文摘:BFC 神奇背后的原理
  4. 男人的快乐可以多简单?
  5. mysql32位的能装在64位的电脑上吗,mysql32位能装64位电脑【excle中怎么将log值变回原来的数据库】...
  6. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解...
  7. java程序实验报告_实验报告一
  8. 使用Spark Shell开发运行Spark程序
  9. 触目惊心,北邮计算机学院女神居然每天看这些公众号
  10. request域中放入参数几种方法
  11. ffmpeg+java截取视频帧
  12. 蓝色蝴蝶(好听的毕业歌)
  13. STM32F103的AD采样非线性问题
  14. Windows将鼠标单击转换为双击的原理
  15. 【历史上的今天】12 月 28 日:冯·诺伊曼诞生;林纳斯·托瓦兹出生;CSDN 正式上线
  16. 项目学习--谷粒商城
  17. 为什么亿级数据量时要使用位图?位图和布隆过滤器有什么关系?
  18. Unregistere
  19. 超赞!Win10自带系统修复工具DISM使用说明
  20. iphone补电代码大全_手机资讯:iPhone ICCID激活策略和运营商查询地址大全

热门文章

  1. Log4j的layout配置
  2. 函数式接口作为方法的参数案例
  3. 有状态服务和无状态服务的区别与联系
  4. Response_案例1_路径_绝对路径
  5. SpringBoot_web开发-扩展与全面接管SpringMVC
  6. signature=94f3cd0155e1d8c8ff09aa94177adccd,研擬顆粒流與連體數值耦合方法模擬山崩產生之震動訊號...
  7. 简易 IM 双向通信电脑端 GUI 应用——基于 Netty、WebSocket、JavaFX 、多线程技术等
  8. 不使用 Maven 等构建工具,而使用原始方法在 IntelliJ IDEA 中整合 Tomcat 部署 Web 应用
  9. linux下c的学习
  10. 如何进行MaxCompute 用户认证?