Windows Artifact[3] - LNK

(본 포스팅에서는 기본적인 도구 사용법에서는 다루지 않습니다)





이번 포스팅에서는 LNK파일 분석에 대해서 알보겠습니다.

----------------------------------------------------------------------------------------------------------------------------------------



1. LNK 파일

Windows Shortcut Files (MS-ShellLink) 는 윈도우 시스템에서 사용하는 파일에 대한 링크 파일입니다. 특정 실행파일을 간편하게 실행하기 위해 사용자 지정 위치에 링크되며, LNK 확장자를 가집니다.

LNK 파일은 사용자가 직접 생성하는 것 이외에도, Windows OS 설치 시 기본적으로 특정 경로에 바탕화면의 내 컴퓨터”, “휴지통부터 최근 문서등과 같은 파일이 생성됩니다. 또한 윈도우 설치시 LNK파일 생성은 기본옵션으로 활성화 되어 있기 때문에 사용자가 파일이나 폳더를 액세스 할 경우 LNK파일이 생성됩니다.

LNK파일은 포렌식 분석관점에서 매우 중요한 아티팩트(증거)가 됩니다. 사용자가 최근 엑세스한 파일이나 접근한 폳더정보를 알 수 있으며, 외부로 유출된 자료조사 시 유용하게 활용할 수 있습니다.



2. LNK파일 저장경로

LNK파일이 저장되는 경로는 다음과 같습니다.


■C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu

  -기본 시작메뉴

■C:\Users\<username>\Public

  -관리자 라이브러리

■C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu

  -사용자 시작메뉴

■C:\Users\<username>\Public

  -사용자 라이브러리

■C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Recent

  -최근문서

■C:\Users\<username>\Desktop

  -사용자별 바탕화면

■C:\Users\<username>\AppData\Roaming\Microsoft\Windows\SendTo

  -SendTo 메뉴 링크

■C:\Users\<username>\AppData\Roaming\Microsoft\Internet  Explorer\Quick Launch

  -사용자 빠른실행



3. LNK파일 구조 분석

LNK 파일에서 파일 타임스탬프, 원본 파일 경로, 실행 옵션 등의 확인이 가능하며, 원본 실행파일에 대한 정보를 다음 5가지 부분의 구조를 가지고 있습니다.

구분

설명

비고

SHELL_LINK_HEADER

식별 정보, 타임스탬프, 선택 가능한 구조의 존재 유무 표시 플래그

 

LINKTARGET_IDLIST

원본에 대한 정보

 

LINKINFO

원본 위치를 찾을 때 필요한 정보

 

STRING_DATA

사용자 인터페이스나 경로 식별(Path identification) 정보

 

EXTRA_DATA

기타 정보

 

[표 1] LNK 포맷


    1) SHELL_LINK_HEADER

SHELL_LINK_HEADER는 총 76 바이트이며, 헤더에는 식별 정보, 타임스탬프 등이 포함됩니다. 헤더의 구조는 다음과 같습니다.


[그림 1] SHELL_LINK_HEADER 분석



각 필드에 대한 내용은 아래 [표 2]와 같습니다.


필드명

설명

비고

HeaderSize

헤더의 크기

Default : 0x4C

LinkCLSID

클래스 식별자

Default :

00021401-0000-0000-C000-000000000046

LinkFlags

쉘 링크에 대한 정보와 어떤 구조체들이 추가로 포함되는지 알려줌

 

FileAttributes

파일 속성 정보로 원본에 대한 정보를 가짐

 

CreationTime

원본의 생성 시간

64비트 윈도우 시간

AccessTime

원본의 접근 시간

64비트 윈도우 시간

WriteTime

원본의 수정 시간

64비트 윈도우 시간

FileSize

원본의 파일 크기

원본 파일 크기 > 0xFFFFFFFF 인 경우 원본 크기가 좌측 32비트

IconIndex

아이콘 인덱스. 주어진 아이콘 위치 안에서의 아이콘 인덱스를 가리킴

 

ShowCommand

Shell Link에 의해 실행되는 애플리케이션의 윈도우 상태를 나타냄

0x1 : SW_NORMAL

0x2 : SW_SHOWMINIMIZED

0x3 : SW_SHOWMAXIMIZED

 

HotKey

바로가기에 의해 지정된 애플리케이션을 바로 실행하기 위한 키보드 조합

 

Reserved1

예약 영역

0 으로 채워짐

Reserved2

Reserved3

