Media Log


Portable Executable Structure이미지 출처 https://code.google.com/p/corkami/wiki/PE101

엄청나게 잘 정리된 그림을 발견했다. 아름답지 아니한가.

저작자 표시 비영리 동일 조건 변경 허락
신고

submit
SysInternals의 대부분의 유틸리티들은 하나의 실행파일로 배포된다.

프로세스 모니터 같은 도구는 시스템 내에서 일어나는 모든 I/O등을 잡아채서 보여주는데 이 역시 EXE 파일 하나로 배포된다. 그렇다면 마크 러시노비치가 이것들을 유저모드 애플리케이션에서 구현했다는 말인가? 아니, 심지어 이런 것들을 유저모드에서 구현할 수나 있는 것일까?
물론 그렇지는 않다. 프로세스 모니터는 파일 시스템 레이어 상위에 장착되는 필터 드라이버와 응용 프로그램으로 구성되어져 있다. 아마도 필터 드라이버가 열심히 I/O를 엿본 다음에 그 정보를 잘 정리해서 응용 프로그램에게 전달한 뒤 응용 프로그램이 GUI로 출력하도록 구현되어져 있을 것이다.

그렇다면 프로세스 모니터의 드라이버 이미지는 어디에 숨어있는 것일까?
드라이버는 바로 EXE 파일 내의 리소스에 있다.


응용 프로그램 내에 커스텀 리소스를 하나 만들어서 그 곳에 바이너리 파일을(여기서는 프로세스 모니터 드라이버 이미지) 쑤셔 넣어둔다.
응용 프로그램이 처음 실행되면 FindResource, LoadResource, LockResource, SizeofResource 함수들을 사용해서 이 리소스를 읽어 오고 CreateFile과 WriteFile 같은 함수를 통해서 새로운 파일을(바로 그 프로세스 모니터 드라이버) 디스크 상에 만들어낸다.
이런 식으로 말이다.
HRSRC h = FindResourceW(0, MAKEINTRESOURCEW(IDR_BIN), L"BIN");
HANDLE hRes = LoadResource(0, h);
CONST CHAR* p = (CONST CHAR*)LockResource(hRes);
HANDLE hFile = CreateFileW(L"D:\\bin", GENERIC_ALL, 0, 0, CREATE_ALWAYS, 0, 0);
DWORD cb = SizeofResource(0, h);
DWORD dw;
WriteFile(hFile, p, cb, &dw, 0);
UnlockResource(hRes);
너무 간단하지 않은가?

이제 드라이버 파일이 생겼으므로 응용 프로그램 코드에서는 CreateServiceStartService 함수들을 통해서 드라이버를 설치하고 구동시킬 수 있다.
응용 프로그램이 종료 될 때는 물론 드라이버를 잘 멈추고 제거하고 파일을 지워버리는 등의 작업 또한 해주어야 할 것이다.

저작자 표시 비영리 동일 조건 변경 허락
신고
  1. 관우 at 2011.01.05 23:15 신고 [edit/del]

    너무 궁금했는데 이렇게 간단할 줄은 몰랐네요. ㅎㅎ 잘 배워 갑니다.

    Reply

submit
Windows 시스템 실행파일의 구조와 원리 - 9점
이호동 지음/한빛미디어

이 책은 PE(Portable Executable)라고도 불리우는 윈도우즈 실행 파일의 내부 구조에 대해서 다룬다.
EXE, DLL, OCX, SYS, DRV 확장자들로 된 파일들이 모두 PE파일이다.

이런 PE 파일들이 실행되는 순간에 메모리에 어떻게 매핑되고 그 자료구조는 어떻게 구성되는지가 바로 이 책이 다루는 내용이다.

이 책을 읽기 전에 제프리리처의 Windows Via C/C++

13장 윈도우 메모리의 구조
14장 가상 메모리 살펴보기
17장 메모리 맵 파일
19장 DLL의 기본
20장 DLL의 고급 기법

위 장들을 읽어보는 것이 이 책을 이해하는데 많은 도움을 줄 것이다.

나는 처음에는 헥사코드를 하나씩 따라가면서 정독해서 읽었는데, 관련 구조체들이 다 비슷비슷 하게 구성되어 있어서 중간쯤 부터는 그런 부분들을 제껴가면서 조금 더 편하게 읽을 수 있었다.

개인적으로 DLL의 깊숙한 부분에 대해서 많은 것을 얻을 수 있어서 좋았고, 또 리소스에 대해서는 거의 아는 것이 없었는데, 이 부분을 많이 다루어 주어서 특히 좋았다.

이 책의 단점을 꼽자면, 그림이나 코드들이 보기에 너무 조잡하다는 것이다.
또한 느낌표나 말줄임표를 잔뜩 붙여놓은 문장들이 곳곳에서 보이는데, 이는 잘 정제되지 못한 글의 느낌을 받게 한다. 마치 인터넷에 써서 올렸던 글을 추려서 책으로 낸듯이 말이다.
저자는 프로그래머이지 글쟁이가 아니므로 이런 것들은 출판사에서 신경을 써준다면 좋을 것이다.

이 책과 비슷한 경우로 김상형의 Windows API 정복이라는 명서가 있는데, 나는 이 책을 국내에서 출판된 가장 잘 쓰여진 프로그래밍 책이라고 생각하지만, 책 안의 그림들은 저자의 깔끔한 글솜씨에 비해 조잡하게 느껴진다.
이 책은 가남사에서 출판되었다가 한빛미디어에서 개정되었는데, 그림들이나 표는 아마도 그대로 옮긴 것 같다.

저자가 그린 그림을 출판사에 제출하면 편집없이 그대로 실는 것 같은 느낌인데, 만약 정말 그러고 있다면 출판사에서 좀 더 다듬어서 주기를 바란다.
오라일리 같은 출판사에서 발행하는 책들은 그림이나 표가 참 보기 좋게 그려져있다. 그 책을 쓰는 저자들이 모두 미술에까지 일가견이 있어서 그런 것은 분명 아닐 것이다.

다음은 내가 출판사에 바라는 점들이다.
1. 모든 코드 조각은 회색 박스로 둘러싼다.
2. 코드 폰트는 고정폭 폰트를(기왕이면 프로그래머가 많이 쓰는) 사용한다.
3. 지저분한 그림이나 표는 예쁘게 다시 그린다.

쓰다보니 단점의 내용이 길어져 버렸는데, 이 것은 이 책만이 아니라 국내에서 출판되는 모든 프로그래밍 서적에 대한 내용이다.

이런 자잘한 단점을 제외하면 이 책은 읽을만한 가치가 있는 아주 훌륭한 책이다.
이런 지식을 얻기위해서, Matt Pietrek이 쓴 다음과 같은 글 들을 눈이 빠지게 읽어야 하는데
보기만해도 질려버린다.




이미 이 책의 저자가 이 문서들을 잘 읽어본 후에 우리들에게 한글로 쉽게 설명해주고 있으니 그저 고마울 뿐이다.

이 책이 개정판이 또 나올 것 같지는 않지만 혹시 개정된다면, 위에서 말한 부분들의 교정과 함께 64bit PE나 Managed PE에 대해서도 살짝 다루어주면 좋겠다.

신고

submit