【加密与解密(第四版)】第十三章笔记

第十三章 HOOK技术

13.1 Hook概述

IAT HOOK(改地址)

BOOL IAT_InstallHook(){BOOL bResult = FALSE ;HMODULE hCurExe = GetModuleHandle(NULL);PULONG_PTR pt ;ULONG_PTR OrginalAddr;bResult = InstallModuleIATHook(hCurExe,"user32.dll","MessageBoxA",(PVOID)My_MessageBoxA,&pt,&OrginalAddr);if (bResult){printf("[*]Hook安装完毕! pThunk=0x%p  OriginalAddr = 0x%p\n",pt,OrginalAddr);g_PointerToIATThunk = pt ;OldMessageBox = (PFN_MessageBoxA)OrginalAddr ;}return bResult;}//************************************// FullName:    InstallModuleIATHook// Description: 为指定模块安装IAT Hook// Access:      public// Returns:     BOOL// Parameter:   HMODULE hModToHook , 待Hook的模块基址// Parameter:   char * szModuleName , 目标函数所在模块的名字// Parameter:   char * szFuncName , 目标函数的名字// Parameter:   PVOID DetourFunc , Detour函数地址// Parameter:   PULONG * pThunkPointer , 用以接收指向修改的位置的指针// Parameter:   ULONG * pOriginalFuncAddr , 用以接收原始函数地址//************************************BOOL InstallModuleIATHook(HMODULE hModToHook,// 要钩取的模块的句柄char *szModuleName,// 要钩取的模块的名称char *szFuncName,// 要钩取的函数的名称PVOID DetourFunc,// 替换原始函数的钩子函数的地址PULONG_PTR *pThunkPointer,// 用于存储指向导入地址的指针的指针ULONG_PTR *pOriginalFuncAddr// 用于存储原始函数地址的指针){PIMAGE_IMPORT_DESCRIPTOR  pImportDescriptor; // 指向导入描述符表的指针PIMAGE_THUNK_DATA         pThunkData; // 指向导入函数表的指针ULONG ulSize; // 导入描述符表的大小HMODULE hModule=0; // 加载模块的句柄ULONG_PTR TargetFunAddr; // 目标函数的地址PULONG_PTR lpAddr; // 导入地址的指针char *szModName; // 当前模块的名称BOOL result = FALSE ; // 返回值,默认为失败BOOL bRetn = FALSE; // 操作结果,默认为失败hModule = LoadLibrary(szModuleName); // 加载要钩取的模块TargetFunAddr = (ULONG_PTR)GetProcAddress(hModule,szFuncName); // 获取要钩取的函数的地址printf("[*]Address of %s:0x%p\n",szFuncName,TargetFunAddr); // 输出目标函数的地址printf("[*]Module To Hook at Base:0x%p\n",hModToHook); // 输出要钩取的模块的基地址pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hModToHook, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); // 获取导入描述符表的地址printf("[*]Find ImportTable,Address:0x%p\n",pImportDescriptor); // 输出导入描述符表的地址while (pImportDescriptor->FirstThunk) // 遍历导入描述符表,直到遇到空描述符{szModName = (char*)((PBYTE)hModToHook+pImportDescriptor->Name) ; // 获取当前模块的名称printf("[*]Cur Module Name:%s\n",szModName); // 输出当前模块的名称if (stricmp(szModName,szModuleName) != 0) // 若当前模块名称与要钩取的模块名称不匹配{printf("[*]Module Name does not match, search next...\n"); // 输出模块名称不匹配的信息pImportDescriptor++; // 继续下一个导入描述符表continue; // 继续下一次循环}// 程序的导入表处理完毕后OriginalFirstThunk可能是无效的,不能再根据名称来查找,而是遍历FirstThunk直接根据地址判断pThunkData = (PIMAGE_THUNK_DATA)((BYTE *)hModToHook + pImportDescriptor->FirstThunk); // 获取导入函数表的地址while(pThunkData->u1.Function) // 遍历导入函数表,直到遇到空条目{lpAddr = (ULONG_PTR*)pThunkData; // 获取导入地址的指针// 找到了地址if((*lpAddr) == TargetFunAddr) // 如果导入地址与目标函数地址相等{printf("[*]Find target address!\n"); // 输出找到目标地址的信息// 通常情况下导入表所在内存页都是只读的,因此需要先修改内存页的属性为可写DWORD dwOldProtect; // 旧的保护属性MEMORY_BASIC_INFORMATION  mbi; // 内存页信息结构体VirtualQuery(lpAddr,&mbi,sizeof(mbi)); // 获取内存页的信息bRetn = VirtualProtect(mbi.BaseAddress,mbi.RegionSize,PAGE_EXECUTE_READWRITE,&dwOldProtect); // 修改内存页的保护属性为可写if (bRetn) // 如果修改成功{// 内存页属性修改成功,继续下一步操作,先保存原始数据if (pThunkPointer != NULL) // 如果指针不为空{*pThunkPointer = lpAddr ; // 将导入地址的指针赋值给pThunkPointer}if (pOriginalFuncAddr != NULL) // 如果指针不为空{*pOriginalFuncAddr = *lpAddr ; // 将导入地址的值赋值给pOriginalFuncAddr}// 修改地址*lpAddr = (ULONG_PTR)DetourFunc; // 将导入地址的值修改为钩子函数的地址result = TRUE ; // 操作成功// 恢复内存页的属性VirtualProtect(mbi.BaseAddress,mbi.RegionSize,dwOldProtect,0); // 恢复内存页的保护属性printf("[*]Hook ok.\n"); // 输出钩子成功的信息}break; // 跳出循环}//---------pThunkData++; // 继续下一个导入函数表条目}pImportDescriptor++; // 继续下一个导入描述符表}FreeLibrary(hModule); // 释放加载的模块return result; // 返回操作结果}

