
Набор инструментов для статического анализа и восстановления структуры защищённых ACE .qvm0 PE-образов
Это аналитические драйверы, используемые для получения измерений, приведённых в README и в заметках по кейсам. Они управляются аргументами и переиспользуемы: каждый принимает путь к PE (и пути вывода) в командной строке.
Запускать из корня репозитория, например:
python scripts/extended_census.py <pe> <dynamic_edges.tsv>
| скрипт | назначение |
|---|---|
verify_target_decodability.py | проверка плотности декодирования целей native->VM относительно контрольной популяции |
verify_dynamic_coverage.py | пересечение множеств на уровне страниц, доказывающее, пересекается ли исполняемый код с местами ветвлений |
verify_dynamic_edges.py | перекрёстная сверка и проверка границ динамических и статических множеств рёбер |
opaque_coverage.py | какую долю статически непрозрачного множества мест достиг динамический проход |
extended_census.py | согласование полной переписи косвенных ветвлений с наблюдаемыми местами |
external_decryptor_scan.py | сканирование соседних модулей на наличие возможностей защиты/отображения/записи страниц |
task1_slice_all.py | полный статический срез: разрешение идиом, затем обратное срезание, с выводом рёбер |
task1b_dynamic_codelike.py | динамическое восстановление рёбер, ограниченное code-like записями VM |
task2_realctx.py | эмуляция из реальных контекстов вызова; восстановление раскладки слотов стекового фрейма |
task4_patch.py | сохраняющий длину патч деобфускации плюс проверка сдерживания |
Несколько из них существуют, чтобы опровергнуть утверждение, поэтому они и сохранены:
verify_target_decodability.py — сравнивает метрику плотности декодирования с
контрольной популяцией. Именно этот скрипт показал, что выборочная проверка трёх целей
не была репрезентативной.verify_dynamic_coverage.py — пересечение множеств на уровне страниц, доказавшее
баг трассировщика, а не архитектурный факт, когда трассировщик сообщил о нуле
косвенных ветвлений на 3M инструкций.extended_census.py — показал, что исходная перепись косвенных ветвлений охватывала
лишь 35% реальной популяции, поскольку сопоставляла только регистровые формы.external_decryptor_scan.py — сканирование возможностей по соседним модулям; гипотеза,
для которой он был построен, впоследствии была опровергнута динамическим
наблюдением отсутствия записи, и отрицательный результат зафиксирован вместе с ним.Держите их честными: драйвер, который только подтверждает, не стоит того, чтобы его хранить.