Project Mono Parte 1 - Fiquei Maluca
Bom dia amigos, espero que todos estejam bem! Estive trabalhando no Choncho Adventure enquanto aprendo Pixel Art, fazendo entrevistas de emprego e tentando relaxar. Passei em uma vaga de dados, começo mês que vem! Ai que saudades de um excelzinho!
Nisso tudo, no lugar de fazer o primeiro DevLog do jogo, começarei a contar a parte 1 de minha saga em engenharia reversa.
Scripts, AutoHotKey e Preguiça
Lá por 2013~2014 conheci o joguinho Clicker Heroes, na Steam. Fiquei viciada e isso mudou drasticamente minha vida, desde então sempre estou jogando algum jogo Incremental ou Idle. Nessa época, acabei encontrando um Script para AutoHotKey, que fazia prestígios no jogo de forma automática, em loop. Extremamente prático, salvou muito tempo da minha vida.
Conforme o tempo foi passando, criei meus próprios scripts para alguns jogos. Basicamente qualquer jogo que era uma ação repetitiva que podia ser emulada através de inputs, eu scriptava usando AHK. Até Disgaea, que é minha franquia favorita, foi automatizado (em minha defesa, platinei Disgaea 4 no Ps3, Disgaea 5 no ps4 e zerei Disgaea 1 no PSP).
Ano passado encontrei o jogo Click Click Dig na Steam, que ainda está sendo desenvolvido mas tem a demo disponível e, como de costume, queria criar um script de automação. No caso desse jogo, seria um script simples, que aperta os botões 12345 a cada X tempo.
Não lembro a razão, mas tinha decidido que não queria que o script maximizasse a janela, enviasse os inputs e minimizasse depois. Na minha cabeça, o script antigo de Clicker Heroes não precisava fazer isso (Spoiler: Precisava), e então começou a GUERRA.
Largando o AutoHotKey
Tentei ControlSend e milhões de alternativas que encontrei na internet, sem sucesso. Já tinha tentado fazer isso antes, mas nas outras vezes desisti rápido e só segui a vida.
Decidi então que iria criar um programa que envia os inputs diretamente para o jogo mesmo que esteja minimizado.
Se você está aqui querendo uma solução simples, o mais fácil seria rodar o jogo e o script em uma Virtual Machine.
WinAPI
Aprendi a usar a WinAPI e fui aos testes, sem sucesso, pois o jogo precisava estar maximizado para processar os inputs.
Foi aí que percebi que foi uma ideia bem arrogante, considerando que AHK existe há quase 20 anos e nem eles fizeram dar certo. Até onde eu entendo hoje, é uma limitação do próprio Windows.
Mas eu não quero soluções fáceis, a teimosia tomou conta de mim e então entrei em um buraco…levemente diferente do esperado.
DLL Injection
Não pergunte sobre como cheguei nisso, estava em fase de mania, mas pensei que “se não posso enviar os inputs para uma janela minimizada, irei injetar código que emula os inputs na janela minimizada.
Ideia fofa, porém besta. Nisso, aprendi a criar e injetar DLL em processos, mas os inputs não estavam sendo lidos. Pela última vez nesse texto, não era possível processar inputs na janela minimizada, não importando de onde eles foram enviados.
Mas agora com o novo conhecimento de injeção de código, existe algo mais interessante do que enviar os inputs!
Muita Sede Ao Pote
Se eu consigo injetar código diretamente na memória, eu não poderia nesse caso só invocar as funções de cada botão? Sim, finalmente uma resposta que faz sentido. O problema agora é que eu não tinha conhecimentos em engenharia reversa. A vez que cheguei mais perto disso foi quando era criança e usava cheat engine para aumentar as moedinhas e comprar a loja toda.
Procurando na internet, você vai encontrar um milhão de videos sobre Cheat Engine, e até mesmo algumas linhas de código sobre injeção de DLL e como alterar dados na memória em tempo real, mas nada de forma muito didática, no final das contas isso é sobre cheat em joguinho, quem que quer realmente aprender sobre né (resposta: EU, EU QUERIA APRENDER DE VERDADE).
Mas não foi completamente inútil, é meio impressionante o quanto as pessoas aprendem de assuntos complexos por motivos nada a ver. Nessa brincadeira, com muita paciência descobri como encontrar os Offsets para cada um dos objetos da classe HeroSkill, que é exatamente o que eu preciso.
Meu problema agora era aprender a instanciar os métodos de uma classe. Pesquisei bastante e não encontrei muitas respostas sobre, visto que o próprio CheatEngine tem função para dissecar jogos que usem MonoCLR e invocar métodos, não há muito interesse nesse tipo de conteúdo. E sim, essa seria outra solução, mas o objetivo agora ia além de fazer um script para o Click Click Dig, eu estava realmente intrigada com tudo isso.
Esse post todo se passou em 2024, mas não foi o fim da história! Mês que vem (ou talvez em Abril) vem a parte 2, obrigada por ter lido!