Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
SysWhispers2 — Обход AV/EDR с помощью прямых системных вызовов. | Kitploit
Инструменты/GitHubGitHub/jthuraisamy/syswhispers2
Оборонительные ИнструментыОбход IDS/IPSШелл-кодRed TeamingРазработка Полезной НагрузкиЭксплуатация Бинарных Файлов
GitHubjthuraisamy/syswhispers2

SysWhispers2

Обход AV/EDR с помощью прямых системных вызовов.

Репозиторий
1.8k2653 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

SysWhispers2

SysWhispers помогает обходить защиту, генерируя заголовочные файлы и файлы ASM, которые импланты могут использовать для прямого вызова системных вызовов.

Поддерживаются все основные системные вызовы, а примеры сгенерированных файлов доступны в папке example-output/.

Различия между SysWhispers 1 и 2

Использование практически идентично SysWhispers1, но не нужно указывать, какие версии Windows поддерживать. Большинство изменений находятся внутри. Он больше не полагается на таблицы системных вызовов от @j00ru, а использует технику «сортировки по адресу системного вызова», популяризированную @modexpblog. Это значительно уменьшает размер заглушек системных вызовов.

Реализация в SysWhispers2 является вариантом кода @modexpblog. Одно из отличий — хэши имён функций рандомизируются при каждой генерации. @ElephantSe4l, который опубликовал эту технику ранее, имеет другую реализацию на C++17, которую также стоит изучить.

Оригинальный репозиторий SysWhispers всё ещё доступен, но может быть устаревшим в будущем.

Введение

Различные продукты безопасности устанавливают перехватчики в пользовательские функции API, позволяя им перенаправлять поток выполнения в свои движки и обнаруживать подозрительное поведение. Функции в ntdll.dll, выполняющие системные вызовы, состоят всего из нескольких инструкций ассемблера, поэтому их повторная реализация в вашем импланте может обойти срабатывание этих перехватчиков. Эта техника была популяризирована @Cn33liz, и в его статье содержится больше технических деталей, которые стоит прочитать.

SysWhispers предоставляет специалистам по Red Team возможность генерировать пары заголовков/ASM для любого системного вызова в образе ядра (ntoskrnl.exe). Заголовки также будут содержать необходимые определения типов.

Установка

root@kitploit:~
> git clone https://github.com/jthuraisamy/SysWhispers2.git
> cd SysWhispers2
> py .\syswhispers.py --help

Использование и примеры

Командные строки

root@kitploit:~
# Экспорт всех функций с совместимостью для всех поддерживаемых версий Windows (см. example-output/).
py .\syswhispers.py --preset all -o syscalls_all

# Экспорт только общих функций (см. список ниже).
py .\syswhispers.py --preset common -o syscalls_common

# Экспорт NtProtectVirtualMemory и NtWriteVirtualMemory с совместимостью для всех версий.
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem

Вывод скрипта

root@kitploit:~
PS C:\Projects\SysWhispers2> py .\syswhispers.py --preset common --out-file syscalls_common

python syswhispers.py -p all -a all -l all -o example-output/Syscalls

                  .                         ,--.
