- 참치군
- ?
- stalk.io
- :: 2013년, 스리는 여섯살
- 웹 강좌
- 점프 투 파이썬
- 요니나의 대학생 재테크
- This is CS50
- 애자일 이야기
- isao의 IT,게임번역소
- 소프트웨어 이야기
- Color Scripter
- 어디를 가든지 마음을 다해 가라
- VisuAlgo
- 서울대 평생교육원
- 몽환
- RegExr: Learn, Build, & Test R…
- Hello, Stranger :D
- I Like Exploit
- Z3alous Security Story
- Project Euler
- Blog
- pieces of code
- window 쪼물딱 거리기
- IT - Informatics Alphabet
- rop
- 국제 정보교육센터 I2sec 대구 1기
- This is the moment. :)
- blackmoon
- z3alous는 세상에 소리 z3alous~
- Acord
- FORENSIC-PROOF
- 어셈블리
- Outsider's Dev Story
- Open Tutorials
- 코드라이언
- 컴퓨터 그래픽스와 3D 프린팅
- HACKABILITY
- Lee, Jae-Hong
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Packet
- Visual Studio
- 소켓
- 베이스
- Calling Convention
- Wireshark
- 호출규약
- 파이썬
- 염색
- 공간복잡도
- 피보나치
- Debug
- 탈색
- 펌
- Hello World
- 창의공학설계
- 발표
- 버퍼오버플로우
- 동대구
- 추상데이터타입
- ubuntu
- 블루블랙
- BOF
- 컴파일러
- 디버깅
- 시간복잡도
- C언어
- 오지총
- 레지스터
- 알고리즘
- Today
- Total
c0smicb0y
Child Process를 디버깅하는 방법 본문
환경: Windows 10 Pro 64bit
1. 문제
Windows 10 64bit 환경에서 작성한 간단한 디버거로 calc.exe가 제대로 디버깅 되지 않는 사태가 발생하였다.
EXIT_PROCESS_DEBUG_EVENT 이후 아무런 이벤트가 발생하지 않는다.
멘토님이 UWP(Universal Windows Platform)이라서 calc.exe를 실행시키면 calc.exe에서 유니버셜 앱인 Calculator.exe를 실행시켜주는 것이라고 하셨다.
그래서 단지 자식프로세스를 디버깅하는 방법을 찾으면 디버깅이 가능할 것 같아서 구글링을 해보았다.
MSDN에서는 CreateProcess를 할때 주는 인자 중 하나인 Process Creation Flag에 다음과 같이 명시되어 있다.
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms684863(v=vs.85).aspx
새로운 프로세스에 의해 만들어지는 새로운 프로세스와 모든 자식프로세스에 대해 Calling thread가 시작되고 디버깅한다.
즉, Process Creation Flag에 DEBUG_PROCESS를 인자로 주면 자식프로세스에 대해서도 디버깅이 될 것이다.
그래서 기존의 코드에서 프로세스를 생성하는 부분을 다음과 같이 해주었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; wchar_t* target = L"c:\\windows\\system32\\calc.exe"; if (TRUE != CreateProcessW( target, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | DEBUG_PROCESS, //자식프로세스도 디버깅가능 NULL, NULL, &si, &pi)) { log("CreateProcess() failed. gle = %u", GetLastError()); return -1; } | cs |
이제 Calculator.exe까지 디버깅이 잘 되어야 할 것이다.
하지만 결과는 똑같이 아무 디버그 이벤트도 발생하지 않았다.
혹시나 해서 따로 자식프로세스를 실행시키는 프로그램을 작성하여 디버거를 붙여보았는데, 자식프로세스까지 디버깅이 잘 되었다.
왜 calc.exe는 자식프로세스까지 디버깅이 되지 않는 것일까?
실행 루틴을 좀 더 자세히 살펴보기 위해 windbg를 이용하여 디버깅해보았다.
현재 pid는 0x908(==2312)이다. 그리고 아랫창에서 보이는 call ntdll!ZwContinue 이후 Calculator.exe가 실행된다.
하지만 Calculator.exe의 pid는 9692이고, windbg애서도 자식프로세스에 잡히지 않았다.
UWP가 실행하는 루틴이 일반적인 자식프로세스를 생성하는 루틴과 다른 것 같은 느낌이 들어서 UWP에 대해 더 알아보았다.
2. UWP(Universal Windows Platform)
MSDN에서는 UWP를 기반으로 만들어진 유니버셜 Windows 앱을 다음과 같이 설명하고 있다.
https://msdn.microsoft.com/ko-kr/library/windows/apps/dn726767.aspx
유니버설 Windows 앱은 Windows 8에서 Windows 런타임으로 처음 도입된 UWP(유니버설 Windows 플랫폼)를 기반으로 하는 Windows 환경입니다. 유니버설 Windows 앱의 핵심은 사용자가 자신의 모든 장치에서 모바일 환경을 원하고 작업에 가장 편리하거나 생산적인 장치를 사용하기를 원한다는 개념입니다.
그리고 유니버셜 Windows 앱의 특징으로 다음과 같이 설명하고 있다.
- .AppX 패키지 형식을 사용하여 앱이 패키지되고 배포됩니다.
모든 유니버설 Windows 앱은 AppX 패키지로 배포됩니다. 이는 신뢰할 수 있는 설치 메커니즘을 제공하며 앱을 원활하게 배포 및 업데이트할 수 있도록 해줍니다.
- 장치 패밀리 간의 공통 API 표면이 있습니다.
UWP(유니버설 Windows 플랫폼) 핵심 API가 모든 Windows 장치 패밀리에 대해 동일합니다. 앱에서 핵심 API만 사용하는 경우 이 앱은 모든 Windows 10 장치에서 실행됩니다.
iOS나 Android에서 말하는 유니버셜 앱과 비슷한 개념을 Windows에 도입하였다는 뉘앙스였다.
그리고 MSDN을 조금 더 찾아보다가 다음과 같은 글을 발견하였다.
https://msdn.microsoft.com/ko-kr/library/windows/apps/hh465029.aspx
유니버셜 앱이 다른 모바일 앱들이 차용하고 있는 샌드박스와 같은 개념을 적용시키고 있는 듯 하다.
다음 기사에서도 동일한 내용을 발견하였다.
http://www.tomsitpro.com/articles/windows-10-app-development-appx,1-2566.html
AppX 포맷의 가장 중요한 측면은 앱들이 호스트 머신으로부터 고립될 것이라는 것이다. 이것은 UWP 앱들이 커널이나 시스템 드라이버에 더 이상 접근할 수 없다는 것을 의미한다. 앱들은 이제 컨테이너화 되었다.
그래서 계산기를 실행시킨 뒤, 작업관리자에서 파일위치열기를 통해 직접 Calculator.exe를 실행시켜보았다.
같은 폴더에 있는 다른 윈도우 앱들도 모두 이런 메시지가 뜨면서 직접적으로 실행이 되지 않았다.
추측하건데 calc.exe를 실행하면 앱 컨테이너의 컨텍스트를 생성시키고 Calculator.exe를 실행시켜준 뒤, calc.exe는 종료되는 듯하다. 여기서 Calculator.exe를 실행시키는 과정에서 일반적인 Createprocess와 다른 루틴을 통해 프로세스를 실행시키므로 디버그 이벤트가 발생하지 않아서 디버깅이 되지 않는 듯하다. 기존의 디버깅 API에 정의되어 있는 이벤트에서 벗어나는 이벤트가 발생할 것이다.
3. 결론
열심히 삽질하고 UWP 구조에 대해 미비하게 깨달았다. 그리고 Process Creation Flag에 DEBUG_PROCESS를 넣으면 다른 프로그램들은 잘 디버깅 됩니다! calc.exe가 조금 특별한 실행파일이네요.
'프로그래밍 > Windows' 카테고리의 다른 글
VC 컴파일러 환경 변수 설정 (0) | 2015.11.13 |
---|---|
함수에서의 레지스터 사용 (0) | 2015.11.04 |
Calling Convention (호출규약) (0) | 2015.11.04 |
ShellExecute vs CreateProcess (0) | 2015.10.02 |