
Escáner de memoria de código abierto escrito en C++
XenoScan es un escáner de memoria que se puede utilizar para analizar la memoria de procesos y localizar las ubicaciones específicas de valores importantes. Este tipo de herramientas se usan típicamente al modificar videojuegos, ya que permiten localizar los valores que representan el estado del juego en la memoria.
XenoScan está escrito en C++ con un frontend en Lua, y he estado trabajando en funcionalidades avanzadas que van más allá de cualquier cosa que haya visto en otros escáneres de memoria. En particular, tiene una forma de enumerar y devolver todas las estructuras de datos complejas (como std::list y std::map) en el espacio de memoria del objetivo, e incluso puede escanear cualquier instancia de clase y agrupar las instancias descubiertas por sus tipos subyacentes.
Si necesitas ponerte en contacto conmigo, quieres un lugar para charlar o tienes alguna pregunta, mi Discord es el mejor lugar.
XenoLua es un envoltorio alrededor de Lua que proporciona una gran cantidad de funcionalidades. Lo más destacado es que proporciona una clase LuaVariant que envuelve la funcionalidad de conversión entre tipos C/C++ y Lua. Además, tiene funciones auxiliares para trabajar con Lua en la clase LuaPrimitive.
XenoScanEngine es el núcleo del proyecto. Contiene el código para el escaneo, la detección de estructuras de datos y todo lo demás.
XenoScanLua une XenoScanEngine con XenoLua para proporcionar un frontend scripteable en Lua para el escáner. Actualmente, este es el único punto de entrada al escáner.
Además, este proyecto contiene código de prueba que asegura que todo funciona correctamente. Una prueba es una combinación de un archivo .cpp, un .h y un .lua. Para ver ejemplos de cómo usar el escáner, puedes consultar los archivos de prueba .lua.
XenoScan usa CMake y ha sido probado con Visual Studio 2017. Para usar esta versión de VS, simplemente ejecuta buildmsvc2017.bat desde un Símbolo del sistema para desarrolladores de VS de 32 bits. Como ejemplo, para compilar un proyecto para Visual Studio 2017, ejecuto
cd C:\ruta\a\XenoScan
buildmsvc2017.bat
Lo que crea un archivo llamado XenoScan.sln en mi directorio build (por ejemplo, C:\ruta\a\XenoScan\build). Luego uso este archivo de solución para compilar el código en Visual Studio. La compilación x64 es similar, pero se ejecuta desde un Símbolo del sistema de herramientas nativas x64 para VS.
cd C:\ruta\a\XenoScan
buildmsvc2017x64.bat
Al cambiar entre compilaciones de 32 bits y x64, debes ejecutar buildclean.bat. Esto eliminará los archivos de proyecto generados y quitará los binarios compilados de LuaJIT, ya que deben reconstruirse para la arquitectura correcta (esto ocurrirá automáticamente).
Nota: No tengo idea de por qué estos símbolos del sistema se llaman de manera tan diferente. Lo importante es que las vcvars configuradas por los símbolos correspondan a la arquitectura que se está compilando. Esto es principalmente importante para compilar LuaJIT. De todos modos, los scripts de compilación te dirán si los estás ejecutando desde el lugar incorrecto.
En teoría, deberías poder compilar el código con cualquier compilador moderno, siempre que uses CMake para generar los archivos de proyecto. Antes de compilar, deberás asegurarte de haber clonado los submódulos. Una vez hecho eso, también tendrás que compilar el submódulo luajit para que XenoScan pueda enlazar con las librerías.
Por moderno me refiero a cualquier cosa que admita C++17, ya que el código usa ese estándar. Además, tu versión de CMake debe ser al menos 3.10.
El código está diseñado para ser independiente de la plataforma. En teoría, para compilar en cualquier otra plataforma, necesitarías:
ScannerTargetWindows.cpp y ScannerTargetWindows.h del proyecto.ScannerTarget para tu plataforma.La funcionalidad básica de escaneo admite los siguientes tipos:
int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_tfloatdoublefiletime64: marca de tiempo de 64 bits (GetSystemTimeAsFileTime() en Windows)ticktime32: contador de ticks de 32 bits ( en Windows)* El frontend de Lua puede tener problemas con enteros de 64 bits, pero la librería del escáner los admite.
El escaneo admite los siguientes tipos de coincidencias:
min <= check <= max)Además, hay funcionalidad para detectar todas las instancias de los siguientes tipos:
std::mapstd::listGetTickCount()struct de C++)