
O SysWhispers ajuda na evasão , gerando arquivos de cabeçalho / ASM que os implantes podem usar para fazer chamadas diretas ao sistema.
Todos os syscalls principais são suportados do Windows XP a 10. Exemplos de arquivos gerados disponíveis em example-output/.
Introdução
Vários produtos de segurança colocam ganchos nas APIs do modo de usuário, que permitem redirecionar o fluxo de execução para seus mecanismos e detectar comportamentos suspeitos. As funções ntdll.dllque compõem os syscalls consistem em apenas algumas instruções de montagem, portanto, a reimplementação em seu próprio implante pode ignorar o acionamento desses ganchos de produtos de segurança. Essa técnica foi popularizada por @ Cn33liz e sua postagem no blog tem mais detalhes técnicos que merecem ser lidos.
O SysWhispers oferece a equipes vermelhas a capacidade de gerar pares de cabeçalho / ASM para qualquer chamada do sistema na imagem principal do kernel ( ntoskrnl.exe) em qualquer versão do Windows a partir do XP. Os cabeçalhos também incluirão as definições de tipo necessárias.
A principal diferença de implementação entre este e o Dumpert POC é que isso não chama RtlGetVersionpara consultar a versão do sistema operacional, mas faz isso no assembly consultando diretamente o PEB. O benefício é poder chamar uma função que suporta várias versões do Windows, em vez de chamar várias funções, cada uma suportando uma versão.
Instalação
> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help
Linhas de comando de uso e exemplos
# Export all functions with compatibility for all supported Windows versions (see example-output/).
py .\syswhispers.py --preset all -o syscalls_all
# Export just the common functions with compatibility for Windows 7, 8, and 10.
py .\syswhispers.py --preset common -o syscalls_common
# Export NtProtectVirtualMemory and NtWriteVirtualMemory with compatibility for all versions.
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem
# Export all functions with compatibility for Windows 7, 8, and 10.
py .\syswhispers.py --versions 7,8,10 -o syscalls_78X
Saída de script
PS C:\Projects\SysWhispers> py .\syswhispers.py --preset common --out-file syscom
, , ,_ /_ . , ,_ _ ,_ ,
_/_)__(_/__/_)__/_/_/ / (__/__/_)__/_)__(/__/ (__/_)__
_/_ /
(/ / @Jackson_T, 2019
SysWhispers: Why call the kernel when you can whisper?
Common functions selected.
Complete! Files written to:
syscom.asm
syscom.h
Exemplo de antes e depois da CreateRemoteThreadinjeção clássica de DLL
py .\syswhispers.py -f NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscalls
#include <Windows.h>
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
WriteProcessMemory(hProcess, lpBaseAddress, dllPath, strlen(dllPath), nullptr);
CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)lpStartAddress, lpBaseAddress, 0, nullptr);
}
#include <Windows.h>
#include "syscalls.h" // Import the generated header.
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
HANDLE hThread = NULL;
LPVOID lpAllocationStart = nullptr;
SIZE_T szAllocationSize = strlen(dllPath);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
NtAllocateVirtualMemory(hProcess, &lpAllocationStart, 0, (PULONG)&szAllocationSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
NtWriteVirtualMemory(hProcess, lpAllocationStart, (PVOID)dllPath, strlen(dllPath), nullptr);
NtCreateThreadEx(&hThread, GENERIC_EXECUTE, NULL, hProcess, lpStartAddress, lpAllocationStart, FALSE, 0, 0, 0, nullptr);
}
Funções comuns O
uso do--preset commoncomutador criará um par de cabeçalho / ASM com as seguintes funções:
Clique para expandir a lista de funções.
Importando para o Visual Studio
- Copie os arquivos H / ASM gerados na pasta do projeto.
- No Visual Studio, vá para Projeto → Construir personalizações … e ative o MASM.
- No Gerenciador de Soluções , adicione os arquivos .he .asm ao projeto como arquivos de cabeçalho e de origem, respectivamente.
- Vá para as propriedades do arquivo ASM e defina o Tipo de item como Microsoft Macro Assembler .
- Verifique se a plataforma do projeto está definida como x64. Projetos de 32 bits não são suportados no momento.
Advertências e limitações
- Somente o Windows de 64 bits é suportado no momento.
- As chamadas do sistema do subsistema gráfico (
win32k.sys) não são suportadas. - Testado no Visual Studio 2019 (v142) com o Windows 10 SDK.
Solução de problemas
ModuleNotFoundErrorno script Python.- Verifique se os módulos necessários estão instalados
pip3 install -r requirements.txt.
- Verifique se os módulos necessários estão instalados
- Digite erros de redefinição: um projeto pode não ser compilado se typedefs
syscalls.hjá tiver sido definido.- Verifique se apenas as funções necessárias estão incluídas (isto
--preset allé, raramente são necessárias). - Se um typedef já estiver definido em outro cabeçalho usado, ele poderá ser removido
syscalls.h.
- Verifique se apenas as funções necessárias estão incluídas (isto

