Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
mmiotic — Raio-x de latência para hardware não documentado | Kitploit
Ferramentas/GitHubGitHub/xoreaxeaxeax/mmiotic
ReconhecimentoEngenharia ReversaColeta de InformaçõesHacking de HardwareSegurança de Hardware
GitHubxoreaxeaxeax/mmiotic

mmiotic

Raio-x de latência para hardware não documentado

Ver Repositório
14196há 29 diasRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

mmiotic

Uma ferramenta exploratória para temporização de MMIO — meça o tempo de qualquer endereço físico e disseque o hardware a partir da latência.

MMIO latency heatmap

Surpreendentemente útil para engenharia reversa de hardware, impressão digital de hipervisores, atividade de dispositivos por canal lateral, caracterização de registradores, calibração de gatilhos maliciosos e criação de instruções de máquina absurdamente longas.

Exemplos

Engenharia reversa de faixas de memória

O primeiro megabyte de memória física é um exemplo fácil para começar, mesmo que sua estrutura já seja bem conhecida.

first megabyte heatmap

As fronteiras de latência nos permitem dividir o espaço de endereçamento sem depender de layouts reportados.

  1. Comece com um simples scan de latência: sudo ./mmiotic --start-address 0x0 --end-address 0x100000 --stride 4 --count 20 --quiet-mmap
  2. A latência cai nas fronteiras clássicas — DRAM até 0x9FFFF a ~380 cy, depois o buraco de vídeo de 128 KB, que se divide em dois em 0xB0000. A mudança na variância em 0x20000 pode indicar um page walk diferente para a página nula.
  3. A0000–AFFFF: lento e instável (996 cy, stdev 327), roteado para a Radeon ligada mas ociosa. B0000–BFFFF: rápido e rígido (780 cy, stdev 3.2, lê ffffffff), reivindicado por ninguém. Dados de aparência semelhante, mas uma diferença de 100x na variância.
  4. C0000–FFFFF: /proc/iomem diz "System ROM", mas o scan mostra latência de DRAM, não velocidade de flash — a BIOS é espelhada na DRAM.

Registros de mailbox não documentados

Faça um scan do espaço de configuração do root complex (00:00.0, 4 KB) em busca de outliers de latência contra um piso plano de ~675 ciclos:

mailbox register heatmap

A latência do mailbox é significativamente maior do que os dados ao redor, e os picos duplicados e as variâncias equivalentes nos permitem associar registradores funcionalmente semelhantes.

  1. Faça um scan do espaço de configuração do root complex: sudo ./mmiotic --start-address 0xf8000000 --end-address 0xf8001000 --stride 4 --count 200
  2. Duas dwords são os outliers: offset 0xe4 (1218 cy, valor 80e3110b) e 0xa4 (1199 cy, valor deadbeef). e4 é um doorbell documentado; a4 não é documentado.
  3. Latência quase idêntica, separados por 0x40, ambos muito acima do piso — uma família de registradores alcançando o mesmo alvo fora do die, da qual apenas e4 é público.
  4. Os valores diferem: deadbeef é lido como um sentinela de não inicializado/erro — mesmo mailbox, a4 não implementado ou alimentado com entrada inválida.

Calibração de interrupções

Latências cuidadosamente selecionadas às vezes podem ser usadas em cenários incomuns de exploração (MCHAMMER, smiiiiiiiiiiiiiiii):

interrupt calibration heatmap

