Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

실행 파일로부터 관리자 요구 권한을 제거하는 방법(부제: 크랙 버전을 보다 안전하게 실행하는 방법)

쉽게 말해서... 불나방처럼 멋모르고 불에 뛰어드는 컴퓨터 사용자들을 종종 보곤 합니다. 물론... 뭐랄까, 어쩔 수 없는 경우도 있겠지요. 가령, 학생의 신분으로 공부는 하고 싶은데 정품을 구매하자니 너무 비싼 경우가 있을 것입니다.

... 이 글을 쓰기 전에 고민이 많이 되었는데요. 제가 이런 글을 쓰지 않는다고 해서 그 분들이 크랙(crack)같은 프로그램을 실행하지 않을 것도 아니고, 그래서 그나마 불에 데이는 것은 막아야 하지 않을까 싶어서 써봅니다.

그래요. 인터넷 상에서 널리 퍼져 있는 각종 소프트웨어의 크랙 버전에 대해서 이야기를 해보겠습니다.

크랙 버전은 원본 소프트웨어 개발자가 배포하는 것이 아니기 때문에 그 안에 어떤 악의적인 코드가 들어있을지 알 수 없습니다. 크랙 자체가 이미 내부의 코드를 변경하는 것이기 때문에 공식적으로 배포되는 해시값을 확인하는 것도 아무런 의미가 없지요.

그렇기 때문에 크랙 버전을 여러분의 컴퓨터에서 실행한다는 것은 바이러스를 비롯해 각종 트로이 목마같은 프로그램이 "운에 따라" 설치된다고 그냥 기정 사실로 받아들이시면 됩니다. 크랙 버전을 만든 제작자가 단순 재미로 크랙을 했다면 여러분들의 컴퓨터가 안전하겠지만, 혹여나 악의적인 의도를 가진 제작자였다면 여지없이 바이러스에 감염될 것입니다.

즉, 크랙버전을 설치하는 것은 자신의 컴퓨터를 좀비 PC로 만드는 것이나 다름없습니다.

하지만, 그나마라도 이를 막을 수 있는 방법이 있습니다. 윈도우 비스타 이후부터 제공되는 사용자 컨트롤(UAC)이 바로 그것입니다. 좀비 PC를 만들려면 대개의 경우 "관리자 권한"을 요구해야 하는데 UAC가 활성화된 경우 높은 권한의 작업들을 사용자 허락없이 할 수 없기 때문입니다.

윈도우 XP를 아직까지도 설치하시는 분들이 있는데, 크랙 버전을 사용하는 분들이라면 최소한 비스타 이후의 운영체제를 설치하시는 것이 이런 면에서 좋습니다. 따라서, 이 글은 윈도우 XP 사용자들을 위한 글이 아닙니다.




크랙된 소프트웨어의 경우, 사실 소프트웨어 자체가 관리자 권한을 요구하는 경우는 많지 않습니다. 일례로, 여러분들이 포토샵에 대한 크랙 버전을 실행한다면 관리자 권한을 요구하며 실행하지는 않는다는 것입니다.

이 때문에 종종 크랙 버전을 만드는 (악의적인) 제작자들은 악성 코드를 설치단계에 심어놓을 수 있습니다. 애석하게도 이런 경우는 비-개발자의 힘으로 막을 수 없는 부분입니다. 이런 식으로 크랙된 소프트웨어를 설치해서 사용해야 하는 경우라면 반드시 가상 머신을 만들어서 그 안에서만 실행하는 것이 권장됩니다. 윈도우 8의 경우 Hyper-V 가상 소프트웨어가 무료로 제공되기 때문에 이를 이용하거나 Virtual Box같은 제품을 사용해도 됩니다.

그다음 대표적인 크랙 유형으로는 시리얼 키 생성 및 원본 프로그램에 대한 패치 방법이 있습니다. 예를 들어, Unity3D 같은 소프트웨어의 경우 원본 프로그램은 unity3d.com에서 받고 크랙 소프트웨어 제작자는 그에 대한 바이너리를 정품으로 인식하도록 만들어주는 크랙을 배포하는 것입니다.

엄밀히 말해서 이런 크랙인 경우 '관리자 권한'을 요구할 필요가 없습니다. 물론, 원본 실행 파일이 "C:\Program Files"에 설치되기 때문에 그 하위 폴더의 파일을 건드리려면 반드시 '관리자 권한'이어야 하므로 이런 부분 때문에 패치 프로그램도 관리자 권한을 요구하는 경우가 있습니다. 다행히, 이런 식의 프로그램이라면 안전하게 실행할 수 있는 방법이 있습니다.

우선, 원본 프로그램을 설치할 때 "C:\Program Files" 기본 폴더가 아닌 다른 폴더(예: d:\mytools)를 지정해야 합니다. 그럼, 패치 프로그램도 관리자 권한이 필요하지 않습니다.

