Pular para o conteúdo

Miasm - Folha de Dicas do Framework de Engenharia Reversa

Miasm - Folha de Dicas do Framework de Engenharia Reversa

Miasm é um framework Python gratuito e de código aberto para analisar, gerar e manipular binários. Pode desmontar em muitas arquiteturas (x86/x64, ARM, MIPS, PPC e mais), levantar código para sua própria representação intermediária (IR), emular execução com JIT e executar execução simbólica para deofuscação e resolução de restrições. É um toolkit programático — você o aciona do Python — que o torna poderoso para automatizar tarefas de engenharia reversa e desempacotamento que ferramentas GUI não conseguem escrever facilmente.

Instalação

MétodoComando
pippip install miasm
A partir do código-fontegit clone https://github.com/cea-sec/miasm && cd miasm && pip install -e .
JIT Opcional (LLVM)pip install llvmlite (backend de emulação mais rápido)
Dockerdocker build -t miasm . a partir do repositório
Verificarpython -c "import miasm; print('ok')"

Módulos Principais

MóduloPropósito
miasm.analysis.binaryCarregue um contêiner binário (ELF/PE/raw)
miasm.analysis.machineAbstração de arquitetura (Machine("x86_64"))
miasm.core.locationdbRastreie endereços/rótulos em toda a análise
miasm.irRepresentação intermediária de instruções
miasm.analysis.dseMotor de execução simbólica dinâmica
miasm.jitterMotor de emulação/JIT

Desassembly

from miasm.analysis.binary import Container
from miasm.analysis.machine import Machine
from miasm.core.locationdb import LocationDB

loc_db = LocationDB()
cont = Container.from_stream(open("target.bin", "rb"), loc_db)
machine = Machine(cont.arch)

mdis = machine.dis_engine(cont.bin_stream, loc_db=loc_db)
asmcfg = mdis.dis_multiblock(cont.entry_point)   # desassembly recursivo → CFG
for block in asmcfg.blocks:
    print(block)
ChamadaDescrição
mdis.dis_block(addr)Desmonte um único bloco básico
mdis.dis_multiblock(addr)Desmonte recursivamente em um CFG
asmcfg.blocksItere blocos básicos
asmcfg.dot()Exporte o gráfico de fluxo de controle para Graphviz

Representação Intermediária (IR)

lifter = machine.lifter_model_call(mdis.loc_db)
ircfg = lifter.new_ircfg_from_asmcfg(asmcfg)
for lbl, irblock in ircfg.blocks.items():
    print(irblock)

A IR normaliza instruções específicas de arquitetura em uma pequena linguagem tipada, o que torna possível análise entre arquiteturas e raciocínio simbólico.

Emulação (Jitter)

from miasm.analysis.machine import Machine
jitter = Machine("x86_64").jitter("llvm")   # ou "python", "gcc"
jitter.init_stack()
# mapeie código, defina registradores, depois:
jitter.run(0x401000)
BackendTrade-off
pythonPortável, mais lento
gccMais rápido, precisa de um compilador
llvmMais rápido, precisa de llvmlite
RecursoUse
add_breakpoint(addr, cb)Execute um callback Python em um endereço
vm.set_mem(addr, data)Escreva memória antes de executar
Syscalls/APIs personalizadasHook chamadas de biblioteca durante emulação

Execução Simbólica

from miasm.ir.symbexec import SymbolicExecutionEngine
sb = SymbolicExecutionEngine(lifter)
symbolic_pc = sb.run_at(ircfg, 0x401000)
print(sb.symbols)        # estado simbólico de registrador/memória

A execução simbólica é a base para deofuscação, resolução de entradas e simplificação de lixo/predicados opacos.

Fluxos de Trabalho Comuns

ObjetivoAbordagem
Exporte um CFG para visualizarasmcfg.dot() → renderize com Graphviz
Desempacotar/deofuscarEmule com o jitter, despeje memória no OEP
Resolva para uma entradaExecução simbólica + um solver SMT (z3)
Análise entre arquiteturasLevante para IR, execute os mesmos passes independentemente de arquitetura

Miasm vs Outros Frameworks de RE

AspectoMiasmangrGhidra
LinguagemPythonPythonJava/GUI
IRPróprio IRVEXP-code
EmulaçãoJIT integradoBaseado em UnicornAPI do Emulador
Execução simbólicaSimSim (força principal)Limitado
Melhor paraAnálise em scripts, deofuscaçãoSimbólico/CTFRE interativo

Recursos