background
9
*
m
/
d
6
=
/
@
1
)
x
(
l
g
f
d
k
8
Q
7
I
4
q
7
[
Z
r
;
d
F
j

favicon
favicon
Reverier 的博客
 

又要挖坑了,为什么记忆里总是在挖坑

Reverier-Xu at 2023-10-30 19:31:38 CTFReverseForensics Development CC-BY-NC-SA 4.0

开始之前……

第一集第二集第零集 呢?!

嘛……

想法

关于这个坑之前有过一些 尝试,但是由于坑太多了于是就搁置了,只有一些 博客 作为技术储备留了下来,这次填上。电子数据取证软件是个大坑,需要很多的技术积累和经验积累,也注定这个坑会填很久。在设计架构的时候,我希望能够尽量用可扩展、可复用的方式设计一套优秀的方案出来,这样就能先投入生产环境,然后根据具体的需求慢慢进行扩展。这篇博客作为开端,主要是做一下初步的架构设想,然后确定一下最初开发的方向和技术栈。

数据取证软件?文件浏览器!(?)

其实电子取证软件就是一个大号浏览器,然后搭载了所谓自动取证分析等等功能,实际上就是 walk dir 并按照事先设置好的规则进行证据提取。所以软件的架构设计应该围绕着最核心的功能进行,也就是对于各种镜像/设备格式的访问和提取。

如果调研一下市面上已经有的镜像/取证包格式,就会发现这个“访问”其实并不是那么好做。现代计算机的存储架构是很复杂的,就拿一个普通的个人 PC 来说,我们先把磁盘看作是一整个 数据空间,那么在这个空间之上进行数据分配的就是 分区表(Partition Table)。然后分区表会决定磁盘上的分区情况,固定了起始地址等等。按照分区表的指引找到某个分区之后,文件系统(File System) 在等着我们做解析工作。磁盘和分区表在软件层面种类尚且有限,文件系统就是个 百鬼夜行 百花齐放的东西了。每种文件系统实现都有其特殊的用途,例如 ZFS、BtrFS 等等,每种分区的解析工作都比较复杂。进入文件系统之后,剩下的路就比较好走了,都是标准的文件访问模型,有文件夹、文件、链接等等。不同文件系统在这里可能会有特性上的区别,例如 ext4 的 inode、NTFS 的额外文件属性等,这些对于取证软件而言倒不是特别重要。

但是这样就完了吗?当然不是!笔者曾经见过有人直接在服务器上把某个硬盘直接格式化成单独分区使用的,这里就绕过了分区表一层(关于这件事,笔者差点删掉了学姐的毕业论文数据,还好损失的都是些机器学习的原始训练集,不太打紧,有空的话单独写一篇博客讲讲);而且现在 分布式存储 也很流行,一块数据可能以各种形式分块存在不同的磁盘中;为了增加数据存储的稳定性,多块硬盘还可以组成 磁盘阵列…… 总之都是我们需要解决的麻烦事,并不是只要按照 层级 去分别设计访问模型就可以的。

根据上面的各种棘手情况,访问模型要有以下的设计结构:

暂时想到的就这些,有的话等写着写着发现了再补充。

访问架构

之前博客里写过的,大致如下:

    组件层:文件浏览、自动化证据提取、证据笔记……
 ====================================================================
    虚拟数据访问平台:提供抽象文件访问服务
 ====================================================================
    访问器:负责按照层级与具体的规则访问镜像文件等,并向上级返回数据

访问器将所有的细节都封装了起来,虚拟数据访问平台向组件层提供与环境无关的、统一的数据访问接口,而组件层负责进行二进制/文本数据的抽象分析。而访问器的统一 API 可以导出为 Python API,然后平台附带一个 Python 环境,给用户足够高的扩展能力。

架构集成

有了上述访问器的架构描述,感觉我们可以往更有趣的方向探索一下。如果我们能把这种文件访问能力抽象成一个完整的磁盘/文件系统 API 呢?这样一来,就可以直接对虚拟机提供磁盘服务了!如果能够集成 QEMU 之类的虚拟机软件,我们甚至可以通过几次点击,直接以取证软件本身为载体,复原出案发时的机器架构!这样一来就可以省下一部分用来重构网站的精力了(当然,运维该做的事情还是要做)。

接下来的事情

进入实现之后可能还会有各种有趣的事情和挑战,希望能做为一个系列给我的博客多添几篇水货。