安全矩阵

 找回密码
 立即注册
搜索
查看: 863|回复: 0

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

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2022-9-16 14:00:04 | 显示全部楼层 |阅读模式

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

原文链接:九维团队-青队(处置)| 代码注入和钩子(一)
原创 pwnda 安恒信息安全服务 2022-09-16 09:27 发表于北京

写在前边

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.因文章整体内容较长,完整内容将会在本公众号拆分为多篇内容分别发出。本文为该系列的第一篇。

在先前的系列推文恶意样本分析之恶意软件的功能和持久化中,我们研究了恶意软件用来留在受害者系统中的不同持久性机制。在本次的系列内容中,大家将可以学习到恶意程序如何将代码注入另一个进程(称为目标进程或远程进程)以执行恶意行动。

将恶意代码注入目标进程的内存并在目标进程的上下文中执行恶意代码的技术被称为代码注入(或进程注入)。

攻击者通常选择一个合法进程(如explorer.exe或svchost.exe)作为目标进程。一旦恶意代码被注入目标进程,它就可以在目标进程的上下文中执行恶意行为,如记录击键、窃取密码和渗出数据。

在将代码注入目标进程的内存后,负责注入代码的恶意软件组件可以继续在系统上持续存在,从而在每次系统重启时将代码注入目标进程,或者它可以从文件系统中删除自己,只将恶意代码保留在内存中。

在我们深入研究恶意软件的代码注入技术之前,必须了解虚拟内存的概念。





虚拟内存


当我们双击一个包含指令序列的程序时,就会创建一个进程。Windows操作系统为每个新创建的进程提供自己的私有内存地址空间(称为进程内存)。

进程内存是虚拟内存的一部分;虚拟内存不是真正的内存,而是由操作系统的内存管理器创造的一种假象。正是由于这种假象,每个进程都认为它有自己的私有内存空间。

在运行期间,Windows内存管理器在硬件的帮助下,将虚拟地址转化为实际数据所在的物理地址(在RAM中);为了管理内存,它将一些内存分页到磁盘。当进程的线程访问被分页到磁盘的虚拟地址时,内存管理器将其从磁盘装回内存。下图说明了两个进程,A和B,它们的进程内存被映射到物理内存中,而有些部分被分页到磁盘上。

编辑

由于我们通常处理的是虚拟地址(即我们在调试器中看到的那些),所以在本文的其余部分,我们将不讨论物理内存而只关注虚拟内存。

虚拟内存被划分为进程内存(进程空间或用户空间)和内核内存(内核空间或系统空间)。虚拟内存地址空间的大小取决于硬件平台。

例如,在32位架构上,默认情况下,总的虚拟地址空间(包括进程和内核内存)最大为4GB。低于一半的部分(下2GB空间),范围从0x00000000到0x7FFFFFFF被保留给用户进程(进程内存或用户空间),地址的上半部分(上2GB空间)范围从0x80000000到0xFFFFFFFF,被保留给内核内存(内核空间)。

在32位系统中,在4GB的虚拟地址空间中,每个进程认为它有2GB的进程内存,范围从0x00000000 - 0x7FFFFFFF。由于每个进程认为它有自己的私有虚拟地址空间(最终被映射到物理内存),总的虚拟地址会比可用的物理内存(RAM)大很多。

Windows内存管理器通过将一些内存分页到磁盘来解决这个问题;这释放了物理内存,它可以用于其他进程或操作系统本身。尽管每个Windows进程都有自己的私有内存空间,但内核内存在大多数情况下是公用的,并由所有进程共享。

下图显示了32位架构的内存布局。

编辑

我们能注意到在用户空间和内核空间之间有一个64KB的空隙;这个区域是不可访问的,它可以确保内核不会意外地越过边界而破坏用户空间。

我们可以通过检查符号MmHighestUserAddress来确定进程地址空间的上边界(最后可用的地址),通过使用内核调试器(如Windbg)查询符号MmSystemRangeStart来确定内核空间的下边界(第一个可用地址)。

即使每个进程的虚拟地址范围是相同的(x00000000 - 0x7FFFFFFF),硬件和Windows都确保映射到这个范围的物理地址对每个进程是不同的。

例如,当两个进程访问同一个虚拟地址时,每个进程最终将访问物理内存中的不同地址。通过为每个进程提供私有的地址空间,操作系统确保进程不会覆盖对方的数据。

