본문 바로가기

My Study/etc

바로가기

오늘 학교를 가기엔 너무 덥고.. 집에 있기엔 짜증이 나서 광천터미널에 영풍문고를 가보기로 마음 먹음.
가서 베스트 셀러를 읽을 생각이었지만 내 의지와 상관없이 몸이 IT서적 있는데로 직행.. 어쩔수없는 본능.

뭐 하나만 보기로 하고 윈도우 포렌식 책을 들었는데 목차에 윈도우 바로가기에 대한 내용이 있어서 읽어봤는데 재미있더군요.냥 머리속에만 남기기 뭐해서 정리합니다. 

================================================
바로가기(shortcut)이라고 불리는 링크 파일은 윈도우에만 있는 독특한 기능이다.
여기서 궁금하실수도 있는데 리눅스에서도 심볼릭링크라고해서 바로가기와 같은 기능을 하는 놈이 있다.
그러면 이 두개는 뭐가 다르냐는 것이다. 

정확히 말하면 윈도우에 심볼릭 링크가 본격적으로 지원되기 시작한 것은 Vista 이후부터다.
고로 윈도우에는 바로 가기와 심볼릭 링크가 동시에 존재하므로 이 둘은 같다고 할 수 없다.

먼저 바로가기와 심볼릭 링크의 가장 큰 차이점이다.

심볼릭 링크 :  파일 시스템 수준에서 구현
   1. 파일 시스템이 보기에는 심볼릭 링크라는 별도의 파일이 아닌 그것이 가리키고 있는 대상 파일로 보임. 
       즉, 중간에 있는 심볼릭 링크는 애플리케이션에는 완전히 투명
   2. 대상에 대한 절대 경로 혹은 상태 경로에 대한 정보만 가지고 있다.
 

바로 가기 : 애플리케이션 수준에서 구현
   1. 그 자체가 완벽한 하나의 파일. 
      즉, 바로 가기는 파일이 가지고 있어야만 하는 모든 메타데이터와 MFT 엔트리를 가지고 있다. 
      파일 시스템이 보기에도 완전히 독립적인 별개의 파일로 보이고, 
      바로 가기를 사용하기 위해서는 애플리케이션 혹은 OS 수준에서 별도의 기능이 필요
   2. 대상에 대한 절대 경로만 가지고 있다.

 


바로 가기의 정식 명칭은 'Shell Link'로, 'Shell Link Binary File Format' 으로 만들어진 파일임을 의미
이 Shell Link Binary File Format의 기능과 구조는 MS 문서에 자세히 나와있다.
( 쉽게 찾으실 수 있겠지만 나와 같이 게으르신 분을 위해 파일을 그냥 올립니다. )
ms-shllink-pdf.pdf
바로 가기라서 간단할꺼 같지만 문서 양을 보면 52p에 달한다..


제가 읽은 책이 윈도우 포렌식이라서  바로 가기에 반드시 필요한 부분과 포렌식 관점에서 중요한 부분만 설명하겠습니다.

바로 가기 생성
● 윈도우 설치 시
가장 대표적인 예는 윈도우를 처음 설치할 때 바탕 화면에 생기는 '내 컴퓨터' 같은 기본 바로 가기들이다.
이 외에도 작업 표시줄에 있는 아이콘이나 '내 음악' 폴더에 있는 'sample music'과 같은 파일들도 모두 바로 가기로 만들어 진다.

제가 쓰는 작업 표시줄 일부인데 이렇게 각각 아이콘들이 전부 바로 가기들입니다.

위 그림은 Windows 7에서의 모양이고 아래는 Windows XP에서의 모양입니다.


● 윈도우 설치 후
윈도우는 사용자의 편의를 위해 최근에 열었던 문서들의 목록을 자동으로 저장한다. 그 목록은 단순한 문자열이 아니라 모두 바로 가기들이다. 
 
● 애플리케이션 설치 시
대부분 애플리케이션은 설치 과정에서 사용자에게 바탕 화면이나 작업 표시줄, 그리고 시작 모튜에 새로 설치한 애플리케이션의 바로 가기 항목을 만들지를 물어본다. 만들겠다고하면 설치 과정에서 자동으로 바로 가기를 만들어준다.

● 사용자가 생성
너무 당연한 이야기이다. 바로 가기 안 만들어본 분이 계시려나..

파일에 대고 우클릭을 하면 위와 같이 나오며 바로 가기 만들기를 누르면 끝이다.. 흠..

이제 바로 가기의 구조를 알아보자

바로 가기의 구조
바로 가기가 가지고 있는 정보 종류는 바로 가기 파일의 속성 정보 창에서 바로 가기 탭을 보면 대충은 알 수 있다.
난 notepad.exe를 대상으로 해보았다.



원본 파일의 종류, 전체 경로, 실행 옵션 등 기본적인 정보들만 있는거 같지만 이것은 바로 가기가 가지고 있는 전체 정보의 극히 일부분에 지나지 않는다.

제대로 파고 들어가기 전에 일반적으로 해킹대회 때나 리버싱 할 때 사용하는 Hex Editor로 열어보았다.
( 파일의 모든 내용을 볼 수 있으므로.. )
보고 싶은 분만 보시길.. 이 파일에 대한 설명은 하지 않겠다. 딱 봐도 뭔가 이상한 정보들이 많이 있다는것 정도는 알수 있다.

