LNK File Structure

c0wb3ll ㅣ 2020. 6. 5. 10:54

LNK File Structure

LNK File?

LNK File은 다른 데이터들에 접근하기 위한 정보를 가지고 있는 데이터이다. Shell Link Binary File Format은 확장자가 .LNK인 윈도우 파일 포맷이다.

Shell Link는 보통 응용프로그램을 실행하거나 OLE 같은 시나리오를 Linking하는데 제공하기 위해서 사용하는 것 뿐만 아니라 파일에 대한 참조를 저장하는 기능을 필요로하는 애플리케이션에 사용될 수 도 있다.

LNK 파일 생성 조건

  • 특정 응용프로그램을 실행할 때 바탕화면에 자동으로 생성
  • 사용자가 편의를 위해 바로가기를 생성했을 때 생성
  • 로컬 및 원격 데이터 파일, 문서를 열었을 때 생성
  • 바탕화면 외에도 최근 문서 폴더, 시작프로그램, 빠른 실행 등 다양한 곳에서 생성

포렌식 관점

  • 파일의 MAC Time
  • 볼륨 정보
  • 네트워크 공유 정보
  • 원본 위치
  • 시스템 이름
  • 원본 파일 추적 가능

LNK File Format

  • ShellLinkHeader(default)
    • 총 76byte인 기본적인 헤더로 식별 정보, 시간 정보, 대상 파일 크기, 대상 파일 특성 등의 정보가 저장된다.
  • LinkTargetIDList(optional)
    • ShellLinkHeader의 HasLinkTargetIDList 플래그가 설정되어 있을때 만 존재하는 구조로, 링크된 대상의 다양한 정보를 리스트 형태로 구성해놓은 구조이다.
  • LinkInfo(optional)
    • ShellLinkHeader의 HasLinkInfo 플래그가 설정되어 있을때만 존재하는 구조로 링크 대상을 참조하기 위한 정보를 가진 구조이다.
  • StringData(optional)
    • 링크 대상의 문자열 정보(이름, 상대경로, 작업디렉토리 등)를 저장하는 구조로 ShellLinkHeader에 관련된 플래그가 설정되어 있을 때만 존재한다.
  • ExtraData(optional)
    • 링크 대상의 화면 표시 정보, 문자열 코드페이지, 환경 변수와 같은 추가적인 정보 저장을 위한 구조입니다.
  • 위의 5가지 구조 중 포렌식적으로 의미있는 정보를 저장한 구조는 ShellLinkHeaderLinkInfo 구조입니다.

ShellLinkHeader 구조

ShellLinkHeader 구조는 앞서 이야기한 ShellTargetIDList, LinkInfo,, StringData를 포함하고 있는 식별 정보 및 타임 스태프 등 여러 데이터가 명시된 데이터를 포함한다.

Offset Length(byte) Name Descryption
0x00 ~0x03 4 HeaderSize 헤더의 크기로 항상 0x0000004C(76)값
0x04 ~ 0x13 16 LinkCLSID 클래스 식별자(class identifier;CLSID)로 항상 00021401-0000-0000-C000-000000000046 값
0x14 ~ 0x17 4 LinkFlags 링크 대상의 다양한 정보에 대한 플래그
0x18 ~ 0x1B 4 FileAttributes 링크 대상의 파일 특성 정보
0x1C ~ 0x23 8 CreationTime 링크 대상의 생성 시간
0x24 ~ 0x2B 8 AccessTime 링크 대상의 접근 시간
0x2C ~ 0x33 8 WriteTime 링크 대상의 쓰기 시간
0x34 ~ 0x37 4 FileSize 링크 대상의 크기
0x38 ~ 0x3B 4 IconIndex 아이콘 인덱스
0x3C ~ 0x3F 4 ShowCommand 링크가 실행될 때 응용프로그램의 동작 모드
0x40 ~ 0x41 2 HotKey 핫키 정보
0x42 ~0x43 2 Reserved1 예약된 필드 (항상 0)
0x44 ~ 0x47 4 Reserved2 예약된 필드 (항상 0)
0x48 ~ 0x4B 4 Reserved3 예약된 필드 (항상 0)

위의 값과 아래 HxD로 열어본 헥스값을 비교해보자.

image

밑에 Variables 탭을 보면 010editor에서 정리를 잘 해주었다. HeaderSize는 고정값이 76이라고 명시해주었으며, GUID값도 마찬가지로 고정된 값이 출력되었다. 그 외의 값도 위에 표에 명시된 대로 구조가 정리되어있었다.

LinkInfo Structure

LinkInfo 구조체는 링크의 원본 위치를 찾지 못했을 때 해결하기 위해서 필수 적인 정보를 명시한다. 링크가 생성되었을 때, 존재하는 원본 파일의 저장된 볼륨과 매핑된 드라이브 문자 및 UNK(Universal Naming Convention) 형식의 경로가 저장된 볼륨에 대한 정보를 포함하고 있다.

  • LinkInfo 구조에서 중요한 정보는 VolumeID, CommonNetworkRelativeLink 정보이다.
  • VolumeID 구조에는 DriveType, DriveSerialNumber 등의 정보가 포함되어 있으며, CommonNetworkRelativeLink 구조에는 링크 대상의 경로가 포함된다.
  • LocalBasePath : 링크 대상 경로
  • DriveSereialNumber : 링크 대상이 위치한 드라이브의 시리얼 번호
  • DriveType : 링크 대상이 위치한 드라이브 형식
    • DRIVE_UNKHOWN : 0x00000000 = 알 수 없음
    • DRIVE_NO_ROOT_DIR : 0x00000001 = Root Path가 없음
    • DRIVE_REMOVABLE : 0x00000002 = 외장 장치
    • DRIVE_FIXED : 0x00000003 = Fixed 장치
    • DRIVE_REMOTE : 0x00000004 = 네트워크
    • DRIVE_CDROM : 0x00000005 = CD-ROM
    • DRIVE_RAMDISK : 0x00000006 = RAM 디스크
