• Windows快捷方式文件格式解析



    大家知道通过IShellLink接口可以得到快捷方式的各种属性。具体怎么做,网上有很多文章,这里就不介绍了。现在主要是分析一下快捷方式文件的格式,并且自己写一个解析程序。
    为了方便大家理解,解说完每个段后附上一个快捷方式对应部分的事例数据并附内容解说。这里以Windows Media Player在桌面上的快捷方式为例。

    一、文件的整体结构


    二、文件头

    文件头结构,参照下面表格:

    Offset

     Size/Type

     Description

    0h

    1 dword

    值常为0000004CH,为字符"L"

    4h

    16 bytes

    GUID

    14h

    1 dword

    Flags,用来标识快捷方式文件中有哪些可选属性,后面有表单独解释每一位的意义。

    18h

    1 dword

    目标文件属性,后面解释。

    1ch

    1 qword

    文件创建时间

    24h

    1 qword

    文件修改时间

    2ch

    1 qword

    文件最后一次访问时间

    34h

    1 dword

    目标文件长度

    38h

    1 dword

    自定义图标个数,

    3ch

    1 dword

    目标文件执行时窗口显示方式:
    1
    正常显示
    2
    最小化
    3
    最大化

    40h

    1 dword

    热键

    44h

    2 dword

    暂时还不清楚用途值常为0

     
    偏移14h开始的标志标示有哪些可选属性,见下表:

    Bit

    所在位为1时表示

    0

    shell item id list

    1

    指向文件或文件夹,如果此位为0表示指向其他。

    2

    存在描述字符串

    3

    存在相对路径

    4

    存在工作路径

    5

    存在命令行参数

    6

    存在自定义图标

    偏移18h开始的目标文件属性: 

    Bit

    所在位为1时表示

    0

    快捷方式所指目标文件有只读属性

    1

    快捷方式所指目标文件有隐藏属性

    2

    快捷方式所指目标文件是系统文件

    3

    快捷方式所指目标是卷标

    4

    快捷方式所指目标是文件夹

    5

    快捷方式所指目标文件上次存档后被改变过

    6

    快捷方式所指目标文件被加密

    7

    快捷方式所指目标文件属性为一般

    8

    快捷方式所指目标文件为临时

    9

    快捷方式所指目标文件为稀疏文件(sparse file

    10

    快捷方式所指目标文件有重分析点数据(reparse point

    11

    快捷方式所指目标文件被压缩

    12

    快捷方式所指目标文件脱机


    例:

    偏移       数据             解释

    0000    4c 00 00 00       字符"L"

    0004    01 14 02 00       快捷方式的GUID。值固定

             00 00 00 00

             C0 00 00 00

             00 00 00 46

    0014    8F 00 00 00      flags。对照表可知

                                  shell item id list

                                  目标是文件

                                  存在描述字符串

                                  存在相对路径

    0018    20 00 00 00     文件属性,具体内容可以查上面的属性说明表

    001C    40 51 0A 0C      文件创建时间

            AD CB C4 01

    0024    C4 D8 A5 91     文件修改时间

            AD CB C4 01

    002C    00 33 16 74       文件最后一次访问时间

            F6 C7 C3 01

    0034    00 20 01 00       文件长度

    0038    00 00 00 00       自定义图标个数

    003C   01 00 00 00       打开时窗口为normal状态

    0040    00 00 00 00       热键

    0044    00 00 00 00       暂时还不清楚用途值常为0

            00 00 00 00

    三、Shell item ID list
      当文件头中1的第0位置位时才有。第一个unsigned short integer表示item ID list段的总长度。后面紧跟着SHITEMID结构。SHITEMID的定义如下:

        typedef struct _SHITEMID {

            USHORT cb;

            BYTE   abID[0];

        } SHITEMID, * LPSHITEMID;

      cb保存SHITEMID结构的大小。abID是可变长度的对象标识。具体都是什么含义没看明白,可以参阅MSDN。因为item ID list段的开始为这个段的总长度,所以在读取的时候可以把此段跳过不做处理!!:)

    例:(文件头段的flags标志显示存在shell item id list段)

    偏移       数据            解释

    004C    9c 00            item ID list总长度(下一段的起始地址为004E+009C=00EA

    004E    14 00           第一个item ID的长度

    0050    1F 50 E0 4F      第一个item ID标示内容

            D0 20 EA 3A

            69 10 A2 D8

            08 00 2B 30

            30 9D

    0062    19 00             第二个item ID的长度

    0064    23 43 3A 5C       第二个item ID标示内容

            00 00 00 00

            00 00 00 00

            00 00 00 00

            00 00 00 00

            00 F1 93

    007B    25 00

    007D    31 00 00 00

            00 00 70 31

            47 3B 31 00

            50 72 6F 67

            72 61 6D 20

            46 69 6C 65

            73 00 50 52

            4F 47 52 41

            7E 31 00

    00A0    2C 00

    00A2    31 00 00 00

            00 00 70 31

            47 3B 10 00

            57 69 6E 64

            6F 77 73 20

            4D 65 64 69

            61 20 50 6C

            61 79 65 72

            00 57 49 4E

            44 4F 57 7E

            32 00

    00CC    1C 00

    00CE    32 00 00 20

            01 00 95 2F

            A1 99 20 00

            77 6D 70 6C

            61 79 65 72

            2E 65 78 65

            00 00

    00E8    00 00                 item ID list段结束

    四、文件位置信息段
      开始的一个long integer表示此段的总长度,当文件头中1的第1位没有置位时表示既不是文件也不是文件夹,所以这个信息没有意义,所以总长度为0。先让我们看一下这个段的头:
     

    Offset

     Size/Type

     Description

    0h

    1 dword

    此段的总长度

    4h

    1 dword

    头结构长度,固定为1ch

    8h

    1 dword

    Flags指示文件在哪些卷有效,这里只用到低两位,第一位置位表示本地卷有效,反之无效。第二位置位表示网络卷有效,反之无效。

    ch

    1 dword

    本地卷信息表的偏移(固定1ch

    10h

    1 dword

    本地路径信息的偏移

    14h

    1 dword

    网络卷信息表的偏移

    18h

    1 dword

    附加信息的偏移

    如果文件在本地卷,那么文件名为:本地路径信息+附加信息
    如果文件在网络卷,那么文件名为:网络卷信息中的共享名+附加信息

    紧跟在段头后面的是本地卷信息表(段内偏移为1ch),结构如下:

    Offset

     Size/Type

     Description

    0h

    1 dword

    本地卷信息表的长度

    4h

    1 dword

    卷类型:
    0 Unknown
    1 No root directory
    2 Removable (Floppy, Zip, etc..)
    3 Fixed (Hard disk)
    4 Remote (Network drive)
    5 CD-ROM
    6 Ram drive (Shortcuts to stuff on a ram drive, now that''s smart...)

    8h

    1 dword

    卷序列号

    ch

    1 dword

    固定长度部分的大小,固定为10h

    10h

    可变长度

     卷标签

    然后是本地路径信息串段内偏移决定于10h的值。

    再往后就是网络卷信息表段内偏移决定于14h的值。结构如下:

    Offset

     Size/Type

     Description

    0h

    1 dword

    网络卷信息表的长度

    4h

    1 dword

    固定为2h

    8h

    1 dword

    固定长度部分的大小,固定为14h

    ch

    1 dword

    固定为0h

    10h

    1 dword

    固定为20000h

    14h

    可变长度

    网络共享名


    最后是附加信息串段内偏移决定于18h的值 例:

    偏移      数据             解释

    段头

    00EA    67 00 00 00     文件位置信息段总长度

    00EE    1C 00 00 00     段头长度,固定为1ch

    00F2    01 00 00 00     本地卷

    00F6    1C 00 00 00     本地卷信息表的段内偏移

    00FA    33 00 00 00     本地路径信息的偏移

    00FE    00 00 00 00     网络卷信息表的偏移

    0102    66 00 00 00     附加信息的偏移

    本地卷信息表

    0106    17 00 00 00     表长度

    010A    03 00 00 00     Fixed (Hard disk)

    010E    AD C9 B2 F0     卷序列号

    0112    10 00 00 00     固定为10h

    0116    73 79 73 74     卷标"system"

            65 6D 00

    本地路径信息串

    011D    43 3A 5C 50 C:\Program Files\Windows Media Player\wmplayer.exe

            72 6F 67 72

            61 6D 20 46

            69 6C 65 73

            5C 57 69 6E

            64 6F 77 73

            20 4D 65 64

            69 61 20 50

            6C 61 79 65

            72 5C 77 6D

            70 6C 61 79

            65 72 2E 65

            78 65 00

      网络卷信息表 因为段头里flags指示仅为本地卷,并且网络卷信息表的偏移值为零。所以不存在网络卷信息表。
    |
    附加信息串

    0150    00

    五、描述字符段
      当文件头中1的第2位置位时才有。开始的一个unsigned short int表示描述字符串的长度(描述字符为Unicode字符,所以字节数需乘以2,可以使用API函数WideCharToMultiByte将其转换成ANSI字符)。后面为内容。例:

    偏移       数据             解释

    0151    20 00        描述字符长度

    0153    AD 64 3E 65

            70 65 57 5B

            92 5A 53 4F

            0C FF 05 53

            EC 62 F3 97

            50 4E 01 30

            C6 89 91 98

            01 30 43 00

            44 00 20 00

            8C 54 20 00

            49 00 6E 00

            74 00 65 00

           72 00 6E 00

            65 00 74 00

            20 00 35 75

            F0 53 02 30

      转换成ANSI字符为"播放数字媒体,包括音乐、视频、CD Internet 电台。

    六、相对路径段
      当文件头中1的第3位置位时才有。同描述字符段一样开始的一个unsigned short int表示相对路径字符串的长度。后面为内容。 例:

    偏移       数据             解释

    0193    38 00         相对路径字符长度

    0195    2E 00 2E 00

            5C 00 2E 00

            2E 00 5C 00

            2E 00 2E 00

            5C 00 50 00

            72 00 6F 00

            67 00 72 00

            61 00 6D 00

            20 00 46 00

            69 00 6C 00

            65 00 73 00

            5C 00 57 00

            69 00 6E 00

            64 00 6F 00

            77 00 73 00

            20 00 4D 00

            65 00 64 00

            69 00 61 00

            20 00 50 00

            6C 00 61 00

            79 00 65 00

            72 00 5C 00

            77 00 6D 00

            70 00 6C 00

            61 00 79 00

            65 00 72 00

            2E 00 65 00

            78 00 65 00

    转换成ANSI字符为"..\..\..\Program Files\Windows Media Player\wmplayer.exe"

    七、工作目录段 同上。

    例:因为文件头中1flags的第四位没有置位,所以此段不存在

    八、 命令行段 同上。

    例:因为文件头中1flags的第五位没有置位,所以此段不存在

    九、图标文件段 同上。

    例:因为文件头中1flags的第六位没有置位,所以此段不存在

    十、 附加信息段 具体信息不清楚!!!!!

      以上很多资料来自网上,并不是微软文档,所以难免有理解错误的地方,请包含。所附代码只是为了跟踪显示,没有输出,嘿嘿,自己改改看吧!!:)有兴趣可以自己写一个类,分析快捷方式的所有信息。

  • 相关阅读:
    AI
    CentoOS6.6安装netcat
    ip防刷脚本
    php git pull
    冥想_ PHP抽奖程序概率算法
    如何在CentOS配置Apache的HTTPS服务
    C++ 用RGB 三种颜色绘图
    Linux Vsftpd 连接超时解决方法(被动模式)
    js 函数返回函数
    模拟jquery的$()选择器的实现
  • 原文地址:https://www.cnblogs.com/ahuo/p/579503.html
Copyright © 2020-2023  润新知