在日常应用中,某些程序往往会被第三方程序下钩子(hook)。如果被下钩子的进程是我们的进程,并且第三方钩子严重影响了我们的逻辑和流程,我们就需要把这些钩子摘掉(Unhook)。本件讲述一种在32位系统上,如何摘掉API钩子的思路和方法。(转载请指明来源于breaksoftware的CSDN博客)

Hook的相应介绍已经很多了,如果对这个技术不是很了解的,可以先搜索下了解下。

一般来说,我们比较熟悉的函数的起始指令是:

push        ebp
mov         ebp,esp 

这两条指令是为了保存前一个函数的栈基址,并将本函数的栈顶指针保存到ebp寄存器中。这样的设计是非常有意义的,在windows平台上,栈的扩展方向是从大端到小端,即由高地址向低地址扩展以申请更大的栈空间。esp则指向栈顶,然而栈顶会根据栈申请和释放而变化,所以如果以esp作为基址来计算变量的位置,将导致一会儿[esp-10]代表变量A,一会儿[esp-20]代表变量A。

虽然这样的结构有种种好处,但是这个肯定不是必须的。所以函数的起始地址指令是不确定的。这儿之所以说这么一大堆,是想说明,Hook库对不同的API进行Hook的方式是不同的。有的是修改函数入口地址的代码,比如上面的入口地址指令可以被Hook库以jmp xxxx来代替。这样就实现了API Hook。本文所讨论和实验的方法也是针对jmp型Hook。

我们以CreateProcessInternalW函数为例,我们看下其汇编代码:

_CreateProcessInternalW@48:
77023BBB  push        654h
77023BC0  push        77024968h
77023BC5  call        __SEH_prolog4_GS (7701415Ch)

我们使用Hook库下钩子,可以发现其代码变成:

_CreateProcessInternalW@48:
77023BBB  jmp         HookApiByDectours::Mine_CreateProcessInternalW (0A927E0h)
77023BC0  push        77024968h
77023BC5  call        __SEH_prolog4_GS (7701415Ch)  

我们的思路很简单,就是——以其人之道还治其人之身。

我将从被Hook函数的PE文件中,读取原来的代码,然后和现在内存中的代码做对比。如果不同,则被hook,并将不同的地方改成PE文件中的函数代码。其中涉及的PE知识可以参考《PE文件和COFF文件格式分析》。其中最需要关注的是《PE文件和COFF文件格式分析——导出表》,该文讲述了如何从PE文件中获取代码地址的方法。

具体的替换代码是:

