
Adaptación de SysWhispers2 a C#. Utiliza SharpASM para localizar los code caves con los que ejecutar el stub de la llamada al sistema.

Versión en C# de SysWhispers2.
Utiliza SharpASM para encontrar los code caves para ejecutar el stub de llamada al sistema.
Lee la entrada del blog para los detalles técnicos: https://www.secforce.com/blog/sharpasm-sharpwhispers/
______ _ ____ _
/ __/ / ___ ________| | /| / / / (_)__ ___ ___ _______
_\ \/ _ \/ _ `/ __/ _ \ |/ |/ / _ \/ (_-</ _ \/ -_) __(_-<
/___/_//_/\_,_/_/ / .__/__/|__/_//_/_/___/ .__/\__/_/ /___/
/_/ /_/
@d_glenx
@SECFORCE_LTD
=============================================================
usage: SharpWhispers.py [-h] [-p PRESET] [-f FUNCTIONS] -o OUT_FILE
optional arguments:
-h, --help show this help message and exit
-p PRESET, --preset PRESET
Preset ("all", "common", "dinvoke")
-f FUNCTIONS, --functions FUNCTIONS
Comma-separated functions
-o OUT_FILE, --out-file OUT_FILE
Output basename (w/o extension)
Las instrucciones para crear el proyecto de Visual Studio se proporcionan aquí
Se proporciona un ejemplo básico de inyección de proceso aquí
Actualmente, los archivos json contienen los datos para generar 33 llamadas al sistema.
Nota: el preajuste All contiene un subconjunto de todas las llamadas al sistema.
==== System Calls Imported ====
==[DInvoke]==
[i] Number of Delegates: 13
NtCreateThreadEx
NtCreateSection
NtUnmapViewOfSection
NtMapViewOfSection
NtQueryInformationProcess
NtOpenProcess
NtAllocateVirtualMemory
NtFreeVirtualMemory
NtQueryVirtualMemory
NtProtectVirtualMemory
NtWriteVirtualMemory
NtReadVirtualMemory
NtOpenFile
==[Additional]==
[i] Number of Delegates: 20
NtOpenThread
NtQueueApcThread
NtOpenSection
NtSuspendThread
NtQueryInformationFile
NtSetContextThread
NtResumeProcess
NtOpenProcessToken
NtWaitForMultipleObjects
NtQueryDirectoryFile
NtAdjustPrivilegesToken
NtQuerySystemInformation
NtDeviceIoControlFile
NtResumeThread
NtCreateProcess
NtSuspendProcess
NtGetContextThread
NtClose
NtQueryInformationThread
NtTestAlert
NtCreateThreadEx
NtCreateSection
NtUnmapViewOfSection
NtMapViewOfSection
NtQueryInformationProcess
NtAllocateVirtualMemory
NtFreeVirtualMemory
NtProtectVirtualMemory
NtWriteVirtualMemory
NtOpenFile
NtReadVirtualMemory
NtQueryVirtualMemory
NtOpenProcess
NtCreateThreadEx
NtCreateSection
NtUnmapViewOfSection
NtMapViewOfSection
NtQueryInformationProcess
NtOpenProcess
NtAllocateVirtualMemory
NtFreeVirtualMemory
NtQueryVirtualMemory
NtProtectVirtualMemory
NtWriteVirtualMemory
NtReadVirtualMemory
NtOpenFile
Generado dinámicamente
Contiene los delegados de las llamadas al sistema a generar.
Depende de SharpASM
Auxiliar para obtener la dirección de PEB usando ASM.
Contiene el código para llamar dinámicamente a ASM en C#.
La función public static IntPtr callASM(byte[] stub) se puede usar para llamar al shellcode pasando un array de bytes.
Generado dinámicamente: el script genera una semilla aleatoria para aplicar hash a los nombres de las llamadas al sistema
Contiene el código para recuperar los números de las llamadas al sistema utilizando la técnica de ElephantSe4l (código portado de SysWhispers2).
Depende de SharpASM
Contiene el código para ejecutar las llamadas al sistema dinámicamente usando ASM.
Contiene también los wrappers para las llamadas al sistema (p. ej. Syscall.NtAllocateVirtualMemory) (Generado dinámicamente)
Generado dinámicamente
Los archivos de salida de SharpWhispers pueden usarse directamente en un proyecto de C#. Los tipos de datos necesarios son un subconjunto de los tipos de datos definidos en el proyecto DInvoke (algunos tipos de datos están tomados del proyecto minimizado de Rastamouse) para reducir la superficie de detección. Los tipos de datos están definidos en el espacio de nombres SharpWhisper.Data para evitar superposiciones con las definiciones de DInvoke.
Nota: los tipos de datos se generan solo si son necesarios (es decir, si una llamada al sistema necesita un tipo de datos) para minimizar la superficie de detección.
Las siguientes plantillas se utilizan para generar los tipos de datos necesarios: