.rsrc 节与 resource table【转载】

原文地址www.mouseos.com-官网首页

PE 文件所有使用的 resource table 非常复杂,一个典型的 windows GUI 应用程序普遍都使用到了 7 个左右的资源。

1. windows 中的资源

WinUser.h 文件里定义了 windows 中所使用的全部资源:

/*
 * Predefined Resource Types
 */
#define RT_CURSOR           MAKEINTRESOURCE(1)
#define RT_BITMAP           MAKEINTRESOURCE(2)
#define RT_ICON             MAKEINTRESOURCE(3)
#define RT_MENU             MAKEINTRESOURCE(4)
#define RT_DIALOG           MAKEINTRESOURCE(5)
#define RT_STRING           MAKEINTRESOURCE(6)
#define RT_FONTDIR          MAKEINTRESOURCE(7)
#define RT_FONT             MAKEINTRESOURCE(8)
#define RT_ACCELERATOR      MAKEINTRESOURCE(9)
#define RT_RCDATA           MAKEINTRESOURCE(10)
#define RT_MESSAGETABLE     MAKEINTRESOURCE(11) #define DIFFERENCE     11
#define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)(RT_CURSOR) + DIFFERENCE)
#define RT_GROUP_ICON   MAKEINTRESOURCE((ULONG_PTR)(RT_ICON) + DIFFERENCE)
#define RT_VERSION      MAKEINTRESOURCE(16)
#define RT_DLGINCLUDE   MAKEINTRESOURCE(17)
#if(WINVER >= 0x0400)
#define RT_PLUGPLAY     MAKEINTRESOURCE(19)
#define RT_VXD          MAKEINTRESOURCE(20)
#define RT_ANICURSOR    MAKEINTRESOURCE(21)
#define RT_ANIICON      MAKEINTRESOURCE(22)
#endif /* WINVER >= 0x0400 */
#define RT_HTML         MAKEINTRESOURCE(23)
#ifdef RC_INVOKED
#define RT_MANIFEST                        24
#define CREATEPROCESS_MANIFEST_RESOURCE_ID  1
#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3
#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1   /* inclusive */
#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16  /* inclusive */
#else  /* RC_INVOKED */
#define RT_MANIFEST                        MAKEINTRESOURCE(24)
#define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE( 1)
#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2)
#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3)
#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE( 1 /*inclusive*/)
#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(16 /*inclusive*/)

在 MSDN 上面有一篇文关于 resource types 的介绍:http://msdn.microsoft.com/en-us/library/ms648009(VS.85).aspx

2. .rsrc 节

.rsrc 节装载整个 resouce table 结构和资源的数据,下面是 helloworld.exe 中的 .rsrc 节的信息

.rsrc 节
VirtualSize0x0000E71C
VirtualAddress0x00019000
SizeOfRawData0x0000E800
PointerToRawData0x00006C00
PointerToRelocations0
PointerToLinenumbers0
NumberOfRelocations0
NumberOfLinenumbers0
Characteristics0x40000040

.rsrc 被加载在 0x00419000(ImageBase + VirtualAddress)上,真实的大小为 0xE71C,这是一个很庞大的数据段,它在 image 文件的位置是 0x0006C00,占用文件的 0xE800 空间

3. resource table

下面是 helloworld.exe 中所使用的 resource table 信息,它是一个 IMAGE_DATA_DIRECTORY 结构

resource table
VirtualAddress0x00019000
size0xE71C

可以看出,resource table 就在 .rsrc 节里,它们的 size 都是一样的。

这个 resouce table 共有 0xE71C bytse,这是一个恐怖的表格,占用大量的空间,所以这个 resource table 是一棵茂密的大树。

下面继续探索整个 resource table 的结构。

4. resource table 的整体结构

整个 resource table 由 4 个结构组成:

  • IMAGE_RESOURCE_DIRECTORY 结构
  • IMAGE_RESOURCE_DIRECTORY_ENTRY 结构
  • IMAGE_RESOURCE_DIRECTORY_STRING 结构,或者说是:IMAGE_RESOURCE_DIR_STRING_U 结构
  • IMAGE_RESOURCE_DATA_ENTRY 结构

整个 resource 结构是一个树型结构,只有一个 root(根)节点,然后长出许多的树枝,最后是叶子。