Aqui, uma Radeon ociosa e sem driver transforma uma leitura alinhada de 4 bytes em uma parada de ~100.000 ciclos.

  1. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e00100 --stride 4 --count 50 — varra o início do BAR da GPU (0x90e00000, 256 KB). 0x90e00008 custa 110.152 cy; 0x90e00018, 16 bytes adiante, volta a ser rápido a 1.523 — por registrador, não por página.
  2. sudo ./mmiotic --start-address 0x90e00000 --end-address 0x90e40000 --stride 4 --count 1 --binary — --binary sonda em ordem de inversão de bits, então toda a janela de 256 KB é coberta uniformemente após 1.012 sondas, mapeando um bloco contíguo de 48 KB onde todo registrador é lento.
  3. Provavelmente, a latência se deve a uma ida e volta ao SMU para reativar um domínio com clock/energia desligados — então o mapa de latência extrai o layout de energia da GPU, sem necessidade de driver ou datasheet.

Espreitada assassina

Idealmente, ler um endereço físico seria uma operação relativamente segura, mas mmiotic é especialmente bom em encontrar acidentalmente as exceções:

killer peek heatmap

Por exemplo, na plataforma acima, uma leitura de 1 byte de 0xdc5003b0 — offset 0x3b0 de um BAR de registradores de iGPU Zen 4 sem driver (Região 5, 0xdc500000, 512 KB) — reinicia o sistema de forma confiável.

  1. sudo ./mmiotic --address 0xdc5003b0 --size 1 --count 1. Sem saída; a máquina reinicia.
  2. Exatamente uma dword: 0x3ac e 0x3b4 em ambos os lados leem 00000000 a ~3.200 cy e são inofensivos.
  3. Uma varredura dword a dword de 0x3a0–0x3fc encontra 7 dwords venenosas intercaladas com 17 seguras.
  4. sudo busybox devmem 0xdc5003b0 32 e sudo dd if=/dev/mem bs=1 count=1 skip=$((0xdc5003b0)) derrubam a máquina se você preferir pular o intermediário.

Uso

[!WARNING] Algumas plataformas serão reiniciadas quando regiões de endereço específicas forem sondadas pelo mmiotic. Tenha cuidado onde você usa isso.

Alvo

A base e o tamanho do ECAM são detectados automaticamente a partir do ACPI MCFG (/sys/firmware/acpi/tables/MCFG). Substitua com -M, --mmio-base / -Z, --mmio-size.

Varredura

--find-target/--find-longest transformam a varredura em busca:

OpçãoEfeito
-F, --find-target <s>encontra um endereço cujo tempo de acesso atinja s segundos e então aumenta a largura (4b não alinhado → 8/16/32/64/512b) para elevá-lo ainda mais
-G, --find-longest

Método de acesso

Saída / execução

Linhas de resultado

root@kitploit:~
b/d/f.o.l: 00:02:00.00.4  address: 00000000f0100000  min:      312  max:      480  stdev:      2.1  dynamic: 0  value: 8086abcd

-T adiciona o sufixo cy às contagens de ciclos e insere um par de tempos min/max em escala (-N os imprime como nanossegundos brutos):

root@kitploit:~
b/d/f.o.l: 00:02:00.00.4  address: 00000000f0100000  min:      312 cy  max:      480 cy  (   104 ns/   160 ns)  stdev:      2.1  dynamic: 0  value: 8086abcd

Configuração

Compile:

root@kitploit:~
make

Executa como root para obter acesso a /dev/mem.

Se você vir: mmap ... Operation not permitted, tente iniciar com iomem=relaxed para remover CONFIG_STRICT_DEVMEM:

root@kitploit:~
# /etc/default/grub
GRUB_CMDLINE_LINUX="iomem=relaxed nopat"

Então execute sudo update-grub e reinicie.

Na natureza

mmiotic tem sido usado para avançar uma variedade de pesquisas internas e externas, às vezes de maneiras inesperadas. Alguns exemplos de aplicações do mmiotic:

  • MCHAMMER: mmiotic calibra uma exceção de machine check atrasada para a entrega de precisão de sinais MC# em ambientes protegidos.

  • smiiiiiiiiiiiiiiii: mmiotic resolve a instrução de alta latência para quebrar o rendezvous do SMM.

  • The Assembly Hall of Shame: mmiotic é usado extensivamente para o importante problema da desotimização de desempenho.

