
Scanner de mémoire open source écrit en C++
XenoScan est un scanneur de mémoire qui peut être utilisé pour analyser la mémoire des processus afin de localiser les emplacements spécifiques de valeurs importantes. Ces types d’outils sont généralement utilisés lors du piratage de jeux vidéo, car ils permettent de localiser les valeurs représentant l’état du jeu en mémoire.
XenoScan est écrit en C++ avec une interface Lua, et j’ai travaillé sur des fonctionnalités avancées qui vont au‑delà de tout ce que j’ai vu dans d’autres scanneurs de mémoire. Notamment, il dispose d’un moyen d’énumérer et de retourner toutes les structures de données complexes (telles que std::list et std::map) dans l’espace mémoire de la cible, et il peut même rechercher n’importe quelles instances de classe et regrouper les instances découvertes par leurs types sous‑jacents.
Si vous avez besoin de me contacter, souhaitez un endroit pour discuter, ou avez une question, mon Discord est le meilleur endroit.
XenoLua est une surcouche autour de Lua qui fournit une multitude de fonctionnalités. Le plus notable est la classe LuaVariant qui encapsule la conversion entre les types C/C++ et Lua. De plus, elle contient des fonctions auxiliaires pour travailler avec Lua dans la classe LuaPrimitive.
XenoScanEngine est le cœur du projet. Il contient le code pour l’analyse, la détection des structures de données, et tout le reste.
XenoScanLua relie XenoScanEngine à XenoLua pour fournir une interface scriptable en Lua pour le scanneur. Actuellement, c’est le seul point d’entrée du scanneur.
De plus, ce projet contient du code de test qui vérifie que tout fonctionne correctement. Un test est une combinaison d’un fichier .cpp, d’un .h et d’un .lua. Pour des exemples d’utilisation du scanneur, vous pouvez consulter les fichiers de test .lua.
XenoScan utilise CMake et a été testé avec Visual Studio 2017. Pour utiliser cette version de VS, exécutez simplement buildmsvc2017.bat depuis une Invite de commandes développeur 32 bits pour VS. Par exemple, pour construire un projet pour Visual Studio 2017, j’exécute
cd C:\path\to\XenoScan
buildmsvc2017.bat
Ce qui crée un fichier nommé XenoScan.sln dans mon répertoire build (par exemple C:\path\to\XenoScan\build). J’utilise ensuite ce fichier solution pour compiler le code dans Visual Studio. La construction en x64 est similaire, mais doit être exécutée depuis une Invite de commandes d’outils natifs x64 pour VS.
cd C:\path\to\XenoScan
buildmsvc2017x64.bat
Lorsque vous passez d’une construction 32 bits à x64, vous devez exécuter buildclean.bat. Cela supprimera les fichiers projet générés et les binaires LuaJIT compilés, car ils doivent être reconstruits pour l’architecture correcte (cela se fera automatiquement).
Note : Je n’ai aucune idée pourquoi ces invites sont nommées si différemment. L’important est que les vcvars configurés par les invites correspondent à l’architecture en cours de construction. C’est surtout important pour la construction de LuaJIT. Quoi qu’il en soit, les scripts de construction vous indiqueront si vous les exécutez au mauvais endroit.
En théorie, vous devriez pouvoir compiler le code avec n’importe quel compilateur moderne, à condition d’utiliser CMake pour générer les fichiers projet. Avant de pouvoir compiler, vous devez vous assurer d’avoir récupéré les sous‑modules. Une fois cela fait, vous devrez également construire le sous‑module luajit pour que XenoScan puisse se lier aux bibliothèques.
Par moderne, j’entends tout ce qui supporte C++17, car le code utilise ce standard. De plus, votre version de CMake doit être au moins la 3.10.
Le code est conçu pour être indépendant de la plateforme. Théoriquement, pour compiler sur n’importe quelle autre plateforme, vous devriez
ScannerTargetWindows.cpp et ScannerTargetWindows.h du projet.ScannerTarget pour votre plateforme.Les fonctionnalités de base d’analyse prennent en charge les types suivants :
int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_tfloatdoublefiletime64 : horodatage 64 bits (GetSystemTimeAsFileTime() sous Windows)ticktime32 : compteur de ticks 32 bits ( sous Windows)* L’interface Lua peut avoir du mal avec les entiers 64 bits, mais la bibliothèque du scanneur les supporte.
L’analyse prend en charge les types de correspondance suivants :
min <= vérification <= max)De plus, il existe une fonctionnalité pour détecter toutes les instances des types suivants :
std::mapstd::listGetTickCount()struct en C++)