
Winstrument is a framework of modular scripts to aid in instrumenting Windows software using Frida for reverse engineering and attack surface analysis.
Winstrument — это фреймворк модульных скриптов для инструментирования Windows-программ с помощью Frida с целью реверс-инжиниринга и анализа поверхности атаки.
Проект поддерживает Python 3.7. Если у вас уже установлены Python и pip, просто выполните:
pip install winstrument
а затем для запуска программы выполните:
winstrument
Обратите внимание, что инструмент пока является экспериментальным и иногда может зависать или иметь другие проблемы со стабильностью.
В некоторых случаях, например при чистой установке Windows 10, при установке Frida через pip может возникнуть ошибка SSL. Если это произошло, см. раздел Устранение неполадок ниже.
Чтобы запустить REPL winstrument, просто выполните команду winstrument.
Вот краткий пример инструментирования notepad.exe с помощью модуля registry. Полную информацию о доступных командах CLI см. в разделе CLI ниже.
PS C:\winstrument> winstrument
> set target C:\Windows\System32\notepad.exe
> use registry
> run
Spawned 1144
instrumented process with pid: 1144 and path: C:\Windows\System32\notepad.exe
<User closes notepad from GUI>
detached from 1144 for reason process-terminated
> show registry
module time target function hkey subkey value
-------- ----------------- ------------------------------- ---------------- ------------------ --------------------------------------------------------------------------- ---------------------------------
registry 2019-08-19 07:03:07 C:\Windows\System32\notepad.exe RegGetValueW 0x2f4 SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize AppsUseLightTheme
<...>
В приведённом выше примере пользователь указывает целевой процесс, в данном случае notepad.exe. Затем он указывает, что хочет использовать модуль registry, который перечисляет системные вызовы реестра, выполняемые программой. После завершения процесса (пользователь закрывает Блокнот) сохранённый вывод можно просмотреть с помощью команды show registry.
Основной файл Python winstrument.py инициализирует устройство Frida и запускает экземпляр целевого процесса.
cmdline.py предоставляет интерфейс командной строки на основе cmd2. Это основная точка входа скрипта, когда Winstrument запускается непосредственно из командной строки. Команды описаны ниже.
Затем он проходит по каждому включённому модулю, создаёт его экземпляр и вызывает метод load_scripts() этого модуля для инструментирования процесса.
Наконец, он вызывает get_output() и on_finish() для каждого модуля после отсоединения от целевого процесса.
Модули содержатся в .py-файлах в каталоге modules/. Модуль представляет собой подкласс base_module.BaseInstrumentation, который определяет внедряемый код, обработку сообщений для этого внедрённого кода и вывод.
API модулей более подробно описаны в разделе «Модули» ниже.
Каждый модуль хранит метаданные, такие как его описание, в modules/metadata.toml. Раздел должен быть озаглавлен именем модуля (без учёта регистра).
Например, вот раздел, соответствующий модулю dlls:
[DLLS]
description = """Hooks LoadLibrary-family system calls and outputs DLL loads where part of the search path might be
writable by the current user or a low-privileged user group."""
Программа хранит настройки в settings.toml в %APPDATA%/winstrument.
Поскольку большинство модулей, если не все, внедряют Javascript в целевой процесс, каталог modules/js/ содержит фрагменты Javascript для Frida, которые загружаются и внедряются модулями.
Эти файлы должны иметь то же имя, что и модуль, т.е. модуль dlls.py будет использовать JS из js/dlls.js.
Как описано выше, каждый модуль является подклассом BaseInstrumentation из base_module.py.
Каждый модуль должен определять своё имя (имя файлов python и js без расширения) как статический атрибут класса с именем modulename.
Модули могут использовать или переопределять следующие методы из BaseInstrumentation:
__init__(self,*args,**kwargs) — В дополнение к любому специфичному для модуля коду инициализации этот конструктор должен вызывать super().__init__(*args,**kwargs).load_script(self) — Этот метод, как правило, не нужно переопределять, так как реализации в BaseInstrumentation должно быть достаточно для большинства случаев. Для подключения к событиям Frida вместо этого переопределите register_callbacks(). load_script следует использовать для загрузки javascript-файла для инструментирования: вызовите session.create_script из Frida, добавьте нужные обратные вызовы, а затем вызовите метод load() объекта сценария для инструментирования.register_callbacks(self) — Вызывается BaseInstrumentation.load_script перед загрузкой сценария в целевой процесс. Используется для регистрации событий, таких как _session.on('message') и т.д. Версия по умолчанию добавляет обработчик для on_message.Оболочка Winstrument предоставляет следующие команды:
list — Показать все доступные и загруженные модулиload <modulename>/use <modulename> — Включить модуль с указанным именемunload <modulename> — Отключить модуль с указанным именемset [setting [value]] — Без аргументов: показать все настройки и их значения. С одним аргументом: показать значение setting. С двумя аргументами: установить для setting значение value. Настройки сохраняются между запусками.show [modulename [format]] — Показать сохранённые данные из modulename в указанном format. Запуск без аргументов выводит список форматтеров.info <modulename> — Выводит описание модуля с указанным именем.run — Начать инструментирование.Это возникает в основном при новой установке Windows. setup.py Frida пытается загрузить .egg-файл с https://files.pythonhosted.org. В некоторых случаях это не удаётся, потому что SSL-сертификат этого домена не проходит проверку. По-видимому, это побочный эффект того, как Windows загружает корневые сертификаты. Windows, судя по всему, не включает все корневые сертификаты в установку по умолчанию, предпочитая загружать их по мере необходимости при посещении веб-сайтов. В результате корневой сертификат, подписавший SSL-сертификат files.pythonhosted.org, может отсутствовать в системном хранилище доверия.
Чтобы решить эту проблему, вручную откройте https://files.pythonhosted.org в Edge или Chrome, чтобы Windows добавила корневой сертификат в своё хранилище доверия, а затем повторите pip install.
Обратите внимание, что посещение страницы в Firefox не поможет, потому что Firefox использует собственное хранилище доверия, а не системное.
Winstrument распространяется под лицензией GPLv3. Подробнее см. в файле LICENSE.
BaseInstrumentationwrite_message(message) принимает JSON-подобное сообщение в виде dict, записывает его в базу данных sqlite и сохраняет для последующего вывода.post_load(self) Вызывается BaseInstrumentation.load_script после загрузки сценария в целевой процесс. Это может использоваться, например, для вызова rpc-методов, экспортируемых сценарием.get_output(self) — Вызывается основным скриптом, когда целевой процесс отсоединяется. Этот метод должен возвращать список, где каждая запись — это объект MoudleMessage (из data/module_message.py). Обычно переопределять не нужно.on_message(self,message,data) — Обратный вызов для обработки события message Frida, которое вызывается с помощью send во внедрённом JS.on_finish(self) — Обратный вызов, вызываемый основным скриптом, когда целевой процесс отсоединяется. Выполните здесь все необходимые операции по очистке.q/quit/exit — Завершить работу CLI (очевидно).