
Фреймворк анализа кучи процессов - Windows/Linux - вывод типов записей и криминалистика
python-haystack криминалистика памяти ################################
|travis| |coverage| |landscape| |pypi| |docs|
Quick usage guide <docs/Haystack_basic_usage.ipynb>_ in the docs/ folder.
Haystack-reverse CLI <docs/Haystack_reverse_CLI.ipynb>_ in the docs/ folder.
More documentation <http://python-haystack.readthedocs.io/en/latest/>_
python-haystack — это фреймворк для анализа кучи, ориентированный на поиск и реверс-инжиниринг C-структур в выделенной памяти.
Первая функция/API — функция SEARCH. Она предоставляет возможность поиска известных типов записей в дампе памяти процесса или в памяти живого процесса.
Вторая функция/API — функция REVERSE в расширении python-haystack-reverse <https://github.com/trolldbois/python-haystack-reverse>_
Она призвана помочь аналитику в обратном проектировании типов записей памяти, присутствующих в куче процесса.
Она ориентирована на восстановление и классификацию классических C-структур из памяти.
Она пытается заново создать определения типов.
Существует несколько точек входа для работы с форматом вашего дампа памяти.
haystack-live-dumphaystack-find-heap позволяет отобразить детали кучи Windows.haystack-search CLI поискаhaystack-show CLI отображения для конкретного типа записи по адресуВы можете использовать следующий URL для указания обработчика/дампа памяти:
dir:///path/to/my/haystack/fump/folder для использования формата дампа haystackdmp:///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:// загрузить образ rekallvolatility:// загрузить образ volatilitycuckoo:// загрузить дамп памяти, созданный Cuckoo (бета, может потребоваться патч)В 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 дамп конкретного процесса в дамп процесса haystackhaystack-volatility-dump дамп конкретного процесса в дамп процесса haystackВы можете легко воспроизвести формат дампа: это папка/архив, содержащий каждую карту памяти в отдельном файле:
Или вы можете реализовать haystack.abc.IMemoryMapping для вашего любимого формата.
В противном случае, если у вас уже есть системный дамп памяти из Volatility или Rekall, вы можете использовать семейства точек входа haystack-rekall-xxx или haystack-volatility-xxx для извлечения памяти конкретного процесса в файл.
Точка входа haystack-find-heap позволяет отобразить детали кучи Windows. Она должна поддерживать:
и отображать детали Look Aside List (LAL) и Low Fragmentation Heap (LFH) frontend.
Возможно, вы удивитесь, увидев, что иногда один процесс может смешивать оба типа кучи (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 x32.
Очевидно, чем больше ограничений, тем лучше будут результаты.
Вы также можете создавать более сложные ограничения с помощью кода Python, реализовав класс haystack.abc.interface.IRecordTypeDynamicConstraintsValidator и передав его в ModuleConstraints.set_dynamic_constraints
Репозиторий 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>_
Смотрите quick usage guide <docs/Haystack_basic_usage.ipynb>_
Самый простой способ — использовать ctypeslib для генерации записей ctypes из C-заголовков.
Или определить запись Python ctypes вручную.
@ см. sslsnoop в репозитории PyPI. Сгенерированы структуры openssl и nss.
@ см. ctypes-kernel на моем GitHub. Структуры ядра Linux генерируются из собранного дерева ядра. (VMM — засада)
Основная функциональность: поиск в памяти процесса конкретной C-записи.
Расширенная функциональность обратного проектирования направлена на восстановление структур из анализа памяти/кучи.
Вы добавляете ограничения на ожидаемые значения полей записи. Указатели всегда ограничены допустимым адресным пространством.
Изначально из passe-partout <http://www.hsc.fr/ressources/breves/passe-partout.html.fr>_. С момента начала работы в марте 2011 года я обнаружил несколько других связанных работ.
Большинство из них находятся в папке docs/.
Другие связанные работы: mona.py от Immunity, некоторые вещи Mandiant...
В двух словах, это, вероятно, не оригинальная идея. Но тем не менее, я не смог найти рабочую автономную библиотеку для извлечения живой памяти для моего PoC sslsnoop, поэтому...
Связанные работы <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