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