python-haystack 内存取证 ################################
|travis| |coverage| |landscape| |pypi| |docs|
docs/ 文件夹中的 快速使用指南 <docs/Haystack_basic_usage.ipynb>_。
docs/ 文件夹中的 Haystack-reverse CLI <docs/Haystack_reverse_CLI.ipynb>_。
更多文档 <http://python-haystack.readthedocs.io/en/latest/>_
python-haystack 是一个堆分析框架,专注于搜索和逆向已分配内存中的 C 结构体。
第一个功能/API 是 SEARCH 函数。 它可以在进程内存转储或活动进程内存中搜索已知的记录类型。
第二个功能/API 是扩展 python-haystack-reverse <https://github.com/trolldbois/python-haystack-reverse>_ 中的 REVERSE 函数。
它旨在帮助分析人员逆向存在于进程堆中的内存记录类型。
它专注于从内存中重建和分类经典的 C 结构体。
它试图重新创建类型定义。
存在几个入口点来处理你的内存转储格式。
haystack-live-dump 生成的内存转储文件夹haystack-find-heap 允许显示 Windows HEAP 的详细信息。haystack-search 搜索 CLIhaystack-show 显示特定地址上特定记录类型的 CLI你可以使用以下 URL 来指定你的内存处理器/转储:
dir:///path/to/my/haystack/fump/folder 使用 haystack 转储格式dmp:///path/to/my/minidump/file 使用 minidump 格式(Microsoft?)frida://name_or_pid_of_process_to_attach_to 使用 frida 访问活动进程内存live://name_or_pid_of_process_to_attach_to ptrace 活动进程rekall:// 加载 rekall 镜像volatility:// 加载 volatility 镜像cuckoo:// 加载由 Cuckoo 生成的内存转储(beta 可能需要补丁)在 Windows 上,最直接的方法是获取 Minidump。Microsoft Sysinternals
工具套件提供了 CLI(procdump.exe)或 GUI(Process Explorer)。
使用其中一种(带有完整内存转储选项)将生成一个文件,
该文件可以与 haystack-minidump-xxx 系列的入口点一起使用。
虽然从技术上讲你可以使用许多第三方工具,但 haystack 实际上需要内存映射信息才能工作。
因此,包含了一个转储工具 haystack-live-dump:
.. code-block:: bash
# haystack-live-dump <pid> myproc.dump
haystack-live-dump 将进程内存转储捕获到文件夹(haystack 格式)haystack-rekall-dump 将特定进程转储为 haystack 进程转储haystack-volatility-dump 将特定进程转储为 haystack 进程转储你可以轻松重现转储的格式,它是一个文件夹/归档, 包含每个内存映射在单独的文件中:
或者你可以为你的首选格式编写一个 haystack.abc.IMemoryMapping 实现。
另外,如果你已经有一个来自 Volatility 或 Rekall 的系统内存转储,
你可以使用 haystack-rekall-xxx 或 haystack-volatility-xxx 系列入口点
将特定进程的内存提取到文件中。
入口点 haystack-find-heap 允许显示 Windows HEAP 的详细信息。
它应支持:
并显示 Look Aside List (LAL) 和 Low Fragmentation Heap (LFH) 前端的详细信息。
你可能会惊讶地发现,有时单个进程可以混合两种类型的 HEAP(32 位和 64 位)。
要搜索特定记录,你首先需要定义该记录类型。 有一个[快速使用指南](docs/Haystack basic usage.ipynb)介绍了从 C 头文件到 Python ctypes 定义的基本步骤。 或者你可以自己动手,使用传统的 Python ctypes 记录。
搜索 API 通过 haystack-xxx-search 系列脚本提供,但也以 API 形式提供,以便你可以将该搜索嵌入到自己的代码中。
简而言之,haystack 搜索将遍历程序内存的每一个偏移量,尝试找到该特定记录类型的“有效”偏移量。
记录的有效性由类型约束决定,例如:
.. code-block:: bash
$ python haystack/cli.py dir:///home/user/project/python-haystack/test/src/test-ctypes6.32.dump ctypes6_gen32.struct_usual
支持以下约束:
示例:
.. code-block:: python
[struct_name]
myfield: [1,0xff]
ptr_field: NotNull
你可以查看 haystack/allocators/win32/winxpheap32.constraints,其中定义了 Windows XP HEAP x32 的约束。
显然,约束越多,结果越好。
你还可以通过实现 haystack.abc.interface.IRecordTypeDynamicConstraintsValidator 类并将其提供给 ModuleConstraints.set_dynamic_constraints 来使用 Python 代码创建更复杂的约束。
sslsnoop 仓库需要更新以兼容 v0.30 以上的版本 - 待处理
例如,这将转储 session_state 结构体及其指向的子结构体,作为可以操作的 Python 对象。 假设我们有一个 ssh 客户端或服务器,PID 为 4042:
.. code-block:: bash
$ sudo haystack-live-search --pickled 4042 sslsnoop.ctypes_openssh.session_state search > instance.pickled
$ sudo haystack-live-search --pickled 4042 sslsnoop.ctypes_openssh.session_state refresh 0xb8b70d18 > instance.pickled
$ sudo haystack-live-search --pickled <pid> <your ctypes Structure> search
当前无法使用
还有一个图形用户界面的尝试 python-haystack-gui <https://github.com/trolldbois/python-haystack-gui>_
请参阅 快速使用指南 <docs/Haystack_basic_usage.ipynb>_
最简单的方法是使用 ctypeslib 从 C 头文件生成 ctypes 记录。
或者手动定义你的 Python ctypes 记录。
@ 参见 Pypi 仓库中的 sslsnoop。生成了 openssl 和 nss 结构体。
@ 参见我的 GitHub 上的 ctypes-kernel。Linux 内核结构体是从构建的内核树生成的。(VMM 很讨厌)
基本功能是在进程内存中搜索特定的 C 记录。
扩展的逆向工程功能旨在通过内存/堆分析来逆向结构体。
你在记录字段的期望值上添加了一些约束。 指针总是被约束在有效的内存空间内。
最初来自 passe-partout <http://www.hsc.fr/ressources/breves/passe-partout.html.fr>_。
自从我 2011 年 3 月开始以来,我发现了一些其他相关的前期工作。
其中大部分在 docs/ 文件夹中。
其他相关工作包括 Immunity 的 mona.py,以及一些 Mandiant 的东西...
简而言之,这可能不是一个原创的想法。但是,我未能找到一个可操作的独立库来为我的 sslsnoop PoC 进行实时内存提取,所以……
相关工作 <https://github.com/trolldbois/python-haystack/wiki/State-of-art-reference>_
http://ntinfo.biz/ xntsv32
.. |pypi| image:: https://img.shields.io/pypi/v/haystack.svg?style=flat-square&label=latest%20stable%20version :target: https://pypi.python.org/pypi/haystack :alt: Latest version released on PyPi
.. |coverage| image:: https://img.shields.io/coveralls/trolldbois/python-haystack/master.svg?style=flat-square&label=coverage :target: https://coveralls.io/github/trolldbois/python-haystack?branch=master :alt: Test coverage
.. |travis| image:: https://img.shields.io/travis/trolldbois/python-haystack/master.svg?style=flat-square&label=travis-ci :target: http://travis-ci.org/trolldbois/python-haystack :alt: Build status of the master branch on Mac/Linux
.. |landscape| image:: https://landscape.io/github/trolldbois/python-haystack/master/landscape.svg?style=flat :target: https://landscape.io/github/trolldbois/python-haystack/master :alt: Code Health
.. |docs| image:: https://readthedocs.org/projects/python-haystack/badge/?version=latest :target: https://readthedocs.org/projects/python-haystack/badge/?version=latest :alt: Documentation status