Engenharia Reversa num jogo de Gameboy Advance — Guia Completo

Bruno Macabeus
5 min readJun 28, 2019

--

Read it in English here! 🇺🇸
¡Léelo en español aquí! 🇪🇸

Eu sempre gosto muito de manter um projeto pessoal. É uma fantástica forma de desopilar e estudar algo diferente do que normalmente programamos no dia a dia do trabalho. Ano passado me foquei bastante num projeto de compilador, e esse ano não podia ser diferente: busquei alguma coisa legal para desenvolver e estudar, algo que também fosse voltando a entender mais os fundamentos da computação e que envolvesse um projeto diferente, cativante de se trabalhar.
Após pular de galho em galho, enfim encontrei algo que prendeu a minha atenção por semanas e que ainda tem muito trabalho pela frente: criar um editor de level para o jogo do Klonoa no Gameboy Advance, isto é, um projeto de ROM hacking!

Nessa sequência de postagens relatarei em detalhes os meus estudos, para assim contagiar mais pessoas a também estudarem engenharia reversa e outros tópicos tão fascinante quanto. Escreverei as postagens tanto em português como em inglês, para assim alcançar o máximo possível de pessoas.

Caso queria acompanhar mais de perto o desenvolvimento do projeto, pode ver o repositório com o código fonte dele, da qual está sendo escrito em JS+React: https://github.com/macabeus/klo-gba.js

O projeto de estudo que apresentarei o desenvolvimento, o klo-gba.js, teve bastante sucesso na comunidade de ROM Hacking, tanto que foi destacado na maior comunidade do ramo.

Mas antes de adentrarmos, vamos para um breve overview ~~

Talks

Você é do tipo que prefere assistir do que ler?
Sem problema algum! Eu e meu amigo apresentamos em três conferências esse projeto. É óbvio que na talk o conteúdo é bem mais condensado, pois temos menos tempo, assim essas postagens estão bem mais ricas em detalhes — porém, as palestras trazem uma outra abordagem bem mais interativa para desvendar esses desafios de engenharia reversa.

Talk na DEFCON Furs 2021, online 🌎
Como essa conferência é voltada para segurança, a talk é focada no processo de engenharia reversa. Slides
(há um breve problema no áudio, corrigido em ~2:00)

Talk na The Conf 2019, no Brasil 🇧🇷
Como essa conferência tem um público bem mais geral, metade dessa talk aborda engenharia reversa, e a outra metade aborda o front-end. Slides

Talk na BalCCon 2k19, na Sérvia 🇷🇸
Mesmo caso da DEFCON Furs 2021: a conferência é voltada para segurança, assim a talk é focada no processo de engenharia reversa. Slides

(ambas as palestras são em inglês; infelizmente, acabei não conseguindo palestrar em algum evento em português e que gravassem as palestras 😕)

O que é esse jogo?

Teaser do Klonoa Empire of Dreams

É um jogo de plataformas em 2D, um pouco mais voltado para puzzle.
Com várias fases e mecânicas que vai aumentando a complexidade no decorrer das fases, é bem viciante. Porém, uma hora as fases acabam… Mas… E se conseguíssemos criar as nossas próprias fases?

Várias características tornam esse jogo propício para esse desafio e estudo: o jogo é 2D com mapa tile-based, apresenta uma mecânica relativamente simples, além de ser executado num video-game antigo e popular. Fazer engenharia reversa e um editor de fases é algo bem complexo, porém ainda factível de se concretizar! Então bora lá!

> o que é um mapa “tile-based”?
Simples: é um mapa de jogo da qual é uma coleção de pequenas peças. Cada peça (tile) normalmente se repete várias vezes, e internamente é representada por um ID único. Assistindo ao vídeo acima, facilmente você pode identificar em primeiro plano uma malha, da qual há peças que se repetem, formando assim o mapa do jogo. Essa é uma popular forma de se arquitetar um jogo 2D.

Gameboy Advance

Console portátil lançado em 2001. Foi muito popular em sua época.
E tal como todo console que se torna popular, surgiram várias pessoas interessadas em aprender mais como ele funciona internamente, assim sendo desenvolvido vários estudos e documentação de como funciona a sua arquitetura, como criar o seu próprio jogo, e verdadeiras ferramentas para auxiliar na engenharia reversa e projetos relacionados aos jogos mais populares, como os de Pokemon. Inclusive, há editores de fases para os jogos de Pokemon, como o Advance Map.

Porém, como o jogo do Klonoa não é tão popular como os de Pokemon, não foram feitos estudos voltados exatamente ao seu funcionando, nem ferramentas para ele. Mas podemos aproveitar todo o ecossistema existente para criar a nossa própria ferramenta, usando como base os manuais e debuggers de GBA!

Nossas ferramentas

Ao lado esquerdo, o no$gba. Ao lado direito, o IDA

Usaremos principalmente duas ferramentas: o no$gba, principalmente para análise dinâmica (analizar o software enquanto ele é executado), e o IDA, para análise estática (analizar o software enquanto ele não é executado).
O no$gba é uma ferramenta muito boa para fazer análise dinâmica, já tento tudo integrado em um só lugar. Como é exclusivamente voltado para o GBA, tem features bem específicas, como visualizar o background/tile map, visualizadores gráficos da memória… isso tudo facilita bastante. Porém, para debug mais geral, ele é bem limitado se comparado ao IDA, que conta com excelentes features para análise estática, como visão em grafo e extrair determinada parte da memória para um arquivo separado, o que é importante para quando formos extrair a fase da ROM.

JS

Como o objetivo é criar um editor de fases, optei que ele fosse um webapp, usando JS+React.

Eu realmente gosto de webapp, pois a internet é um delivery de código. Basta o usuário acessar uma URL que ele já pode prover de seu produto. E como eu não queria forçar que o usuário baixasse uma ferramenta só para criar algumas fases num jogo, decidi que a ferramenta fosse web.

Desse modo, optei usar JS, pois é a linguagem que mais tenho experiência para rodar no browser, e para fazer o front decidi usar React. Dentre as libs/frameworks que já experimentei, React foi a que mais gostei. A ideia de pensar em seu front como componentes isolados, cada qual com um conjunto de estados, realmente me agrada.

Falaremos mais sobre o desenvolvimento do front nas últimas postagens dessa série.

Tudo pronto para começarmos!

Ao final dessa série de postagens, você aprenderá sobre como foi desenvolvida a mágica aplicação acima

Dado esse breve overview, nos próximos capítulos explicarei os meus avanços em cada etapa do projeto, para juntos criarmos um editor de level para o jogo do Klonoa do GBA! Bora?

Próxima postagem: Vamos esticar a ponte!

--

--