Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
mmiotic — Рентген задержек для недокументированного оборудования | Kitploit
Инструменты/GitHubGitHub/xoreaxeaxeax/mmiotic
РазведкаОбратная инженерияСбор информацииАппаратный ХакингАппаратная Безопасность
GitHubxoreaxeaxeax/mmiotic

mmiotic

Рентген задержек для недокументированного оборудования

Репозиторий
1419171 месяц назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

mmiotic

Экспериментальный инструмент для MMIO-тайминга — измеряйте время обращения к любому физическому адресу и извлекайте информацию об оборудовании из задержек.

MMIO latency heatmap

Неожиданно полезен для реверс-инжиниринга оборудования, снятия отпечатков гипервизоров, побочного анализа активности устройств, характеризации регистров, калибровки вредоносных триггеров и создания чудовищно длинных машинных инструкций.

Примеры

Реверс-инжиниринг диапазонов памяти

Первый мегабайт физической памяти — простой пример для начала, даже если его структура уже хорошо известна.

first megabyte heatmap

Границы задержек позволяют разделить адресное пространство, не полагаясь на заявленную раскладку.

  1. Начните с простого сканирования задержек: sudo ./mmiotic --start-address 0x0 --end-address 0x100000 --stride 4 --count 20 --quiet-mmap
  2. Задержка ложится на классические границы — DRAM до 0x9FFFF при ~380 тактов, затем 128-КБ видео-дыра, которая раздваивается на 0xB0000. Изменение дисперсии на 0x20000 может указывать на другой обход страниц для нулевой страницы.
  3. A0000–AFFFF: медленный и дрожащий (996 тактов, stdev 327), направлен на включённый, но простаивающий Radeon. B0000–BFFFF: быстрый и стабильный (780 тактов, stdev 3.2, читается ffffffff), никем не занят. Похожие данные, но разрыв по дисперсии в 100 раз.
  4. C0000–FFFFF: /proc/iomem сообщает «System ROM», но сканирование показывает задержку DRAM, а не скорость флеша — BIOS затенён в DRAM.

Незадокументированные регистры mailbox

Просканируйте конфигурационное пространство корневого комплекса (00:00.0, 4 КБ) на предмет выбросов задержки на фоне ровного уровня ~675 тактов:

mailbox register heatmap

Задержка mailbox значительно выше окружающих данных, а повторяющиеся пики и эквивалентные дисперсии позволяют сопоставить функционально схожие регистры.

  1. Сканируйте конфигурационное пространство корневого комплекса: sudo ./mmiotic --start-address 0xf8000000 --end-address 0xf8001000 --stride 4 --count 200
  2. Два dword являются выбросами: смещение 0xe4 (1218 тактов, значение 80e3110b) и 0xa4 (1199 тактов, значение deadbeef). e4 — документированный doorbell; a4 не документирован.
  3. Почти идентичная задержка, расстояние 0x40, оба намного выше базового уровня — одно семейство регистров, обращающихся к одной и той же внешней цели, из которых публичен только e4.
  4. Значения различаются: deadbeef читается как неинициализированный/ошибочный sentinel — тот же mailbox, a4 не реализован или получает недопустимые входные данные.

Калибровка прерываний

Тщательно подобранные задержки иногда можно использовать в необычных сценариях эксплуатации (MCHAMMER, smiiiiiiiiiiiiiiii):

interrupt calibration heatmap

Здесь простаивающий Radeon без драйвера превращает одно выровненное 4-байтовое чтение в простой примерно на 100 000 тактов.

  1. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e00100 --stride 4 --count 50 — просканируйте начало GPU BAR (0x90e00000, 256 КБ). 0x90e00008 стоит 110 152 такта; 0x90e00018, на 16 байт дальше, снова быстрый — 1 523 такта — то есть задержка привязана к регистру, а не к странице.
  2. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e40000 --stride 4 --count 1 --binary — --binary опрашивает в порядке обращения битов, поэтому всё 256-КБ окно равномерно покрывается после 1 012 проб, выявляя смежный блок 48 КБ, где каждый регистр медленный.
  3. Вероятно, задержка вызвана обращением к SMU для снятия тактовой/питающей изоляции домена — так карта задержек извлекает раскладку питания GPU без драйвера или даташита.

Смертоносный просмотр

В идеале чтение физического адреса должно быть относительно безопасной операцией, но mmiotic особенно хорош в случайном обнаружении исключений:

killer peek heatmap

Например, на указанной платформе 1-байтовое чтение 0xdc5003b0 — смещение 0x3b0 BAR регистров неактивированного iGPU Zen 4 (Region 5, 0xdc500000, 512 КБ) — надёжно перезагружает систему.

  1. sudo ./mmiotic --address 0xdc5003b0 --size 1 --count 1. Никакого вывода; машина перезагружается.
  2. Ровно один dword: 0x3ac и 0x3b4 по обе стороны читаются как 00000000 при ~3 200 тактов и безвредны.
  3. По-dword проход от 0x3a0 до 0x3fc обнаруживает 7 ядовитых dword вперемешку с 17 безопасными.
  4. sudo busybox devmem 0xdc5003b0 32 и sudo dd if=/dev/mem bs=1 count=1 skip=$((0xdc5003b0)) вырубают машину, если вы предпочитаете без посредников.

Использование

[!WARNING] Некоторые платформы перезагружаются при обращении mmiotic к определённым областям адресов. Будьте осторожны, где вы это используете.

Выбор цели

ОпцияНазвания
-b/-d/-f/-rPCI --bus/--device/--function/--register — декодируется относительно базы ECAM
-o, --offset <n>смещение от базы MMIO (пропускает декодирование B/D/F)
-A, --address <n>один физический адрес; неявно задаёт базу области
-a/-z--start-address/--end-address — физический диапазон; подразумевает --scan

База и размер ECAM автоматически определяются из ACPI MCFG (/sys/firmware/acpi/tables/MCFG). Переопределите с помощью -M, --mmio-base / -Z, --mmio-size.

Сканирование

ОпцияЭффект
-S, --scanпройти по всем адресам в целевой области
-t, --stride <n>шаг между адресами (по умолчанию: 4)
-n, --limit <n>остановиться после этого количества адресов
--binaryопрос в порядке обращения битов — после k проб диапазон имеет равномерное покрытие с гранулярностью ~range/k (см. предупреждение выше)
-x, --limitedограниченный диапазон регистров (0x00–0xff вместо 0x000–0xfff)
-e, --skipпропускать функции, которые читают 0xffffffff по смещению 0 (отсутствующие устройства)
-I, --iomemсканировать каждую верхнеуровневую область, не являющуюся System-RAM, в /proc/iomem
-R, --ioregion <name>сканировать области /proc/iomem, чья метка соответствует <name>, любой глубины

--find-target/--find-longest превращают сканирование в поиск:

ОпцияЭффект
-F, --find-target <s>найти адрес, время обращения к которому достигает s секунд, затем увеличивать ширину (невыровненный 4б → 8/16/32/64/512б), чтобы поднять его выше
-G, --find-longestтот же поиск, но перебирает всех кандидатов, а не останавливается на первом совпадении
-B, --fallbacks <n>кандидаты, переносимые в фазу эскалации (по умолчанию: 10)

Метод доступа

Скачать инструмент