
하드웨어 중단점과 예외 처리기를 사용하여 Windows syscall 인자를 검색하고 스푸핑함으로써 EDR 텔레메트리를 우회하는 C++ 라이브러리.
TamperingSyscalls는 인자 스푸핑(argument spoofing)과 syscall 검색(syscall retrieval)으로 구성된 2부작의 새로운 프로젝트로, 두 가지 모두 EH를 악용하여 EDR을 우회합니다. 이 프로젝트는 직접 syscall에 대한 대안을 제공하기 위해 이 두 프로젝트를 모두 포함합니다.
시스템 콜 변조.
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
0f05 바이트가 포함된 syscall 명령의 주소에 Dr0 레지스터로 하드웨어 중단점을 설정합니다.
이 빠른 메모리 바이트 검색으로 syscall 스텁의 주소를 찾을 수 있습니다.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 텔레메트리를 위조하기 시작하려면 현재 NULL로 설정되어 있는 p[FunctionName] 정의를 수정하면 됩니다.
필요한 함수를 생성하려면 gen.py를 사용하세요. 이 도구는 다음 중 하나를 지원합니다:
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection
그러면 TamperingSyscalls.cpp, TamperingSyscalls.h, main.cpp의 3개 파일이 생성됩니다. 프로젝트에 #include "TamperingSyscalls.h"를 포함할 수 있습니다. 함수 이름 앞에 p를 붙여 함수를 호출할 수 있습니다. 예: pNtOpenSection(...);
NtSetThreadContext 또는 그 변형에는 중단점을 설정할 수 없습니다. 이는 디버그 레지스터를 설정하는 데 사용되기 때문입니다. 디버그 레지스터가 설정되는 짧은 기간이 있지만 매우 짧으므로 Dr0가 열린 상태로 유지되는 것을 탐지하지 못할 것이라고 생각합니다.
저는 이러한 기법을 다루는 짧은 블로그 게시물을 게시했습니다.