티스토리 뷰

728x90
반응형

[Reversing] PEB, Anti-Debugging


PEB란? Process Environment Block로 프로세스의 정보를 담고있는 구조체로 FS 레지스터를 통해 얻을 수 있다. 

각 프로세스들 마다 PEB를 가지고 있으며, 스레드로는 TEB 가지고 있다.

FS:[18] = TEB 주소


또한 PEB 이용하여 dll api 주소를 얻을 수 있으며, 프로세스의 디버깅 유무도 함께 알 수 있다. 

0x002 BYTE BeingDebugged; 

0x008 void* ImageBaseAddress; 

0x00C _PEB_LDR_DATA* Ldr; 

0x018 void* ProcessHeap 

0x064 DWORD NumberOfProcessors; 

0x068 DWORD NtGlobalFlag; 

PEB의 안티디버깅에 대해 작성을 해보면, PEB Structure 을 살펴봐야 된다.


   +0x002 BeingDebugged    

해당 멤버를 살펴보면 디버깅 중일 때 해당 멤버의 값은 '1'로 설정이 된다.

우회를 하기 위해서는 PEB[2] 값을 '0'으로 수정하면 된다.

참고, Kernel32.dll에서 IsDebuggerPresent() 함수가 이 필드를 참고하여 디버깅 상태 확인 후 리턴값을 준다.

   +0x018 ProcessHeap      

PEB 멤버 ProcessHeap 정보를 담고 있는 HEAP 포인터

HEAP 멤버의 Flags(0x40)와 ForceFlags(0x44)는 디버깅 유무에 따라 다른 값을 가지며 다음과 같음


디버깅 중이 아닐 시 : Flags(2), ForceFlags(0)

디버깅 중일 시 : Flags(0x50000062), ForceFlags(0x40000060


   +0x068 NtGlobalFlag     

해당 멤버는 디버깅 중일 때 해당 멤버의 값은 '70'으로 설정이 된다.

우회를 하기 위해서는 PEB[68] 값을 '0'으로 수정하면 된다.

728x90
반응형

'Reversing > Anti-Reversing' 카테고리의 다른 글

[Reversing] ZwSetInformationThread, Anti-Debugging  (0) 2020.02.10
[Reversing] Anti-Reversing  (0) 2020.01.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
250x250