[표 2] SHELL_LINK_HEADER 필드 내용




    2) LINKTARGET_IDLIST 분석

LINKTARGET_IDLIST는 바로가기의 필수 항목이며, 총 사이즈는 2바이트(IDList의 크기) + 가변(IDList) 입니다. 이 중 IDList는 다시 두 부분으로 나뉘는데, 첫째 부분은 2바이트 고정길이를 갖는 ItemIDSize 이며, 그 뒤로는 가변길이의 Data가 붙게 됩니다. IDListData는 일정한 구조가 없으며 데이터의 맨 끝 위치에 2바이트의 예약영역이 존재합니다. 이 예약영역은 0으로 채워져 있으며, 데이터의 종료를 나타냅니다.

[그림 3] LINKTARGET_IDLIST

필드에 대한 내용은 아래와 같습니다.

필드명

설명

비고

IDListSize

IDList 의 크기

 

IDList (variable)

아이템들의 ID 리스트

 

[표 2] LINKTARGET_IDLIST 필드 내용



    3) LinkInfo 분석

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

[그림 4] LinkInfo

각 필드에 대한 내용은 아래와 같습니다.


필드명

설명

비고

LinkInfoSize

LinkInfo 구조체의 크기

 

LinkInfoHeaderSize

LinkInfo Header 섹션의 크기

 

LinkInfoFlag

LinkInfo Flags. 전체 32비트 중 왼쪽 2비트만을 사용하며, 나머지는 0으로 채워짐

 

VolumeIDOffset

VolumeID 필드까지의 Offset

 

LocalBasePathOffset

LocalBasePath 필드까지의 Offset

 

CommonNetwork-

RelativeLinkOffset

CommonNetworkRelativeLink 필드까지의 Offset

 

CommonPathSuffixOffset

CommonPathSuffix 필드까지의 Offset

 

LocalBasePathOffsetUnicode

(optional)

LocalBasePath 필드까지의 Unicode Offset

 

CommonPathSuffixOffsetUnicode(optional)

CommonPathSuffix 필드까지의 Unicode Offset

 

VolumeID (variable)

바로가기가 생성 될 당시에 원본이 있던 볼륨의 데이터

원본이 제 위치에 없는 경우 찾는데 사용

LocalBasePath

Link 파일 또는 Link 대상 파일의 기본 경로

CommonPathSuffix 와 결합하여 전체 경로가 됨

 

CommonNetworkRelativeLink

Link Target 이 저장 된 네트워크 위치에 대한 정보

 

CommonPathSuffix

Link 파일 또는 Link 대상 파일의 파일 경로

LocalBasePath 와 결합하여 전체 경로가 됨

 

LocalBasePathUnicode

LocalBasehPath Unicode 타입

LinkInfoHeader-Size 필드가 0x00000024 보다 클 경우 Enable

CommonPathSuffixUnicode

CommonPathSuffix Unicode 타입

 VolumeIDSize

 VolumeID 크기. 이 값은 반드시 0x10보다 커야 함

 

 DriveType

 드라이브 형태

 

 DriveSerialNumber

 드라이브의 시리얼 번호

 

 VolumeLabelOffset

 아스키 또는 유니코드 형식의 VolumeLabel 까지의 Offset

 

 Data

 VolumeLabel

 

[표 3]LinkInfo 필드 내용



드라이브 형태로는 아래와 같습니다.

문자열

설명

비고

DRIVE_UNKNOWN

0x00000000

알려지지 않은 타입

 

DRIVE_NO_ROOT_DIR

0X00000001

루트 경로를 사용할 수 없는 경우

 

DRIVE_REMOVABLE

0X00000002

이동형 저장장치

플로피 디스크, USB, 플래시 카드 리더 등

 

DRIVE_FIXED

0X00000003

고정형 저장장치

 

DRIVE_REMOTE

0X00000004

네트워크 드라이브

 

DRIVE_CDROM

0X00000005

CD-ROM

 

DRIVE_RAMDISK

0X00000006

RAM Disk

 

[표 4]DriveType




3. LNK파일 분석

LNK파일 분석은 LinkParser를 이용하여 분석 할 수 있습니다. [그림 5]는 LinkParser를 실행한 화면이며, [그림 6]은 분석 결과입니다.


[그림 5] LinkParser 도구 실행화면



[그림 6] Link파일 분석 내용






지금까지 LNK파일에 대해서 알아 보았으며, 다음 포스팅에서는 휴지통에 대해서 알아보겠습니다.



이 글을 공유하기

댓글