그다음 패치 프로그램을 보면 다음과 같이 '방패' 모양의 아이콘이 달려 있을 텐데요.

runas_medium_1.png

이건 실행할 때 관리자 권한을 요구하도록 명시되어 있는 프로그램임을 의미합니다. 따라서 실행하면 다음과 같이 관리자 권한을 얻기 위한 창이 뜹니다.

runas_medium_2.png

바로 여기에 허점이 있는데요. 해당 패치 프로그램이 정말 순수하게 원본 프로그램에 대한 패치만 하는 역할이라면 관리자 권한이 필요없다는 점입니다. 따라서 관리자 권한을 요구하는 부분을 빼버리고 실행해도 악성 프로그램이 아니라면 정상적으로 패치가 이뤄지게 됩니다. (물론, 악성 프로그램이어도 정상적으로 패치가 될 수 있겠지만 어쨌든 시스템에 대한 공격은 할 수 없습니다.)

이런 식으로 관리자 권한을 요구하는 프로그램을 만드는 방법에 대해서는 예전에 설명한 적이 있습니다.

신뢰도 등급을 조절하는 방법(1) - Manifest 파일 이용
; https://www.sysnet.pe.kr/2/0/445

즉, EXE 프로그램 안에 아래와 같이 설정된 .manifest 파일을 리소스로 가지고 있기 때문에,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
    <ms_asmv2:security>
      <ms_asmv2:requestedPrivileges>
        <ms_asmv2:requestedExecutionLevel level="requireAdministrator"
          uiAccess="false"/>
        </ms_asmv2:requestedPrivileges>
       </ms_asmv2:security>
  </ms_asmv2:trustInfo>
</assembly>

애당초 실행할 때부터 관리자 권한을 요구하도록 '방패' 모양의 아이콘이 달려 있는 것입니다. 따라서, requireAdministrator값을 원래의 asInvoker 값으로 바꿔주면 해당 프로그램이 실행될 때 관리자 권한을 요구하지 않게 됩니다.

이를 위해 HxD와 같은 헥사 에디터를 다운로드 받고,

HxD - Freeware Hex Editor and Disk Editor
; http://mh-nexus.de/en/hxd/

관리자 권한을 요청하는 패치 프로그램을 열어서 "requireAdministrator" 문자열을 검색하면 다음과 같이 찾을 수 있습니다.

runas_medium_3.png

이제 그 부분을 'asInvoker'로 바꾸고 그다음 uiAccess 문자열까지 남는 부분은 공백 문자(0x20)로 채워주시면 됩니다.

runas_medium_4.png

이렇게 바꾸고 저장하면 패치 프로그램의 아이콘에 방패 모양의 이미지가 사라지게 됩니다.

runas_medium_5.png

이 상태에서 실행시키면 이제 해당 프로그램은 관리자 권한이 아닌 일반 사용자 계정으로 실행이 되고, 따라서 시스템의 설정을 바꿀 수 있는 높은 권한의 작업들을 할 수 없게 됩니다.

적어도 이 정도의 처리만 해주셔도... 많은 경우 악성 코드 제작자로부터 자신의 PC를 보호하실 수 있을 것입니다.




정리해 보면 간단합니다.

  1. 가장 좋은 것은, 출처를 알 수 없는 인터넷 상에서 프로그램을 받아 사용하지 마세요.
  2. 1번이 불가능하다면, 제발 윈도우 비스타 이상의 운영체제를 사용하시고 절대 UAC를 끄지 마세요. 이렇게만 하셔도 알 수 없는 그 프로그램이 높은 권한을 요구하는 것인지 정도는 인지할 수 있습니다.
  3. 만약 다운로드 받은 프로그램이 상식적으로 높은 권한을 요구할 이유가 없는 것이라면, 헥사 에디터를 이용해 권한 요청을 제거하고 실행할 수 있습니다. 또는, 가상 머신을 하나 만들어서 그 안에서 설치를 합니다. 당연히 그 가상머신은 바이러스에 걸렸다고 기본적으로 가정하고 민감한 사용자 데이터 작업은 하지 마세요.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/28/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2014-02-18 04시38분
저는 manifest 수정해야 하면, *ResEdit* freeware 프로그램을 사용합니다. http://www.resedit.net/ 한 번 사용해 보세요
GiSeong Eom
2014-02-18 11시35분
@GiSeong Eom 좋은 툴 소개 감사합니다. ^^
정성태
2014-04-04 11시04분
[내찬RB] 경우에 따라 관리자권한이 실행시 상속되는거 같던데.
[손님]
2014-04-05 06시28분
"내찬RB"님, 그건 '경우에 따라'가 아니라 기본 동작이 그렇습니다. cmd.exe를 관리자 권한으로 실행시키고 그 안에서 다른 프로그램을 실행하면 역시 관리자 권한으로 실행됩니다.
정성태
2014-04-05 12시26분
[Visual Studio 2010] 프로페셔널 버전 (크랙판) 구해놓고,
바이러스 차단 프로그램까지 막은 후,
깔려고 하다고.. 시간이 너무 많이 걸릴 것 같아서 그만 두었는데..
오늘 아침에..
이런 글을 읽게되네요..