根部和每个树技是一个节点,这个节点由 IMAGE_RESOURCE_DIRECTORY 结构和 IMAGE_RESOURCE_DIRECTORY_ENTRY 结构组成

IMGE_RESOURCE_DIRECTORY_STRINGIMAGE_RESOURCE_DIR_STRING_U)结构和 IMAGE_RESOURCE_DATA_ENTERY 都是整个 资源树 末端的 叶子

5. 节点的构成

前面说到资源树的节点由 IMAGE_RESOURCE_DIRECTORYIMAGE_RESOURCE_DIRECTORY_ENTRY 构成,它们是怎样组成一个节点的呢?

由 Directory(IMAGE_RESOURCE_DIRECTORY) 指出有多少个 Entry (IMAGE_RESOURCE_DIRECTORY_ENTRY) 然后每个 Entry 再伸延出一个 Directory 或者指出最终的 Data(数据)

事实上 Directory 和 Entry 虽然是两个结构,但它们是一个整体,不存在单独出现的情况

5.1 Driectory(目录)

WinNT.h 文件里定义了这个 Directory 结构:

typedef struct _IMAGE_RESOURCE_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    WORD    NumberOfNamedEntries;
    WORD    NumberOfIdEntries;
//  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

这个结构里的 Characteristics, MajorVersion 以及 MinorVersion 一直为 0 不使用

NumberOfNamedEntries 代表一个数量,以 "Name" 作为子树的个数。

NumberOfIdEntries 代表一个数量,以 "ID" 作为子树的个数。

而 Directory 引出的 Entry 数量是 NumberOfNamedEntries 与 NumberOfIdEntries 之和,即:NumberOfNamedEntries + NumberOfIdEntries 等于 Entry 的数量

Entry 是紧接着 Driectory 存放的。

5.2 Entry(表项)

WinNT.h 文件中,Entry 结构的定义为:

typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
    union {
        struct {
            DWORD NameOffset:31;
            DWORD NameIsString:1;
        } DUMMYSTRUCTNAME;
        DWORD   Name;
        WORD    Id;
    } DUMMYUNIONNAME;
    union {
        DWORD   OffsetToData;
        struct {
            DWORD   OffsetToDirectory:31;
            DWORD   DataIsDirectory:1;
        } DUMMYSTRUCTNAME2;
    } DUMMYUNIONNAME2;
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

这个结构看上去很复杂,实际上它成员只有 两个 DWORD 成员 ,共 8 bytes,如下:

 typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
    DWORD Name;
    DWORD OffsetToData;
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

使用这个看上去很复杂方式定义,它想表达一个策略:

  • Name 的高最位(Bit31)为 1 时: Name[30:0](低 31 位)是一个 offset 指向 IMAGE_RESOURCE_DIR_STRING_U 结构。
    Bit310 时,Name 表示一个 ID 值。
  • OffsetToData 的最高位(Bit31)为 1 时:OffsetToData[30:0](低 31 位)是一个 offset 指向下一个 Directory 结构。
    Bit310 时,OffsetToData 仍然是一个 Offset 值,它指向一个 IMAGE_RESOURCE_DATA_ENTRY 结构。

Entry 的职责是给出下一个 DirectoryData,从资源树的角度来看,Entry 要么给出下一个节点,要么给出叶子

5.2.1 给出下一个 Directory

此时 Name 是一个 ID 值(即:Bit31 为 0),同时 OffsetToData 指向下一个 Directory 的位置(即:Bit31 为 1)

OffsetToData 提供的这个 Offset 值是基于 resource table 的,例如下面的一个 Entry 是这样的:

// entry[0]
00419010  03 00 00 00     // Name = 0x03 ====> ID = 3 (ICON)
00419014  48 00 00 80     // OffsetToData = 0x80000048

上例上所示,Name 此时表示一个 ID 值(Bit31 为 0),而 OffsetToDataBit31 为 1,此时它提供一个 offset 指向下一个 Directory 的位置。

在这个例子里,resource table 的位址是在 0x00419000,那么下一个 Directory 就在 0x00419048resource table + OffsetToData)位置上。

5.2.2 给出 Data 数据

OffsetToData 的 Bit31 为 0,它指向一个 IMAGE_RESOURCE_DATA_ENTRY 结构,从树的解度来看,它给出一个叶子。下面是个例子:

