윈도우 비스타에서는 UAC(사용자 계정 관리)를 사용합니다.

XP이전의 운영체제에서는 대부분의 응용프로그램이 관리자 권한으로 수행된다고 가정하고 설계되었습니다. 따라서 개인 PC의 사용자들은 대부분 관리자 권한의 계정을 만들어 사용하게 됩니다.

레지스트리에 접근하거나, 프로그램 폴더, 시스템 폴더, 드라이버, 설정등에 바로 접근 가능한 권한으로 로그인하여 PC를 사용합니다.

하지만 관리자 권한으로 프로그램을 수행하게 됨으로서 실행되는 프로그램 또한 PC의 모든 권한을 가지게 됩니다. 따라서 악의 적인 프로그램에 의해 시스템이 손상될 가능성이 높아지게됩니다.

그렇다고 권한이 낮은 계정으로 사용하려면 매우 불편합니다.. 만약 시간은 바꾼다던지, 드라이버를 설치한다던지, 프로그램을 설치할때마다, Administrator계정으로 로그인하여 다시 수행해야 합니다.

응용프로그램 중 단순히 프로그램 수행에도 Administrator계정을 필요로 하는 경우도 많습니다.

비스타에서는 이러한 문제를 해결하기 위해서 UAC를 사용하여, 관리자 권한이 필요로 하는 경우만 관리자 모드로 해당 프로그램을 권한 상승시키는 방법을 사용하게 됩니다.

사용자 삽입 이미지

비스타의 경우 심지어 Administrators 그룹에 속해 있는 사용자도 관리자 모드를 필요로하는 프로그램을 실행할때, 권한 상승을 하고 수행 할지? 취소할지? 물어봅니다.

사용자 삽입 이미지

그럼 프로그램이 수행될때 이 프로그램이 어떤권한을 필요로 하는 프로그램인 어떻게 알고, 위와 같이 권한 상승을 요구하게되는 것일까?

manifest에 내용에 따라 결정이된다. 또는 이 파일이 resource로 실행 파일 내부에 링크 되어 포함 될 수도 있다.

만약 Vista이전에 나온 프로그램이라면 대부분 이러한 정보가 포함되어 있지 않게 된다.

그런데 설치 프로그램일 경우 관리자 모드를 필요로 하게된다.

이 때는 아래와 같은 내용에 의해 설치 프로그램 여부를 판단하게 된다.


Installer Detection only applies to:

  1. 32 bit executables
  2. Applications without a requestedExecutionLevel
  3. Interactive processes running as a Standard User with UAC enabled


Before a 32 bit process is created, the following attributes are checked to determine whether it is an installer:

  • Filename includes keywords such as "install," "setup," and "update."
  • Keywords in the following Versioning Resource fields: Vendor, Company Name, Product Name, File Description, Original Filename, Internal Name, and Export Name.
  • Keywords in the side-by-side application manifest embedded in the executable.
  • Keywords in specific StringTable entries linked in the executable.
  • Key attributes in the resource file data linked in the executable.
  • Targeted sequences of bytes within the executable.


비스타가 설치 프로그램이라 판단하게 되면, 해당 프로그램을 권한 상승후 수행하게 된다.

 

User Interface Privilege Isolation(UIPI)
관리자 권한으로 수행되는 프로그램과 낮은 권한으로 수행되는 프로그램간의 관계도 제한 받게 된다.


A lower privilege process cannot:

  • Perform a window handle validation of higher process privilege.
  • SendMessage or PostMessage to higher privilege application windows. These Application Programming Interfaces (APIs) return success but silently drop the window message.
  • Use thread hooks to attach to a higher privilege process.
  • Use Journal hooks to monitor a higher privilege process.
  • Perform DLL injection to a higher privilege process.


With UIPI enabled, the following shared USER resources are still shared between processes at different privilege levels:

  • Desktop window, which actually owns the screen surface.
  • Desktop heap read-only shared memory.
  • Global atom table.
  • Clipboard

위 내용 때문에 요즘 만들고 있는 멜론 스나이퍼가 비스타에서는 전혀 작동하지 않았다.


자신이 만든 프로그램이 권한 상승이 필요할 경우 아래와 같은 작업을 해줘야 한다.


우선 아래와 같은 manifest파일을 작성한다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <!-- Identify the application security requirements.-->
  <ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
    <ms_asmv2:security>
      <ms_asmv2:requestedPrivileges>
        <!-- 실행 수준에는 세 가지(asInvoker, highestAvailable, requireAdministrator)가 있습니다. -->
        <ms_asmv2:requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </ms_asmv2:requestedPrivileges>
       </ms_asmv2:security>
  </ms_asmv2:trustInfo>
</assembly>


"asInvoker"의 경우 이 프로세스를 생성한 상위 프로세스를 상속 받게 됩니다.
"requireAdministrator" 관리자 권한을 프로세스 생성시 요구 하게 됩니다.
"highestAvailable" 사용자와 연결된 프로세스들이 가진 권한중 가장 높은 권한을 요구 하게 됩니다.

파일이름 실행 프로그램 이름에 확장자를 추가로 manifest로 붙혀 준다. 만약 test.exe가 실행 파일이라면 test.exe.manifest로 저장한다. 저장 위치는 수행 프로그램이 위차한 같은 폴더여야 한다.

권한상승의 경우 DLL의 경우는 해당사항 없고 EXE실행 파일의 경우만 해당된다.

위 같은 작업을 해주고 프로그램을 수행하면 권한 상승을 요구하고 수행되게 된다.




실행 프로그램에 이 manifest파일을 포함하고 싶다면, 리소스 파일과 같은 위치에 해당 manifest파일을 놓아 두고..

리소스 파일 (.rc)파일 열어서 아래 와 같이 추가한다.

#define MANIFEST_RESOURCE_ID 1
MANIFEST_RESOURCE_ID RT_MANIFEST "test.exe.manifest"


해당 파일에 manifest파일이 포함되고 수행시 관리자 모드로 권한 상승을 요구 하게 됩니다.

참조 페이지
http://msdn2.microsoft.com/en-us/library/ms766454.aspx
http://msdn2.microsoft.com/en-us/library/aa905330.aspx
http://msdn.microsoft.com/msdnmag/issues/07/01/UAC/default.aspx?loc=ko
신고


티스토리 툴바