AtariHackerMCP
Ferramentas que podem ser necessárias para hackear código Atari de 8 bits (arquivos .atr), incluindo dump hexadecimal, desmontador, tabelas de símbolos, etc.
Documentação
AtariHackerMCP
Um servidor MCP local para engenharia reversa de binários Atari de 8 bits e imagens de disco ATR. Suporta análise de desmontagem em múltiplas passadas, separação de código/dados, saída ciente de segmentos, injeção de arquivos ATR, script em lote e uma tabela abrangente de símbolos de hardware Atari.
Requisitos
- .NET SDK 10.0+
- Linux, macOS ou Windows
Compilação
Restaure pacotes e compile:
dotnet build
Publique uma compilação de lançamento, se necessário:
dotnet publish -c Release -o publish
Execução
Este servidor usa transporte stdio MCP, portanto normalmente é iniciado por um cliente MCP em vez de ser executado interativamente.
Para testes locais:
dotnet run --no-build
Ou execute o executável publicado:
./publish/AtariHackerMCP
Configuração do Cliente MCP
Exemplo de entrada de servidor stdio:
{
"mcpServers": {
"atari-hacker": {
"command": "dotnet",
"args": [
"run",
"--project",
"/absolute/path/to/AtariHackerMCP/AtariHackerMCP.csproj",
"--no-build"
]
}
}
}
Se preferir usar uma compilação publicada:
{
"mcpServers": {
"atari-hacker": {
"command": "/absolute/path/to/AtariHackerMCP/publish/AtariHackerMCP",
"args": []
}
}
}
Ferramentas Disponíveis
Ferramentas de arquivo e disco
load_rom— Carrega um binário ROM/XEX na sessão atualrom_info— Exibe informações estruturais sobre o binário carregadoatr_info— Exibe informações estruturais sobre uma imagem de disco ATRatr_header— Exibe os campos do cabeçalho ATR de uma imagem de discoload_atr_file— Extrai um arquivo de um ATR e o carrega na sessãoload_atr_boot— Extrai setores de boot de um ATR e os carrega em $0700list_atr_directory— Lista o diretório DOS de uma imagem de disco ATRanalyze_boot_sector— Decodifica o cabeçalho do setor de boot de um ATRsector_dump— Despejo hexadecimal de setores de um ATR por número de setor lógicosearch_boot_sector— Examina setores de boot em vários ATRs em busca de padrões/diferençasextract_atr_file— Extrai um arquivo de um ATR e o salva em discoinject_atr_file— Injeta um arquivo em um ATR (cópia ao gravar)create_atr— Cria uma nova imagem de disco ATR do zerowrite_atr_sector— Grava dados brutos em um setor específico de um ATRwrite_atr_file— Grava um arquivo em um ATR com criação de entrada de diretóriodefine_filesystem— Define um layout de sistema de arquivos personalizado para ATRs não-DOS
Inspeção e desmontagem
hex_dump— Produz um despejo hexadecimal com deslocamentos de arquivo, endereços de memória e ASCIIdisassemble— Desmonta código 6502 com análise opcional em múltiplas passadas (analyze=true)- Formatos suportados:
listing,ca65,atasm,mac65 - Quando
analyze=true: gera rótulos significativos (sub_XXXX,data_XXXX,jmp_XXXX), separação código/dados, saída.segment/.proc/.endprocciente de segmentos, formatação de strings ATASCII, comentários de cabeçalho de procedimentos
- Formatos suportados:
analyze_disassembly— Análise em múltiplas passadas que constrói um grafo de referências e identifica regiões de código/dados- Formatos:
summary,graph,labels,full
- Formatos:
define_segment— Define um segmento de memória por tipo (código, dados, gráficos, texto, zero_page)remove_segment— Remove um segmento definido pelo nomelist_segments— Lista todos os segmentos de memória definidos (mostra lacunas)clear_segments— Limpa todos os segmentos definidosgenerate_linker_config— Gera uma configuração de linker cc65 a partir dos segmentos atuais
Ferramentas de análise
x_ref— Encontra referências cruzadas para um endereço na ROMfind_pattern— Procura um padrão de bytes com curingasfind_strings— Procura sequências de caracteres ASCII ou ATASCII imprimíveistrace_control_flow— Rastreia estaticamente a execução a partir de um endereço inicialprobe_data— Analisa um intervalo de memória para identificar o tipo de dados (texto, gráficos, tabela, charset, lista de exibição, dados de sprite, dados de mapa) com pontuação de confiançagenerate_callgraph— Gera um grafo de chamadas mostrando relações entre sub-rotinas (formato Mermaid ou texto)analyze_coverage— Analisa cobertura de código: quais bytes são executados vs. dadosdiff_roms— Compara dois arquivos ROM ou ATR (formato resumo, detalhado ou diff hexadecimal)
Ferramentas de símbolos e zero-page
define_symbol— Adiciona ou atualiza um rótulo nomeado para um endereço de memóriaremove_symbol— Remove um símbolo definido pelo usuáriolookup_symbol— Consulta a entrada de símbolo para um endereçolist_symbols— Lista símbolos na tabela de símbolosset_symbols— Ativa/desativa grupos de símbolos (hardware, variáveis do SO, ROM do SO, rótulos do usuário) para controlar quais nomes aparecem na desmontagemload_labels— Carrega rótulos e segmentos de um arquivo auxiliarsave_labels— Salva rótulos e segmentos atuais em um arquivo auxiliarannotate_zero_page— Adiciona ou atualiza uma anotação de zero-pageshow_zero_page_map— Exibe anotações atuais de zero-page
Ferramentas de script
run_script— Executa uma sequência de comandos de um arquivo de script (suporta 33 comandos)
Ferramentas utilitárias
calculate— Avalia expressões matemáticas com literais hexadecimais (prefixo$)hex_to_decimal— Converte hexadecimal para decimaldecimal_to_hex— Converte decimal para hexadecimal
Desmontagem em Múltiplas Passadas
Quando analyze=true é passado para disassemble, o mecanismo executa três passadas:
- Passada 1 — Coleta de Referências: Examina todos os limites de instrução na ROM, registrando alvos de JSR, alvos de JMP, alvos de desvios, alvos de saltos indiretos e referências de dados absolutas/indiretas em um
ReferenceGraph. - Passada 2 — Rastreamento de Regiões de Código: A partir de cada ponto de entrada de código, rastreia o fluxo de execução (seguindo JSR, JMP, desvios, parando em RTS/RTI/BRK) para marcar bytes como código ou dados.
- Passada 3 — Geração de Rótulos: Produz rótulos significativos (
sub_XXXX,jmp_XXXX,data_XXXX,L_XXXX) com ordenação de prioridade adequada (usuário > sub-rotina > dados > hardware > SO > desvio).
Exemplo
; --------------------------------------------------
; Generated by Atari Hacker MCP v4
; --------------------------------------------------
.segment "MAIN_CODE"
.org $0C00
; --------------------------------------------------
; Subroutine: game_init
; Calls: load_ag_obj, load_ag_dat, main_loop
; --------------------------------------------------
.proc game_init
LDA #$00
STA $D400 ; DMACTL
...
.endproc
; String table at $1712
credits_text:
.byte "Scholastic", $9B ; $9B = ATASCII EOL
.byte "Wizware", $9B
.byte $00
Tabela de Símbolos de Hardware Atari
A tabela de símbolos integrada cobre mais de 200 entradas em todos os principais componentes Atari:
| Grupo | Faixa | Entradas |
|---|---|---|
| GTIA | $D000–$D01F | 22 registradores (gráficos de jogador/míssil, cor, controle) |
| POKEY | $D200–$D21F | 32 registradores (som, E/S, reservados, aliasing de leitura/gravação) |
| PIA | $D300–$D303 | 4 registradores (E/S paralela) |
| ANTIC | $D400–$D41F | 20 registradores (DMA, lista de exibição, NMI, reservados) |
| ROM do SO | $C000–$FFFF | 13 pontos de entrada (SIO, CIO, vetores) |
| Zero page do SO | $00–$FF | ~220 variáveis (temporizadores, controle de E/S, ponto flutuante, tela, paddles, joysticks) |
Grupos de símbolos podem ser alternados com set_symbols para evitar conflitos quando o código do usuário se sobrepõe às faixas de endereço do SO.
Operações de Gravação em ATR
O subsistema de gravação ATR fornece modificação de imagem de disco com cópia ao gravar:
| Operação | Descrição |
|---|---|
extract_atr_file | Extrai um arquivo DOS de um ATR para o sistema de arquivos do host |
inject_atr_file | Substitui os dados da entrada de um arquivo em um ATR (cria cópia .modified) |
create_atr | Cria um ATR em branco com contagem de setores e densidade especificados |
write_atr_sector | Grava dados binários brutos em um setor específico |
write_atr_file | Cria uma nova entrada de arquivo DOS com alocação de setores |
define_filesystem | Descreve um layout de sistema de arquivos não-DOS para discos de formato personalizado |
Script em Lote
A ferramenta run_script executa sequências de comandos de arquivos de texto:
# disassemble_all.txt
load_rom filePath=game.xex
define_symbol address=$1540 label=game_init
define_segment name=boot_loader start=$0700 end=$087F type=code
define_segment name=main_code start=$0C00 end=$1CFF type=code
disassemble offset=$0700 numBytes=384 format=ca65 analyze=true
generate_linker_config output=game.cfg
save_labels filePath=game.annotations.json
Sondagem de Dados
probe_data usa 7 heurísticas para identificar tipos de dados em faixas de memória:
- Detecção de strings — Sequências imprimíveis ATASCII/ASCII, terminadas por
$9B, terminadas por nulo - Detecção de preenchimento — Sequências de
$00,$FF,$1A(EOL ATASCII) - Detecção de conjunto de caracteres — Blocos de 1024 bytes (128×8) e 512 bytes (64×8)
- Detecção de tabelas — Tabelas de endereços de 2 bytes, tabelas de consulta de 1 byte
- Detecção de lista de exibição — Opcodes de lista de exibição ANTIC com extração de LMS
- Detecção de dados de sprite — Blocos alinhados de 8/16/32 bytes com análise de variedade de bytes
- Detecção de dados de mapa — Padrões de grade 2D com comprimentos de linha consistentes
Cada resultado inclui um nível de confiança (Alto/Médio/Baixo) e detalhes de suporte.
Fluxo de Trabalho Típico
Exploração básica
- Carregue um arquivo com
load_rom,load_atr_fileouload_atr_boot. - Inspecione a estrutura com
rom_infoouatr_info. - Use
hex_dumppara examinar bytes brutos,find_stringspara localizar texto. - Desmonte com
disassemble(modo básico).
Desmontagem orientada por análise
load_rom→ Carregue o binário.analyze_disassembly format=summary→ Obtenha visão geral de código/dados.analyze_disassembly format=labels→ Veja todos os rótulos gerados automaticamente.probe_data start=$1712 end=$1AD4→ Identifique regiões de dados.define_segment name=main_code start=$0C00 end=$1CFF type=codedefine_segment name=game_data start=$1D00 end=$BBA4 type=datadisassemble offset=$0C00 numBytes=5376 format=ca65 analyze=true→ Saída ciente de segmentos.generate_callgraph start=$1540 depth=5 format=mermaid→ Visualize a estrutura.- Itere:
define_symbol→disassemble analyze=true→ revise.
Fluxo de trabalho de refinamento iterativo
load_rom→ desmontagem inicial com rótulos automáticos.analyze_disassembly→ identifique regiões de código/dados.define_symbol→ anote endereços-chave.define_segment→ marque regiões de código/dados.save_labels→ persista anotações.disassemble analyze=true→ re-desmonte com anotações.- Revise, repita os passos 3-6 conforme necessário.
Fluxo de trabalho de modificação de ATR
create_atr output=build/disk.atr sectors=720 density=sd→ disco em branco.write_atr_sector filePath=build/disk.atr sector=1 input=boot.bin→ grave setor de boot.write_atr_file filePath=build/disk.atr name=AGENT.OBJ input=build/AGENT.OBJ→ adicione arquivo.extract_atr_file filePath=game.atr name=AGENT.OBJ output=extracted/AGENT.OBJ→ extraia arquivo.inject_atr_file filePath=game.atr name=AGENT.OBJ input=build/AGENT.OBJ→ substitua arquivo.
Persistência
Símbolos definidos pelo usuário, anotações de zero-page e definições de segmentos são salvos automaticamente em um arquivo JSON auxiliar ao lado do alvo carregado:
<rom-or-synthetic-path>.atarihacker.json
O formato auxiliar v4 inclui:
- Campo de versão para compatibilidade futura
- Hash SHA-256 da ROM para verificação de integridade
- Segmentos (nome, tipo, início, fim, comentário)
- Definições de sistema de arquivos personalizados
Arquivos auxiliares v3 (sem campo de versão) são lidos de forma transparente e atualizados ao salvar.
Exemplo de Teste Rápido MCP
Isso envia initialize e tools/list diretamente via stdio:
(
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0"}}}\n'
sleep 0.2
printf '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}\n'
sleep 1
) | dotnet run --no-build
Notas
- Logs são gravados em stderr para que stdout permaneça limpo para tráfego JSON-RPC MCP.
- A ferramenta
disassemblecomanalyze=false(padrão) se comporta exatamente como na v3 — compatibilidade total com versões anteriores. - Código automodificável e despacho por tabela de saltos (
JMP (table,X)) não podem ser resolvidos estaticamente; usedefine_segmentpara marcar essas regiões manualmente. - Para detalhes completos do design, consulte
docs/version4-design.mde a especificação v4.
Licença
Este projeto é licenciado sob a Licença MIT. Consulte o arquivo LICENSE para detalhes.