波动性 - 手动检查进程的堆

逆向工程 记忆 Python 数字取证 内存转储
2021-06-17 09:39:33

根据The Art of Memory Forensics[1] 一书,有一个堆插件可以从进程的堆内存中提取信息。我正在使用最新版本的波动性 - 2.6 ,但该heaps插件不起作用。

是否有任何替代方法可以使用 volshell 或任何插件从进程堆中提取信息?

[1] 光、迈克尔·黑尔等人。内存取证艺术:检测 Windows、Linux 和 Mac 内存中的恶意软件和威胁。约翰威利父子公司,2014 年。

2个回答

所以你的问题有点含糊。但是,即使没有提供您的目标系统、版本和使用的配置文件的附加信息,我也会尝试针对 Windows 系统给出一个介绍性的答案。

您可以使用PEB存储在_EPROCESS结构中的进程环境块 ( )来识别堆段。您应该考虑三个重要点:

  • PEB.ProcessHeap 代表主堆,在启动时总是被初始化。
  • PEB.NumberOfHeaps 一个进程可以额外创建堆。
  • PEB.ProcessHeaps指向进程堆的指针,其中偏移零指向PEB.ProcessHeap

另一种可能性是探索VAD结构。这本书给出了一个很好的介绍过滤过程的帮助下vadinfovadtree但是您应该始终考虑:堆的碎片只有在不交换到磁盘时才能被提取。因此,某些数据可能会丢失,因为这些页面尚未在您的转储中获取。

因此,我将重放一个与本书本身提供的示例类似的示例。期待一个有兴趣的正在运行的应用程序。

在此处输入图片说明

让我们首先提取感兴趣的进程及其对应的 PID:

python vol.py -f /media/sf_FODEB8/MW-PC-20170826-101847.raw --profile=Win7SP1x64 pslist | grep notepad
Volatility Foundation Volatility Framework 2.6
0xfffffa8000f6c060 notepad.exe            1596   2412      2       56      1      0 2017-08-26 10:17:11 UTC+0000 

我们在 vadtree 插件的帮助下检查堆结构并绘制出来:

python vol.py -f /media/sf_FODEB8/MW-PC-20170826-101847.raw --profile=Win7SP1x64 vadtree --output=dot --output-file=graph.dot -p 1596

xdot进程结构中的高亮堆检查图(红色节点):

在此处输入图片说明

启动了volshell通过与PID定义你的POI和手动检查不同的心室辅助装置:

python vol.py -f /media/sf_FODEB8/MW-PC-20170826-101847.raw --profile=Win7SP1x64 volshell -p 1596
Volatility Foundation Volatility Framework 2.6
Current context: notepad.exe @ 0xfffffa8000f6c060, pid=1596, ppid=2412 DTB=0x65eb000
Welcome to volshell! Current memory image is:
file:///media/sf_FODEB8/MW-PC-20170826-101847.raw
To get help, type 'hh()'

经过一番搜索(确定0x00000000001e0000+0x038c20是你的工作):

>>> db(0x00000000001e0000+0x038c20, 0xff)
0x00218c20  00 00 00 00 00 00 00 00 8b 2f bd 3e 48 69 00 2e   ........./.>Hi..
0x00218c30  0d 00 0a 00 54 00 68 00 69 00 73 00 20 00 69 00   ....T.h.i.s...i.
0x00218c40  73 00 20 00 73 00 75 00 70 00 65 00 72 00 20 00   s...s.u.p.e.r...
0x00218c50  73 00 65 00 63 00 72 00 65 00 74 00 20 00 2d 00   s.e.c.r.e.t...-.
0x00218c60  20 00 64 00 6f 00 6e 00 27 00 74 00 20 00 73 00   ..d.o.n.'.t...s.
0x00218c70  68 00 61 00 72 00 65 00 20 00 69 00 74 00 20 00   h.a.r.e...i.t...
0x00218c80  77 00 69 00 74 00 68 00 20 00 6f 00 74 00 68 00   w.i.t.h...o.t.h.
0x00218c90  65 00 72 00 20 00 70 00 61 00 72 00 74 00 69 00   e.r...p.a.r.t.i.
0x00218ca0  65 00 73 00 20 00 6f 00 72 00 20 00 70 00 65 00   e.s...o.r...p.e.
0x00218cb0  72 00 73 00 6f 00 6e 00 73 00 2e 00 0d 00 0a 00   r.s.o.n.s.......
0x00218cc0  0d 00 0a 00 0d 00 0a 00 54 00 48 00 49 00 45 00   ........T.H.I.E.
0x00218cd0  46 00 31 00 20 00 3a 00 20 00 49 00 20 00 77 00   F.1...:...I...w.
0x00218ce0  69 00 6c 00 6c 00 20 00 72 00 6f 00 62 00 20 00   i.l.l...r.o.b...
0x00218cf0  74 00 68 00 65 00 20 00 62 00 61 00 6e 00 6b 00   t.h.e...b.a.n.k.
0x00218d00  20 00 6e 00 65 00 78 00 74 00 20 00 77 00 65 00   ..n.e.x.t...w.e.
0x00218d10  65 00 6b 00 20 00 74 00 6f 00 20 00 65 00 61      e.k...t.o...e.a

