导出表钩子之EAT HOOK解析
EAT HOOK与IAT HOOK原理是一样的,都是通过修改PE来达到HOOK的目的。只是EAT HOOK是从来源入手而IAT HOOK则是从自身入手。但有一点值得注意的就是EAT HOOK只能对后面通过动态加载进来的API有效,对原本已经在IAT表中获取的API无法产生效果。
最简单的解释是exe进程大部分都没有导出表
详细的原因在于进程被加载到内存后PE Loader就逐个将导入表的IAT表中的各项从对应dll中获取并且硬编码地址,而进程调用API就是通过查询导入表中的IAT表中的硬编码API地址。这部分是EAT无法影响的因为在进程被加载到内存时就已经决定。
试想一下,EAT HOOK的时机时必须是进程启动后才能注入并影响对应DLL中的导出表。而IAT表早就已经在Loader加载时期就查询对应dll后被硬编码。在那时候EAT HOOK的动态库根本还没有被注入进来。所以只有当用户进行动态加载API时,才有机会。
讲一下大体思路。
1. 通过IMAGE_OPTIONAL_HEADER.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress找到导出表的地址(注意这里是RVA要加上ImageBase才能得到VA,下面都是一样)。与导入表不同,导出表只有一张!
2. 遍历IMAGE_EXPORT_DESCRIPTOR.AddressOfNames(一共IMAGE_EXPORT_DESCRIPTOR.NumberOfNames个)找到被HOOK的API名称。记得与此同时要保存IMAGE_EXPORT_DESCRIPTOR.AddressOfNameOrdinals的值
3. 如果找到了API名称则把IMAGE_EXPORT_DESCRIPOTR.AddressOfFunctions[IMAGE_EXPORT_DESCRIPTOR.AddressOfNameOrdinals]即原函数的RVA地址替换成新函数地址。
#include <windows.h>
#include <cstdio>
#include <tchar.h>BOOL EATHook(LPCTSTR szDllName, LPCTSTR szFunName, LPVOID NewFun) {DWORD addr = 0;DWORD index = 0;DWORD dwProtect;HMODULE hMod = LoadLibrary(szDllName);if (NULL == hMod)return(FALSE);PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hMod;PIMAGE_OPTIONAL_HEADER pOptHeader = (PIMAGE_OPTIONAL_HEADER)((PBYTE)hMod + pDosHeader->e_lfanew + 24);PIMAGE_EXPORT_DIRECTORY pExpDes = (PIMAGE_EXPORT_DIRECTORY)((PBYTE)hMod + pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);PULONG pAddressOfFunctions = (PULONG)((PBYTE)hMod + pExpDes->AddressOfFunctions);PULONG pAddressOfNames = (PULONG)((PBYTE)hMod + pExpDes->AddressOfNames);PUSHORT pAddressOfNameOrdinals = (PUSHORT)((PBYTE)hMod + pExpDes->AddressOfNameOrdinals);for (int i = 0; i < pExpDes->NumberOfNames; ++i) {index = pAddressOfNameOrdinals[i];LPCTSTR pFuncName = (LPTSTR)((PBYTE)hMod + pAddressOfNames[i]);if (!_tcscmp((LPCTSTR)pFuncName, szFunName)) {addr = pAddressOfFunctions[index];break;}}VirtualProtect(&pAddressOfFunctions[index], 0x1000, PAGE_READWRITE, &dwProtect);pAddressOfFunctions[index] = (DWORD)NewFun - (DWORD)hMod;WriteProcessMemory(GetCurrentProcess(), &pAddressOfFunctions[index], (LPCVOID)((DWORD)NewFun - (DWORD)hMod), sizeof(NewFun), &dwProtect);return(TRUE);
}int __stdcall MyMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType
) {_tprintf("Hello, world!\n");return(0);
}typedef int (WINAPI* LPFNMESSAGEBOX)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);int _tmain() {EATHook("USER32.dll", "MessageBoxA", MyMessageBox);HMODULE hDll = GetModuleHandle("USER32.dll");LPFNMESSAGEBOX lpMessageBox = (LPFNMESSAGEBOX)GetProcAddress(hDll, "MessageBoxA");if (NULL == lpMessageBox)return(-1);lpMessageBox(NULL, "Hello, EAT Hook", "Info", MB_OK);return(0);
}
可以将EAT HOOK写成DLL并通过远程线程注入或者利用全局HOOK注入到目标进程中执行。
(完)
导出表钩子之EAT HOOK解析相关推荐
- nodemanager不能正常关闭_Java虚拟机关闭钩子(Shutdown hook)
作者:俩右 出处:https://segmentfault.com/a/1190000038298447 源码点击 study:https://github.com/xiaoshuanglee/stu ...
- 钩子运行机制HOOK
转载 javanetc 代码频道 :http://www.javanetc.com/vc/vc_1749.html 基本概念 钩子(Hook)是Windows消息处理机制的一个平台,应用程序可以在上面 ...
- 日志钩子(JournalRecord Hook)的使用
-- 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们.钩子的种类很多,每种钩子可以截获并处 ...
- 守护线程(Daemon)、钩子线程(Hook)简述
1. 简述 守护线程 守护线程在主线程退出时候会随主线程一起结束,而不会阻塞主线程的退出 钩子线程 钩子线程可以在*JVM正常退出*的时候自动触发 2. 代码演示 public static void ...
- VUE 钩子函数超详细解析
点击上方蓝色字体关注我吧 一起学习,一起进步,做积极的人! 前言 Vue 实例在被创建时,会经过一系列的初始化过程,初始化过程中会运行一些函数,叫做生命周期钩子函数,通过运用钩子函数,用户在可以在Vu ...
- java 钩子线程_JAVA HOOK(钩子)线程介绍
当jvm进程退出的时候,或者受到了系统的中断信号,hook线程就会启动,一个线程可以注入多个钩子,这是一个实例: import java.io.IOException; import java.uti ...
- java钩子函数(hook)以spring源码为例
一.什么是钩子函数 请问在Spring中,如果JVM异常终止,Spring是如何保证会释放掉占用的资源,比如说数据库连接等资源呢?钩子函数非常简单,简单到只用摘抄一段Spring代码即可. 二.问题 ...
- C/C++:Windows编程—Inline Hook内联钩子(上)
前言 先介绍下Windows中的Hook技术.Hook是Windows中提供的一种用以替换DOS下"中断"的系统机制,中文译为"挂钩"或"钩子&quo ...
- EAT/IAT Hook
标 题: EAT/IAT Hook 作 者: Y4ng 时 间: 2013-08-21 链 接: http://www.cnblogs.com/Y4ng/p/EAT_IAT_HOOK.html #in ...
- [转] js中的钩子机制(hook)
什么是钩子机制?使用钩子机制有什么好处? 钩子机制也叫hook机制,或者你可以把它理解成一种匹配机制,就是我们在代码中设置一些钩子,然后程序执行时自动去匹配这些钩子:这样做的好处就是提高了程序的执行 ...
最新文章
- NVIDIA Turing Architecture架构设计(下)
- openpyxl 操作 Excel表的格基本用法
- 红黑树(一)之 原理和算法详细介绍---转帖
- Fcoin Token ( FT )——数字货币交易所的颠覆者,还是无情镰刀的收割者
- GoogleAppEngine是什么?
- python基础(part12)--模块
- C++将地址转换为字符串
- 计算机专业论文设计与实现,计算机专业论文 计算机网络的设计与实现.doc
- 国产机器人销售增涨 安防市场有待挖掘
- Ubuntu下跑通py-faster-rcnn、详解demo运作流程
- 杭电1425 sort
- Movielens/IMDB电影数据分析(一)
- 如何用matlab求出矩阵简化阶梯形顺带算出主元所在的列
- Nginx静态Web服务搭建
- 简单爬取网易云音乐评论(新手报到)
- 挑战全网最全的idea快捷键与选项卡中文翻译
- C++ string substr()
- 【Unity3D】Unity 组件 ④ ( 摄像机 | 调整摄像机 | 手工调整 | 3D 视图对齐 Align with View 调整摄像机 )
- Python3预测NBA比赛结果
- 彩色图像RGB分量直方图分析matlab
热门文章
- 百度地图改变定位图标
- Excel中用REPT函数制作图表
- 免费的中文深度学习全书:《深度学习理论与实战:提高篇》
- Hibernate 的检索策略
- re学习笔记(90)攻防世界 - mobile进阶区 - boomshakalaka-3
- JZOJ 3339. 【NOI2013模拟】wyl8899和法法塔的游戏
- 【江枫】AIX虚拟内存管理机制
- android标题栏跑马灯,Android跑马灯效果
- python中floor_Python torch.floor方法代码示例
- python自然语言_Python自然语言处理 - 随笔分类 - 牛皮糖NewPtone - 博客园