Transcript unpacking

1. Unpacking이란…
Unpacking이란 무엇인가?
2. 디버거 탐지 기술
IsDebuggerPresent()
- 디버거를 찾는 기술 중 가장 기초적인 기술
- PEB(Process Environt Block)을 이용
- IsDebuggerPresent() 함수를 이용하여 리턴 값을 참조, 현재 프로세스가 디버깅 되고 있는지 판단하는 방식
2. 디버거 탐지 기술
PEB.Beingdebugged-1
- IsDebuggerPresent함수가 실제로 참조하는 값
2. 디버거 탐지 기술
PEB.Beingdebugged-2
- IsDebuggerPresent함수가 실제로 참조하는 값
2. 디버거 탐지 기술
PEB.Beingdebugged-3
- asm 코드로 구현하면 아래와 같은 형식이다.
2. 디버거 탐지 기술
PEB.NTGlobalFlag – (1)
- NTGlobalFlag는 PEB에 저장되어 있는 값이며, 다양한 내부 Debugging과 Tracing, 운영체제 내의 유효성 검사를
가능하게 해주는 Flags
2. 디버거 탐지 기술
PEB.NTGlobalFlag – (2)
- NtGlobalFlag 역시 BeingDebugged와 같이 PEB구조체에 저장되어 있는 값이고 0x68 offset 지점에 위치
- FLG_HEAP_ENABLE_TAIL_CHECK(0x10)
- FLG_HEAP_ENABLE_FREE_CHECK(0x20)
- FLG_HEAP_VALIDATE_PARAMETERS(0x40)
=> 위의 세가지 값이 플래그에 세팅이되어 0x70 값이
들어가게된다.
2. 디버거 탐지 기술
PEB.NTGlobalFlag – (3)
2. 디버거 탐지 기술
HeapFlags, ForceFlags - (1)
- HeapFlags와 ForceFlags는 NTGlobalFlag의 설정으로 인해서 활성화 되는 플래그에 관련된 값이다.
- 프로세서의 첫 번째 힙이 생성될 때, 플래그들과 ForceFlag 필드를 0x02(HEAP_GROWABLE) 그리고 0x0으로 설정
되지만, 디버깅 중일때 이 플래그들은 0x50000062(NTGlobalFlag에 따라)와 0x4000060 (플래그들과 0x6001007D에
따라)로 설정된다.
- 프로세서가 디버그 될 때 heap이 만들어지고 플래그가 설정된다. HEAP_TAIL_CHECKING_ENABLED(0x20),
HEAP_FREE_CFHECKING_ENABLED(0x40)
2. 디버거 탐지 기술
HeapFlags, ForceFlags – (2)
http://www.nirsoft.net/kernel_struct/vista/index.html
2. 디버거 탐지 기술
CheckRemoteDebuggerPresent
-CheckRemoteDebuggerPresent()는 IsDebuggerPresent()와 비슷한 개념
- 함수는 내부적으로 NtQueryInformationProcess()라는 API함수를호출, EPROCESS라는 커널 구조체에서 Debugport값을 검사
- 함수는 디버거가 프로세스에 어태치 하는 것을 확인하는 함수
http://www.nirsoft.net/kernel_struct/vista/index.html
2. 디버거 탐지 기술
NtQueryInformationProcess() - 1
- CheckRemoteDebuggerPresent가 호출 될 때에 내부적으로 호출되는 NativeAPI함수
- 함수의 이름 그대로 프로세스의 정보를 요청하는 NativeAPI
- 함수의 원형은 아래와 같으며 두번째 인자 ProcessInformation Class에 7을 넘겨주게 되면 EPROCESS의 DebugPort값 로드
http://www.nirsoft.net/kernel_struct/vista/index.html
2. 디버거 탐지 기술
NtQueryInformationProcess() - 2
- DebugPort의 플래그는 디버깅을 당하고 있지 않을 때는 0, 디버깅을 당하고 있을 때에는 0xffffffff 값이 들어간다.
http://www.nirsoft.net/kernel_struct/vista/index.html