Desenvolvimento de um Bot para Brawlhalla: Manipulação de Memória, Kernel e Automação de Inputs
Introdução:
Estou tentando desenvolver um bot para o Brawlhalla que possa simular ações avançadas como esquivas rápidas, ataques precisos e decisões inteligentes baseadas na situação do jogo. Inicialmente, optei por usar técnicas como Python e C++ para automação de teclado e controle de entrada, mas percebi que isso não seria suficiente para lidar com as restrições do anti-cheat (EAC) e a latência do servidor.
A ideia inicial era manipular diretamente a memória do jogo e injetar inputs de teclado e mouse para controlar o bot. No entanto, depois de alguns testes e análise da estrutura do jogo, percebi que seria necessário adotar técnicas de kernel-level programming para contornar o EAC e melhorar a performance, especialmente em termos de latência.
1. A Necessidade de Kernel-Level Programming
A automação de inputs com Python e C++ não se mostrou eficiente o suficiente para contornar as proteções do EAC, além de não ser precisa o bastante devido à latência de rede. Com isso, percebi que a única maneira de obter um controle mais profundo e não detectado seria através de kernel-level programming.
A proposta é desenvolver um driver que interaja diretamente com o sistema de entrada (teclado e mouse) e a memória do jogo, sem ser detectado pelas proteções do jogo. Isso garantirá uma maior precisão e maior controle na simulação das ações do bot, além de reduzir significativamente o delay entre as ações do bot e o servidor.
2. A Dificuldade no Acesso à Memória do Jogo
Uma das maiores dificuldades que encontrei foi a de acessar informações cruciais do jogo, como a posição do jogador (x, y, z), status de ataques e ações como esquiva. Ao utilizar ferramentas como o Cheat Engine (CE), percebi que o acesso a essas informações não é tão simples.
O jogo parece usar técnicas de ofuscação e criptografia de dados, o que torna difícil mapear os endereços de memória de forma estável. O LocalPlayer, por exemplo, não possui um ponteiro estático facilmente acessível, e as variáveis essenciais estão frequentemente encapsuladas em objetos dinâmicos que mudam de endereço conforme a partida avança.
A partir disso, decidi buscar uma abordagem em que o sistema de controle estivesse fora do jogo, mas ainda fosse capaz de comunicar-se com a memória do jogo de forma eficiente.
3. Automação de Inputs via Kernel
Com o objetivo de melhorar a precisão e reduzir a latência nos comandos, comecei a desenvolver um driver que interage diretamente com os buffers de entrada do sistema operacional. Usando C++ para criar um driver de kernel, consigo capturar e injetar entradas de teclado e mouse de maneira mais eficiente.
O uso de kernel-level programming ajuda a evitar detecção por ferramentas de anti-cheat, pois o sistema de entrada manipulado diretamente no kernel não é facilmente monitorado por APIs de alto nível. Além disso, essa abordagem reduz a latência, garantindo que o bot reaja rapidamente aos estados do jogo.
Os objetivos principais dessa parte do desenvolvimento incluem:
Interação direta com o sistema de entrada: Manipulação de teclas e mouse de forma mais precisa.
Manipulação eficiente de memória: Leitura e escrita na memória do jogo sem ser detectado pelo EAC.
Redução de latência: Sincronizar os inputs de forma que o bot responda de forma quase instantânea.
4. Latência e Ataques de Alta Velocidade
Brawlhalla é um jogo com uma mecânica de ataques rápidos, onde ações de menos de 1ms podem fazer a diferença entre vencer ou perder. O delay do servidor é um dos maiores obstáculos no desenvolvimento de um bot eficiente. Mesmo com um sistema de controle de teclado mais eficiente e manipulação direta da memória, o tempo de resposta do servidor limita as capacidades do bot.
Para superar isso, estou explorando a leitura de pacotes de rede, para prever as ações do inimigo antes mesmo que elas aconteçam, antecipando movimentos e ataques. Isso permitiria ao bot reagir de maneira mais eficaz, simulando a previsão de ataques rápidos e realizando esquivas ou contra-ataques de maneira mais estratégica.
5. Rede Neural e Tomada de Decisão
Além da automação de inputs e manipulação de memória, estou utilizando uma rede neural para melhorar a inteligência do bot. A ideia é treinar o bot para tomar decisões mais inteligentes, como quando atacar ou quando esquivar, com base no estado do jogo.
No momento, o bot já consegue realizar algumas ações básicas como esquivar e atacar em momentos específicos. No entanto, a decisão rápida e precisa ainda é um desafio. Para melhorar isso, estou treinando o bot usando aprendizado supervisionado, onde forneço exemplos de combate para o bot aprender a tomar as melhores decisões.
6. Desafios Encontrados
Precisão de Esquiva e Timing: Um dos maiores desafios tem sido a precisão na esquiva. O bot ainda tem dificuldades para reagir a ataques rápidos, como o Nlight, devido à latência e à complexidade de calcular a precisão dos inputs. Mesmo com o modelo de rede neural, a reação do bot não é tão rápida quanto a de um jogador profissional.
Previsão de Movimentos: O bot ainda tem dificuldades em antecipar os movimentos do inimigo. A previsão de ataques, mesmo utilizando técnicas de machine learning, não está 100% precisa, especialmente com ataques rápidos.
Manipulação de Memória e Estruturas de Dados: O processo de mapeamento da memória do jogo tem sido complicado devido à dinâmica da estrutura de dados e técnicas de ofuscação. Encontrei alguns endereços de memória dinâmicos, mas os dados ainda não são estáveis o suficiente para garantir uma leitura precisa em tempo real.
7. Solicitação de Ajuda
Neste ponto, estou buscando ajuda nas seguintes áreas:
Kernel-Level Programming: Alguém tem experiência no desenvolvimento de drivers de kernel para manipulação de inputs? Como evitar a detecção por EAC?
Manipulação de Memória: Como posso acessar as variáveis e dados do inimigo de maneira mais eficiente? Alguém já conseguiu acessar com precisão dados como hitboxes ou status de movimentos?
Redução de Latência e Previsão de Movimentos: Quais técnicas podem ajudar a reduzir a latência entre o servidor e o cliente, melhorando a precisão da esquiva e ataque do bot?
Integração entre Python e C++: Alguém já integrou Python com C++ para controlar bots em jogos? Quais ferramentas ou técnicas ajudaram na comunicação entre os dois?
Conclusão:
O desenvolvimento desse bot tem sido desafiador, mas estou fazendo progressos significativos. A combinação de C++ para controle de baixo nível e Python para lógica de inteligência artificial está funcionando bem, embora a integração entre eles ainda apresente desafios. Se alguém tiver dicas ou experiências para compartilhar sobre os aspectos técnicos mencionados, eu ficaria muito grato por qualquer ajuda!