虚拟内存空间不需要总是被分成2GB的两半,这只是默认设置。例如,你可以通过以下命令启用3GB的启动开关,将进程内存增加到3GB,范围从0x00000000 - 0xBFFFFFFF;内核内存得到剩余的1GB,从0xC0000000-0xFFFFFFFF。
bcdedit /set increaseuserva 3072

x64架构为进程和内核内存提供更大的地址空间,如下图所示。

编辑

在x64架构上,用户空间的范围是0x000000000000-0x000007ffffffff,而内核空间的范围是0xffff080000000000及以上。你可能会注意到在用户空间和内核空间之间有一个巨大的地址差距;这个地址范围是不能使用的。

尽管在上面的截图中,内核空间是从0xffff080000000000开始的,但内核空间的第一个可用地址是从ffff800000000开始的。原因是x64代码中使用的所有地址都必须是规范的。如果一个地址的第47-63位全部被设置或全部被清除,那么这个地址就是规范的的。试图使用一个非规范的地址会导致一个页面故障异常。

1、进程内存组件(用户空间)

有了对虚拟内存的了解,让我们把注意力集中在虚拟内存的一部分,即进程内存。进程内存是用户应用程序使用的内存。下图显示了两个进程,并给出了驻留在进程内存中的组件的高级概述。在下图中,为了简单起见,内核空间被故意留空(我们将在下一节中填补这一空白)。请记住,进程共享相同的内核空间。

编辑

过程存储器由以下主要部分组成:
进程可执行文件

这个区域包含与应用程序相关的可执行文件。当双击磁盘上的一个程序时,就会创建一个进程,并将与该程序相关的可执行文件加载到进程内存中。

动态链接库(DLLs

当一个进程被创建时,其所有相关的DLLs被加载到进程内存中。这个区域代表与进程相关的所有DLLs。

进程环境变量

这个内存区域存储进程的环境变量,如临时目录、主目录、AppData目录等等。

进程堆(s)

这个区域指定了进程的堆。每个进程有一个单一的堆,并且可以根据需要创建额外的堆。这个区域指定了进程所接受的动态输入。

线程堆栈(s)

这个区域代表分配给每个线程的进程内存的专用范围,称为其运行时堆栈。每个线程都有自己的堆栈,在这里可以找到函数参数、局部变量和返回地址。

• 进程环境块(PEB)

这个区域代表了PEB结构,它包含了关于可执行文件的加载位置、它在磁盘上的完整路径以及在内存中找到DLL的信息。

可以通过使用Process Hacke工具来检查一个进程的内存内容。要做到这一点,启动Process Hacker,右键单击所需的进程,选择属性,并选择内存选项卡。
Process Hacke下载网址https://processhacker.sourceforge.io/*左右滑动查看更多

2、内核内存内容(内核空间)

内核内存包含操作系统和设备驱动程序。下图显示了用户空间和内核空间的组件。在本节中,我们将主要关注内核空间的组件。

编辑

内核内存由以下关键部分组成:
hal.dll

硬件抽象层(HAL)是在可加载的内核模块hal.dll中实现的。HAL将操作系统与硬件隔离;它实现了支持不同硬件平台(主要是芯片组)的功能。它主要为Windows执行器、内核和内核模式设备驱动程序提供服务。内核模式设备驱动程序调用hal.dll暴露的功能与硬件进行交互,而不是直接与硬件进行通信。
ntoskrnl.exe

这个二进制文件是被称为内核镜像的Windows操作系统的核心组件。ntoskrnl.exe二进制文件提供两种类型的功能:执行和内核。

执行器实现了被称为系统服务例程的功能,用户模式的应用程序可以通过一个受控机制调用这些功能。执行器还实现了主要的操作系统组件,如内存管理器、I/O管理器、对象管理器、进程/线程管理器等。

内核实现了低级别的操作系统服务,并公开了一系列的例程,这些例程由执行器建立,以提供高级别的服务。

Win32K.sys

这个内核模式的驱动程序实现了用户界面和图形设备接口(GDI)服务,这些服务用于在输出设备(如显示器)上渲染图形。它为GUI应用程序提供功能。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-29 15:29 , Processed in 0.014476 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表