본문 바로가기

My Study/Programming&Theory

Windows Session, Station, Desktop

겹치는 내용도 있고 그러지만 하나하나 다 읽어보면 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://www.benjaminlog.com/entry/Understanding-Windows-at-a-deeper-level-Sessions-Window-Stations-and-Desktops


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


Remote
이미지 이름                    PID 세션 이름              세션#  메모리 사용
========================= ======== ================ =========== ============
smss.exe                       416 Services                   0      1,236 K
csrss.exe                      800 RDP-Tcp#0                  1     18,644 K
services.exe                   848 Services                   0     11,416 K
winlogon.exe                   888 RDP-Tcp#0                  1      9,048 K
lsass.exe                      900 Services                   0     13,716 K
lsm.exe                        908 Services                   0      7,624 K
svchost.exe                    328 Services                   0     10,660 K
nvvsvc.exe                     696 Services                   0      8,656 K
nvxdsync.exe                  1620 RDP-Tcp#0                  1     22,716 K
nvvsvc.exe                    1632 RDP-Tcp#0                  1     16,848 K
taskhost.exe                  3528 RDP-Tcp#0                  1     13,492 K
dwm.exe                       3720 RDP-Tcp#0                  1      5,856 K
explorer.exe                  4104 RDP-Tcp#0                  1     90,868 K
ImageSAFERStart_X86.exe       4112 RDP-Tcp#0                  1      5,524 K
ImageSAFERStart_X64.exe       4328 RDP-Tcp#0                  1      5,852 K
RAVCpl64.exe                  4944 RDP-Tcp#0                  1     14,332 K
BleServicesCtrl.exe           5096 RDP-Tcp#0                  1     11,500 K
rundll32.exe                  5104 RDP-Tcp#0                  1     15,496 K
TSVNCache.exe                 4168 RDP-Tcp#0                  1     18,872 K
ETDCtrl.exe                   4256 RDP-Tcp#0                  1     20,628 K
rundll32.exe                  1748 RDP-Tcp#0                  1     10,760 K
igfxtray.exe                  4588 RDP-Tcp#0                  1     11,708 K
hkcmd.exe                     4276 RDP-Tcp#0                  1     11,348 K
igfxpers.exe                  4952 RDP-Tcp#0                  1     12,444 K
MyPeople.exe                  5220 RDP-Tcp#0                  1    119,108 K
nvtray.exe                    5228 RDP-Tcp#0                  1     16,644 K
sidebar.exe                   5312 RDP-Tcp#0                  1     36,920 K
CrazyRemote.exe               5544 RDP-Tcp#0                  1     20,668 K
ETDCtrlHelper.exe             5552 RDP-Tcp#0                  1     11,896 K
AirVideoServer.exe            5708 RDP-Tcp#0                  1     41,776 K
iusb3mon.exe                  5860 RDP-Tcp#0                  1      9,632 K
GBOSDV2.exe                   5892 RDP-Tcp#0                  1     15,524 K
unsecapp.exe                  5936 RDP-Tcp#0                  1      8,872 K
THXAudio.exe                  5948 RDP-Tcp#0                  1     21,868 K
NDrive.exe                    5992 RDP-Tcp#0                  1     30,172 K
AvastUI.exe                   6060 RDP-Tcp#0                  1     18,532 K
acrotray.exe                  5368 RDP-Tcp#0                  1      8,164 K
iTunesHelper.exe              4572 RDP-Tcp#0                  1     16,340 K
vmware-tray.exe               5844 RDP-Tcp#0                  1     17,256 K
jusched.exe                   5420 RDP-Tcp#0                  1     13,044 K
NDSync.exe                    6756 RDP-Tcp#0                  1     20,860 K
btplayerctrl.exe              6972 RDP-Tcp#0                  1      6,248 K
IAStorIcon.exe                2052 RDP-Tcp#0                  1     29,508 K
iexplore.exe                  6368 RDP-Tcp#0                  1     33,536 K
iexplore.exe                  6820 RDP-Tcp#0                  1    142,436 K
atbsvc.exe                    1204 RDP-Tcp#0                  1     19,812 K
uTorrent.exe                  8040 RDP-Tcp#0                  1     34,644 K
vmware.exe                    8020 RDP-Tcp#0                  1     93,444 K
vmware-unity-helper.exe       7756 RDP-Tcp#0                  1     17,608 K
vmware-vmx.exe                4736 RDP-Tcp#0                  1  1,246,940 K
Melon.exe                     4784 RDP-Tcp#0                  1     82,216 K
p3melonasvr2.exe              7404 RDP-Tcp#0                  1     15,900 K
vmware-vmx.exe                8972 RDP-Tcp#0                  1    700,360 K
iexplore.exe                  4904 RDP-Tcp#0                  1     86,108 K
chrome.exe                    2776 RDP-Tcp#0                  1    147,224 K
chrome.exe                    3924 RDP-Tcp#0                  1    152,536 K
chrome.exe                    8408 RDP-Tcp#0                  1     98,580 K
chrome.exe                    7360 RDP-Tcp#0                  1     53,416 K
chrome.exe                    7688 RDP-Tcp#0                  1     73,752 K
chrome.exe                    9176 RDP-Tcp#0                  1     73,536 K
chrome.exe                    9288 RDP-Tcp#0                  1    106,400 K
cmd.exe                      10148 RDP-Tcp#0                  1      4,048 K
conhost.exe                   7872 RDP-Tcp#0                  1     11,664 K
SearchFilterHost.exe          2172 Services                   0      7,556 K
csrss.exe                     9864 Console                    3     20,824 K
winlogon.exe                  7452 Console                    3      7,636 K
LogonUI.exe                   9616 Console                    3     23,440 K
nvvsvc.exe                    8840 Console                    3     12,696 K
nvxdsync.exe                  9440 Console                    3     16,712 K
rdpclip.exe                   8456 RDP-Tcp#0                  1      7,648 K
svchost.exe                   9708 Services                   0      3,012 K
SearchProtocolHost.exe        2968 Services                   0      8,864 K
tasklist.exe                 10024 RDP-Tcp#0                  1      6,388 K

차이점을 보면 대부분 프로세스의 세션 이름들이 Console에서 RDP-Tcp#0 으로 바뀌었다는 것과 csrss.exe, winlogon.exe 등 다른 세션 ID를 갖는 프로세스가 생겼다는 것이다. 이러한 다른 부분들을 이용해 현재 작업이 host에서 이루어지고 있는지 원격에서 이루어지고 있는지 구별할 수 있게 된다.

'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