
Open Source Speicherscanner geschrieben in C++
XenoScan ist ein Speicherscanner, mit dem der Speicher von Prozessen durchsucht werden kann, um die genauen Stellen wichtiger Werte zu lokalisieren. Diese Art von Werkzeugen wird typischerweise beim Hacken von Videospielen verwendet, da sie es ermöglichen, die Werte zu lokalisieren, die den Spielzustand im Speicher darstellen.
XenoScan ist in C++ mit einem Lua-Frontend geschrieben, und ich habe an erweiterten Funktionen gearbeitet, die über alles hinausgehen, was ich in anderen Speicherscannern gesehen habe. Insbesondere bietet es eine Möglichkeit, alle komplexen Datenstrukturen (wie std::list und std::map) im Speicherbereich des Ziels aufzulisten und zurückzugeben, und es kann sogar nach beliebigen Klasseninstanzen suchen und die gefundenen Instanzen nach ihren zugrunde liegenden Typen gruppieren.
Wenn Sie mit mir in Kontakt treten möchten, einen Ort zum Chatten suchen oder eine Frage haben, ist mein Discord der beste Ort.
XenoLua ist ein Wrapper um Lua, der eine Menge Funktionalität bietet. Am bemerkenswertesten ist die Bereitstellung einer LuaVariant-Klasse, die die Konvertierung zwischen C/C++- und Lua-Typen kapselt. Darüber hinaus enthält es Hilfsfunktionen für die Arbeit mit Lua in der LuaPrimitive-Klasse.
XenoScanEngine ist das Herzstück des Projekts. Es enthält den Code für das Scannen, die Erkennung von Datenstrukturen und alles andere.
XenoScanLua verbindet XenoScanEngine mit XenoLua, um ein Lua-scriptbares Frontend für den Scanner bereitzustellen. Derzeit ist dies der einzige Einstiegspunkt in den Scanner.
Darüber hinaus enthält dieses Projekt einige Testcodes, die sicherstellen, dass alles einwandfrei funktioniert. Ein Test besteht aus einer Kombination einer .cpp-, einer .h- und einer .lua-Datei. Beispiele zur Verwendung des Scanners finden Sie in den .lua-Testdateien.
XenoScan verwendet CMake und wurde mit Visual Studio 2017 getestet. Um diese VS-Version zu verwenden, führen Sie einfach buildmsvc2017.bat von einer 32-Bit Developer-Eingabeaufforderung für VS aus. Als Beispiel führe ich Folgendes aus, um ein Projekt für Visual Studio 2017 zu erstellen:
cd C:\path\to\XenoScan
buildmsvc2017.bat
Dadurch wird eine Datei mit dem Namen XenoScan.sln in meinem build-Verzeichnis (z. B. C:\path\to\XenoScan\build) erstellt. Diese Projektmappendatei verwende ich dann, um den Code in Visual Studio zu kompilieren. Das Erstellen von x64 ist ähnlich, erfolgt jedoch über eine x64 Native Tools-Eingabeaufforderung für VS.
cd C:\path\to\XenoScan
buildmsvc2017x64.bat
Beim Wechsel zwischen 32-Bit- und x64-Builds sollten Sie buildclean.bat ausführen. Dadurch werden die generierten Projektdateien gelöscht und die kompilierten LuaJIT-Binärdateien entfernt, da sie für die korrekte Architektur neu erstellt werden müssen (dies geschieht automatisch).
Hinweis: Ich habe keine Ahnung, warum diese Eingabeaufforderungen so unterschiedlich benannt sind. Wichtig ist, dass die von den Eingabeaufforderungen eingerichteten vcvars der zu erstellenden Architektur entsprechen. Dies ist hauptsächlich für die Erstellung von LuaJIT wichtig. Unabhängig davon teilen Ihnen die Build-Skripte mit, ob Sie sie von der falschen Stelle aus ausführen.
Theoretisch sollten Sie den Code mit jedem modernen Compiler erstellen können, solange Sie CMake verwenden, um die Projektdateien zu generieren. Bevor Sie kompilieren können, müssen Sie sicherstellen, dass Sie die Untermodule ausgecheckt haben. Danach müssen Sie auch das luajit-Untermodul erstellen, damit XenoScan gegen die Bibliotheken linken kann.
Mit modern meine ich alles, was C++17 unterstützt, da der Code diesen Standard verwendet. Außerdem sollte Ihre CMake-Version mindestens 3.10 sein.
Der Code ist plattformunabhängig konzipiert. Theoretisch müssten Sie zum Kompilieren auf einer anderen Plattform Folgendes tun:
ScannerTargetWindows.cpp und ScannerTargetWindows.h aus dem Projekt.ScannerTarget-Interface für Ihre Plattform.Die grundlegende Scanfunktionalität unterstützt die folgenden Typen:
int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_tfloatdoublefiletime64: 64-Bit-Zeitstempel (GetSystemTimeAsFileTime() unter Windows)ticktime32: 32-Bit-Tick-Zähler ( unter Windows)* Lua-Frontend könnte bei 64-Bit-Ganzzahlen Probleme haben, aber die Scanner-Bibliothek unterstützt sie.
Das Scannen unterstützt die folgenden Arten von Übereinstimmungen:
min <= check <= max)Darüber hinaus gibt es eine Funktion zum Erkennen aller Instanzen der folgenden Typen:
std::mapstd::listGetTickCount()struct)