
Scanner de memória de código aberto escrito em C++
XenoScan é um scanner de memória que pode ser usado para escanear a memória de processos a fim de localizar as posições específicas de valores importantes. Esse tipo de ferramenta é tipicamente usado ao modificar jogos de vídeo, pois permite localizar os valores que representam o estado do jogo na memória.
XenoScan é escrito em C++ com um frontend em Lua, e tenho trabalhado em funcionalidades avançadas que vão além de qualquer coisa que já vi em outros scanners de memória. Notavelmente, ele possui uma maneira de enumerar e retornar todas as estruturas de dados complexas (como std::list e std::map) no espaço de memória do alvo, e pode até mesmo escanear por instâncias de classes e agrupar as instâncias descobertas por seus tipos subjacentes.
Se precisar entrar em contato comigo, quiser um lugar para conversar ou tiver uma pergunta, meu Discord é o melhor lugar.
XenoLua é um invólucro em torno do Lua que fornece uma tonelada de funcionalidades. Mais notavelmente, ele fornece uma classe LuaVariant que encapsula a funcionalidade de conversão entre tipos C/C++ e Lua. Além disso, possui funções auxiliares para trabalhar com Lua na classe LuaPrimitive.
XenoScanEngine é a parte principal do projeto. Contém o código para a varredura, detecção de estruturas de dados e todo o resto.
XenoScanLua liga XenoScanEngine ao XenoLua para fornecer um frontend programável em Lua para o scanner. Atualmente, este é o único ponto de entrada para o scanner.
Além disso, este projeto contém algum código de teste que garante que tudo está funcionando corretamente. Um teste é uma combinação de um arquivo .cpp, um .h e um .lua. Para exemplos de como usar o scanner, você pode consultar os arquivos de teste .lua.
XenoScan usa CMake e foi testado com Visual Studio 2017. Para usar esta versão do VS, basta executar buildmsvc2017.bat a partir de um Prompt de Comando do Desenvolvedor de 32 bits para VS. Como exemplo, para construir um projeto para Visual Studio 2017, executo
cd C:\caminho\para\XenoScan
buildmsvc2017.bat
O que cria um arquivo chamado XenoScan.sln no meu diretório build (ex.: C:\caminho\para\XenoScan\build). Em seguida, uso esse arquivo de solução para compilar o código no Visual Studio. A construção para x64 é semelhante, mas é executada a partir de um Prompt de Comando das Ferramentas Nativas x64 para VS.
cd C:\caminho\para\XenoScan
buildmsvc2017x64.bat
Ao alternar entre builds de 32 bits e x64, você deve executar buildclean.bat. Isso excluirá os arquivos de projeto gerados e removerá os binários compilados do LuaJIT, pois eles precisam ser reconstruídos para a arquitetura correta (isso acontecerá automaticamente).
Nota: Não faço ideia por que esses prompts têm nomes tão diferentes. A parte importante é que as vcvars configuradas pelos prompts correspondam à arquitetura que está sendo construída. Isso é principalmente importante para construir o LuaJIT. De qualquer forma, os scripts de build dirão se você os está executando do lugar errado.
Em teoria, você deve conseguir compilar o código com qualquer compilador moderno, desde que use o CMake para gerar os arquivos de projeto. Antes de compilar, você precisará garantir que fez o checkout dos submódulos. Depois disso, também será necessário construir o submódulo luajit para que o XenoScan possa linkar contra as bibliotecas.
Por moderno, quero dizer qualquer coisa que suporte C++17, já que o código usa esse padrão. Além disso, sua versão do CMake deve ser pelo menos 3.10.
O código foi projetado para ser independente de plataforma. Teoricamente, para compilar em qualquer outra plataforma, você precisaria
ScannerTargetWindows.cpp e ScannerTargetWindows.h do projeto.ScannerTarget para sua plataforma.A funcionalidade básica de varredura suporta os seguintes tipos:
int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_tfloatdoublefiletime64: carimbo de tempo de 64 bits (GetSystemTimeAsFileTime() no Windows)ticktime32: contagem de ticks de 32 bits ( no Windows)* O frontend Lua pode engasgar com inteiros de 64 bits, mas a biblioteca do scanner os suporta.
A varredura suporta os seguintes tipos de correspondência:
min <= verificação <= max)Além disso, há funcionalidade para detectar todas as instâncias dos seguintes tipos:
std::mapstd::listGetTickCount()struct do C++)