13. 우회 방법

API Hooking을 통한 우회
  • API를 이용한 디버깅 탐지 기법들은 API Hooking을 이용하여 해당 API를 무력화 하는 방법으로 우회 가능

  • OllyDBG의 OllyAdvanced라는 안티 디버깅 플러그인이 대부분의 무력화를 지원함

    • FindWindow

      : FindWindow()를 Hooking -> Debuger process의 윈도우 핸들을 가리킬 경우 Null을 return

    • IsSoftIceLoaded

      : CreateFile() Hooking -> Softice 드라이버일 경우 null 또는 INVALID_HANDLE 리턴

    • CheckRemoteDebuggerPresent

      : CheckRemoteDebuggerPresent Hooking -> 호출 시 강제로 false 리턴





      함수 호출부를 아래와 같이 수정하여 강제로 0을 반환하도록 함

      xor eax, eax

      ret

    • Debug Oject Handle

      : NtQueryInformationProcess() API를 같은 방법으로 수정

      : 두 번째 인자가 0x1e (ProcessDebugObjectHandle)일 경우에 대해서만 반환하도록

    • NtQueryObject

      : NtQueryObject에서 NTSTATUS 실패를 리턴

      • NtQueryObject() 를 호출할 경우 모든 오브젝트 핸들을 얻어올 수 있음, 이 중 DebugObject가 포함됐을 경우 탐지하는 기법

    • NoDebugInherit

      : NtQueryInformationProcess() API를 같은 방법으로 수정

    • NtSetInformationThread

      : NtSetInformationThread() API를 같은 방법브로 수정

    • 프로세스 체크

      : Process32Next()API를 이용, 프로세스를 찾지 못하도록 수정

    • 버전 체크

      : GetFileVersionInfoSize() 를 실패하도록 수정

    • 부모 프로세스 체크

      : Process32Next()API를 이용, 프로세스를 찾지 못하도록 수정

      : NtQueryInformationProcess() 도 변조

    • SeDebugPrivilege 권한 체크

      : CsrGetProcessId() 를 변조, OpenProcess(), NtQueryObject()

    • 키보드 입력 봉쇄

      : BlockInput() 변조

    • OutputDebugString

      : OutputDebugString() 함수를 변조, 바로 반환하도록 설정해도 가능

    • WinDBG 검출

      : FindWindow() 무력화

    • CloseHandle()을 이용한 안티 리버싱

      : CloseHandle() 을 후킹, 정상 핸들을 Close하는 것을 걸러야 하는데 이 과정이 복잡

      : OllyAdvanced에서도CloseHandle()을 필터링하는 기능이 존재

      : Ignore and skip C0000008h (inv Handle) 기능 활성화

    • 타이머를 이용한 방법

      : GetTickCount() API를 후킹해 시간을 속임, rdtsc 를 사용하면 Win32 API 가 아니기 때문에 APi 후킹으로는 안됨, OllyAdvanced 에서 관련 기능을 제공함

      1. Anti-RDTSC 기능을 Enable

      2. 해당 기능을 사용하면 아래와 같이 커널 드라이버가 설치됨    


3. IDT 후킹을 이용한 rdtsc 우회 기법

4. rdtsc : 시스템 부팅 후 현재 실행 시점까지를 알려주는 명령어, CPU 사이클을 읽어서 계산함

5. CR4 레지스터의 TSD(Time Stamp Disable) 비트를 1로 설정할 경우 rdtsc가 호출될 때마다 GP(General Protection) 예외가 발생

6. 해당 예외를 처리하는 핸들러가 GPF(General Protection Fault)이며 0xD 인테럽트를 사용
7. 즉, rdtsc를 호출하면 0xD번 인테럽트가 호출됨
8. 0xD 인테럽트를 후킹하여 해당 인테럽트가 호출되면 그것이 rdtsc에 의해 호출되었는지 확인, rdtsc일 경우 시간 값 조작을 통해 우회

      그냥 opcode를 찾아 패치하는 방법도 있음

      1. rdtsc를 호출하는 명령어 (0x0F31)를 모두 찾아 0x90(nop)으로 수정함

    • 디버그 레지스터

      : ???

    • API Hook을 이용한 디버깅 감지

      : 디버거가 프로세스를 attach 할 때 주로 사용하는 DebugActiveProcess() 를 후킹해서 attach 를 못 하게 하는 기법으로, 후킹된 해당 DebugActiveProcess() 를 다시 후킹해서 원복시킴

    • Self Debugging

      : 부모 프로세스에서 WaitForDebugEvent() API를 호출함, 해당 API에 DebugActiveProcessStop() 함수를 삽입하여 부모 프로세스가 디버거를 놓아버리게 함

OllyDBG 옵션을 이용한 우회
  • int3을 이용한 디버거 감지

    : OllyDBG 의 메뉴에서 Option - Debugging Option 으로 가서 Exception 탭에서 Ignore memory access violations in KERNEL32 을 켜고 INT3 break 옵션과 Single-step break 옵션을 켜준다

    : 디버거 인테럽트가 발생해도 자동으로 예외 처리 핸들러를 호출하여 디버거 사용이 가능

  • SetUnhandledExceptionFilter

    : 예외 처리 관련 안티 디버깅에 대한 우회는 해당 옵션으로 대부분 우회 가능

플래그 수정으로 우회
  • PEB를 이용한 방법

    : PEBBeginDebugged 플래그 값을 0 으로 패치

  • 리모트 디버깅 감지

    : KD_DEBugGER_NOT_PRESENT 는 커널 전역 변수, 해당 변수를 TRUE 로 패치해버림

  • 0xCC 자체를 탐지

    : 코드 상의 0xCC 를 찾아서 패치


'Study > Reversing' 카테고리의 다른 글

코드 후킹  (0) 2019.03.21
FSC_Level1 풀이  (0) 2019.03.20
Petya Ransomware 분석  (0) 2019.02.19
PE 헤더  (0) 2019.02.18
2. C 문법과 디스어셈블리  (0) 2019.02.14

+ Recent posts