九维团队-青队(处置)| 代码注入和钩子(七)

admin 2022年11月11日12:30:59评论111 views字数 2998阅读9分59秒阅读模式

九维团队-青队(处置)| 代码注入和钩子(七)

写在前边

1.本文原文为K A, Monnappa. 2018年发表的《Learning Malware Analysis》,本文的相关内容均为笔者对相关内容的翻译及实践记录,仅供各位学术交流使用。另出于易读性考虑,对部分字句有所删改。 
2.如各位需要引用,请做原文引用,格式如下所示: 
[序号]K A, Monnappa. LearningMalware Analysis[M]. 2018.06. Published by Packt Publishing Ltd. Livery Place 35 Livery Street Birmingham B3 2PB, UK. 
3.因文章整体内容较长,完整内容将会在本公众号拆分为多篇内容分别发出。本文为该系列的第七篇。
往期内容请参见合集《Learning Malware Analysis》



钩子技术




到目前为止,我们已经看了不同的代码注入技术来执行恶意代码。攻击者将代码(主要是DLL,但也可以是可执行文件或shellcode)注入合法(目标)进程的另一个原因是为了勾住目标进程的API调用。一旦代码被注入到目标进程中,它就可以完全访问进程内存,并可以修改其组件。改变进程内存组件的能力允许攻击者替换IAT中的条目或修改API函数本身,这种技术被称为钩子。通过钩子API(hook api),攻击者可以控制程序的执行路径,并将其重新引导到他选择的恶意代码中。然后,该恶意函数可以:

* 阻止合法应用程序(如安全产品)对API的调用。

* 监控和拦截传递给API的输入参数。

* 过滤从API返回的输出参数。


在本节中,我们将研究不同类型的挂钩技术。


4.1

IAT 钩子


如前所述,IAT包含一个应用程序从DLLs导入的函数地址。在这种技术中,当一个DLL被注入到目标(合法)进程中后,被注入的DLL中的代码(Dllmain()函数)会钩住IAT中目标进程的入口。下面给出了用于执行这种钩子步骤的高级概述:

* 通过解析内存中的可执行镜像,找到IAT的位置。

* 确定要钩住的函数的入口。 

* 用恶意函数的地址替换该函数的地址。


 为了帮助各位读者理解,下面让我们看一个合法程序通过调用DeleteFileA()API来删除一个文件的例子。


DeleteFileA()对象接受一个参数,即要删除的文件的名称。下面的截图显示了合法程序(在上钩之前)正常通过IAT确定DeleteFileA()的地址,然后在kernel32.dll中调用DeleteFileA()。

九维团队-青队(处置)| 代码注入和钩子(七)


当程序的IAT被钩住时,IAT中DeleteFileA()的地址被替换为恶意函数的地址,如下所示。

现在,当合法程序调用DeleteFileA()时,该调用被重定向到恶意软件模块中的恶意函数。恶意函数随后调用原来的DeleteFileA()函数,以使它看起来一切正常。在中间的恶意函数可以阻止合法程序删除文件,或者监视参数(正在被删除的文件),然后采取一些其他动作。

九维团队-青队(处置)| 代码注入和钩子(七)


除了通常在调用原始函数之前发生的阻断和监控之外,恶意函数还可以过滤输出参数,这发生在重新调用之后。这样,恶意软件可以钩住显示进程、文件、驱动、网络端口等列表的API,并过滤输出以躲避使用这些API函数的工具。


对于使用这种技术的攻击者来说,其缺点是如果程序使用运行时链接(动态链接),或攻击者希望钩子的功能已作为表的内容导入,此时它就不起作用。另一个缺点则是IAT钩子很容易被发现。在正常情况下,IAT中的条目应该位于其相应模块的地址范围内。例如,DeleteFile()的地址应该在kernel32.dll的地址范围内。


为了检测这种挂钩技术,安全产品可以识别IAT中不在其模块地址范围内的条目。在64位Windows上,一项名为PatchGuard的技术可以阻对包括IAT在内的调用表进行修补。由于这些问题,恶意软件作者使用了一种略微不同的钩子技术,接下来将讨论这个问题。

