Site officiel de Squalr
Rejoignez-nous sur notre canal Discord
Squalr est un logiciel de montage de mémoire performant qui permet aux utilisateurs de créer et de partager des astuces dans leurs jeux Windows Desktop. Cela comprend la balayage de mémoire, les pointeurs, l'injection d'assemblage x86 / x64, etc.
Squalr réalise les analyses rapides via un lancement multi-lancier combiné avec des instructions SIMD. Voir cet article: SIMD dans .NET. Pour profiter de ces gains, votre processeur doit avoir un support pour SSE, AVX ou AVX-512.

Vous pouvez trouver une documentation détaillée sur le wiki. Il existe trois façons d'utiliser Squalr:
Vous trouverez ci-dessous une brève documentation sur les API du package NuGet
Si vous utilisez les packages NuGet, il est important de s'accrocher à la sortie du moteur pour recevoir des journaux d'événements. Ceux-ci sont inestimables pour diagnostiquer les problèmes.
using Squalr . Engine . Logging ;
.. .
// Receive logs from the engine
Logger . Subscribe ( new EngineLogEvents ( ) ) ;
.. .
class EngineLogEvents : ILoggerObserver
{
public void OnLogEvent ( LogLevel logLevel , string message , string innerMessage )
{
Console . WriteLine ( message ) ;
Console . WriteLine ( innerMessage ) ;
}
} using Squalr . Engine . OS ;
.. .
IEnumerable < Process > processes = Processes . Default . GetProcesses ( ) ;
// Pick a process. For this example, we are just grabbing the first one.
Process process = processes . FirstOrDefault ( ) ;
Processes . Default . OpenedProcess = process ; using Squalr . Engine . Memory ;
.. .
Reader . Default . Read < Int32 > ( address ) ;
Writer . Default . Write < Int32 > ( address ) ;
Allocator . Alloc ( address , 256 ) ;
IEnumerable < NormalizedRegion > regions = Query . GetVirtualPages ( requiredProtection , excludedProtection , allowedTypes , startAddress , endAddress ) ;
IEnumerable < NormalizedModule > modules = Query . GetModules ( ) ;Squalr peut assembler et démonter les instructions x86 / x64, en tirant parti du NASM.
using Squalr . Engine . Architecture ;
using Squalr . Engine . Architecture . Assemblers ;
.. .
// Perform assembly
AssemblerResult result = Assembler . Default . Assemble ( assembly : "mov eax, 5" , isProcess32Bit : true , baseAddress : 0x10000 ) ;
Console . WriteLine ( BitConverter . ToString ( result . Bytes ) . Replace ( "-" , " " ) ) ;
// Disassemble the result (we will get the same instructions back)
Instruction [ ] instructions = Disassembler . Default . Disassemble ( bytes : result . Bytes , isProcess32Bit : true , baseAddress : 0x10000 ) ;
Console . WriteLine ( instructions [ 0 ] . Mnemonic ) ;Squalr a une API pour effectuer une analyse de mémoire haute performance:
using Squalr . Engine . Scanning ;
using Squalr . Engine . Scanning . Scanners ;
using Squalr . Engine . Scanning . Scanners . Constraints ;
using Squalr . Engine . Scanning . Snapshots ;
.. .
DataType dataType = DataType . Int32 ;
// Collect values
TrackableTask < Snapshot > valueCollectorTask = ValueCollector . CollectValues (
SnapshotManager . GetSnapshot ( Snapshot . SnapshotRetrievalMode . FromActiveSnapshotOrPrefilter , dataType ) ) ;
// Perform manual scan on value collection complete
valueCollectorTask . CompletedCallback += ( ( completedValueCollection ) =>
{
Snapshot snapshot = completedValueCollection . Result ;
// Constraints
ScanConstraintCollection scanConstraints = new ScanConstraintCollection ( ) ;
scanConstraints . AddConstraint ( new ScanConstraint ( ScanConstraint . ConstraintType . Equal , 25 ) ) ;
TrackableTask < Snapshot > scanTask = ManualScanner . Scan (
snapshot ,
allScanConstraints ) ;
SnapshotManager . SaveSnapshot ( scanTask . Result ) ;
} ) ;
for ( UInt64 index = 0 ; index < snapshot . ElementCount ; index ++ )
{
SnapshotElementIndexer element = snapshot [ index ] ;
Object currentValue = element . HasCurrentValue ( ) ? element . LoadCurrentValue ( ) : null ;
Object previousValue = element . HasPreviousValue ( ) ? element . LoadPreviousValue ( ) : null ;
} // Example: Tracing write events on a float
BreakpointSize size = Debugger . Default . SizeToBreakpointSize ( sizeof ( float ) ) ;
CancellationTokenSource cancellationTokenSource = Debugger . Default . FindWhatWrites ( 0x10000 , size , this . CodeTraceEvent ) ;
.. .
// When finished, cancel the instruction collection
cancellationTokenSource . cancel ( ) ;
.. .
private void CodeTraceEvent ( CodeTraceInfo codeTraceInfo )
{
Console . WriteLine ( codeTraceInfo . Instruction . Address . ToString ( "X" ) ) ;
Console . WriteLine ( codeTraceInfo . Instruction . Mnemonic ) ;
} | Référence | Description |
|---|---|
| Formateur XAML | XAML devrait être exécuté à travers ce formateur |
| Stylecop | Stylecop pour appliquer les conventions de code. Notez que nous dévions sur certaines conventions standard. Nous utilisons le nom de type complet pour les variables (EX INT32 plutôt que INT). Le raisonnement est qu'il s'agit d'un éditeur de mémoire, nous préférons donc utiliser le nom de type qui est le plus explicite pour éviter les erreurs de codage. |
Afin de compiler Squalr, vous ne devriez avoir besoin que Visual Studio 2017 . Cela devrait être à jour, nous mettons souvent à jour Squalr pour utiliser la dernière version du .NET Framework. Voici les bibliothèques tierces importantes que ce projet utilise:
| Bibliothèque | Description |
|---|---|
| Easyhook | Crochet API géré / non géré |
| Fusil de pointe | Assembleur UDIS86 porté vers C # |
| Csscript | C # bibliothèque de scripts |
| AvaloneDit | Bibliothèque d'édition de code |
| Sharpdx | Wrapper DirectX |
| Clrmd | Bibliothèque d'inspection des applications .NET. |
| Avalondock | Bibliothèque d'accueil |
| Livecharts | Graphiques WPF |
| Bibliothèque | Description | But |
|---|---|---|
| Asmjit | assembleur x86 / x64 | Remplacez FASM, améliorez radicalement les scripts |
| Asmjit | assembleur x86 / x64 | Projet C ++ original. Peut le porter / l'interprète si la version ci-dessus ne fonctionne pas (ni l'un ni l'autre ne peut fonctionner entièrement, et quelque chose de personnalisé peut être nécessaire) |
| WpfhexeditorControl | Rédacteur en chef | Éditeur hexadécimal / éditeur hexadécimal |
| Opentk | Wrapper opengl | Injection graphique |
| Sharpdx | Wrapper DirectX | Injection graphique (en utilisant actuellement SharpDx juste pour la saisie) |
| Sharppcap | Capture de paquet | Éditeur de paquets |
| Paquet.net | Capture de paquet | Éditeur de paquets |