바로 가기는 다음과 같이 크게 다섯 부분으로 나눌 수 있다. 각 부분들은 저마다 고유한 내부 구조를 가지고 있다.

SHELL_LINK_HEADER:  식별 정보, 타임 스탬프, 그리고 선택 가능한 구조의 존재 유무를 표시하는 플래그를 저장
LINKTARGET_IDLIST : 원본에 대한 정보를 담고 있다. 
                                      이 구조는 Shell Link Binary File Format에서 선택 사항이지만
                                      바로 가기에서는 필수적인 항목 

LINKINFO : 원본의 위치를 찾을 때 필요한 정보를 담고 있다. 이 역시 선택 항목
STRING_DATA : 사용자 인터페이스나  경로 식별 정보를 가지고 있다.
EXTRA_DATA : 기타 정보를 가지고 있다.


이제 하나하나 세세하게 알아보자.

SHELL_LINK_HEADER



실제 Hex Editor에 있는 값과 비교해 가면서 적어본 것이다.

중요한 것만 몇가지 집고 넘어가겠다.
CLSID는 고정적인 값으로 바로 가기를 찾는데 중요한 역할을 할 수 있다.

SHELL_LINK_HEADER의 LinkFlag


LINKTARGET_IDLIST
바로 가기에서 LINKTARGET_IDLIST는 필수적인 항목이다. LINKTARGET_IDLIST는 2Byte에 걸쳐 IDList의 크기가 나오고 그 뒤에 가변 길이의 IDList가 나온다. IDList의 크기가 가변적이기 때문에 당연히 LINKTARGET_IDLIST의 크기도 가변적이다.
IDList는 다시 두 부분으로 나뉘는데, 첫 번째 부분은 2Byte의 고정 길이를 갖는 ItemIDSize이며, 그 뒤로는 가변 길이의 Data가 붙게 된다. IDList의 데이터는 일정한 구조가 없다. IDList의 끝에는 IDList의 끝을 알리는 2Byte크기의 예약 영역이 나오는데, 이것은 모두 0으로 채워져 있으며 TerminalID라고 부른다.


010 Editor 툴로 보면 쉽게 그 구조를 파악할 수 있다.


IDListSize가 223이라고 나왔는데 223 = 0xDF이다.
그 아래로 IDList 구조체 배열이 0,1,2,3 쭉 있다. 

LINKINFO
LinkInfo도 바로 가기에 필수적인 요소이며, 원본 파일이 정해진 위치에 없는 경우 그것을 찾기 위한 필수 정보들을 가지고 있다. 그 필수 정보에는 원본이 저장되어 있던 볼륨의 정보 혹은 맵드 드라이브 문자, 원본까지의 UNC 경로 등이 포함된다. 




LinkInfo Flag는 특이하게도 전체 32비트 중에서 좌측 2비트만을 사용하는데 그 의미는 아래와 같다.


VolumeID필드는 바로 가기가 생성될 당시에 원본이 있던 볼륨의 데이터를 가지고 있다.
이 정보는 원본이 제 위치에 없는 경우 원본을 찾는데 이용된다. 컴퓨터 포렌식 관점에서 이 정보는 매우 중요.
바로 가기의 링크가 끊어졌다면 우리는 이 볼륨 정보를 보고 사라진 볼륨에 대한 힌트를 얻을 수 있다.

VolumeID 구조 ( 010 Editor로 그냥 봄.. )


STRING_DATA
이 구조체는 사용자 인터페이스와 경로 식별자를 알려주는 일련의 문자열들로 구성.
각 문자열은 앞에 2Byte 길이의 문자열 크기가 먼저 나오고, 그 다음에 그에 해당하는 길이만큼의 문자열이 뒤따른다.
이 구조체에 올 수 있는 문자열의 종류는 LinkFlags에 따라 결정되며 가능한 문자열은 다음과 같다.

NAME_STRING : 바로 가기에 대한 설명을 가지고 있다.
RELATIVE_PATH : 바로 가기를 기준으로 원본까지의 상대 주소를 가지고 있다.
WORKING_DIR : 바로 가기를 활성화시켰을 때 사용할 수 있는 working directory의 주소를 가지고 있다.
COMMAND_LINE_ARGUMENTS : 애플리케이션을 실행할 때 사용한 명령 옵션을 가지고 있다.
ICON_LOCATION : 바로 가기를 사용자에게 보여줄 때 사용할 아이콘의 위치 정보를 가지고 있다.


제가 테스트한 notepad.exe의 바로가기에는 다음과 같은 정보가 있다.




RELATIVE_PATH ,WORKING_DIR 두 정보가 있었다.

EXTRA_DATA
이 구조체는 말 그대로 원본에 대한 추가 정보를 가지고 있다. 
5가지 중요 정보 중에서 가장 방대한 크기를 차지하고 있었다. 

추가될 수 있는 정보의 종류가 많지만 필요한 부분만 정리해보겠다.




지금까지 바로 가기에 대해서 분석해 보았는데 이 간단한 놈이 이렇게 복잡한 내용을 담고 있다는 것은 처음 알았다.


'My Study > etc' 카테고리의 다른 글

TIOBE 프로그래밍 인기 순위  (2) 2012.02.02
ipad 사용자 권한  (0) 2012.01.27
PC로 카톡 쓰기~  (8) 2011.05.30
UHA 확장자  (0) 2011.05.27
Chrome OS  (0) 2011.05.25