,-. . . ,-. . , , |-. o ,-. ,-. ,-. ,-. ,-.    /
`-. | | `-. |/|/  | | | `-. | | |-' |   `-. ,-'
`-' `-| `-' ' '   ' ' ' `-' |-' `-' '   `-' `---
     /|                     |  @Jackson_T
    `-'                     '  @modexpblog, 2021

SysWhispers2: Why call the kernel when you can whisper?

All functions selected.

Complete! Files written to:
        example-output/Syscalls.h
        example-output/Syscalls.c
        example-output/SyscallsStubs.std.x86.asm
        example-output/SyscallsStubs.rnd.x86.asm
        example-output/SyscallsStubs.std.x86.nasm
        example-output/SyscallsStubs.rnd.x86.nasm
        example-output/SyscallsStubs.std.x86.s
        example-output/SyscallsStubs.rnd.x86.s
        example-output/SyscallsInline.std.x86.h
        example-output/SyscallsInline.rnd.x86.h
        example-output/SyscallsStubs.std.x64.asm
        example-output/SyscallsStubs.rnd.x64.asm
        example-output/SyscallsStubs.std.x64.nasm
        example-output/SyscallsStubs.rnd.x64.nasm
        example-output/SyscallsStubs.std.x64.s
        example-output/SyscallsStubs.rnd.x64.s
        example-output/SyscallsInline.std.x64.h
        example-output/SyscallsInline.rnd.x64.h

Пример до и после: классическая инъекция DLL с помощью CreateRemoteThread

root@kitploit:~
py .\syswhispers.py -f NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscalls
root@kitploit:~
#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);
}
root@kitploit:~
#include <Windows.h>
#include "syscalls.h" // Импортируем сгенерированный заголовок.

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);
}

Общие функции

Использование ключа --preset common создаст пару заголовок/ASM со следующими функциями:

Нажмите, чтобы раскрыть список функций.
  • NtCreateProcess (CreateProcess)
  • NtCreateThreadEx (CreateRemoteThread)
  • NtOpenProcess (OpenProcess)
  • NtOpenThread (OpenThread)
  • NtSuspendProcess
  • NtSuspendThread (SuspendThread)
  • NtResumeProcess
  • NtResumeThread (ResumeThread)
  • NtGetContextThread (GetThreadContext)
  • NtSetContextThread (SetThreadContext)
  • NtClose (CloseHandle)
  • NtReadVirtualMemory (ReadProcessMemory)
  • NtWriteVirtualMemory (WriteProcessMemory)
  • NtAllocateVirtualMemory (VirtualAllocEx)
  • NtProtectVirtualMemory (VirtualProtectEx)
  • NtFreeVirtualMemory (VirtualFreeEx)
  • NtQuerySystemInformation (GetSystemInfo)
  • NtQueryDirectoryFile
  • NtQueryInformationFile
  • NtQueryInformationProcess
  • NtQueryInformationThread
  • NtCreateSection (CreateFileMapping)
  • NtOpenSection
  • NtMapViewOfSection
  • NtUnmapViewOfSection
  • NtAdjustPrivilegesToken (AdjustTokenPrivileges)
  • NtDeviceIoControlFile (DeviceIoControl)
  • NtQueueApcThread (QueueUserAPC)
  • NtWaitForMultipleObjects (WaitForMultipleObjectsEx)

Импорт в Visual Studio

  1. Скопируйте сгенерированные файлы H/C/ASM в папку проекта.
  2. В Visual Studio перейдите в Project → Build Customizations... и включите MASM.
  3. В Solution Explorer добавьте .h и .c/.asm файлы в проект как файлы заголовков и исходных кодов соответственно.
  4. Перейдите к свойствам ASM-файла для x86.
  5. Выберите All Configurations из выпадающего списка Configurations.
  6. Выберите Win32 из выпадающего списка Platform.
  7. Установите следующие параметры:
    • Excluded From Build = No
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  8. Нажмите Apply.
  9. Выберите x64 из выпадающего списка Platform.
  10. Установите следующие параметры:
    • Excluded From Build = Yes
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  11. Нажмите Apply, затем OK.
  12. Перейдите к свойствам ASM-файла для x64.
  13. Выберите All Configurations из выпадающего списка Configurations.
  14. Выберите Win32 из выпадающего списка Platform.
  15. Установите следующие параметры:
    • Excluded From Build = Yes
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  16. Нажмите Apply.
  17. Выберите x64 из выпадающего списка Platform.
  18. Установите следующие параметры:
    • Excluded From Build = No
    • Content = Yes
    • Item Type = Microsoft Macro Assembler
  19. Нажмите Apply, затем OK.

Компиляция с MinGW и NASM

Следующие примеры показывают, как скомпилировать приведённые выше программы в виде EXE и DLL с помощью MinGW и ассемблера NASM:

Пример EXE для x86

root@kitploit:~
i686-w64-mingw32-gcc -c main.c syscalls.c -Wall -shared
nasm -f win32 -o syscallsstubs.std.x86.o syscallsstubs.std.x86.nasm
i686-w64-mingw32-gcc *.o -o temp.exe
i686-w64-mingw32-strip -s temp.exe -o example.exe
rm -rf *.o temp.exe

Пример DLL для x86 с экспортами

root@kitploit:~
i686-w64-mingw32-gcc -c dllmain.c syscalls.c -Wall -shared
nasm -f win32 -o syscallsstubs.std.x86.o syscallsstubs.std.x86.nasm
i686-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
i686-w64-mingw32-strip -s temp.dll -o example.dll
rm -rf *.o temp.dll

Пример EXE для x64

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -c main.c syscalls.c -Wall -shared
nasm -f win64 -o syscallsstubs.std.x64.o syscallsstubs.std.x64.nasm
x86_64-w64-mingw32-gcc *.o -o temp.exe
x86_64-w64-mingw32-strip -s temp.exe -o example.exe
rm -rf *.o temp.exe

Пример DLL для x64 с экспортами

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -c dllmain.c syscalls.c -Wall -shared
nasm -f win64 -o syscallsstubs.std.x64.o syscallsstubs.std.x64.nasm
x86_64-w64-mingw32-gcc-dllwrap --def dllmain.def *.o -o temp.dll
x86_64-w64-mingw32-strip -s temp.dll -o example.dll
rm -rf *.o temp.dll

Компиляция с MinGW и GNU Assembler (GAS)

Пример EXE для x86

root@kitploit:~
i686-w64-mingw32-gcc -m32 -Wall -c main.c syscalls.c syscallsstubs.std.x86.s -o temp.exe
i686-w64-mingw32-strip -s temp.exe -o example.exe

Пример DLL для x86 с экспортами

root@kitploit:~
i686-w64-mingw32-gcc -m32 -Wall -c dllmain.c syscalls.c syscallsstubs.std.x86.s -o temp.dll
i686-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
i686-w64-mingw32-strip -s temp.dll -o example.dll

Пример EXE для x64

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -Wall -c main.c syscalls.c syscallsstubs.std.x64.s -o temp.exe
x86_64-w64-mingw32-strip -s temp.exe -o example.exe

Пример DLL для x64 с экспортами

root@kitploit:~
x86_64-w64-mingw32-gcc -m64 -Wall -c dllmain.c syscalls.c syscallsstubs.std.x64.s -o temp.dll
x86_64-w64-mingw32-dllwrap --def dllmain.def *.o -o temp.dll
x86_64-w64-mingw32-strip -s temp.dll -o example.dll

Использование с LLVM/Clang

SysWhispers2 создаёт совместимый с clang файл .s, содержащий заглушки ASM. Его можно использовать с llvm для компиляции вашего кода. Например, с использованием примера инъекции DLL CreateRemoteThread выше:

root@kitploit:~
clang -D nullptr=NULL main.c syscall.c syscallstubs.std.x64.s -o test.exe

Только встроенный заголовок (Inline Header Only)

Опция вывода inlinegas генерирует версию SysWhispers2 только в виде заголовка, которую можно использовать при компиляции BOF. Просто включите заголовок в свой проект.

Случайные переходы системных вызовов

Использование процедуры случайных переходов системных вызовов позволяет избежать «метки системного вызова». Заглушка на ассемблере вызывает новую функцию SW__GetRandomSyscallAddress, которая ищет и выбирает чистую инструкцию системного вызова в ntdll.dll для использования. Это позволяет также избежать срабатывания пользовательских инструкций системного вызова.

Чтобы использовать случайные переходы системных вызовов, необходимо определить RANDSYSCALL при компиляции программы и использовать rnd версию вывода SysWhispers2. Следующие примеры демонстрируют использование заглушек GNU Assembler.

Пример EXE для x86 — использование случайных переходов системных вызовов

root@kitploit:~
i686-w64-mingw32-gcc main.c syscalls.c syscallsstubs.rnd.x86.s -DRANDSYSCALL -Wall -o example.exe

Пример EXE для x64 — использование случайных переходов системных вызовов

root@kitploit:~
x86_64-w64-mingw32-gcc main.c syscalls.c syscallsstubs.rnd.x64.s -DRANDSYSCALL -Wall -o example.exe

Предостережения и ограничения

  • Системные вызовы из графической подсистемы (win32k.sys) не поддерживаются.
  • Протестировано на Visual Studio 2019 (v142) с Windows 10 SDK.

Устранение неполадок

  • Ошибки переопределения типов: проект может не скомпилироваться, если typedef в syscalls.h уже были определены.
    • Убедитесь, что включены только необходимые функции (т.е. --preset all редко требуется).
    • Если typedef уже определён в другом используемом заголовке, его можно удалить из syscalls.h.

Благодарности

Разработано @Jackson_T и @modexpblog, но основано на работе многих других:

  • @FoxHex0ne за каталогизацию множества прототипов функций и typedef в машиночитаемом формате.
  • @PetrBenes, команда NTInternals.net и MSDN за дополнительные прототипы и typedef.
  • @Cn33liz за первоначальную реализацию POC Dumpert.

Связанные статьи и проекты

  • @modexpblog: Bypassing User-Mode Hooks and Direct Invocation of System Calls for Red Teams
  • @hodg87: Malware Mitigation when Direct System Calls are Used
  • @Cn33liz: Combining Direct System Calls and sRDI to bypass AV/EDR (Код)
  • @0x00dtm: Userland API Monitoring and Code Injection Detection
  • @0x00dtm: Defeating Userland Hooks (ft. Bitdefender) (Код)
  • @mrgretzky: Defeating Antivirus Real-time Protection From The Inside
  • @SpecialHoang: Bypass EDR’s memory protection, introduction to hooking (Код)
  • @xpn и @domchell: Silencing Cylance: A Case Study in Modern EDRs
  • @mrjefftang: Universal Unhooking: Blinding Security Software ()

Ссылки на SysWhispers

  • @JFaust_: Процесс инъекции Часть 1, Часть 2 и проект Alaris loader (Код)
  • @0xPat: Malware Development Part 2
  • @brsn76945860: Implementing Syscalls In The CobaltStrike Artifact Kit
  • @Cn33liz и @_DaWouw: Direct Syscalls in Beacon Object Files (Код)

Лицензия

Этот проект лицензирован по лицензии Apache License 2.0.

Скачать инструмент
Код
  • @spotheplanet: Full DLL Unhooking with C++
  • @hasherezade: Floki Bot and the stealthy dropper
  • @hodg87: Latest Trickbot Variant has New Tricks Up Its Sleeve