Lnk File


Lnk 확장자 파일은 보통 바로가기라 하면 된다. 하지만 바로가기라고만 표현하기에는 너무나 많은 정보를 포함하고 있기에 포렌식의 관점에서 이에 대하여 다루고자 한다. 링크파일은 주로 아래의 위치에 많이 리스트화 되어 존재한다.


# 바탕화면(Desktop) 폴더

  • Windows XP : C:\Documents and Settings\<user name>\Desktop
  • Windows 7 : C:\Users\<user name>\Desktop

# 최근문서(Recent) 폴더

  • Windows XP : C:\Documents and Settings\<user name>\Recent
  • Windows 7 : C:\Users<user name>\AppData\Roaming\Microsoft\Windows\Recent

# 시작프로그램(Start) 폴더

  • Windows XP : C:\Documents and Settings\<user name>\Start Menu\Programs
  • Windows 7 : C:\Users\<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

# 빠른실행(QuickLaunch) 폴더

  • Windows XP : C:\Documents and Settings\<user name>\Application Data\Microsoft\Internet Explorer\Quick Launch
  • Windows 7 : C:\Users\<user name>\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch


Lnk File Format


Lnk File Format에는 크게 5가지 부분으로 나눌 수가 있다. 

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

  • ShellLinkHeader 구조

    기본적인 헤더로 식별 정보, 시간 정보, 대상 파일 크기, 대상 파일 특성 등의 정보가 저장된다.

     범위(Hex) 크기(Byte) 이름 설명
    0 – 34 HeaderSize 헤더의 크기로 항상 0x0000004C(76) 값
    4 – 1316 LinkCLSID 클래스 식별자(class identifier;CLSID)로 항상 00021401-0000-0000-C000-000000000046 값
    14 – 174 LinkFlags 링크 대상의 다양한 정보에 대한 플래그
    18 – 1B4 FileAttributes 링크 대상의 파일 특성 정보
    1C – 23 CreationTime 링크 대상의 생성 시간
    24 –  2B AccessTime 링크 대상의 접근 시간
    2C – 33 WriteTime 링크 대상의 쓰기 시간
    34 – 37 FileSize 링크 대상의 크기
    38 – 3B IconIndex 아이콘 인덱스
    3C – 3F ShowCommand 링크가 실행될 때 응용프로그램의 동작 모드
    40 – 41 HotKey 핫키 정보
    42 – 43 Reserved1 예약된 필드 (항상 0)
    44 – 47 Reserved2 예약된 필드 (항상 0)
    48 – 4B Reserved3 예약된 필드 (항상 0)


    LinkTargetIDList 구조
    ShellLinkHeader의 HasLinkTargetIDList 플래그가 설정되어 있을때만 존재하는 구조로, 링크된 대상의 다양한 정보를 리스트 형태로 구성해놓은 구조이다.


    LinkInfo 구조
    ShellLinkHeader의 HasLinkInfo 플래그가 설정되어 있을때만 존재하는 구조로 링크 대상을 참조하기 위한 정보를 가진 구조이다.

    VolumeID 구조에는 DriveType, DriveSerialNumber 등의 정보가 포함되고, CommonNetworkRelativeLink 구조에는 링크 대상의 경로가 포함된다. 경로 정보는 StringData 구조의 정보를 이용해도 얻을 수 있다. 따라서, LinkInfo 구조에서 포렌식적으로 의미있는 정보를 다음과 같다. 


    • DriveType : 링크 대상이 위치한 드라이브 형식
    • DRIVE_UNKNOWN : 0x00000000
    • DRIVE_NO_ROOT_DIR : 0x00000001
    • DRIVE_REMOVABLE : 0x00000002
    • DRIVE_FIXED : 0x00000003
    • DRIVE_REMOTE : 0x00000004
    • DRIVE_CDROM : 0x00000005
    • DRIVE_RAMDISK : 0x00000006
    DriveSerialNumber : 링크 대상이 위치한 드라이브의 시리얼 번호

    LocalBasePath : 링크 대상 경로



    결론


    링크 파일을 통하여 알 수 있는 정보는 꽤 많다. 아래는 LNK Parser를 통하여 보이는 화면을 캡처한 것으로 링크된 파일의 이름과 해당 파일의 경로, 그리고 파일의 사이즈 비교를 통하여 찾고자 했던 파일의 크기와 비교를 할 수가 있으며, 바로가기 생성시간, 접근시간, 쓰기 시간 등과 그리고 타겟 파일에 대한 타임스탬프가 존재한다. 또한 마지막으로 해당 파일이 만약 USB와 같은 외부 저장장치에서 실행이 됐다면 그 Volume Label과 해당 드라이브의 시리얼 넘버를 알 수가 있다.



    참고

    http://forensic-proof.com/archives/607


    'Forensic > Theory' 카테고리의 다른 글

    Project Spartan Forensic - Edge  (0) 2015.09.30
    윈도우 아티팩트 요소  (0) 2015.09.28
    Jump List  (0) 2015.09.27
    File System Tunneling  (0) 2015.09.23
    Web Forensic  (0) 2015.09.19