Sitio web oficial de Squalr
Únase a nosotros en nuestro canal de discordia
Squalr es un software de edición de memoria de rendimiento que permite a los usuarios crear y compartir trucos en sus juegos de escritorio de Windows. Esto incluye escaneo de memoria, punteros, inyección de ensamblaje x86/x64, etc.
Squalr logra escaneos rápidos a través de múltiples subprocesos combinados con instrucciones SIMD. Vea este artículo: Simd en .NET. Para aprovechar estas ganancias, su CPU debe tener soporte para SSE, AVX o AVX-512.

Puede encontrar documentación detallada en el wiki. Hay tres formas de usar Squalr:
A continuación se muestra una breve documentación sobre las API del paquete Nuget
Si usa los paquetes Nuget, es importante conectarse a la salida del motor para recibir registros de eventos. Estos son invaluables para diagnosticar problemas.
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 puede ensamblar y desmontar instrucciones x86/x64, aprovechando el 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 tiene una API para realizar un escaneo de memoria de alto rendimiento:
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 ) ;
} | Referencia | Descripción |
|---|---|
| Formatero xaml | XAML debe ejecutarse a través de este formateador |
| Estilecop | Stylecop para hacer cumplir las convenciones de código. Tenga en cuenta que nos desviamos en algunas convenciones estándar. Usamos el nombre de tipo completo para variables (ex int32 en lugar de int). El razonamiento es que este es un editor de memoria, por lo que preferimos usar el nombre de tipo que es más explícito para evitar errores de codificación. |
Para compilar Squalr, solo debe necesitar Visual Studio 2017 . Esto debería estar actualizado, con frecuencia actualizamos Squalr para usar la última versión del marco .NET. Aquí están las importantes bibliotecas de terceros que usa este proyecto:
| Biblioteca | Descripción |
|---|---|
| Fácil | API administrado/no administrado |
| Sharpdisasm | Ensamblador UDIS86 portado a C# |
| Csscript | Biblioteca de secuencia de comandos C# |
| Avalonedit | Biblioteca de edición de código |
| Sharpdx | Envoltura directx |
| CLRMD | Biblioteca de inspección de aplicaciones .NET |
| Avalondock | Biblioteca |
| Livecharts | Gráficos de WPF |
| Biblioteca | Descripción | Objetivo |
|---|---|---|
| Asmjit | ensamblador x86/x64 | Reemplace el FASM, mejore drásticamente las secuencias de comandos |
| Asmjit | ensamblador x86/x64 | Proyecto C ++ original. Puede puerto/introducir esto si la versión anterior no funciona (ninguno puede funcionar completamente, y puede ser necesario algo personalizado) |
| WpfhexeditorControl | Editor hexadecimal | Editor hexadecimal / editor hexadecimal |
| Opente | Wrapper OpenGL | Inyección gráfica |
| Sharpdx | Envoltura directx | Inyección de gráficos (actualmente usando SharpDX solo para entrada) |
| Sharppcap | Captura de paquetes | Editor de paquetes |
| Paquete.net | Captura de paquetes | Editor de paquetes |