InLine Hook(改内容)

13.2  HOOK的分类

名目繁多的 Hook,总结起来其实只有两种:Address Hook和Inline Hook。

Address Hook:IAT、EAT、user32.dll的回调函数表、IDT(中断描述符表)、SSDT(系统服务描述符表)、C++类的虚函数表、COM接口的功能函数表、处理例程地址、特殊寄存器中的地址、特定的函数指针

Inline Hook:

基于异处理的HOOK

13.3 HOOK位置的挑选

影响最小的 Hook:应用程序中的call Hook,可精确到特定位置对特定 API的调用。

影响最大的Hook:在系统内核中,大部分Hook的位置都会影响整个系统的调用过程,越往下就越明显。

在内核中,KiFastCallEnlry和KeServiceDescriptorTable(含 Shadow)是两个绝佳的Hook位置。

13.4 HOOK的典型过程

Address Hook 的实施过程:定义Detour()函数、定义函数指针、查表(遍历匹配)替换原函数地址、关闭写保护、写入Detour()函数的地址

Inline Hook 的实施过程:确定 Hook方式及需要在Trampoline 中执行的指令、准备TrampolineFun函数、准备jmp指令并写入、CALLL HOOK

二次HOOK

13.5  Detour函数的典型用法

检查参数、检查结果、拦截调用或下发

13.6  HOOK中的注意事项

多线程安全、保存和恢复现场、注意返回值、避免重入

13.7  HOOK在X64平台上的新问题

指针的定义与操作、内存地址对齐、PE格式、调用约定的变化、跳转指令的问题、PatchGuard问题

13.8  HOOK技术的应用

实现增强的二次开发或补丁、信息截获、安全防护

13.9  HOOK的检测、恢复与对抗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

韩顺平0基础学Java——第13天

p264-p284 安装IDEA,熟悉一下软件。 尴尬了,难道是这个版本的idea不支持jdk17,难受住了 成功了,顺便跑一下昨天的作业: 这都要跑2秒?是电脑的问题还是谁的问题?控制台里跑的好快的哦 设置id…

Thingsboard规则链:Message type switch节点详解

在物联网解决方案中,数据的高效处理与自动化决策流程是实现智能化管理的基础。Thingsboard,作为一个强大的开源物联网平台,通过其规则引擎为用户提供了一系列灵活的节点来定制复杂的业务逻辑。其中,Message Type Switch节点是构建…

BookxNote Pro 宝藏 PDF 笔记软件

一、简介 1、BookxNote Pro 是一款专为电子书阅读和学习笔记设计的软件,支持多种电子书格式,如PDF和EPUB,能够帮助用户高效地管理和阅读电子书籍,同时具备强大的笔记功能,允许用户对书籍内容进行标注、摘录和思维导图绘…

Springboot启动时报错Property ‘mapperLocations‘ was not specified.

这几天没整boot 晚上直接运行不了了 本想是在表现层写点代码测测接口的 localhost8080找半天 结果404 先考虑好久 是不是url输入错了 然后 就发现 结果boot都不能启动了 JUnit也测不出来 找了半天 结果是开关机导致数据库没开 手动打开服务 找到MySQL启动 IDEA连接数据…

ssm/springoot养老院问诊服务预约系统_96316老年人服务系统

2.管理员: (1)登入注册页面:管理员进行操作时需要是已注册登入的 (2)权限管理:管理员登入后可以运用权限进行相应的操作管理。 (3)用户管理:对用户进行删除、…

国产数据库替代加速 助力数字中国建设

