
오픈 소스 메모리 스캐너 (C++로 작성됨)
XenoScan은 프로세스의 메모리를 스캔하여 중요한 값의 특정 위치를 찾는 데 사용할 수 있는 메모리 스캐너입니다. 이러한 유형의 도구는 일반적으로 비디오 게임 해킹에 사용되며, 게임 상태를 나타내는 값을 메모리에서 찾을 수 있게 해줍니다.
XenoScan은 Lua 프론트엔드와 함께 C++로 작성되었으며, 제가 본 다른 메모리 스캐너에는 없는 고급 기능을 계속 개발하고 있습니다. 특히, 대상의 메모리 공간에 있는 모든 복잡한 데이터 구조(예: 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 버전을 사용하려면 32비트 개발자 명령 프롬프트 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 명령 프롬프트 for VS에서 실행해야 합니다.
cd C:\path\to\XenoScan
buildmsvc2017x64.bat
32비트 빌드와 x64 빌드 사이를 전환할 때는 buildclean.bat를 실행해야 합니다. 이렇게 하면 생성된 프로젝트 파일이 삭제되고 컴파일된 LuaJIT 바이너리가 제거됩니다. LuaJIT은 올바른 아키텍처에 맞게 다시 빌드되어야 하기 때문입니다(이 작업은 자동으로 수행됩니다).
참고: 이러한 프롬프트의 이름이 왜 이렇게 다르게 지정되었는지 모르겠습니다. 중요한 것은 프롬프트가 설정하는 vcvars가 빌드 중인 아키텍처와 일치해야 한다는 것입니다. 이는 주로 LuaJIT 빌드에 중요합니다. 어쨌든 빌드 스크립트는 잘못된 위치에서 실행하고 있는지 알려줄 것입니다.
이론적으로는 CMake를 사용하여 프로젝트 파일을 생성하기만 하면 최신 컴파일러에서 코드를 빌드할 수 있습니다. 컴파일하기 전에 서브모듈을 체크아웃했는지 확인해야 합니다. 그런 다음 luajit 서브모듈을 빌드하여 XenoScan이 라이브러리에 링크할 수 있도록 해야 합니다.
최신 컴파일러란 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::listC++ struct 생각)