‘Low’ Integrity level 프로세스 디버깅
Vista이후의 OS에는 “Integrity level”(이하 IL)이라는 것을 두어, 같은 사용자 권한으로 동작하는 프로세스라도 IL에 따라 자원 혹은 다른 프로세스에 대한 접근권한을 제어한다.
프로세스의 IL은 [System, High, Medium, Low] 네 가지 중 하나의 값을 가질 수 있는데, 특히 Low-IL의 경우, 로컬 리소스나 (Medium이상의 IL로 실행된) 다른 프로세스 대한 접근에 상당한 제한이 있다.
이 포스트에서는 Low-IL로 실행된 어플리케이션에서 출력하는 OutputDebugString을 DbgView.exe를 통해 확인 하는 내용에 대해 다룬다.
실제 이러한 디버깅 케이스는 흔히 발생하는 케이스는 아니나, Low level로 실행되는 어플리케션을 개발한 경우 이를 디버깅하거나, 기 작성된 Low level로 실행되는 어플리케이션에 injection되어 동작하는 모듈을 디버깅하는 경우 유용할 수 있다.
Low level로 실행되는 어플리케이션의 예를 들자면,
n IE 8(보호모드)
n Adobe Reader X
n MS Office 2010(제한된 보기)
등을 들 수 있다.
Windows7에서 IE8을 실행 해 보면 아래와 같이, Medium-IL프로세스가 생성되고 그 프로세스의 자식으로 Low-IL프로세스가 생성된다.
IE를 통한 악성코드로부터 로컬 시스템을 보호화기 위한 조치로 생각되며(그래서 보호모드 라고 이름을 붙인듯), 자식으로 생성된 Low-IL프로세스는 대부분의 로컬 파일/폴더로의 접근이 제한된다. Low-IL로 실행된 경우에는 보는 것 처럼 Temp폴더 조차도 별도의 폴더로 설정되어 있음을 알수 있다.
[ Medium-IL]
BHO를 이용한 모듈이나 다른 방식으로 IE 8에 인젝션되어 동작하는 모듈을 개발했다고 생각해 보자.
이런한 경우, “일반적”인 방법으로는 해당 모듈에서 호출한 OutputDebugString의 출력을 DbgView를 통해 볼수 없다. 여기서 “일반적”이라 함은 DbgView.exe를 그냥 실행시킨(즉 Medium-IL) 경우를 의미한다.
그냥 파일 로그를 남기면 되지 않겠냐고? 그것 역시도 불가능 하다. Low-IL에서는 위에서 설명한 대로 대부분의 경로에 파일을 생성 할 수 없다. (위에서 살펴본 Temp폴더라면 파일 생성/쓰기가 가능하긴 하지만)
언젠가 웹서치를 하다가 DbgView가 공유메모리와 이벤트를 통해 OutputDebugString 출력을 디스플에이 한다고 본 기억이 있는데.....
DbgView가 Open하고 있는 객체들을 Process Exporer로 확인해 보면
DBWIN_BUFFER_READY, DBWIN_DATA_READY 등의 이벤트를 생성하고 있는 것을 볼 수 있다.
이를 통해 DbgView가 OutputDebugString()의 출력을 공유 메모리등에 Write한 후, 상기 이벤트를 설정해 DbgView창에 출력한다고 유추해 볼수 있겠다.
즉 “Low-IL로 실행된 프로세스(IE8보호모드)가 Medium-IL로 실행된 DbgView의 이벤트 및 리소스에 접근 할수 없어 출력되지 않음” 정도로 이해하면 될 것 같다.
그러면 어떻게 하면 Low-IL로 실행된 프로세스가 출력하는 디버깅 메시지를 확인 할 수 있을까?
위의 내용을 정확히 이해 했다면 방법은 간단하다.
DbgView를 Low-IL로 실행시키면 된다는 거다. 물론 DbgView가 Low-IL로 정상적으로 실행되어 준다면…
프로세스를 Low-IL로 실행시키는 것은 ProcessExplore를 이용하면 이 역시 어렵지 않다.
자 이제 모든 준비는 끝났다.디버깅 하면 된다.
아주 간단한 결론이지만, 이방법을 찾지 못해 디버깅한다고 별 삽질을 다했으니 포스팅할 만한 가치는 있지않나? 싶다.
'Windows Programming > 디버깅' 카테고리의 다른 글
Windbg case by case (0) | 2011.07.08 |
---|---|
[WinDbg] 조건부 브레이크 포인트 (1) | 2011.07.08 |
[WinDbg] Kernel 모드에서 특정 프로세스 디버깅하기 (0) | 2011.07.05 |
WOW64 디버깅 (0) | 2011.06.27 |
WinDbg 명령어 정리 (0) | 2011.06.21 |