본문으로 바로가기

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에 있는 것과 동일

 
활용?
패커 제작 시 기능 일부로 넣어서 분석을 시도할 경우 코드가 제대로 복원되지 않게 끔 하는 방식도 괜찮을 거 같은데 코드가 조잡하네...


소스 헤더


소스 코드