
XenoScan は、プロセスのメモリをスキャンして重要な値の特定の場所を見つけるために使用できるメモリスキャナです。この種のツールは、通常ビデオゲームのハッキングに使用され、ゲームの状態を表す値をメモリ内で特定することを可能にします。
XenoScan は C++ で記述されており、Lua フロントエンドを持っています。そして、私がこれまで見てきた他のメモリスキャナにはない高度な機能に取り組んできました。特に、ターゲットのメモリ空間内のすべての複雑なデータ構造(std::list や std::map など)を列挙して返す方法があり、さらにクラスインスタンスをスキャンし、発見されたインスタンスをその基本型ごとにグループ化することもできます。
連絡を取りたい場合、チャットの場所が必要な場合、または質問がある場合は、私の Discord が最適です。
XenoLua は Lua のラッパーで、多くの機能を提供します。最も顕著なのは、C/C++ 型と Lua 型の間の変換機能をラップする LuaVariant クラスを提供することです。さらに、LuaPrimitive クラスには Lua を扱うためのヘルパー関数があります。
XenoScanEngine はプロジェクトの主要部分です。スキャン、データ構造検出、その他すべてのコードが含まれています。
XenoScanLua は XenoScanEngine と XenoLua を結びつけ、スキャナの Lua スクリプト可能なフロントエンドを提供します。現在、これがスキャナへの唯一のエントリポイントです。
さらに、このプロジェクトには正常に動作することを確認するためのテストコードがいくつか含まれています。テストは .cpp、.h、.lua ファイルの組み合わせです。スキャナの使用例については、.lua テストファイルを確認できます。
XenoScan は CMake を使用しており、Visual Studio 2017 でテストされています。このバージョンの VS を使用するには、32bit Developer Command Prompt for VS から buildmsvc2017.bat を実行するだけです。例として、Visual Studio 2017 用のプロジェクトをビルドするには、以下のコマンドを実行します。
cd C:\path\to\XenoScan
buildmsvc2017.bat
これにより、build ディレクトリ(例:C:\path\to\XenoScan\build)に XenoScan.sln というファイルが作成されます。その後、このソリューションファイルを使用して Visual Studio でコードをコンパイルします。x64 ビルドも同様ですが、x64 Native Tools Command Prompt for VS から実行します。
cd C:\path\to\XenoScan
buildmsvc2017x64.bat
32bit ビルドと x64 ビルドを切り替える際には、buildclean.bat を実行する必要があります。これにより、生成されたプロジェクトファイルが削除され、コンパイル済みの LuaJIT バイナリが削除されます(正しいアーキテクチャ用に再ビルドする必要があるため、自動的に行われます)。
注:これらのプロンプトの名前がなぜこんなに異なるのか、私にはわかりません。重要なのは、プロンプトによって設定される vcvars がビルド対象のアーキテクチャに対応していることです。これは主に LuaJIT のビルドで重要です。いずれにせよ、ビルドスクリプトは間違った場所から実行していることを教えてくれます。
理論上は、CMake を使用してプロジェクトファイルを生成すれば、比較的新しいコンパイラであればコードをビルドできるはずです。コンパイルする前に、サブモジュールをチェックアウトしていることを確認する必要があります。その後、luajit サブモジュールをビルド して、XenoScan がライブラリとリンクできるようにする必要もあります。luajit のビルド方法
ここで「比較的新しい」とは、コードが C++17 を使用しているため、C++17 をサポートするものを指します。また、CMake のバージョンは 3.10 以上である必要があります。
コードはプラットフォームに依存しないように設計されています。理論的には、他のプラットフォームでコンパイルするには、以下の手順が必要です。
ScannerTargetWindows.cpp と ScannerTargetWindows.h ファイルをプロジェクトから削除する。ScannerTarget インターフェースをプラットフォーム向けに実装する。基本スキャン機能では以下の型をサポートしています:
int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_tfloatdoublefiletime64:64ビットタイムスタンプ(Windows の GetSystemTimeAsFileTime())ticktime32:32ビットティックカウント(Windows の GetTickCount())* Lua フロントエンドは64ビット整数で問題が発生する可能性がありますが、スキャナライブラリはサポートしています。
スキャンは以下の種類のマッチングをサポートしています:
min <= check <= max)さらに、以下の型のすべてのインスタンスを検出する機能があります:
std::mapstd::liststruct を想定)