본문 바로가기

My Study/Reversing

csrss.exe 프로세스를 사용한 안티디버깅 기법

이번에 알아볼 내용은 csrss.exe프로세스를 사용한 안티디버깅 기법입니다.
탐지 프로그램을 만들어서 여러 환경에서 실험을 해보았는데 되는 환경이 있고 안되는 환경도 있더군요.
일단 설명을 들어가도록 하겠습니다.

아마 프로세스를 디버깅을 하려면 디버거에 프로세스를 Attach를 시켜야 할 것입니다.
이 때 몇몇 디버거들은 타겟 프로세스의 권한을 원래 상태로 돌아가는 것을 성공하지만
반면에 몇몇 디버거들은 권한을 원래 상태로 돌리는 것을 실패를 합니다.
이 때 우리는 이것을 가지고 디버거를 탐지할 수 있습니다.
해당 프로세스의 특권 권한이 높아졌는지 원래 상태인지를 알 수 있는 방법은 csrss.exe프로세스를 
PROCESS_ALL_ACCESS 플래그를 사용해 알 수 있습니다.
일반적으로 우리의 프로세스는 csrss.exe 프로세스를 
PROCESS_ALL_ACCESS권한으로 OpenProcess()함수를 호출해 열 수 없습니다.
하지만, 디버거에 붙게되면 권한이 상승하게 되는데 (몇몇 디버거) 
이 때는 csrss.exe프로세스를 OpenProcess함수를 사용해 열 수 있습니다. 

제가 만든 코드를 보시겠습니다.

설명은 주석으로 달아놨습니다.

이제 해당 프로그램을 돌려보겠습니다.

환경 : Windows XP SP3
a. 정상 실행


b. 올리디버거로 실행


c. IDA v5.5로 실행


d. WinDbg로 실행


일단은 위 실험 결과를 보면 3개의 디버거를 실험 결과 올리디버거에서는 특권 권한을 원래대로 돌리는지
핸들 얻기를 실패하고 있었습니다. 나머지 디버거들은 탐지가 되는 군요.

환경을 바꿔서 실험을 해보도록 하겠습니다.

환경 : Windows 7
a.  정상 실행


b. 올디에서 실행


c. IDA에서 실행


d. WinDbg에서 실행


위 실험 결과도 마찬가지 입니다. 윈 7에서도 잘 먹히는 것을 확인할 수 있었습니다.
안타까운 점은 유저모드 상에서 가장 많이 쓰이는 올디가 안걸린다는 것입니다.
그래도 IDA와 WinDbg는 걸리는 군요.

== 추가내용 ==
위 파일 소스코드를 보면 OpenProcess를 할 때 첫 번째 인자로 PROCESS_ALL_ACCESS를 썼습니다.
하지만 해당 플래그 값으로 설정을 해주면 특정 프로세스의 핸들을 잘 못 얻어옵니다. 그래서 사용되는 플래그로
MAXIMUM_ALLOWED를 사용하면 csrss의 핸들을 잘 얻어올 수 있죠.
근데 이렇게 해주면 정상적으로 실행해도 csrss의 핸들을 얻어와 버리니 쫌 문제가 있는거 같습니다.
별로 쓰기 싫은 안티디버깅 기법입니다.


한가지 실험을 하면서 알게된 결과인데 VS에서 F5로 실행시키는 디버그 모드가 아닌 Ctrl + F5를 눌러서 실행시켜도 
권한이 상승 된다는 것입니다. 디버그 모드가 아닌데도 말이죠..

처음에 그냥 VS에서 Ctrl + F5로 실행시켰을 때 Debugging으로 떠서 깜짝놀랬습니다. 
이 안티디버깅 기법이 안먹히는줄 알았죠.. ㅜ ㅜ 식겁..