겹치는 내용도 있고 그러지만 하나하나 다 읽어보면 Windows에서 사용자는 세션, 스테이션, 데스크톱이 뭘 의미하는지 알 수 있을 것이다. 그리고 이러한 내용을 알게되면 Windows에서 프로그래밍 하는데 있어서 많은 도움이 될 것이다. 지금까지 이러한 내용들이 나오면 지레겁을 먹고 스킵하기 일쑤였지만 근로자의 날을 맞아 경건한 마음으로 공부를 해보았다.
----------------------------------------------------------------------------------------------
Windows Internals에 적힌 간단한 설명들을 적어본다.
[Session]
프로세스와 단일 사용자 워크스테이션 로그인 세션을 나타내는 그 밖의 시스템 객체(예를 들어 윈도우 스테이션과 데스크톱, 윈도우)로 이뤄진다. 각 세션은 세션 전용의 GUI 데이터 구조체를 할당하기 위해 윈도우 서브시스템(Win32k.sys)의 커널모드 부분이 사용하는 세션 특정적인 페이지드 풀 영역을 가진다. 또한 각 세션은 윈도우 서브시스템 프로세스(Csrss.exe)와 로그온 프로세스(winlogon.exe)에 대한 자신만의 복사본을 가진다.
[Session space]
각 세션에 전역적인 정보를 포함하는 구성 요소, 모든 세션의 전역적인 데이터 구조체는 시스템 공간의 이 영역에 매핑된다. 프로세스가 생성될 때 주소 영역은 프로세스가 속한 세션에 알맞은 페이지로 매핑된다.
[Station]
윈도우 스테이션은 데스크톱을 포함하며 각 데스크톱은 윈도우를 포함한다. 단 하나의 윈도우 스테이션만이 콘솔에 보일 수 있으며 사용자 마우스와 키보드 입력을 받는다. 터미널 서비스 환경에서 각 세션마다 한 윈도우 스테이션이 보이지만 서비스는 콘솔 세션의 일부로서 실행한다.
[Desktop]
윈도우 스테이션 내에 포함된 객체. 데스크톱은 논리 디스플레이 화면을 가지며 윈도우와 메뉴, 훅을 포함한다.
----------------------------------------------------------------------------------------------
Application Hacking 에 적인 설명들을 적어본다.
OS 는 세션, 스테이션, 데스크톱 등의 커널 객체를 통해서 사용자의 작업 환경을 분리하고 있다. 세션에는 현재의 세션상에서 유일하게 사용자의 입출력을 처리할 수 있는 'Winsta0' 이라는 윈도우 스테이션이 존재하며 하위에 다음의 세 가지 데스크톱이 존재하게 된다.
WinSta0\Default 사용자의 작업이 수행되는 쉘 환경
WinSta0\Winlogon 로그인 화면에서 사용자의 아이디와 비밀번호를 묻는데 사용
WinSta0\Screen-Saver 화면 보호기가 실행되는 순간에 사용되는 데스크톱
시스템은 모든 로그인 세션에 대해서 위와 같이 세가지 데스크톱을 생성한다. 특히 Default, Winlogon 데스크톱은 세션이 생성되고 스테이션이 생성되면 항상 생성되는 기본 데스크톱들이다.
데스크톱은 윈도우 UI 와 밀접하게 관련되어 있는데 화면에 표시되는 윈도우들에 대한 논리적인 공간이며 사용자 인터페이스와 관련된 모든 오브젝트를 소유하고 있다. 그렇기 때문에 실제 다른 데스크톱이 소유하고 있는 윈도우나 메뉴, 훅 등에 접근할 수 없고 완전히 분리되어서 처리된다.
예를 들어 EnumWindows 함수는 현재 데스크톱 아래의 모든 윈도우 목록을 조사해서 콜백 함수로 넘겨주는 함수인데 이 함수를 써도 다른 데스크톱에 존재하는 윈도우들을 확인할 수 없고 메시지도 보낼 수 없다.
로그온 사용자의 세션에 연결되는 윈도우 스테이션인 'Winsta0' 만이 사용자와의 입출력을 처리할 수 있는데 데스크톱들은 기본적으로 이 스테이션에 연결되어 사용자의 입력을 받고 윈도우를 표시하게 된다. 스테이션에 사용자가 생성한 여러 개의 데스크톱이 존재하더라도 사용자의 입력을 받고 윈도우를 표시할 수 있는 활성화된 데스크톱은 하나만 존재하게 된다.
데스크톱이 따로 존재하기 때문에 Default 데스크톱에 있는 모든 윈도우에 대한 메시지 훅이 설치되었더라도 Winlogon 데스크톱의 로그인 화면에 대한 사용자 입력은 확인할 수 없게 된다. 윈도우즈 비스타 이상에선 관리자 권한이 필요한 경우 발생하는 UAC 화면도 별도의 보안 데스크톱에서 수행된다.
데스크톱 자체가 사용자의 입력과 화면을 격리된 상태에서 처리하기 때문에 보안상의 이점을 얻을 수 있지만 사용자의 입력을 가로채거나 가짜 윈도우를 이용한 어뷰징 방법이 워낙 많이 존재하기 때문에 데스크톱 자체는 완벽한 보안을 제공하지 못한다. 낮은 권한의 공격으로부터 최소한의 보안을 제공하는 장치라고만 생각해야 한다. 권한만 있다면 다른 데스크톱에 얼마든지 접근할 수 있다.
책을 보면 Default 데스크톱에서 Winlogon 데스크톱 상에 접근해 메시지 박스를 생성하는 방법이 나와있다. 소스코드를 여기에 쓰기엔 양이 너무 많으므로 사용되는 함수들만 나열한다.
OpenDesktop
SetThreadDesktop
MessageBox
CloseDesktop
윈도우 스테이션에서 생성하는 기본 데스크톱 이외에 사용자가 생성할 수 있는 데스크톱의 수에는 제한이 있다. 데스크톱 힙(Desktop Heap) 으로 불리는 리소스 저장 공간의 크기에 제한이 있기 때문이다. 생성할 수 있는 데스크톱 자체는 시스템의 리소스 상황에 따라서 다르다. 다음의 레지스트리 키에 설정된 문자열 중에서 'SharedSection' 항목에서 데스크톱에 사용할 힙의 크기 등을 변경할 수 있다.
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows
스테이션과 데스크톱은 사용자의 작업 환경을 분리하는데 있어서 윈도우를 표시하고 입출력을 담당하는 중요한 커널 객체이다. 이 스테이션과 데스크톱의 상위에 세션이 존재하게 된다. 윈도우즈 서버 제품과 개인용 윈도우즈 시스템의 가장 큰 차이점은 다중 사용자 처리를 위한 멀티 세션의 지원 유무이다. 터미널 서비스라고 불리는 다중 사용자 작업 환경의 핵심은 세션에 있다. 터미널 서비스의 경우 로그온 사용자의 세션별로 윈도우 스테이션이 연결되어 각각의 입출력을 처리하게 된다. 원격 데스크톱 연결(RDP)과 윈도우즈 XP에서 등장한 빠른 사용자 전환 (Fast User Switching) 등이 이 기술을 이용해서 구현되어 있다. 빠른 사용자 전환의 경우 로그인 사용자 별로 세션을 유지한 상태에서 실제 동시에 작업 가능한 사용자는 한 명으로 제한한 축소된 터미널 서비스 환경으로 보면 된다.
세션은 로그인한 사용자 별로 새로운 세션이 할당된다. 사용자가 로그인하면 세션 매니저 프로세스인 smss.exe 등을 통해서 세션이 생성되고 winlogon.exe를 통해서 로그인 작업이 수행된다. 마지막 단계로 사용자의 작업 환경을 제공하는 쉘 프로세스인 explorer.exe와 레지스트리에 등록된 시작 프로그램들을 실행하면서 로그인 과정이 완료된다.
시작 프로그램을 설정하는 레지스트리는 다음과 같다.
HKLM\SOFTWARE\Microsoft\windows\CurrentVersion\Run
세션은 하나의 작업 공간으로 사용자가 다른 세션에 영향을 주지 않고 작업을 수행하도록 설계되어 있다. 커널 객체는 기본적으로 세션 단위로 접근이 제한되어 있으며 커널 객체를 생성할 때에 세션의 접근 범위를 지정해야 한다.
서비스 프로세스의 경우 사용자와 상호 작용을 수행하지 않기 때문에 사용자 입출력을 처리할 수 있는 기본 윈도우 스테이션이 아닌 독자적인 스테이션을 가지게 된다. Windows XP 에서는 첫 번째 로그인한 사용자의 경우 서비스 프로세스와 동일한 0번 세션을 할당 받기 때문에 서비스 프로세스도 해당 세션에 윈도우를 생성할 수 있다.
서비스 프로세스가 윈도우를 생성하게 되면 0번 세션을 가지는 사용자의 화면으로만 제약적으로 윈도우를 표시하게 된다. 윈도우즈 비스타의 경우는 서비스 프로세스는 계속해서 0번 세션으로 생성되지만 사용자는 1번 세션부터 할당 받도록 설계가 변경되었기 때문에 아예 윈도우를 생성할 수 없게 되었다. 만약 로그인한 다중 사용자의 각 화면에 윈도우를 표시하려면 각각의 세션에 프로세스를 생성해서 해당되는 데스크톱에 윈도우를 생성하도록 처리해야 한다. 이렇게 다른 세션에 프로세스를 생성하고 윈도우를 표시하는 것은 쉬운 작업이 아니다. 하지만 다른 세션에서 실행중인 프로세스의 토큰을 사용하면 쉽게 처리할 수 있다.
책에서 로그인한 사용자의 아이디를 입력 받아서 해당 사용자와 동일한 세션에 프로세스를 생성하도록 하는 예제 코드가 있지만 이 또한 양이 많아 적진 않겠다.
----------------------------------------------------------------------------------------------
인터넷에서 찾은 링크들
http://poorduck.tistory.com/30
http://blog.naver.com/PostView.nhn?blogId=rudalson&logNo=100106183681
위 링크의 글들이 사라질 경우
언제나 헷갈리는 Session, Station, Desktop.pdf
윈도우즈의 세션, 윈도우 스테이션, 데스크탑에 대해 자세히 알아보기.pdf
Session, Window Station과 Desktop.pdf
------------------------------------------------------------------------------------------------
Windows에서 같은 계정으로 Host에서 본 프로세스 목록과 RDP로 원격접속 후 본 프로세스 목록 차이점
같은 부분은 삭제하고 다른 부분만 나타내보았다.
Host
이미지 이름 PID 세션 이름 세션# 메모리 사용
========================= ======== ================ =========== ============
smss.exe 416 Services 0 1,216 K
csrss.exe 800 Console 1 57,668 K
services.exe 848 Services 0 11,392 K
winlogon.exe 888 Console 1 8,784 K
lsass.exe 900 Services 0 13,744 K
lsm.exe 908 Services 0 7,380 K
svchost.exe 328 Services 0 10,604 K
nvvsvc.exe 696 Services 0 8,180 K
nvxdsync.exe 1620 Console 1 22,992 K
nvvsvc.exe 1632 Console 1 17,372 K
taskhost.exe 3528 Console 1 13,696 K
dwm.exe 3720 Console 1 52,392 K
explorer.exe 4104 Console 1 94,348 K
ImageSAFERStart_X86.exe 4112 Console 1 5,524 K
ImageSAFERStart_X64.exe 4328 Console 1 5,852 K
RAVCpl64.exe 4944 Console 1 14,520 K
BleServicesCtrl.exe 5096 Console 1 11,708 K
rundll32.exe 5104 Console 1 15,772 K
TSVNCache.exe 4168 Console 1 19,068 K
ETDCtrl.exe 4256 Console 1 20,976 K
rundll32.exe 1748 Console 1 10,940 K
igfxtray.exe 4588 Console 1 11,868 K
hkcmd.exe 4276 Console 1 11,544 K
igfxpers.exe 4952 Console 1 12,628 K
MyPeople.exe 5220 Console 1 119,408 K
nvtray.exe 5228 Console 1 16,644 K
sidebar.exe 5312 Console 1 37,384 K
CrazyRemote.exe 5544 Console 1 20,840 K
ETDCtrlHelper.exe 5552 Console 1 12,084 K
AirVideoServer.exe 5708 Console 1 42,008 K
iusb3mon.exe 5860 Console 1 9,828 K
GBOSDV2.exe 5892 Console 1 15,872 K
unsecapp.exe 5936 Console 1 8,856 K
THXAudio.exe 5948 Console 1 22,056 K
NDrive.exe 5992 Console 1 30,760 K
AvastUI.exe 6060 Console 1 18,724 K
acrotray.exe 5368 Console 1 8,348 K
iTunesHelper.exe 4572 Console 1 16,476 K
vmware-tray.exe 5844 Console 1 17,452 K
jusched.exe 5420 Console 1 13,092 K
NDSync.exe 6756 Console 1 21,196 K
btplayerctrl.exe 6972 Console 1 6,248 K
IAStorIcon.exe 2052 Console 1 29,644 K
iexplore.exe 6368 Console 1 33,976 K
iexplore.exe 6820 Console 1 143,040 K
atbsvc.exe 1204 Console 1 20,024 K
uTorrent.exe 8040 Console 1 36,384 K
vmware.exe 8020 Console 1 94,052 K
vmware-unity-helper.exe 7756 Console 1 18,024 K
vmware-vmx.exe 4736 Console 1 1,247,116 K
Melon.exe 4784 Console 1 82,520 K
p3melonasvr2.exe 7404 Console 1 16,128 K
vmware-vmx.exe 8972 Console 1 700,504 K
iexplore.exe 4904 Console 1 87,056 K
chrome.exe 2776 Console 1 142,008 K
chrome.exe 3924 Console 1 149,372 K
chrome.exe 8408 Console 1 98,664 K
chrome.exe 7360 Console 1 53,416 K
chrome.exe 7688 Console 1 73,752 K
chrome.exe 9176 Console 1 73,536 K
chrome.exe 9288 Console 1 104,040 K
svchost.exe 10196 Services 0 3,148 K
SearchProtocolHost.exe 2284 Services 0 9,048 K
cmd.exe 10148 Console 1 4,048 K
conhost.exe 7872 Console 1 11,260 K
SearchFilterHost.exe 2172 Services 0 6,644 K
tasklist.exe 4872 Console 1 6,492 K
'My Study > Programming&Theory' 카테고리의 다른 글
ERROR C4996 (8) | 2013.05.23 |
---|---|
Bug Check 0x9A : SYSTEM_LICENSE_VIOLATION (2) | 2013.05.04 |
Windows 7 PID는 어디서 결정되는가? (1) | 2013.03.17 |
C언어 처음 본 연산자? (10) | 2013.03.15 |
윈도우 드라이버 로드 시 에러 (2) | 2013.03.15 |