티스토리 뷰
[Reversing] Anti-Reversing
- 참조
> http://unprotect.tdgt.org/index.php/Anti-debugging
- 샘플 파일 다운로드
> 첨부파일
샘플에 적용된 안티 디버깅, 안티 VM 기법에 대해 확인하였다.
IsDebuggerPresent, CheckRemoteDebuggerPresent API 안티 디버깅
0x4019D0()에서 IsDebuggerPresent()을 이용하여 디버거를 통해 호출이 되었는지를 확인한다. 디버거 환경이 아니라면 “0”을 반환하고, 디버거 환경이라면 “0”이 아닌 값을 반환 한다.
CheckRemoteDebuggerPresent()의 v1 즉, GetCurrentProcess() 현재 프로세스의 핸들을 얻는다. CheckRemoteDebuggerPresent()에서 해당 프로세스를 확인하여 디버깅 유무에 대해 반환 해준다. 보통 디버깅을 탐지했을 때 종료하는 코드로 진행한다.
그림 – 안티디버깅 기법(1)
RaiseException API 안티 디버깅
RaiseException()의 dwExceptionCode 0x40010006(DBG_PRINTEXCEPTION_C) 디버깅 중일 경우 예외가 발생한다. 디버깅 여부를 파악 할 수 있다.
그림 – 안티디버깅 기법(2)
Hardware BP 기반 안티 디버깅
하드웨어 브레이크 포인트를 사용하기 위해 Debug Register를 사용하게 되는데 해당 Debug Register를 체크하여 안티 디버깅 유무를 확인 할 수 있다
그림 – 안티디버깅 기법(3)
.
GetThreadContext()을 이용하여 Debug Register 값을 체크한다. Dr0, Dr1, Dr2 Dr3은 하드웨어 브레이크 포인트의 가상 주소이다.
하드웨어 브레이크 포인트가 설정되어 있는지 연산값을 통해 (그림 13)의 "(Dr0, Dr1, Dr2, Dr3) != 0" 참 "0"이면 거짓 조건을 확인 할 수 있다. 즉, v0=0은 0!=0, v0=1 1!=0이다.
그림 – 안티디버깅 기법(3)
PEB 구조체를 통한 안티 디버깅
FS 레지스터를 이용하여 PEB의 주소를 얻을 수 있다.
FS:[0x00] | 현재 SEH 프레임 |
FS:[0x18] | TEB |
FS:[0x20] | PID |
FS:[0x24] | TID |
FS:[0x30] | PEB |
FS:[0x34] | Last Error Value |
표 – FS 레지스터
EAX에 오프셋 0x30만큼의 값을 더하여 PEB를 얻는다.
그림 – 안티디버깅 기법(4)_1
PEB 구조체의 0x2, 0x68 번지 변수에는 디버깅 유무를 확인 할 수 있는 1byte 값이 저장되어 있다.
그림 – 안티디버깅 기법(4)_2
QueryDosDevice을 이용한 가상 환경 안티 VM
QueryDosDevice()을 이용하여 MS-DOS 장치 목록을 얻어 오는데, 얻어온 목록 중에 “VBoxMiniRdrDN”, “VBoXGuest” 같은 가상 환경에서 존재하는 장치 이름을 확인한다. 그러나 문자열들을 확인 할 수 없는데, 이는 문자열을 특정 4byte 해시값으로 표현하기 때문인 걸 확인 할 수 있다
그림 – 안티디버깅 기법(5)
레지스트리 키를 이용한 가상 환경(Virtual Box) 안티 VM
특정 레지스트리 키를 확인하여 가상 환경인지를 탐지한다. (그림 20)을 보게 되면 “HARDWARE\\ACPI\\DSDT\\VBOX__” 이전 정적 분석을 통해 얻은 정보라는 걸 확인 할 수 있다.
그림 – 안티디버깅 기법(6)
현재 프로세스 모듈의 이름을 확인하는 안티 VM, 안티 디버깅
문자열을 특정 해시값으로 표현하였다는 점에서 비슷한 안티 VM 이다. CreateToolhelp32Snapshot(), Module32First(), Module32Next()을 이용하여 현재 프로세스 중 가상 환경과 디버깅에 대한 모듈이 있는지 확인한다.
그림 – 안티디버깅 기법(7)
현재 프로세스 이름을 확인하는 안티 VM
위와 같이 문자열을 특정 해시값으로 표현하였으며, CreateToolhelp32Snapshot(), Process32First()을 이용하여 현재 프로세스 중 가상 환경과 관련된 프로세스에 대해 확인한다.
그림 – 안티디버깅 기법(8)
Rdtsc(ReaD TimeStamp Counter)을 이용한 안티 디버깅
rdtsc는 컴퓨터 부팅 후 CPU 사이클 횟수를 획득하는 명령어로 사이클 횟수의 차를 이용하여 디버깅 유무를 확인 할 수 있다.
기법(9)_1 과 같이 0x429E68, 0x429E6C 주소에 RDTSC CPU 사이클 횟수를 저장한다.
그림 – 안티디버깅 기법(9)_1
0x401BC0의 rdtsc 명령어를 재호출하여 위 값들과 비교한다. 디버깅 시간이 걸리기 때문에 두 값의 차이를 통해 안티 디버깅으로 활용한다.
그림 – 안티디버깅 기법(9)_2
'Reversing > Anti-Reversing' 카테고리의 다른 글
[Reversing] PEB, Anti-Debugging (0) | 2020.02.11 |
---|---|
[Reversing] ZwSetInformationThread, Anti-Debugging (0) | 2020.02.10 |
- Total
- Today