// Entry[0]
00419180  09 04 00 00                    // ID = 0x409
00419184  98 03 00 00                    // ****** IMAGE_RESOURCE_DATA_ENTRY: 0x00000398

此时 OffsetToData 提供的是 Data (IMAGE_RESOURCE_DATA_ENTRY) 位置,同样这个 Offset 也是基于 resource table 的地址。

那么这个 Data 数据区域在:0x00419398

5.3 节点图​

Entry 紧跟着 Directory 存放,它们构成一个节点,Directory 的 NumberOfIdEntries 给出 Entry 的个数 7,那么紧跟着的 Entry 就有 7 个。 每个 Entry 是一个 IMAGE_RESOURCE_DIRECTORY_ENTRY 结构。

那么该节点大小就有 1IMAGE_RESOURCE_DIRECTORY 结构和 7IMAGE_RESOURCE_DIRECTORY_ENTRY 结构,每个节点的大小可能是不相同。

5.4 root 节点

root(根)节点是 resource table 的第 1 个节点,root 就在 resource table 位置上。

helloworld.exe 为例,它的 resource table 在 0x00419000(ImageBase + VirtualAddress),下面是它的 root 节点:

// Driectory: (root)
00419000  00 00 00 00
00419004  00 00 00 00
00419008  00 00
0041900A  00 00
0041900C  00 00            // NumberOfNameEntries
0041900E  07 00            // NumberOfIdEntries // entry[0]
00419010  03 00 00 00     // ID = 3 (ICON)
00419014  48 00 00 80     // OffsetToData = 0x80000048 // entry[1]
00419018  04 00 00 00     // ID = 4 (MENU)
0041901C  D8 00 00 80     // OffsetToData = 0x800000D8 // entry[2]
00419020  05 00 00 00     // ID = 5 (DIALOG)
00419024  F0 00 00 80     // OffsetToData = 0x800000F0 // entry[3]
00419028  06 00 00 00     // ID = 6 (STRING)
0041902C  08 01 00 80     // OffsetToData = 0x80000180
// entry[4]
00419030  09 00 00 00     // ID = 9 (ACCELERATOR)
00419034  20 01 00 80     // OffsetToData = 0x80000120 // entry[5]
00419038  0E 00 00 00     // ID = 0E (GROUP_ICON)
0041903C  38 01 00 80     // OffsetToData = 0x80000138
// entry[6]
00419040  18 00 00 00     // ID = 0x18 (MAINFEST)
00419044  58 01 00 80     // OffsetToData = 0x80000158

它有 7 个 Entry,每个 Entry 代表一个资源,由 Name(ID 值) 域得到,每个资源伸延出各自的资源树,这些 ID 值代表一个资源,也就是前面的 WinUser.h 文件定义的常量值,每个 Entry 的 OffsetToData 值都指向各自的下一个 Directory

6. 叶子(Data/String)

资源树最终都要落在未端的叶子上,叶子两类结构表示:DataString,它们由 Entry 引出。

6.1 Data Entry

Data 数据区域Data Entry 指出,这个 Data Entry 结构在 WinNT.h 定义为:

typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
    DWORD   OffsetToData;
    DWORD   Size;
    DWORD   CodePage;
    DWORD   Reserved;
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

Data Entry 的职责是指出最终的 resource table 中的数据,由 OffsetToData 指出,这个 OffsetToData 是个 RVA 值,基于 ImageBase。数据区的大小由 Size 得出

在资源树的未端 Resource Directory Entry 给出 Data Entry,再由 Data Entry 得到 Data 区域。

6.2 Resource Directory String

Resource Directory 的名字包含在 String 结构里,这个结构在 WinNT.h 定义为:

typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
    WORD    Length;
    CHAR    NameString[ 1 ];
} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
    WORD    Length;
    WCHAR   NameString[ 1 ];
} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;

Directory String 里包含的是 Unicode 码,因此,Directory Entry 始终指向 IMAGE_RESOURCE_DIR_STRING_U 结构, 它和 IMAGE_RESOURCE_DIRECTORY_STRING 的区别是一个是 ASCII,一个是 Unicode

NameString 是不定长的,用来表示 Directory 的名字,如:ICON 资源 Directory

6.3 两种分枝

