안티 디버깅(Anti-Debugging)

 

1) 정의

 

- 디버깅을 방해하여 분석을 어렵게 하는 기술

- 안티 디버깅을 적용한 프로그램이 실행 중에 있을 때 디버깅을 당한다면 디버깅을 하지 못하도록 에러를 발생시키거나 디버거 프로그램을 종료시키는 등 여러가지 방법을 사용하여 분석을 방해

 

2) 목적

 

- 디버깅을 방지하기 위해 사용

- 각종 안티 디버깅 기법들의 동작 원리를 파악한 후 회피하기 위해 사용

 

 

Static Anti-Debugging

 

1) 정의

 

- 프로그램의 첫 실행에서 디버거를 탐지하는 것

- 안티 디버깅을 수행하는 함수가 호출되는 시점에서만 디버거의 존재를 확인하고 그 뒤에는 탐지하지 않음

- Static 기법이 적용된 파일들은 디버거에서 실행조차 되지 않음

 

2) Static Anti-Debugging의 해제 방법

 

호출되는 API에 후킹을 걸어 원래 API의 루틴이 아닌 다른 루틴을 수행하도록 하는 방법

플러그인을 사용하여 자동으로 해제하는 방법

수동으로 해당 안티디버깅을 풀어내는 방법

 

3) 디버깅 기법

 

PEB(Process Environment Block)

 - 현재 프로세스의 디버깅 여부를 판단하기 위해 이용

NtQueryInformationProcess()

- ntdll!NtQueryInformationProcess() API를 이용하여 프로세스의 디버깅 관련 정보를 얻을 수 있음

NtQuerySystemInformation()

- 디버깅 환경을 체크하는 기법

- 현재 OSDebug Mode로 부팅되었는지 판단

NTQueryObject()

- 시스템에서 어떤 디버거가 다른 프로세스를 디버깅 중일 때 DebugObject타입의 커널 객체가 생성되는데, DebugObject의 존재를 확인하는 것

- ntdll!NtQueryObject() API를 이용하여 시스템의 다양한 종류의 커널 객체 정보를 얻을 수 있음

ZwSetInformationThread()

- ZwSetInformationThread() API를 사용하면 자신을 디버깅하고 있는 디버거를 떼어낼 수 있음

- ZwSetInformationThread() 함수는 스레드에게 정보를 세팅하는 System Native API

TLS 콜백 함수

- 프로그램의 Entry Point 코드보다 먼저 실행되기 때문에 유용하게 사용

- IsDebuggerPresent() 함수로 디버깅 여부를 판별하여 프로그램을 계속 실행할지 결정

 

 

Dynamic Anti-Debugging

 

1) 정의

 

- 프로그램이 실행되는 중간중간 계속하여 디버거를 탐지하는 것

- 프로그램의 실행과 함께 계속하여 실행되며 중간중간 디버거의 유무를 확인하기 때문에 지속적으로 해제가 필요

- 디버거 트레이싱을 방해하여 원본 프로그램의 코드와 데이터를 확인할 수 없게 만드는 것

디버거 트레이싱 : 디버깅 당하는 쪽의 내부 구조를 하나씩(한줄씩) 실행하면서 레지스터, 메모리 등을 실시간으로 확인하는 것

 

2) Dynamic Anti-Debugging의 해제 방법

 

호출되는 API에 후킹을 거는 방법

플러그인을 사용하여 자동으로 해제하는 방법

프로그램을 이용하여 자동적으로 풀어내거나 디버거로 설정하는 방법

수동으로 해당 안티디버깅을 풀어내는 방법

 

3) 디버깅 기법

 

예외(Exception)

- 정상적으로 실행된 프로세스에서 예외가 발생하면 SEH(Structured Exception Handling) 메커니즘에 의해 OS에서 예외를 받아서 프로세스에 등록된 SEH를 호출하지만, 디버깅 당하는 경우에 예외가 발생하면 디버거에서 예외처리를 담당

    정상 실행되는 경우와 디버깅 당하는 경우를 판별하여 서로 다른 동작 수행

Timing Check

- 디버거 트레이싱을 할 때 발생하는 실행 시간의 차이를 측정하여 디버깅 여부를 판별

0xCC Detection

- 일반적으로 프로그램을 디버깅할 때 Software BP(BreakPoing)를 많이 설치하는데, BPx86 Instruction'0xCC’

    → 이 값이 정확히 발견된다면 디버깅 여부를 판별 가능

 

 

 

안티 디버깅 종류

 

출처 : http://www.openrce.org/reference_library/anti_reversing

 

 

+ Recent posts