Autor

mmiotic é um esforço de pesquisa de Christopher Domas (@xoreaxeaxeax).

Baixar ferramenta
OpçãoNomes
-b/-d/-f/-rPCI --bus/--device/--function/--register — decodificados com base no ECAM
-o, --offset <n>offset a partir da base MMIO (ignora a decodificação B/D/F)
-A, --address <n>um endereço físico; define a base da região implicitamente
-a/-z--start-address/--end-address — uma faixa física; implica --scan
OpçãoEfeito
-S, --scanpercorre todos os endereços na região alvo
-t, --stride <n>passo entre endereços (padrão: 4)
-n, --limit <n>parar após este número de endereços
--binarysonda em ordem de inversão de bits — após k sondas a faixa tem cobertura uniforme com granularidade de ~range/k (veja o aviso acima)
-x, --limitedfaixa de registradores limitada (0x00–0xff vs 0x000–0xfff)
-e, --skippula funções que leem 0xffffffff no offset 0 (dispositivos ausentes)
-I, --iomemescaneia todas as regiões de nível superior não–System-RAM em /proc/iomem
-R, --ioregion <name>escaneia regiões de /proc/iomem cujo rótulo corresponde a <name>, em qualquer profundidade
mesma busca, mas esgota todos os candidatos em vez de parar no primeiro resultado
-B, --fallbacks <n>candidatos levados para a fase de escalada (padrão: 10)
OpçãoEfeito
-s, --size <n>bytes por acesso: 1 / 2 / 4 (padrão) / 8 / 16 (XMM) / 32 (YMM) / 64 (ZMM) / 512 (fxrstor). Tamanhos > 4 estão fora da especificação, mas funcionam no hardware testado; larguras AVX precisam de AVX / AVX-512F
-c, --count <n>amostras por endereço (padrão: 1); o mínimo é reportado
-L, --lockmede o tempo de um RMW com lock: lock xadd (tamanhos 1/2/4/8) ou lock cmpxchg16b (tamanho 16). Escreve o valor de volta
-g, --gathermede o tempo de um gather vetorizado; --size 16/32/64 escolhe XMM/YMM/ZMM (AVX-512)
-w, --write-readcaptura a latência de escrita medindo o tempo de uma leitura que deve observar uma escrita postada anteriormente — veja abaixo
-E, --enter (--enter-2, --enter-3)conduz uma rajada de até 30 acessos a partir de um único enter $0, $31 — veja abaixo
-k, --continueem uma falha de fxrstor, descarta essa amostra e continua a varredura
OpçãoEfeito
-C, --min-cycles <n>exibe apenas resultados com min_cycles >= n
-T, --timemostra nanossegundos junto com os ciclos (detecta a frequência do TSC)
-N, --nanosecondcom --time, imprime nanossegundos brutos, sem escala de unidades
-P, --progressprogresso da varredura em tempo real no stderr
-p, --processor <n>fixa no CPU lógico n (padrão: 0) — reduz ruído do timer
-u, --unboundnão fixa a um núcleo
--lazy-mmapmapeia janelas de 2 GB sob demanda; necessário para regiões > 2 GB
--quiet-mmapsuprime o ruído de "mmap failed" de regiões inacessíveis
CampoSignificado
b/d/f.o.lbarramento/dispositivo/função, offset do registrador, tamanho do acesso
offsetoffset a partir da base MMIO — substitui b/d/f.o.l quando o alvo veio de -o/-A/-a+-z
addressendereço físico completo de 64 bits
min/maxacesso mais rápido e mais lento observado, em ciclos
stdevdesvio padrão das contagens de ciclos amostrados
dynamic1 se o valor mudou em algum momento entre as amostras
valuevalor lido — para tamanhos acima de 8 bytes, os primeiros 32 bytes como qwords separados por espaços
faultsanexado apenas se um acesso falhou