API Hooking을 통한 우회
API를 이용한 디버깅 탐지 기법들은 API Hooking을 이용하여 해당 API를 무력화 하는 방법으로 우회 가능
FindWindow()
를 Hooking -> Debuger process의 윈도우 핸들을 가리킬 경우 Null을 returnIsSoftIceLoaded
:
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)
기능 활성화Anti-RDTSC
기능을Enable
함해당 기능을 사용하면 아래와 같이 커널 드라이버가 설치됨
OllyDBG의 OllyAdvanced라는 안티 디버깅 플러그인이 대부분의 무력화를 지원함
타이머를 이용한 방법
: GetTickCount()
API를 후킹해 시간을 속임, rdtsc
를 사용하면 Win32 API
가 아니기 때문에 APi 후킹으로는 안됨, OllyAdvanced
에서 관련 기능을 제공함
rdtsc를 호출하는 명령어 (0x0F31)를 모두 찾아 0x90(nop)으로 수정함
디버그 레지스터
: ???
API Hook을 이용한 디버깅 감지
: 디버거가 프로세스를
attach
할 때 주로 사용하는DebugActiveProcess()
를 후킹해서attach
를 못 하게 하는 기법으로, 후킹된 해당DebugActiveProcess()
를 다시 후킹해서 원복시킴Self Debugging
: 부모 프로세스에서
WaitForDebugEvent()
API를 호출함, 해당 API에DebugActiveProcessStop()
함수를 삽입하여 부모 프로세스가 디버거를 놓아버리게 함
그냥 opcode를 찾아 패치하는 방법도 있음
OllyDBG 옵션을 이용한 우회
int3을 이용한 디버거 감지
:
OllyDBG
의 메뉴에서Option - Debugging Option
으로 가서Exception
탭에서Ignore memory access violations in KERNEL32
을 켜고INT3 break
옵션과Single-step break
옵션을 켜준다: 디버거 인테럽트가 발생해도 자동으로 예외 처리 핸들러를 호출하여 디버거 사용이 가능
SetUnhandledExceptionFilter
: 예외 처리 관련 안티 디버깅에 대한 우회는 해당 옵션으로 대부분 우회 가능
플래그 수정으로 우회
PEB를 이용한 방법
:
PEB
의BeginDebugged
플래그 값을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 |