4.2

内联钩子inline hooking

(内联修补)


IAT钩子依赖于交换函数指针,而在内联钩子中,API函数本身被修改(打补丁)以将API重定向到恶意代码。与IAT钩子技术一样,这种技术允许攻击者拦截、监测和阻止特定应用程序的调用,并过滤输出参数。


在内联钩子中,目标API函数的前几个字节(指令)通常被一个跳转语句所覆盖,该语句将程序控制重新引导到恶意代码。然后恶意代码可以拦截输入参数,过滤输出,并将控制权重定向到原始函数。


为了帮助大家理解,让我们假设一个攻击者想钩住一个合法应用程序所做的DeleteFileA()函数调用。通常情况下,当合法应用程序的线程遇到对DeleteFileA()的调用时,该线程会从DeleteFileA()函数的起点开始执行,如下所示。

九维团队-青队(处置)| 代码注入和钩子(七)


为了用跳转取代函数的前几条指令,恶意软件需要选择一些指令来取代。jmp指令至少需要5个字节,所以恶意软件需要选择占用5个字节以上的指令。


在上图中,替换前三条指令(使用不同颜色突出显示)是安全的,因为它们正好占用5个字节,而且这些指令除了设置堆栈框架外,没有什么作用。在DeleteFileA()中要替换的三条指令被复制,然后用某种跳转语句替换,将控制权转移到恶意函数中。


恶意函数做它想做的事,随后执行DeleteFileA()的原始三条指令,并跳回位于补丁下面的地址(在跳转指令下面),如下图所示。被替换的指令,连同返回目标函数的跳转语句,被称为蹦床。

九维团队-青队(处置)| 代码注入和钩子(七)


这种技术可以通过寻找API函数开始时的意外跳转指令来检测,但要注意的是恶意软件可以通过在API函数中插入更深的跳转,而不是在函数开始时插入,从而使检测变得困难;或是使用恶意软件可能会使用call指令,或push和ret指令的组合来重定向控制。这种技术可以绕过安全工具,因为安全工具只寻找jmp指令。


有了对内联钩子的了解,让我们来看看恶意软件(Zeus Bot)使用这种技术的例子。


宙斯机器人钩住了各种API函数;其中之一是Internet Explorer(iexplore.exe)的HttpSendRequestA()。通过钩住这个函数,恶意软件可以从POST有效载荷中提取凭证。在挂钩之前,恶意可执行文件(包含各种功能)被注入到Internet Explorer的地址空间。下面的截图显示了地址0x33D0000,可执行文件被注入其中。

九维团队-青队(处置)| 代码注入和钩子(七)


在注入可执行文件后,HttpSendRequestA()被钩住,将程序控制重定向到注入的可执行文件中的一个恶意函数。在我们看这个被钩住的函数之前,让我们看一下合法的HttpSendRequestA()函数的前几个字节(如图所示)。

九维团队-青队(处置)| 代码注入和钩子(七)


前三个指令(占用5个字节,在前面的截图中突出显示)被替换为重定向控制。下面的截图显示了挂钩后的HttpSendRequestA()。前三条指令被替换为jmp指令(占用5个字节);注意跳转指令是如何将控制权重定向到地址为0x33DEC48的恶意代码上的,这属于注入的可执行程序的地址范围。

九维团队-青队(处置)| 代码注入和钩子(七)

(未完待续)




—  往期回顾  —


九维团队-青队(处置)| 代码注入和钩子(七)

九维团队-青队(处置)| 代码注入和钩子(七)

九维团队-青队(处置)| 代码注入和钩子(七)

九维团队-青队(处置)| 代码注入和钩子(七)

九维团队-青队(处置)| 代码注入和钩子(七)



关于安恒信息安全服务团队
安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。

九维团队-青队(处置)| 代码注入和钩子(七)


九维团队-青队(处置)| 代码注入和钩子(七)
九维团队-青队(处置)| 代码注入和钩子(七)


原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 代码注入和钩子(七)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月11日12:30:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-青队(处置)| 代码注入和钩子(七)https://cn-sec.com/archives/1403515.html

发表评论

匿名网友 填写信息