Profile

youngsouk

youngsouk

안티 디버깅 기법

1. 윈도우 API 사용

 

IsDebuggerPresent()

PEB에서 IsDebugged 검사

 

CheckRemoteDebuggerPresent()

PEB에서 IsDebugged 검사 & 자기 자신 or 로컬 컴퓨터의 다른 프로세스만 검사 가능

 

NtQueryInformationProcess()

 

OutputDebugString()

SetLastError()로 에러 설정

OutputDebugString()함수를 이용해 디버깅 중이면 이 함수는 성공, 디버깅 중이 아니라면 에러 코드를 설정하므로, 디버깅 여부 판단 가능

 

 

2. ProcessHeap 플래그 검사

힙 헤더의 플래그를 살핌으로서 디버깅 여부 판단

 

3. NTGlobalFlag 검사

PEB의 0x68부분이 0x70인지 확인

 

4. 레지스트리 & FindWindow함수 이용

 

5. INT 찾기

자신의 코드에서 INT(0xcc) INT 3(0xcd)를 찾는다.

 

6. 체크섬 수행

 

7. 시간 검사 (rdtsc 명령어, QueryPerformanceCounter, GetTickCount)

 

8. TLS 콜백 함수 사용

PE 구조에서 정의하는 진입점보다 TLS 콜백 함수가 먼저 실행하기 때문에 디버거 방해가 가능하다. <- ida pro의 (CTRL-E) 키로 진입점을 재지정하면 우회가 가능하다.

 

9. SEH 설정 후 INT 3 INT 2D(커널) 삽입

 

10. ICE 삽입

icebp 명령어는 싱글 스텝을 유발한다.

디버거에서는 싱글 스텝을 일반적인 예외라 여기고 예외처리를 실행하지 않는다.

 

11. 디버거의 버그, 취약점 공격

PE DataDirecotory 배열의 크기는 0x10으로 고정. 하지만 NumberOfRvaAndSizes 값 수정함으로서 방해

SizeOfRawData > VirtualSize 라면 VirtualSize 데이터를 메모리에 복사 & 나머지 무시한다. 그런데 이 값을 매우 크게 설정함으로서 방해한다;

 

'악성코드 분석' 카테고리의 다른 글

64 bit 악성코드  (0) 2020.04.07
안티 가상머신  (0) 2020.03.07
안티 디스어셈블리  (0) 2020.03.04
네트워크 시그니쳐 생성  (0) 2020.03.01
유용한 DNS 검색 사이트  (0) 2020.02.29