Offset Length(byte) Name Description
0x00 ~ 0x03 4 LinkInfoSize LinkInfo 구조체 크기
0x04 ~ 0x07 4 LinkInfoHeaderSize LinkInfo 헤더 크기
0x08 ~ 0x0B 4 LinkInfoFlags VolumeID / LocalBasePath / LocalBasePathUnicode / CommonnNetworkRelativeLink 필드가 존재하는에 대해서 정보를 명시한 Flags
0x0C ~ 0x0F 4 VolumeIDOffset VolumeID 필드의 위치
0x10 ~ 0x13 4 LocalBasePathOffset LocalBasePath 필드의 위치
0x14 ~ 0x17 4 CommonNetwork
RelativeLinkOffset
CommonNetworkRelativeLink 필드 위치
0x18 ~ 0x1B 4 CommonPath
SuffixOffset
CommonPathSuffix 필드 위치
0x1C ~ 0x1F 4 LocalBasePath
OffsetUnicode
LocalBasePathUnicode 필드의 위치
0x20 ~ 0x23 4 CommonPathSuffix
OffsetUnicode
CommonPathSuffixOffsetUnicode의 위치
~ Variable VolumeID 링크가 생성되었을 때 링크 대상이 있는 볼륨에 대한 정보를 명시한다.
~ Variable LocalBasePath CommonPathSuffix 필드에 문자열을 추가해서 링크 항목이나 링크 대상의 전체 경로를 구성하는데 사용되는 System Default Code Page에 의해 정의된 NULL로 끝나는 문자열
~ Variable CommonNetwork
RelativeLink
링크 대상이 저장된 네트워크 위치에 대한 정보를 명시
~ Variable CommonPathSuffix LocalBasePath 필드에 문자열을 합친 대상 링크 또는 링크 아이템에 전체 경로를 구성하는데 사용되는 Sytem Default Code Page에 의해 정의된 NULL로 끝나는 문자열
~ Variable LocalBase
PathUnicode
CommonPathSuffixUnicode 필드에 문자열읋 합친 대상 링크 또는 링크 아이템에 전체 경로를 구성하는데 사용되는 유니코드 문자열
~ Variable CommonPath
SuffixUnicode
LocalBasePathUnicode 필드에 문자열을 합친 대상 링크 또는 링크 아이템에 전체 경로를 구성하는데 사용되는 유니코드 문자열

image

010editor를 이용한 분석 결과도 마찬가지로 대조해보면 위의 표와 같다는 걸 알 수 있습니다.

추가적으로 LinkInfo 구조체에 있는 LinkInfoFlags 데이터이다.

값은 VolumeIDAndLocalBasePath 와 CommonNetworkRelativeLinkAndPathSuffix 두가지이다.

  • VolumeIDAndLocalBasePath
    • 설정된 경우 VolumeID 및 LocalBasePath 필드가 있으며 해당 위치는 각각 VolumeIDOffset 및 LocalBasePathOffset필드의 값으로 지정됩니다. LinkInfoHeaderSize 필드 의 값이 0x00000024보다 크거나 같은 경우 LocalBasePathUnicode 필드가 존재하며 해당 위치는 LocalBasePathOffsetUnicode 필드의 값으로 지정됩니다.
    • 설정하지 않으면 VolumeID, LocalBasePath 및 LocalBasePathUnicode 필드가 존재하지 않으며 VolumeIDOffset 및 LocalBasePathOffset 필드의 값은 0이다. LinkInfoHeaderSize의 필드값이 0x00000024이상인 경우 LocalBasePathOffsetUnicode필드의 값은 0이다.
  • CommonNetworkRelativeLinkAndPathSuffix
    • 설정된 경우 CommonNetworkRelativeLink 필드가 존재하고 해당 위치는 CommonNetworkRelativeLinkOffset 필드의 값으로 지정된다.
    • 설정하지 않으면 CommoonNetworkRelativeLink의 필드는 존재하지 않고, CommonNetworkRelativeLinkOffset필드의 값은 0이다.

image

제가 연 파일에 경우 VolumeIDAndLocalBasePath 플래그만 활성화 되어 있었습니다.

image

따라서 VolumeID 정보를 확인할 수 있고 VolumeID 정보는 아래와 같습니다.

Offset Length(byte) Name Description
0x00 ~ 0x03 4 VolumeIDSize VolumeID의 크기를 명시, 최소 0x10이상이다.
0x03 ~ 0x07 4 DriveType 링크 대상이 저장된 타입
0x08 ~ 0x0B 4 DriverSerialNumber 링크 대상이 저장된 볼륨의 시리얼 번호
0x0C ~ 0x0F 4 VolumeLabelOffset 링크 대상이 저장된 드라이브의 볼륨 명을 포함한 문자열의 명시
0x10 ~ 0x13 4 VolumeLabelOffsetUnicode 링크 대상이 저장된 드라이브의 볼륨 명을 포함한 문자열의 명시(유니코드)
0x14 ~ Variable Data 드라이브의 볼륨명

Reference

https://whitesnake1004.tistory.com/591

http://www.forensic-artifact.com/windows-forensics/linkfile