另一种方法是简单地将特定进程的整个 VAD 结构转储到一个文件夹中,并粗略地忽略您的预期输出。

> mkdir vads
> python vol.py -f /media/sf_FODEB8/MW-PC-20170826-101847.raw --profile=Win7SP1x64 vaddump -p 1596 -D vads
Volatility Foundation Volatility Framework 2.6
Pid        Process              Start              End                Result
---------- -------------------- ------------------ ------------------ ------
      1596 notepad.exe          0x000000007ffe0000 0x000000007ffeffff vads/notepad.exe.1f76c060.0x000000007ffe0000-0x000000007ffeffff.dmp
      1596 notepad.exe          0x00000000002e0000 0x00000000003dffff vads/notepad.exe.1f76c060.0x00000000002e0000-0x00000000003dffff.dmp
      1596 notepad.exe          0x00000000000d0000 0x000000000014ffff vads/notepad.exe.1f76c060.0x00000000000d0000-0x000000000014ffff.dmp
      1596 notepad.exe          0x0000000000040000 0x0000000000041fff vads/notepad.exe.1f76c060.0x0000000000040000-0x0000000000041fff.dmp
      [SHORTENED]
      vads/notepad.exe.1f76c060.0x000007feff080000-0x000007feff080fff.dmp
      1596 notepad.exe          0x000007fffffdc000 0x000007fffffddfff vads/notepad.exe.1f76c060.0x000007fffffdc000-0x000007fffffddfff.dmp
      1596 notepad.exe          0x000007fffffd8000 0x000007fffffd8fff vads/notepad.exe.1f76c060.0x000007fffffd8000-0x000007fffffd8fff.dmp
      1596 notepad.exe          0x000007fffffde000 0x000007fffffdffff vads/notepad.exe.1f76c060.0x000007fffffde000-0x000007fffffdffff.dmp

检查转储显示:

