CRC를 이용한 안티 디버깅
해시 함수를 이용하여 무결성 검사를 수행할 수 있음. 일반적으로 특정 루틴을 분석하기 위해 0xCC(Software BreakPoint)를 쓰게 되는데 이 경우 해당 지점의 코드 바이트가 0xCC로 변경되는 것을 이용, 반복적으로 중요 함수의 코드 바이트를 무결성 검사하여 안티 디버깅 수행
예제 진행 순서(CRC 코드 임의 작성)
1. 프로그램 시작 시 쓰레드로 안티디버깅 호출(while로 특정 함수의 코드 무결성 검증)
2-1. 함수가 실행되며 함수에 대한 코드가 변경되지 않을 경우 일반적인 진행
2-2. 함수가 실행되는 부분에 BreakPoint를 설치하고 진행할 경우 안티 디버깅 코드가 동작하는 쓰레드에 의해 프로세스가 종료
빌드 환경 체크
빌드 환경 : VC 2005 - Release - 최적화 옵션 : Disable
빌드 시 CRC 값이 바뀔 수 있음
ex) _security_check_cookie(x)의 함수 위치 변경에 의한 코드 바이트 변경
실행
scanf() 함수 코드 이 후의 분석을 위해 BreakPoint를 설치하고 실행했을 때 Process Terminate 되는 것을 확인
안티 디버깅 우회 방법
1. CRC 값을 체크하는 루틴을 찾아 수정
2. 코드에 대한 정적 리버싱 수행(BreakPoint를 설치하지 않을 경우 의미 없음)
3. Hardware BreakPoint 사용(안티 디버깅 코드에서 Hardware Break Point에 대한 안티디버깅이 있을 경우 문제가 될 수 있음..)
Reference
CRC 테이블과 SALT 테이블은 reversing.kr의 CRC1.exe에 있는 것과 동일
활용?
패커 제작 시 기능 일부로 넣어서 분석을 시도할 경우 코드가 제대로 복원되지 않게 끔 하는 방식도 괜찮을 거 같은데 코드가 조잡하네...
소스 헤더
소스 코드
'Reversing > Anti Debugging' 카테고리의 다른 글
[VM 탐지] Hard Disk Driver (0) | 2015.03.26 |
---|---|
[VM 탐지] Hard Disk Name (0) | 2015.03.26 |
[TEB,PEB 기반] Memory Search - Magic Number(0xFEEEFEEE) (0) | 2015.03.26 |
[TEB,PEB 기반] ProcessHeap - Flags, ForceFlags (0) | 2015.03.26 |
[TEB,PEB 기반] PEB.NtGlobalFlag (0) | 2015.03.26 |