링크 파일과 링크 파일 포맷에 대해서 알아보자
Shell link나 shortcut로 불리는 Link 파일 구조체는 다른 데이터를 접근하는 데 필요한 정보를 포함하고 데이터이다. Shell Link Binary File Format은 확장자가 “.LNK”인 윈도우 파일의 포맷이다.
Shell Link는 보통 응용프로그램을 실행하거나 OLE(Object Linking and Embedding) 같은 시나리오를 linking을 제공하기 위해 사용되는 것뿐만 아니라 대상 파일에 대한 참조를 저장하는 기능을 필요한 애플리케이션에서 사용할 수도 있다.
Shell Link Binary File Format은 다음과 같은 구조로 되어 있다.
ShellLinkHeader 구조는 LinkTargerlDLIST, LinkInfo, StringData를 포함하고 있는 식별 정보, 타임스탬프, 선택적인 구조의 형태가 명시된 플래그를 포함한다.
※ 참고 : LinkFlags, FileAttributes, HotKey Flag
ShellLinkHeader에서 ShowCommand의 Flag는 아래 표와 같다.
LinkTargetIDList 구조체는 대상의 링크를 명시하고 있다. 이 구조체는 ShellLinkHeader안에 HasLinkTargetIDList bit에 의해 지정된다.
저장된 IDList 구조체는 itemID로 구성되어 있다.
ItemID는 IDList 구조체의 단위이다. ItemID에 저장된 데이터는 선행 ItemID의 대상 공간에서의 위치에 대응하는 소스에 의해 정의된다. 이 데이터는 유일하게 고유 네임 스페이스의 해당 부분의 항목을 식별한다.
LinkInfo 구조체는 대상 링크의 원본 위치를 찾지 못했을 때 해결하기 위한 필수적인 정보를 명시한다. 여기에는 링크가 생성되었을 때에 존재하는 대상이 저장된 볼륨과 매핑된 드라이브 문자 및 UNC(Universal Naming Convention) 형식의 경로가 저장된 볼륨에 대한 정보를 포함한다. LinkInfoHeader는 LinkInfoSize, LinkInfoHeaderSize, LinkInfoFlags, VolumeIDOffset, LocalBasePathOffset, CommonNetworkRelativeLinkOffset, CommonPathSuffixOffset, LocalBasePathOffsetUnicode, CommonPathSuffixOffsetUnicode이다. 아래에서 나오는 Offset은 LinkInfo 구조체의 시작에서부터의 offset을 나타낸다.
LinkInfo 구조체에서 LinkInfoFlags에 대한 자세한 내용은 아래 그림을 참고하면 된다.
2.3.1 VolumeID
VolumeID는 링크가 생성되었을 때 대상 링크가 있는 볼륨에 대한 정보를 명시한다. 원본 위치에 파일이 존재하지 않으면 링크를 유용하게 해결 위한 정보이다.
DriveType의 대한 정보는 다음과 같다.
2.3.2 CommonNetworkRelativeLink
CommonNetworkRelativeLink 구조체는 링크 대상이 연결된 드라이브명과 UNC path prefix를 포함한 저장된 네트워크 장소에 대한 정보를 명시한다.
StringData는 사용자 인터페이스와 경로 식별 정보를 전달하는 구조의 집합을 말한다. StringData에 들어가는 정보는 다음과 같다.
StringData의 구조는 다음과 같다.
Extra Data는 링크 대상에 대한 추가적인 정보를 나타내는 구조체 집합이다. 이 선택적 구조체는 기본 Shell Link Binary File Format에 추가된 extra data section에 존재할 수 있다.
2.5.1 ConsoleDataBlock
ConsoleDataBlock 구조체는 링크 대상이 콘솔 창에서 실행되는 응용프로그램을 지정하는 경우에 사용되는 표시 설정을 명시한다.
2.5.2 ConsoleFEDataBlock
ConsoleFEDataBlock 구조체는 링크 대상이 콘솔 창에서 실행되는 응용프로그램을 지정하는 경우에 텍스트를 보여주는 데 사용하는 코드 페이지를 명시한다.
2.5.3 DarwinDataBlock
DarwinDataBlock 구조체는 shell link가 동작할 때 응용프로그램을 설치하기 위해서 링크 대상 IDList 대신에 사용되는 응용프로그램 식별자를 명시한다.
2.5.4 EnvironmentVariableDataBlock
EnvironmentVariableDataBlock 구조체는 링크 대상이 해당 환경 변수를 갖는 위치를 참조할 때 환경 변수 정보의 경로를 명시한다.
2.5.5 IconEnvironmentDataBlock
IconEnvironmentDataBlock 구조체는 아이콘에 경로를 명시한다.
2.5.6 KnownFolderDataBlock
KnownFolderDataBlock 구조체는 알려진 폴더의 위치를 명시한다. 이 데이터는 링크가 로드될 때 링크 대상 IDList가 번역될 수 있도록 추적하는 알려진 폴더면 사용할 수 있다.
2.5.7 PropertyStoreDataBlock
Shell link안에 extra data를 정장하기 위해서 응용프로그램을 사용되는 property의 집합을 명시한다.
2.5.8 ShimDataBlock
링크 대상이 활성화될 때 지정하는 shim의 이름을 명시한다.
2.5.9 SpecialFolderDataBlock
SpecialFolderDataBlock 구조체는 Special folder의 위치를 명시한다. 링크가 로드될 때 링크 대상 IDList가 번역될 수 있도록 추적하는 special folder이면 사용할 수 있다.
2.5.10 TrackerDataBlock
TrackerDataBlock 구조체는 링크가 resolve될 때 원래 위치에서 발견되지 않는 경우, 링크 대상을 resolve 하는 데 사용될 수 있는 데이터를 명시한다.
2.5.11 VistaAndAboveIDListDataBlock
VistaAndAboveIDListDataBlock 구조체는 그것을 지원하는 플랫폼에 LinkTargetIDList구조체를 대신해 사용할 수 있는 대체적인 IDList를 명시한다.
[MS_SHELLLINK] : Shell Link Binary File Format
- https://msdn.microsoft.com/en-us/library/dd891294.aspx