문제에서 디버깅을 감지하는 함수는 무엇인가를 보아 디버깅을 감지한 후에 정상 여부를 출력하는것 같다.
OllyDBG로 열고나서 디버깅을 진행해 보았다.
디버거로 디버깅을 진행해본결과 디버깅을 감지하고 디버깅 당함이라는 문자를 보여준다.
00408454의 주소의 CALL 명령어를 통해서 실행이 된다 Break Point를 걸고 함수 내부로 진입 해보았다.
함수 내부에서 디버깅을 탐지한후 탐지 여부에 따라서 정상과 디버깅당함이라는 문자열을 무한 반복한다.
계속해서 디버깅을 진행해보았다.
0040105E주소에서 KERNEL32.lsDebbugerPresnt 라는 함수이름이 보인다.
IsDebuggerPresent() 함수는 kernel32.dll에 export되는 함수이며 디버깅을 체크하는 MS에서 공식적으로 지원하는 안티리버싱 API이다. 해당 프로세스가 디버깅을 당하고 있는지에 대한 여부를 PEB구조체의 디버깅 상태값을 확인하며 디버깅을 당하고 있다면 1을 아닐 경우 0을 리턴한다.
IsDebuggerPresent() 함수는 내부적으로 TEB(Thread Environment Block)와 PEB(Process Environment Block)을 이용하며 PEB내의 Begin Debugger라는 멤버의 값을 기준으로 유저모드 디버거에 의해 디버깅을 판단한다
- TEB(Thread Enviorment Block) 프로세스에서 실행되는 스레드의 정보를 담고있는 구조체이다
- OS 환경마다 다르다. (Windows7의 경우 Windows XP SP3 보다 확장)
- 시작 주소 : FS:[0x00], FS:[0x18](User mode)
- PEB(Process Enviorment Block) 프로세스의 정보를 담고있는 구조체
- PEB 구조체는 OS마다 달라진다 (Windows7의 경우 Windows XP SP3 보다 확장)