Engenharia Reversa num jogo de Gameboy Advance — Guia Completo
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?
É 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
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!
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?