Data 与 String 不可能共同在同一个 Directory 树中:

  • Data 树由 Directory Entry 中 OffsetToData 指出
  • String 树由 Directory Entry 中 Name 指出

这种分枝的策略是区别是:

一个用 ID 来标识资源 一个用 String 名字来标资源

6.3.1 Data 树

root 节点的 Entry 中,当 OffsetToData 的 Bit31 为 1 时,由该 Entry 伸出的是 Data 树,此时由该 Entry 指向树分枝中的所有 Entry 的 Name 都是 ID 值,

再回过头来看一看 hellworld.exeroot 节点 :

// Driectory: (root)
00419000  00 00 00 00
00419004  00 00 00 00
00419008  00 00
0041900A  00 00
0041900C  00 00            // NumberOfNameEntries
0041900E  07 00            // NumberOfIdEntries // entry[0]
00419010  03 00 00 00     // ID = 3 (ICON)
00419014  48 00 00 80     // OffsetToData = 0x80000048 // entry[1]
00419018  04 00 00 00     // ID = 4 (MENU)
0041901C  D8 00 00 80     // OffsetToData = 0x800000D8 // entry[2]
00419020  05 00 00 00     // ID = 5 (DIALOG)
00419024  F0 00 00 80     // OffsetToData = 0x800000F0 // entry[3]
00419028  06 00 00 00     // ID = 6 (STRING)
0041902C  08 01 00 80     // OffsetToData = 0x80000180
// entry[4]
00419030  09 00 00 00     // ID = 9 (ACCELERATOR)
00419034  20 01 00 80     // OffsetToData = 0x80000120 // entry[5]
00419038  0E 00 00 00     // ID = 0E (GROUP_ICON)
0041903C  38 01 00 80     // OffsetToData = 0x80000138
// entry[6]
00419040  18 00 00 00     // ID = 0x18 (MAINFEST)
00419044  58 01 00 80     // OffsetToData = 0x80000158

上面的 root 节点长出 7 个分枝,每个分枝都由 Entry 指出,7 个分枝的 Entry 的 Name 都是 ID 值

因此 helloworld.exe 资源树中所有分枝都是 Data 树,它不存在 String 树

6.3.2 String 树

当 root 节点的 Entry 中 Name 域 Bit31 为 1 时,Name 指向 String,这个 String 标识整个分枝,由这个 Entry 长出来的树枝都是 String 树

事实上,对一个 windows 典型资源几乎都是用 ID 来标识,而不是用 String 来标识。

7. 追踪 helloworld.exe 的资源树中的一条分枝

现在我们从 root 节点开始到末端的叶子,来看一看 helloworld.exe 的一条分枝情况:

(1)root 节点

// Driectory: (root)
00419000  00 00 00 00
00419004  00 00 00 00
00419008  00 00
0041900A  00 00
0041900C  00 00            // NumberOfNameEntries
0041900E  07 00            // NumberOfIdEntries // entry[0]
00419010  03 00 00 00     // ID = 3 (ICON)
00419014  48 00 00 80     // OffsetToData = 0x80000048

它的第 1 个分枝是 Data 分枝,ID = 3 它是一个 ICON 资源分枝树,下一个节点在 0x00419048 (0x00419000 + 0x00000048)

(2)下一个节点


// Directory
00419048  00 00 00 00
0041904C  00 00 00 00
00419050  00 00
00419052  00 00
00419054  00 00            // NumberOfNameEntries
00419056  10 00            // NumberOfIdEntries
// Entry[0]
00419058  01 00 00 00      // ID = 01
0041905C  70 01 00 80      // OffsetToData = 0x80000170 00419060  02 00 00 00      // ID = 02
00419064  88 01 00 80      // OffsetToData = 0x80000188 00419068  03 00 00 00      // ID = 03
0041906C  A0 01 00 80      // OffsetToData = 0x800001A0 00419070  04 00 00 00
00419074  B8 01 00 80 00419078  05 00 00 00
0041907C  D0 01 00 80 00419080  06 00 00 00
00419084  E8 01 00 80 00419088  07 00 00 00
0041908C  00 02 00 80 00419090  08 00 00 00
00419094  18 02 00 80 00419098  09 00 00 00
0041909C  30 02 00 80 004190A0  0A 00 00 00
004190A4  48 02 00 80 004190A8  0B 00 00 00
004190AC  60 02 00 80 004190B0  0C 00 00 00
004190B4  78 02 00 80 004190B8  0D 00 00 00
004190BC  90 02 00 80 004190C0  0E 00 00 00
004190C4  A8 02 00 80 004190C8  0F 00 00 00
004190CC  C0 02 00 80 // Entry[15]
004190D0  10 00 00 00
004190D4  D8 02 00 80

