▶안티디버깅이란?
디버깅을 방해해서 분석을 어렵게 하는 기술
디버깅을 당한다면 디버깅을 하지 못하도록 고의적으로 에러를 발생 or 디버거 프로그램을 종료시키는 등 다양한 방법 사용해서 방해함
크게 static 그룹과 dynamic 그룹으로 나뉨
1) Static
- 디버거를 탐지하여 프로그램이 정상적으로 실행되지 못하게 함
- 디버깅을 시작할 때 한 번만 해체해주면 됨
PEB – (프로세스 정보를 담고 있는 구조체)값을 참조해서 할 수 있는 방식


LDR – 프로세스가 디버깅 시에 메모리의 힙 영역에 디버깅 당하는 표시를 메모리를 해줌
프로세스가 디버깅 당하면 힙 영역에 0xFEEEFEEE 또는 0xABABABAB 를 채움
→ 해당 표시로 디버깅 중임을 확인
+ PEB – 프로세스 정보를 담고 있는 구조체
#TLS 콜백 함수 / IsDebuggerPresent
TLS 콜백 함수 – 프로세스의 스레드가 생성 및 종료 될 때마다 자동으로 호출되는 콜백 함수
코드의 시작점인 EP 코드보다 먼저 호출됨을 이용(EP 코드 실행 전에 TLS 콜백 함수가 실행됨)
– 브레이크 포인트 사용함
ISDebuggerPresent 함수를 이용함 / 현재 프로세스가 디버깅중이면 “Debugger Detected!” 문자열을 출력함
커널 모드의 디버거는 탐지 X, 유저 모드의 디버거만 탐지 O
디버깅 중면 DebugObject 라는 객체를 생성함 – 객체 탐지를 위해 NTQueryObject 함수를 이용함
DebugObject의 리스트를 나열해서 존재하는 객체의 개수를 카운팅함, + 다양한 커널 객체 정보를 구해옴
객체의 개수가 1개 – 디버거가 발견 X
PEB 구조체의 0x68 에 존재함
디버깅 중에 0x70 으로 세팅됨 / 정상일 때는 0으로 세팅
2) Dynamic
- 디버거 트레이싱을 방해해서 원본 프로그램의 동작 원리를 이해하는데 방해함
- 정상적 분석을 위해서는 dynamic 기법의 안티디버깅을 만날 때마다 해체 해야함
#Timing Check
특정 명령어 사이의 시간 간격을 측정함
→ 디버깅 시에 코드를 한 줄씩 실행하기에 실행할 때 시간이 많이 들어감
Counter Based Metod / Timed Based 방식으로 나뉨
l Counter Based Metod
CPU의 카운터를 이용함
l Timed Based
시스템의 실제 시간을 이용함
#0x CC Detection
디버깅 시에 BreakPoint 를 설치하게 되면 해당 위치 코드가 0x CC로 변경됨
API BreakPoint / CheckSum 방식으로 나뉨
l API BreakPoint
리버서들은 특정 API 에 중단점을 설치하고 디버깅을 진행하곤 함 → 이를 역이용하여 API 코드 시작 부근에 0x CC 가 있는지 확인함
l CheckSum
특정 코드 영역의 CheckSum 값을 구하고 미리 계산해놓은 원본 CheckSum과 비교함
0x CC 로 변경되는지 확인
#SEH 메커니즘 / Exception
정상적 프로세스에서 예외(Exception)가 발생하면 OS에서 예외를 받음 → 프로세스에 등록된 SEH를 호출해줌
예외 : 하드웨어 예외 (하드웨어에서 인식하고 알려줌) / 소프트웨어 예외 (소프트웨어에서 감지)
'SYSTEM' 카테고리의 다른 글
파일 디스크립터, 실습 (0) | 2023.01.05 |
---|---|
패킹, 언패킹 (0) | 2023.01.05 |
프로세스, 스레드 차이 (0) | 2023.01.05 |
세마포어, 뮤텍스 차이 (0) | 2023.01.05 |
하드웨어, 소프트웨어 BP (0) | 2023.01.05 |