5月24日,随着第七届数字中国建设峰会在福州的成功举办,释放数据要素价值、发展新质生产力成为当下热议的话题。 数据作为新型生产要素,是数字化、网络化、智能化的重要基础。北京人大金仓信息技术股份有限公司(以下简称人大金仓&a…

OpenHarmony实战开发——宿舍全屋智能开发指南

项目说明 基于OpenAtom OpenHarmony(以下简称“OpenHarmony”)、数字管家开发宿舍全屋智能,实现碰一碰开门、碰一碰开灯、碰一碰开风扇以及烟感检测。因为各项目开发流程大体相似,本文主要以碰一碰开门为例介绍如何在现有OpenHar…

西储大学数据集学习

数据集下载地址:CWRU凯斯西储大学轴承数据数据集——附:下载链接_西储大学轴承数据集下载-CSDN博客 最近研究故障诊断,先对使用比较多的西储大学数据集研究。以资料【1】中的内容展开研究。 1、轴承的结构 轴承分为外圈、内圈、保持架和滚珠…

CC工具箱使用指南:【Word特定文本批量替换(BHM)】

一、简介 群友定制工具。 工具所要做的是批量更新Word模板中的特定文本。 输入参数为一个Word模板和Excel更新数据。 Word模板长这样: Word中需要更新的文本都用大括号及里内部的标签标注出来。 对应的Excel长这样: 第一行的标签和Word里的一一对应…

mysql 按区间统计 3 分钟维度

根据 UNIX_TIMESTAMP 去掉分钟后的的位数 思路如下select UNIX_TIMESTAMP(now()) 当前时间 秒,now() 当前时间,FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) / (3 * 60)) * (3 * 60)) 3分钟为分隔去掉多余位数当前时间 秒 当前时间 3分钟为分隔去掉多余…

【招聘】易基因科技诚聘销售总监 虚位以待

🚀 关于我们 易基因拥有一支充满活力的科研服务团队,致力于以“引领表观遗传学科学研究与临床应用”为愿景,依托高通量测序技术和云数据分析平台,为医疗机构、科研机构、企事业单位等提供以表观遗传学技术为核心的多组学科研服务…

翻译《The Old New Thing》- What did MakeProcInstance do?

What did MakeProcInstance do? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080207-00/?p23533 Raymond Chen 2008年02月07日 MakeProcInstance 做了什么? MakeProcInstance 宏实际上什么也不做。 #define MakeProcInst…

教师岗位等级划分标准

教师岗位等级的划分是否真的能够全面反映教师的专业能力和教学效果?晋升机制是否公正合理,能否真正激励教师持续进步? 教师岗位等级,其实就是对教师专业技能和教学经验的一种评价和激励。教师的岗位等级一般分为12个级别&#xff…

关于Profinet远程IO模块的超详细讲解

什么是Profinet远程IO模块 Profinet是新一代基于工业以太网技术的自动化总线标准,它为自动化通信领域提供了一个完整的网络解决方案,用于连接远程输入输出(IO)设备到Profinet网络。它可以通过以太网进行通信,并支持实…

I.MX6ULL主频和时钟配置实验

系列文章目录 I.MX6ULL主频和时钟配置实验 I.MX6ULL主频和时钟配置实验 系列文章目录一、前言二、I.MX6U 时钟系统详解三、硬件原理四、 7 路 PLL 时钟源五、时钟树简介六、内核时钟设置七、PFD 时钟设置八、AHB、IPG 和 PERCLK 根时钟设置九、实验程序编写十、编译下载10.1编写…

Java常用工具类、包装类

1、工具类的设计 一般地,把那些完成通用功能的方法分类存放到类中,这些类就叫工具类。 工具类起名:XxxUtil、XxxUtils、XxxTool、XxxTools等,其中Xxx表示一类事物,比如ArrayUtil、StringUtil、JdbcUtil。 工具类存放的…

JAVA GUI之自定义窗口

Java Gui的自定义窗口可以通过继承JFrame类来实现。下面是一个简单的例子来介绍如何创建一个自定义的Java Gui窗口: 导入必要的类库; 创建一个继承JFrame类的子类; 在子类的构造方法中设置窗口的属性;可以向窗口中添加组件,如按钮、标签等;最后,创建一个…

详析河南道路与桥梁乙级资质新办条件

河南道路与桥梁乙级资质新办条件详析如下: 一、企业基本条件 独立企业法人资格: 申请人必须是具有独立企业法人资格的单位。注册资金: 企业的注册资金应不少于100万元人民币。社会信誉: 申请人应具有良好的社会信誉,无…

安卓开机启动阶段

目录 概述一、boot_progress_start二、boot_progress_preload_start三、boot_progress_preload_end四、boot_progress_system_run五、boot_progress_pms_start六、boot_progress_pms_system_scan_start七、boot_progress_pms_data_scan_start八、boot_progress_pms_scan_end九、…

详解 Scala 的变量、标识符、数据类型

一、注释 Scala 注释与 Java 一致 // 单行注释/** 多行注释*//*** 文档注释*/二、变量与常量 1. 语法 // 变量,类型可以省略 var varName:varClass value // 常量,类型可以省略 val valName:valClass value2. 案例 // 使用 var/val 才会在类中声明属…