在这个节点中,有 16 个 Entry,也一个庞大的分枝。我们只看第 1 个分枝情况:

  • ID = 01
  • OffsetToData = 0x80000170

说明再下一个节点在 0x00419170 位置上,它的 ID 值为 1,这些 Entry 的排列顺序是以 ID 值升序排列的。在子树里的 ID 值并没什么意义,只有在 root 节点里的 ID 里才代表着资源类型。

(3)再下一个节点

// Directory
00419170  00 00 00 00
00419174  00 00 00 00
00419178  00 00
0041917A  00 00
0041917C  00 00
0041917E  01 00 // Entry[0]
00419180  09 04 00 00                    // ID = 0x409
00419184  98 03 00 00                    // ****** IMAGE_RESOURCE_DATA_ENTRY: 0x00000398

这个节点里只有 1 个 Entry,这个 Entry 的 OffsetToData 值是 0x00000398,那么它指向 Data Entry 而不是下一个节点。它个 Data Entry 位置在 0x00419398

(4)它的 Data Entry

// IMAGE_RESOURCE_DATA_ENTRY
00419398  A8 98 01 00           // OffsetToData = 0x000198A8
0041939C  E8 02 00 00           // Size = 0x02E8
004193A0  00 00 00 00           // Codepage
004193AC  00 00 00 00           // Reserved

最终的 Data 数据区在 0x000198A8,注意这个值是基于 ImageBase 的,而不是基于 resource table,因此 Data 数据区在映像的 0x004198A8ImageBase + OffsetToData

(5)Data 数据区

下面摘取一部分数据:

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 004198A0                          28 00 00 00 20 00 00 00         .(... ...
004198B0  40 00 00 00 01 00 04 00 00 00 00 00 00 00 00 00  @...............
004198C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
004198D0  00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00  ......€..€...€€.
004198E0  80 00 00 00 80 00 80 00 80 80 00 00 80 80 80 00  €...€.€.€€..€€€.
004198F0  C0 C0 C0 00 00 00 FF 00 00 FF 00 00 00 FF FF 00  ààà...?..?...??.
00419900  FF 00 00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00  ?...?.?.??..???.
00419910  AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA  aaaaaaaaaaaaaaaa
00419920  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00419930  77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 70  wwwwwwwwwwwwwwwp
00419940  78 88 88 88 88 88 88 88 88 88 88 88 88 88 88 70  x??????????????p
00419950  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419960  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419970  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419980  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419990  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
004199A0  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
004199B0  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
004199C0  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
004199D0  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
004199E0  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
004199F0  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A00  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A10  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A20  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A30  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A40  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A50  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A60  78 7F FF FF FF FF FF FF FF FF FF FF FF FF F8 70  x.?????????????p
00419A70  78 77 77 77 77 77 77 77 77 77 77 77 77 77 78 70  xwwwwwwwwwwwwwxp
00419A80  78 88 88 88 88 88 88 88 88 88 88 88 88 88 88 70  x??????????????p
00419A90  78 44 44 44 44 44 44 44 44 44 40 00 00 00 00 70  xDDDDDDDDD@....p
00419AA0  78 44 44 44 44 44 44 44 44 44 48 80 88 08 80 70  xDDDDDDDDDH€?.€p
00419AB0  78 44 44 44 44 44 44 44 44 44 48 80 88 08 80 70  xDDDDDDDDDH€?.€p
00419AC0  78 44 44 44 44 44 44 44 44 44 44 44 44 44 44 70  xDDDDDDDDDDDDDDp
00419AD0  78 88 88 88 88 88 88 88 88 88 88 88 88 88 88 70  x??????????????p
00419AE0  77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 70  wwwwwwwwwwwwwwwp
00419AF0  AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA  aaaaaaaaaaaaaaaa

这个数据组成特定的数据格式。:) ​

未经允许禁止转载~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