Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
TamperingSyscalls — 하드웨어 중단점과 예외 처리기를 사용하여 Windows syscall 인자를 검색하고 스푸핑함으로써 EDR 텔레메트리를 우회하는 C++ 라이브러리. | Kitploit
도구/GitHubGitHub/rad9800/tamperingsyscalls
IDS/IPS EvasionPost-ExploitationRed TeamingPayload Development
GitHubrad9800/tamperingsyscalls

TamperingSyscalls

하드웨어 중단점과 예외 처리기를 사용하여 Windows syscall 인자를 검색하고 스푸핑함으로써 EDR 텔레메트리를 우회하는 C++ 라이브러리.

저장소 보기
508764년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

TamperingSyscalls

TamperingSyscalls는 인자 스푸핑(argument spoofing)과 syscall 검색(syscall retrieval)으로 구성된 2부작의 새로운 프로젝트로, 두 가지 모두 EH를 악용하여 EDR을 우회합니다. 이 프로젝트는 직접 syscall에 대한 대안을 제공하기 위해 이 두 프로젝트를 모두 포함합니다.

시스템 콜 변조.

  1. 나중에 사용할 전역 EH를 설정합니다.
root@kitploit:~
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
  1. 0f05 바이트가 포함된 syscall 명령의 주소에 Dr0 레지스터로 하드웨어 중단점을 설정합니다. 이 빠른 메모리 바이트 검색으로 syscall 스텁의 주소를 찾을 수 있습니다.
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. 그런 다음 이 함수를 호출하면서 처음 4개 이하의 인자(프로세스 핸들과 같은 정보를 담고 있는 더 중요한 인자)에 NULL을 전달할 수 있습니다. 또한 이 함수에 해당하는 Enum으로 EnumState를 설정합니다(나중에 인자를 수정할 수 있도록).
  2. EDR이 우리 인자를 완전히 들여다볼 수 있지만, 처음 4개 이하의 인자에 NULL을 전달했으므로 우리가 악의적인 행동을 수행하고 있다고 확신할 수 없습니다.
  3. 그러면 EDR은 syscall 번호(SSN)를 반환하고 이를 RAX에 저장합니다. syscall 검색에만 관심이 있다면 이 저장소의 stripped 브랜치를 확인하세요.
  4. 그러면 프로그램은 이전에 설정한 중단점에 걸리는 syscall 명령 { 0x0F, 0x05 }으로 흐릅니다. 그러면 SINGLE_STEP 예외가 발생하며, 1단계에서 설정한 예외 처리기가 이를 처리합니다.
root@kitploit:~
if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
  1. 이 예외 처리기는 Dr0와 RIP가 일치하는 경우에만 Dr0 레지스터가 가리키는 값을 0으로 설정하여 Dr0에 대한 하드웨어 중단점을 비활성화합니다(현재 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 호출 규약에 따라 첫 4개 인자에 RCX, RDX, R8, R9를 사용하고 나머지는 스택에 설정하기 때문입니다. 4개가 넘는 매개변수를 스택에 수동으로 설정하는 것도 가능하지만, 인라인 어셈블리가 필요하므로 이 프로젝트의 범위를 벗어납니다. R10이 RCX가 아닌 이유는 모든 syscall 스텁의 시작 부분에 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 텔레메트리를 위조하기 시작하려면 현재 NULL로 설정되어 있는 p[FunctionName] 정의를 수정하면 됩니다.

생성

필요한 함수를 생성하려면 gen.py를 사용하세요. 이 도구는 다음 중 하나를 지원합니다:

  • 쉼표로 구분된 함수 목록
root@kitploit:~
python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection

그러면 TamperingSyscalls.cpp, TamperingSyscalls.h, main.cpp의 3개 파일이 생성됩니다. 프로젝트에 #include "TamperingSyscalls.h"를 포함할 수 있습니다. 함수 이름 앞에 p를 붙여 함수를 호출할 수 있습니다. 예: pNtOpenSection(...);

제한 사항

NtSetThreadContext 또는 그 변형에는 중단점을 설정할 수 없습니다. 이는 디버그 레지스터를 설정하는 데 사용되기 때문입니다. 디버그 레지스터가 설정되는 짧은 기간이 있지만 매우 짧으므로 Dr0가 열린 상태로 유지되는 것을 탐지하지 못할 것이라고 생각합니다.

저는 이러한 기법을 다루는 짧은 블로그 게시물을 게시했습니다.

TamperingSyscall의 개요 블로그 게시물

TamperingSyscall의 가짜 인트로스펙션 블로그 게시물

도구 다운로드