
Scanner di memoria open source scritto in C++
XenoScan è uno scanner di memoria che può essere utilizzato per scansionare la memoria dei processi e individuare le posizioni specifiche di valori importanti. Questi tipi di strumenti sono tipicamente usati nel cracking di videogiochi, poiché permettono di localizzare i valori che rappresentano lo stato del gioco in memoria.
XenoScan è scritto in C++ con un frontend Lua, e ho lavorato a funzionalità avanzate che vanno oltre qualsiasi cosa presente in altri scanner di memoria che ho visto. In particolare, ha un modo per enumerare e restituire tutte le strutture dati complesse (come std::list e std::map) nello spazio di memoria del target, e può persino scansionare per qualsiasi istanza di classe e raggruppare le istanze scoperte per i loro tipi sottostanti.
Se hai bisogno di contattarmi, vuoi un posto dove chattare o hai una domanda, il mio Discord è il posto migliore.
XenoLua è un wrapper attorno a Lua che fornisce un sacco di funzionalità. In particolare, fornisce una classe LuaVariant che incapsula la funzionalità di conversione tra tipi C/C++ e Lua. Inoltre, ha funzioni di supporto per lavorare con Lua nella classe LuaPrimitive.
XenoScanEngine è il cuore del progetto. Contiene il codice per la scansione, il rilevamento delle strutture dati e tutto il resto.
XenoScanLua collega XenoScanEngine a XenoLua per fornire un frontend scriptabile in Lua per lo scanner. Attualmente, questo è l'unico punto di accesso allo scanner.
Inoltre, questo progetto contiene del codice di test che assicura che tutto funzioni correttamente. Un test è una combinazione di un file .cpp, un .h e un .lua. Per esempi su come usare lo scanner, puoi dare un'occhiata ai file di test .lua.
XenoScan utilizza CMake ed è stato testato con Visual Studio 2017. Per usare questa versione di VS, esegui semplicemente buildmsvc2017.bat da un Prompt dei comandi per sviluppatori VS a 32 bit. Ad esempio, per compilare un progetto per Visual Studio 2017, eseguo
cd C:\path\to\XenoScan
buildmsvc2017.bat
Che crea un file chiamato XenoScan.sln nella mia directory build (es. C:\path\to\XenoScan\build). Poi uso questo file di soluzione per compilare il codice in Visual Studio. La compilazione x64 è simile, ma viene eseguita da un Prompt dei comandi strumenti nativi x64 per VS.
cd C:\path\to\XenoScan
buildmsvc2017x64.bat
Quando si passa tra compilazioni a 32 bit e x64, dovresti eseguire buildclean.bat. Questo eliminerà i file di progetto generati e rimuoverà i binari compilati di LuaJIT, poiché devono essere ricostruiti per l'architettura corretta (questo avverrà automaticamente).
Nota: non ho idea del perché questi prompt siano chiamati in modo così diverso. La parte importante è che le vcvars impostate dai prompt corrispondano all'architettura in fase di compilazione. Questo è principalmente importante per la compilazione di LuaJIT. In ogni caso, gli script di build ti diranno se li stai eseguendo dal posto sbagliato.
In teoria, dovresti essere in grado di compilare il codice con qualsiasi compilatore moderno, purché usi CMake per generare i file di progetto. Prima di compilare, devi assicurarti di aver scaricato i sottomoduli. Una volta fatto, dovrai anche compilare il sottomodulo luajit in modo che XenoScan possa linkare le librerie.
Per moderno intendo qualsiasi cosa che supporti C++17, poiché il codice utilizza quello standard. Inoltre, la versione di CMake dovrebbe essere almeno 3.10.
Il codice è progettato per essere indipendente dalla piattaforma. In teoria, per compilare su qualsiasi altra piattaforma, dovresti
ScannerTargetWindows.cpp e ScannerTargetWindows.h dal progetto.ScannerTarget per la tua piattaforma.La funzionalità di scansione di base supporta i seguenti tipi:
int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_tuint64_tfloatdoublefiletime64: timestamp a 64 bit (GetSystemTimeAsFileTime() su Windows)ticktime32: tick count a 32 bit ( su Windows)* Il frontend Lua potrebbe bloccarsi con interi a 64 bit, ma la libreria dello scanner li supporta.
La scansione supporta i seguenti tipi di corrispondenza:
min <= check <= max)Inoltre, è presente la funzionalità per rilevare tutte le istanze dei seguenti tipi:
std::mapstd::listGetTickCount()struct in C++)