Upload
truongque
View
226
Download
0
Embed Size (px)
Citation preview
Packing/Anti-debugging 개념 및 Reversing 개념 해
성 : 김원기 ([email protected])
호성 ([email protected])
재창 ([email protected])
원섭 ([email protected])
한승범 ([email protected])
03 Nov. 2009
◉ 차 ◉
1. Packing/Anti-Debugging 개 ....................................01
2. Packing/Anti-Debugging 스 ..................................03
Anti-Debugging
IsDebuggerPresent
PEB 조체 상태값 확 한다.
당할 경 1, 그 않 경
0 하게 다.
IsDebugged
PEB 조체 BeingDebugged 맴 값
확 한다. 당할 경 1, 그
않 경 0 한다.
NtGlobalFlags
PEB 조체에 0x68에 치해 는
NtGlobalFlag 값 확 한다. 0 정상,
당했 경 0 아닌 값
다.
CheckRemoteDebuggerPresent
Win Xp 상 사 할 수
ZwQueryInformationProcess() 사 하여
정보 얻게 다. 0 정상,
당했 경 다 값 한다.
FindWindow
FindWindow() 함수 사 하여 트정
나 클래스 찾아 특정 프
그램 실행 확 한다.
Heap
flags PEB 조체 0x18에 치해 는
Heap flags 검사한다. 정상 경 2
값 하 당할 경 그
값 한다.
Debugger
Interrupts 럽트 수행 에 같 럽
트 드 만났 처 하 않는
경 단한다.
1. Packing/Anti-Debugging 개
Packing 프 그램 압축/암호화하고 그 내 수 는 해 프 그램에 여 실행시
그것 하여 복원한 내 에 고 원래 프 그램 EP 실행하는 식 행
하게 다. Packing 2가 점 다. 첫 째 프 그램 량 적 어들고,
째 툴에 한 어 워 게 었다.
Anti-Debugging 란 프 그램 하 하게 하 해 하는 업 말한다.
Binary 보호하는 하나 쉐어웨어, 과 프 그램, 타 한 프 그램
들 내 알고 과 들 하 하 에 Packing 하거나
Anti-Debugging 적 함 하고 하 하 하는 큰 적
다. Anti-Debugging 적 한 프 그램 실행 에 당한다 하
하 해당 거 프 그램 종료시키거나 에러 생 시키는 등 다양한 사
하여 해한다.
* Anti-Debugging
.386
.model flat, stdcall
option casemap :none ; case sensitive
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
.data
DbgNotFoundTitle db "Debugger status:",0h
DbgFoundTitle db "Debugger status:",0h
DbgNotFoundText db "Debugger not found!",0h
DbgFoundText db "Debugger found!",0h
.code
start:
2. Packing/Anti-Debugging 스
PEB.NtGlobalFlag
PEB BeingDebugged 플래그 에 , PEB는 NtGlobalFlag라는 필드 갖고 는
NtGlobalFlag는 PEB 0x68 치에 존 한다. LiveKD 하여 PEB 조체 값 확
해보았다.
플러그 값 아니라 0x0 값 담 만 라 0x70 값 담겨
다. 그 같 것 하여 탐 한다.
다 NtGlobalFlag Code 다.
ASSUME FS:NOTHING
MOV EAX,DWORD PTR FS:[30h]
ADD EAX,68h
MOV EAX,DWORD PTR DS:[EAX]
CMP EAX,70h
JE @DebuggerDetected
PUSH 40h
PUSH offset DbgNotFoundTitle
PUSH offset DbgNotFoundText
PUSH 0
CALL MessageBox
JMP @exit
@DebuggerDetected:
PUSH 30h
PUSH offset DbgFoundTitle
PUSH offset DbgFoundText
PUSH 0
CALL MessageBox
@exit:
PUSH 0
CALL ExitProcess
end start
여 ASSUME FS:NOTHING 란 문 그 트 스트 주 값 할당 하는 것
아니라 티브 만나 실행 시에 어 블러가 주 계산하는 경한다. FS
그 트에 NOTHING 라는 는 미 다. FS:[0] Exception handler Default 가
고 다. MASM 컴 러는 본적 스 사 할 ERORR 문에
같 ASSUM FS:NOTHING 주 그 같 ERORR Check Remove 해 다고
어 다.
NtGlobalFlag 회
해당 탐 회는 간단하다. 접 드 치 하여 꾸거나 혹 플래그 값 수정하거나
다. 하 만 것 역시 에 플러그 형태 원 하고 다. 해당 플러그 실행하고
NtGlobalFlag 체크 한 확 해주 동적 시 플래그 값 수정하여 거 탐
회 하게 다. 그 드 치 등 다양한 존 한다. 툴 좀 하게 하는 것
좋다.
다 Olly Advanced NtGlobalFlag 다.
Heap.HeapFlag , Heap.ForceFlags
ProcessHeap PEB 에 0x18 만큼 어져 고 플래그는 프 가 heap
만들어 고 정 는 플래그들 HeapFlag ForceFlas 다. 처 프 그램 힙
역 만들 ForceFlags 에는 0x0 값 HeapFlag 에는 0x2 값 정 다. 하 만
라 NtGlobalFlag 에 라 개 플래그 값 경 다.
만약 탐 어 경 었다 FoceFlags에는 0x40000060값 할당 HeapFlag
에는 0x50000062 값 할당 다. 경 값 체크함 무 한다.
.386
.model flat, stdcall
option casemap :none ; case sensitive
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
.data
다 PEB ProcessHeap 조체 offset 다.
여 ProcessHeap 조체 살 보 언 한 개 값들 존 한다.
다 Process_Heap Code 다.
DbgNotFoundTitle db "Debugger status:",0h
DbgFoundTitle db "Debugger status:",0h
DbgNotFoundText db "Debugger not found!",0h
DbgFoundText db "Debugger found!",0h
.code
start:
ASSUME FS:NOTHING
MOV EAX,DWORD PTR FS:[18h] ;TEB
MOV EAX,DWORD PTR [EAX+30h] ;PEB
MOV EAX,DWORD PTR[EAX+18h] ;Process_Heap
CMP DWORD PTR DS:[EAX+10h],0 ;Force_Flags
JNE @DebuggerDetected
MOV EAX,DWORD PTR FS:[18h] ;TEB
MOV EAX,DWORD PTR [EAX+30h] ;PEB
MOV EAX,DWORD PTR[EAX+18h] ;Process_Heap
CMP DWORD PTR DS:[EAX+0ch],2 ;Force_Flags
JNE @DebuggerDetected
PUSH 40h
PUSH offset DbgNotFoundTitle
PUSH offset DbgNotFoundText
PUSH 0
CALL MessageBox
JMP @exit
@DebuggerDetected:
PUSH 30h
PUSH offset DbgFoundTitle
PUSH offset DbgFoundText
PUSH 0
CALL MessageBox
@exit:
PUSH 0
CALL ExitProcess
end start
Heap.HeapFlag , Heap.ForceFlags 회
역시 앞 과 동 하게 드 치 플래그 조 회 할 수 다. 또는 플러그
OllyAdvanced 하 쉽게 플래그 값 동 수정 해 다.
.386
.model flat, stdcall
option casemap :none ; case sensitive
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
.data
DbgNotFoundTitle db "Debugger status:",0h
다 Olly Advanced HeapFlag,ForceFlags 회 다.
NtQueryInformationProcess
CheckRemoteDebuggerPresent API는 거가 프 attach 하는 것 감 한다. API
는 내 적 NtQueryInformationProcess 호출한다. 함수는 또한 내 적 커 조체
EPROCESS DebugPort 플래그 검사한다. 가 저 드 거가 프 attach 한
상태 DebugPort 플래그 값 0 아닌값 정 다.
앞 PEB에 해 간략하게 알아 보았다. PEB 저 드 프 스에 한 추가 정보
여 하는 EPROCESS는 커 에 프 스 하 해 사 하는 조체 정 가 겠
다. 또한 NtQueryInformationProcess 내 적 러낼 는 값 ProcessInformation
값 7 다.
또한 DebugPort 프 0x120 치에 존 하 저 드 에 라
NtQueryInformationProcess 함수 값 hProcess는 0xfffffff 값 그 않 경
에는 0 라는 값 담 게 다.
다 NtQueryInformationProcess Code 다.
DbgFoundTitle db "Debugger status:",0h
DbgNotFoundText db "Debugger not found!",0h
DbgFoundText db "Debugger found!",0h
ntdll db "ntdll.dll",0h
zwqip db "NtQueryInformationProcess",0h
.data?
NtAddr dd ?
MinusOne dd ?
.code
start:
MOV [MinusOne],0FFFFFFFFh
PUSH offset ntdll ;ntdll.dll
CALL LoadLibrary
PUSH offset zwqip ;NtQueryInformationProcess
PUSH EAX
CALL GetProcAddress
MOV [NtAddr],EAX
MOV EAX,offset MinusOne
PUSH EAX
MOV EBX,ESP
PUSH 0
PUSH 4
PUSH EBX
PUSH 7
PUSH DWORD PTR[EAX]
CALL [NtAddr]
POP EAX
TEST EAX,EAX
JNE @DebuggerDetected
PUSH 40h
PUSH offset DbgNotFoundTitle
PUSH offset DbgNotFoundText
PUSH 0
CALL MessageBox
JMP @exit
@DebuggerDetected:
PUSH 30h
PUSH offset DbgFoundTitle
PUSH offset DbgFoundText
PUSH 0
CALL MessageBox
@exit:
PUSH 0
CALL ExitProcess
end start
드에 ? 는 수 언할 값 할당하 않 상태 것 라 생각 다. 어 든
드에 커 API 수행하 해 LoadLibrary GetProcAddress 하여 해당 함수 주
얻 , 앞 한 값 호출 하고 라 는 값 체크하여
거 존 무 하고 습니다.
다 그 드 Olly에 확 한 (NtQueryInformationProcess in Olly) 다.
그 에 알 수 듯 값 저런 식 들어가 호출하게 어야 체크 할 수
다.
.386
.model flat, stdcall
option casemap :none ; case sensitive
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
.data
msgTitle db "Execution status:",0h
NtQueryInformationProces 회
회하는 역시 여러 가 가 존 할 수 다. 다만 플러그 Olly
Advanced 는 NtQueryInformationProcess 값 하나 hProcess 0 만듦 해
당 루틴 회하게 것 라 생각했 나 않는다. 단 그냥 주 루틴 나
는 에 EAX값 0 정하 회가 다.
Debugger Interrupts
거가 하나 프트 브 크 포 트 수행하 고 할 INT3(0xcc) 삽 함
수행 다. 럽 가 수행 다는 말 처 가 어난다는 미 다. 하 만
거가 수행 같 OP 드 INT3 만난 다 처 없 수행 하게
다.
Debugger Interrupts는 러한 것 착안하여 안티 수행한다. Interrupt 수행
에 같 럽 드 만났 exception 하 않는 경 라고 하게
다. 좀 연한 해 해 아래 드 참고 한다.
다 Debugger Interrupts 다.
msgText1 db "No debugger detected!",0h
msgText2 db "Debugger detected!",0h
.code
start:
ASSUME FS:NOTHING
PUSH offset @Check
PUSH FS:[0]
MOV FS:[0],ESP
; Exception
INT 3h
PUSH 30h
PUSH offset msgTitle
PUSH offset msgText2
PUSH 0
CALL MessageBox
PUSH 0
CALL ExitProcess
; SEH handleing
@Check:
POP FS:[0]
ADD ESP,4
PUSH 40h
PUSH offset msgTitle
PUSH offset msgText1
PUSH 0
CALL MessageBox
PUSH 0
CALL ExitProcess
end start
에 드에 @Check는 exception 어 날 등 는 SEH 다. INT 3 수행
어나 않는다 Debuger dectect 시 가 출 것 다. 다 (Debugger
Interrupt in Olly)에 살 본 습 다.
저 에 INT3 심히 살 보 저 가 문 라고 해하는 수월 할 수 다.
INT3 exception 킨다 0x0040103e 향하게 것 그 않 경 0x00401024
드 향하게 것 다.
5.2 Debug Interrupts 회
회 간단하다. 에 에 보 INT 3 만났 무시하 않고 SEH
following 하라는 택하여 다.
다 과 같 회 하게 다 Exception Handle 빠 는 루틴(Exception Handle 호출하
는 루틴) 볼 수 다.