xxd -a notepad.exe.1f76c060.0x00000000001e0000-0x00000000002dffff.dmp | less

  *
  0038c20: 0000 0000 0000 0000 8b2f bd3e 4869 002e  ........./.>Hi..
  0038c30: 0d00 0a00 5400 6800 6900 7300 2000 6900  ....T.h.i.s. .i.
  0038c40: 7300 2000 7300 7500 7000 6500 7200 2000  s. .s.u.p.e.r. .
  0038c50: 7300 6500 6300 7200 6500 7400 2000 2d00  s.e.c.r.e.t. .-.
  0038c60: 2000 6400 6f00 6e00 2700 7400 2000 7300   .d.o.n.'.t. .s.
  0038c70: 6800 6100 7200 6500 2000 6900 7400 2000  h.a.r.e. .i.t. .
  0038c80: 7700 6900 7400 6800 2000 6f00 7400 6800  w.i.t.h. .o.t.h.
  0038c90: 6500 7200 2000 7000 6100 7200 7400 6900  e.r. .p.a.r.t.i.
  0038ca0: 6500 7300 2000 6f00 7200 2000 7000 6500  e.s. .o.r. .p.e.
  0038cb0: 7200 7300 6f00 6e00 7300 2e00 0d00 0a00  r.s.o.n.s.......
  0038cc0: 0d00 0a00 0d00 0a00 5400 4800 4900 4500  ........T.H.I.E.
  0038cd0: 4600 3100 2000 3a00 2000 4900 2000 7700  F.1. .:. .I. .w.
  0038ce0: 6900 6c00 6c00 2000 7200 6f00 6200 2000  i.l.l. .r.o.b. .
  0038cf0: 7400 6800 6500 2000 6200 6100 6e00 6b00  t.h.e. .b.a.n.k.
  0038d00: 2000 6e00 6500 7800 7400 2000 7700 6500   .n.e.x.t. .w.e.
  0038d10: 6500 6b00 2000 7400 6f00 2000 6500 6100  e.k. .t.o. .e.a.
  0038d20: 7200 6e00 2000 6100 2000 7300 6800 6900  r.n. .a. .s.h.i.
  0038d30: 7400 2000 7400 6f00 6e00 2000 6f00 6600  t. .t.o.n. .o.f.
  0038d40: 2000 6d00 6f00 6e00 6500 7900 2e00 2e00   .m.o.n.e.y.....
  0038d50: 2e00 0d00 0a00 5400 4800 4900 4500 4600  ......T.H.I.E.F.
  0038d60: 3200 2000 3a00 2000 5300 6f00 7500 6e00  2. .:. .S.o.u.n.
  0038d70: 6400 7300 2000 6700 7200 6500 6100 7400  d.s. .g.r.e.a.t.
  0038d80: 2000 2100 2000 4c00 6500 7400 2700 7300   .!. .L.e.t.'.s.
  0038d90: 2000 6400 6f00 2000 6900 7400 2100 0d00   .d.o. .i.t.!...
  0038da0: 0a00 5400 4800 4900 4500 4600 3100 2000  ..T.H.I.E.F.1. .
  0038db0: 3a00 2000 4800 6500 7200 6500 2000 6100  :. .H.e.r.e. .a.
  0038dc0: 7200 6500 2000 7300 6f00 6d00 6500 2000  r.e. .s.o.m.e. .
  0038dd0: 7000 6100 7300 7300 7700 6f00 7200 6400  p.a.s.s.w.o.r.d.
  0038de0: 7300 0d00 0a00 5400 4800 4900 4500 4600  s.....T.H.I.E.F.
  0038df0: 3100 2000 3a00 2000 7300 7500 7000 6500  1. .:. .s.u.p.e.
  0038e00: 7200 5300 6500 6300 7200 6500 7400 3100  r.S.e.c.r.e.t.1.
  0038e10: 3300 3300 3700 0d00 0a00 5400 4800 4900  3.3.7.....T.H.I.
  0038e20: 4500 4600 3100 2000 3a00 2000 4100 5300  E.F.1. .:. .A.S.
  0038e30: 4400 4600 3100 3300 3300 3700 0000 0000  D.F.1.3.3.7.....

您还可以查看以下插件

更好的方法是创建我们自己的插件作为 vadinfo.py 插件的一个分支。这真的很容易,即使您不了解 Python。

首先,从 GitHub此处获取波动率大师

在您的工作目录中,创建一个“插件”目录。从波动率大师中,提取此目录中的波动率/插件/vadinfo.py 文件。将此 vadinfo.py 重命名为 vaddumpheaps.py。编辑文件。

删除除导入VADInfoVADDump类之外的所有内容。

添加此导入:

from volatility.plugins.vadinfo import VADInfo

重命名类VADDumpVADDumpHeaps

在该__init__()方法的末尾,添加以下几行:

config.add_option("HEAPS-ONLY", short_option = 'H', default = False,
                  action = 'store_true', help = 'Heaps only')

render_text()方法中,寻找这个循环:

for vad, _addrspace in task.get_vads(vad_filter = filter, skip_max_commit = True):

在循环之前,添加以下行:

heaps = task.Peb.ProcessHeaps.dereference()

在循环中,在第一次测试之后,添加以下几行:

if self._config.HEAPS_ONLY and not vad.Start in heaps:
    continue

保存文件。

从您的目录(包含新的插件目录,包含新的 vaddumpheaps.py)运行波动率-2.6.exe:

mkdir 666Heaps
volatility-2.6.exe --plugins=plugins -p 666 -D 666Heaps -H vaddumpheaps

这假定您创建了一些包含类似内容的 .volatilityrc 文件,以避免每次调用 volatility-2.6.exe 时都必须指定文件和配置文件:

[DEFAULT]
PROFILE=Win7SP1x86
LOCATION=file://memory.dmp

新插件将仅转储 VAD 堆。很有用。