어쩔까나..

docx를 Visual Studio에서 보려면 Add-In을 설치해야 한다는데,
그게.. Expresss에서는 안 된다네요..
- VSTO에서 한 번 절망시키더니만..
  또 이러네..
  요즘 수입도 없는데..

그냥 맨 눈으로, 쌩 editor 쳐다보아야 하겠습니다.

좋은 글 (어려운 글) 잘 보았습니다.
감사합니다.
[손님]
2016-10-17 12시52분
정성태
2018-03-30 06시39분
[ㅁㄴㅇㄹ] 다른 나라 파일에선 저 부분을 어떻게 찾아요?
[손님]
2018-03-30 07시03분
[ㅁㄴㅇㄹ] Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="관리자 권한 끄고 실행"

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

으로 해보긴 했는데 바이러스 2개 뜨고 백신이 막네요

ㅎㄷㄷ
[손님]

[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13116정성태8/4/2022174.NET Framework: 2041. C# - Socket.Close 시 Socket.Receive 메서드에서 예외가 발생하는 문제파일 다운로드1
13115정성태8/3/2022252.NET Framework: 2040. C# - ValueTask와 Task의 성능 비교파일 다운로드1
13114정성태8/2/2022236.NET Framework: 2039. C# - Task와 비교해 본 ValueTask 사용법파일 다운로드1
13113정성태7/31/2022225.NET Framework: 2038. C# 11 - Span 타입에 대한 패턴 매칭 (Pattern matching on ReadOnlySpan<char>)
13112정성태7/30/2022262.NET Framework: 2037. C# 11 - 목록 패턴(List patterns)파일 다운로드1
13111정성태7/29/2022235.NET Framework: 2036. C# 11 - IntPtr/UIntPtr과 nint/nuint의 통합파일 다운로드1
13110정성태7/27/2022265.NET Framework: 2035. C# 11 - 새로운 연산자 ">>>" (Unsigned Right Shift)파일 다운로드1
13109정성태7/27/2022211VS.NET IDE: 177. 비주얼 스튜디오 2022를 이용한 (소스 코드가 없는) 닷넷 모듈 디버깅 - "외부 원본(External Sources)"
13108정성태7/26/2022163Linux: 53. container에 실행 중인 Golang 프로세스를 디버깅하는 방법
13107정성태7/25/2022128Linux: 52. Debian/Ubuntu 계열의 docker container에서 자주 설치하게 되는 명령어
13106정성태7/24/2022110오류 유형: 819. 닷넷 6 프로젝트의 "Conditional compilation symbols" 기본값 오류
13105정성태7/23/2022230.NET Framework: 2034. .NET Core/5+ 환경에서 (프로젝트가 아닌) C# 코드 파일을 입력으로 컴파일하는 방법 - 두 번째 이야기 [1]
13104정성태7/23/2022202Linux: 51. WSL - init에서 systemd로 전환하는 방법
13103정성태7/22/2022112오류 유형: 818. WSL - systemd-genie와 관련한 2가지(systemd-remount-fs.service, multipathd.socket) 에러
13102정성태7/19/2022188.NET Framework: 2033. .NET Core/5+에서는 구할 수 없는 HttpRuntime.AppDomainAppId
13101정성태7/15/2022157[내용 예약] (비어 있는 글)
13100정성태7/15/2022266.NET Framework: 2032. C# 11 - shift 연산자 재정의에 대한 제약 완화 (Relaxing Shift Operator)
13099정성태7/14/2022655.NET Framework: 2031. C# 11 - 사용자 정의 checked 연산자파일 다운로드1
13098정성태7/13/2022196개발 환경 구성: 647. Azure - scale-out 상태의 App Service에서 특정 인스턴스에 요청을 보내는 방법
13097정성태7/12/2022148오류 유형: 817. Golang - binary.Read: invalid type int32
13096정성태7/8/2022442.NET Framework: 2030. C# 11 - UTF-8 문자열 리터럴
13095정성태7/7/2022227Windows: 208. AD 도메인에 참여하지 않은 컴퓨터에서 Kerberos 인증을 사용하는 방법
13094정성태7/6/2022157오류 유형: 816. Golang - "short write" 오류 원인
13093정성태7/5/2022268.NET Framework: 2029. C# - HttpWebRequest로 localhost 접속 시 2초 이상 지연
13092정성태7/3/2022435.NET Framework: 2028. C# - HttpWebRequest의 POST 동작 방식파일 다운로드1
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...