Расширение WinDbg для декомпиляции через LLM


Этот проект представляет собой шаблон расширения WinDbg для Windows x64, который определяет функцию по имени или адресу, восстанавливает детерминированное представление потока управления и напрямую обращается к LLM из расширения для генерации псевдокода.
Структура
src/extension: DLL расширения WinDbg и команда !decomp.
src/shared: общий код для JSON, анализатора, протокола и верификатора, используемый расширением.
scripts: вспомогательные сценарии сборки и копирования сторонних библиотек.
third_party/dbgeng: опциональная копия поставляемых dbgeng.h и dbgeng.lib.
third_party/zydis: поставляемое стабильное дерево исходного кода Zydis, используемое по умолчанию при наличии.
Текущий объем
- предположения только для x64
- анализ активной памяти через DbgEng
- структурированная дизассемблеризация на основе Zydis для стабильного восстановления мнемоник/операндов
- восстановление области символа, развертывание и эвристическое восстановление диапазона функций
- восстановление в стиле SSA-lite для входящих регистровых аргументов, локальных переменных стековых слотов, кандидатов слияния и нормализованных условий ветвления
- низкоуровневые факты значений IR с подсказками определения-использования, каноническими копиями/константными выражениями и маркерами мертвых определений
- факты состояния значений на уровне блоков для сходящихся достигающих определений live-in/live-out по регистрам и локальным переменным стека
- факты областей потока управления на основе доминаторов для естественных циклов, кандидатов if/else, кандидатов switch, метаданных индукции циклов и метаданных диапазона/по умолчанию switch
- факты ABI x64 для теневых/домашних слотов, дельт указателя стека, распознавания пролога/эпилога, невозвратных вызовов, хвостовых вызовов, thunk'ов, кандидатов оберток импорта и восстановленных регистровых/стековых аргументов вызовов
- восстановление аргументов Microsoft x64 с учетом SIMD/FP для
xmm0 – xmm3 с защитой от нулевых идиом векторов для предотвращения ложных входящих аргументов
- подсказки восстановления типов для указателеподобных значений, локальных переменных стека, смещений полей, массивов с масштабированным индексом, сравнений по типу перечислений, проверок битовых флагов и кандидатов vtable
- факты идиом и библиотечных шаблонов для помощников по памяти/строкам, cookies безопасности, проб стеков, аллокаторов, агрегатных инициализаторов и RIP-относительных загрузок глобальных/импортных значений
- факты целей вызовов для прямых вызовов, косвенных вызовов через регистр/память, кандидатов виртуальных вызовов/смещений vtable, типа возврата, модели параметров, побочных эффектов, эффектов памяти, подсказок владения и уверенности
- факты обфускации в стиле OLLVM для диспетчеров уплощения потока управления, восстановленных семантических ребер, мертвых ребер непрозрачных предикатов и идиом замены скалярных инструкций
- факты готовности деобфускации, а также управление
/deobf:on|off (включено/выключено) для указания, могут ли восстановленные факты обфускации направлять перезапись псевдокода на C
- факты графа доказательств, связывающие анализатор высокого сигнала, PDB и факты наблюдаемого поведения обратно с привязкой к инструкциям/блокам
- уточняющие запросы с сгенерированным анализатором скелетом псевдокода, сводками с учетом графа для областей CFG, условий и важных блоков, ранжированным выбором фактов с высоким сигналом и разреженной выборкой для больших наборов фактов
- ссылки DML WinDbg для навигации по входным точкам/базовым блокам/доказательствам/целям вызовов, когда обратный вызов вывода поддерживает DML
- раздельные режимы результатов для краткого вывода, объяснения доказательств, только фактов, отладочной подсказки, JSON и в стиле модели данных
- переключатели пользовательских исправлений для подсказок no-return, типа, поля и переименования
- факты политики анализа с учетом сеанса для активных сеансов, дампов, ядра и сеансов, подобных TTD
- факты наблюдаемого поведения из текущего контекста отладчика, включая образцы регистровых аргументов, горячие точки памяти и предложения запросов TTD, если доступны
- классификация строк/глобальных/IAT с RIP-относительной адресацией и подсказки сигнатур целей вызовов для запросов LLM
- подсказки прототипов с учетом загруженного PDB, областей видимости параметров/локальных переменных, полей, перечислений и исходных строк для запросов LLM
- прямые внутрипроцессные вызовы LLM из расширения
- HTTP-адаптер, совместимый с OpenAI, или детерминированная заглушка
- проход верификатора по выходным данным LLM
Использование в WinDbg
Загрузите расширение из выходных данных сборки, затем выполните !decomp для символа или адреса:```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
Используйте `/doctor`, если настройка выглядит неверно или перед включением LLM-провайдера:```text
!decomp /doctor
!decomp /doctor:net
/doctor не требует цели и не вызывает провайдера. Он сообщает о конфигурации (путь/статус загрузки), сводку по провайдеру/модели/конечной точке, наличие аутентификации без секретов, настройки таймаута/токенов/разбиения на чанки, поддержку DML, класс/квалификатор сессии, тип обработчика и предупреждения PDB.
/doctor:net принимается как явный запрос проверки сети, но в настоящее время сообщает, что пинг провайдера пропущен. Расширение не выполняет сетевой зонд из режима doctor.
- Секретные значения, такие как ключи API, токены носителя, токены обновления и строки запроса URL, не выводятся.
Целями могут быть публичные/приватные символы, имена экспортируемых функций или адреса. Если цель разрешается в адрес внутри функции, расширение пытается восстановить диапазон содержащей функции из символов, данных развертывания и эвристик управления потоком. Помещайте цели, содержащие пробелы, в кавычки:```text
!decomp "my module!Function With Spaces"
Обычный путь команды выполняет локальный анализ, строит факты анализа, при необходимости вызывает настроенную конечную точку LLM, проверяет ответ на соответствие восстановленным доказательствам и выводит псевдо-C с указанием уверенности, предупреждений и примечаний о неопределенности:```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
Normal, brief и explain выводят компактный поток прогресса даже без /verbose. Длинные запуски LLM показывают завершение локального анализа, прогресс по фрагментам, уведомления о повторных попытках, начало слияния, проверку и подсказку об отмене с помощью Ctrl+Break. Машиночитаемые режимы, такие как /view:json, /view:facts, /view:prompt и /view:data, подавляют строки прогресса и вспомогательные ссылки DML, чтобы скрипты получали только запрошенные данные.