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

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

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

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

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

Категории

Все категории
Loading categories
TamperingSyscalls — C++ библиотека, которая извлекает и подделывает аргументы системных вызовов Windows с помощью аппаратных точек останова и обработчиков исключений для обхода телеметрии EDR. | Kitploit
Инструменты/GitHubGitHub/rad9800/tamperingsyscalls
Обход IDS/IPSПост-эксплуатацияRed TeamingРазработка Полезной Нагрузки
GitHubrad9800/tamperingsyscalls

TamperingSyscalls

C++ библиотека, которая извлекает и подделывает аргументы системных вызовов Windows с помощью аппаратных точек останова и обработчиков исключений для обхода телеметрии EDR.

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

Популярное

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

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

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

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

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

TamperingSyscalls

TamperingSyscalls — это оригинальный проект из двух частей, состоящий из спуфинга аргументов и получения системных вызовов, которые оба злоупотребляют EH (обработчиком исключений) для обхода EDR. Этот проект объединяет обе эти части, чтобы предоставить альтернативное решение прямым системным вызовам.

Манипулирование системными вызовами.

  1. Настройте глобальный EH, который будет использоваться позже.
root@kitploit:~
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
  1. Установите аппаратную точку останова на адрес инструкции системного вызова, содержащей байты 0f05, в регистре Dr0. Мы можем найти адрес заглушки системного вызова с помощью этого быстрого поиска байтов в памяти.
root@kitploit:~
BYTE stub[] = { 0x0F, 0x05 };
for( unsigned int i = 0; i < (unsigned int)25; i++ )
{
	if( memcmp( (LPVOID)((DWORD_PTR)function + i), stub, 2 ) == 0 ) {
		return (LPVOID)((DWORD_PTR)function + i);
	}
}
  1. Затем мы можем вызвать эту функцию, передав NULL для первых <=4 аргументов (которые, как правило, являются более важными аргументами, содержащими такую информацию, как дескрипторы процессов и т.д.). Мы также устанавливаем EnumState в соответствующее значение Enum для этой функции (чтобы позже исправить аргументы).
  2. Пока EDR полностью видит наши аргументы, он не может с уверенностью решить, что мы выполняем вредоносное действие, поскольку мы передали NULL в качестве первых <=4 аргументов.
  3. Затем EDR вернёт номер системного вызова (SSN) и сохранит его в RAX. Если вас интересует только получение системных вызовов, ознакомьтесь с веткой stripped этого репозитория.
  4. Затем программа переходит к инструкции системного вызова { 0x0F, 0x05 }, которая попадает в ранее установленную точку останова. Это вызовет исключение SINGLE_STEP, которое будет обработано обработчиком исключений, настроенным на Шаге 1.
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
  1. Этот обработчик исключений отключит аппаратную точку останова для Dr0, только если Dr0 и RIP совпадают, установив значение регистра Dr0 в 0 (а это должен быть текущий RIP).
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
{
	if( ExceptionInfo->ContextRecord->Dr7 & 1 ) {
		if( ExceptionInfo->ContextRecord->Rip == ExceptionInfo->ContextRecord->Dr0 ) {
			ExceptionInfo->ContextRecord->Dr0 = 0;
  1. Затем мы исправим остальные регистры, которые ранее установили в NULL. Почему именно 4? Потому что соглашение о вызовах x64 требует использовать RCX, RDX, R8, R9 для первых 4 аргументов, а остальные размещаются в стеке. Можно вручную настроить параметры >4 в стеке, но это выходит за рамки данного проекта, поскольку потребовало бы встроенного ассемблера. Почему используется R10, а не RCX? Потому что в начале каждой заглушки системного вызова выполняется mov r10, rcx, так как регистр RCX уничтожается следующими инструкциями.
root@kitploit:~
case NTMAPVIEWOFSECTION_ENUM:
	ExceptionInfo->ContextRecord->R10 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->SectionHandle;

	ExceptionInfo->ContextRecord->Rdx =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ProcessHandle;

	ExceptionInfo->ContextRecord->R8 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->BaseAddress;

	ExceptionInfo->ContextRecord->R9 =
		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ZeroBits;

В этом примере мы видим, как исправляются аргументы для NtMapViewOfSection.

Как использовать

Если вы хотите начать подделывать телеметрию EDR, можно изменить определения p[FunctionName], которые сейчас установлены в NULL.

Генерация

Чтобы сгенерировать необходимые функции, используйте gen.py. Поддерживаются следующие варианты:

  • Функции через запятую
root@kitploit:~
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection

Будут созданы 3 файла: TamperingSyscalls.cpp, TamperingSyscalls.h и main.cpp. Вы можете подключить #include "TamperingSyscalls.h" в свой проект. Мы можем вызывать функции, добавляя имя функции к p, например pNtOpenSection(...);

Ограничения

Мы не можем установить точку останова на NtSetThreadContext или его варианты, так как он используется для установки регистров отладки. Существует короткий промежуток времени, когда регистры отладки установлены, но он очень мал, и я не думаю, что нас обнаружат за удержание открытого Dr0.

Я опубликовал небольшую статью в блоге, затрагивающую эти техники.

Обзорный пост в блоге о TamperingSyscalls

Пост в блоге о фальшивой интроспекции TamperingSyscalls

Скачать инструмент