BOOL CUnHookDllFunc::UnHook()
{BOOL bSuc = FALSE;do {LPBYTE lpFunStart = m_lpStart + m_dwRA;HMODULE hModule = GetModuleHandleA(m_strDllPath.c_str());if ( NULL == hModule ) {break;}LPBYTE lpOriFuncAddr = (LPBYTE)hModule + m_dwRVA;DWORD dwModifyCount = 0;for ( int n = 0; n < MAXCOMPCOUNT; n++ ) {if ( *(lpOriFuncAddr + n) != *(lpFunStart + n) ) {dwModifyCount++;}}if ( dwModifyCount == 0 ) {bSuc = TRUE;}else if ( dwModifyCount == MAXCOMPCOUNT ) {// 超过则认为不支持break;}else {DWORD dwOldPro = 0;if ( FALSE == VirtualProtect(lpOriFuncAddr, dwModifyCount, PAGE_EXECUTE_READWRITE, &dwOldPro )) {DWORD dwLastErr = GetLastError();break;}for ( DWORD dwIndex = 0; dwIndex < dwModifyCount; dwIndex++ ) {*(lpOriFuncAddr + dwIndex) = *(lpFunStart + dwIndex);}VirtualProtect(lpOriFuncAddr, dwModifyCount, dwOldPro, &dwOldPro);bSuc = TRUE;}} while (0);return bSuc;
}

最后附上测试工程。其Hook了和UnHook的状态如下图。

PE文件和COFF文件格式分析——导出表的应用——一种摘掉Inline钩子(Unhook)的方法相关推荐

  1. PE文件和COFF文件格式分析——导出表的应用——一种插件模型

    可能在很多人想想中,只有DLL才有导出表,而Exe不应该有导出表.而在<PE文件和COFF文件格式分析--导出表>中,我却避开了这个话题.我就是想在本文中讨论下载Exe中存在导出表的场景. ...

  2. PE文件和COFF文件格式分析——导出表的应用——通过导出表隐性加载DLL

    通过导出表隐性加载DLL?导出表?加载DLL?还隐性?是的.如果觉得不可思议,可以先看<PE文件和COFF文件格式分析--导出表>中关于"导出地址表"的详细介绍.(转载 ...

  3. PE文件和COFF文件格式分析——导出表

    在之前的<PE可选文件头>相关博文中我们介绍了可选文件头中很多重要的属性,而其中一个非常重要的属性是(转载请指明来源于breaksoftware的CSDN博客) IMAGE_DATA_DI ...

  4. PE文件和COFF文件格式分析——RVA和RA相互计算

    之前几节一直是理论性质的东西非常多.本文将会讲到利用之前的知识得出一个一个非常有用的一个应用.(转载请指明来源于breaksoftware的csdn博客) 首先我们说下磁盘上A.exe文件和正在内存中 ...

  5. PE文件和COFF文件格式分析——节信息

    在<PE文件和COFF文件格式分析--签名.COFF文件头和可选文件头3>中,我们看到一些区块的信息都有偏移指向.而我们本文讨论的节信息是没有任何偏移指向的,所以它是紧跟在可选文件头后面的 ...

  6. PE文件和COFF文件格式分析--概述

    刚工作的时候,我听说某某大牛在做病毒分析时,只是用notepad打开病毒文件,就能大致猜到病毒的工作原理.当时我是佩服的很啊,同时我也在心中埋下了一个种子:我也得有这天.随着后来的工作进行,一些任务的 ...

  7. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

    本文将讨论PE文件中非常重要的一部分信息.(转载请指明来源于breakSoftware的CSDN博客) 首先说一下VC中对应的数据结构."签名.COFF文件头和可选文件头"这三部分 ...

  8. PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段

    MS 2.0节是PE文件格式中第一个"节".其大致结构如下:(转载请指明来源于breaksoftware的csdn博客) 在VC\PlatformSDK\Include\WinNT ...

  9. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头2

    之前的博文中介绍了IMAGE_FILE_HEADER结构,现在来讨论比较复杂的"可选文件头"结构体.(转载请指明来自breaksoftware的csdn博客)先看下其声明 type ...

最新文章

  1. 奇葩注释大盘点,你觉得哪个最牛逼?
  2. Dataset之OttoGroup:OttoGroup数据集的简介、下载、案例应用之详细攻略
  3. 3-5 单链表分段逆转 (20 分)
  4. BFC(块级格式化上下文)【面试】
  5. mysql按时间月份查询数据
  6. 24. 当效率至关重要时,请在map::operator[]与map::insert之间谨慎作出选择
  7. Url传值的Get method and Post method
  8. NYOJ题目1045看美女
  9. CS领域论文数据分析
  10. 如何看懂财务报表:(一)如何下载财报
  11. JavaScript(JS) date.getDate()
  12. Solr Tokenizers分词器介绍
  13. docker中各ID之间的关系和计算(二)-layerID-diffID-chainID-cacheID的计算
  14. 一、<a>标签如何实现下载
  15. 在EXCEL使用VLOOKUP函数实现自动匹配
  16. 动态规划解决0-1背包问题详解(图文并茂)
  17. html页面滚动条设置
  18. 通过icon hash查IP地址
  19. 位运算的一些技巧总结
  20. 工作-大四实习生面经

热门文章

  1. matplotlib绘制图表,设置刻度标签、最大最小刻度、字体大小,label位置、刻度轴箭头等
  2. 图像识别-opencv
  3. PCL:点云配准1、基础知识:平面3自由度、旋转矩阵精讲
  4. Latex使用简单总结
  5. 数据结构与算法(6-4)线索二叉树
  6. 【目标检测】(5) YOLOV1 目标检测原理解析
  7. 【MediaPipe】(4) AI视觉,远程手势调节电脑音量,附python完整代码
  8. CornerNet的配置、训练与测试
  9. 【点云论文速读】最佳点云分割分析
  10. 剑指offer: 面试题03. 数组中重复的数字