PE文件格式分析系列(文章2)----一个PE文件rdata段的分析(Win32工程Release版)(一)

来源:互联网 发布:开卷八分钟 知乎 编辑:程序博客网 时间:2024/06/06 00:11

PE文件格式分析系列(文章2)

一个PE文件rdata段的分析(Win32工程Release版)(一)

在分析MFC工程调试版的PE文件时, 导入表在idata段
而这个Win32工程Release版的PE文件, 导入表在rdata段, 并且rdata段不仅包含导入表信息,
还包含了一些常量, 例如一些字符串信息等. 下面先分析idata段.


IMAGE_DIRECTORY_ENTRY_IMPORT  (01 VirtualAddress:0x0000543C; Size:0x0000003C).rdata
OriginalFirstThunk       Name               FirstThunk    Count   StrName
0x00005514                 0x0000552A    0x0000509C  1          USER32.dll
0x00005478                 0x000057D0    0x00005000   38       KERNEL32.dll

一. 该PE文件使用了2个DLL
分别是:
1. USER32.dll
2. KERNEL32.dll

第2个段 .rdata 0x7DE(内存中实际数据大小)  0x5000(文件中位置) 0x1000(文件对齐大小)
也就是说.rdata 段在0x5000---0x6000(0x5000---0x57DE是有用数据)

Import 数据目录 RVA:543C  Size:3C
IAT 数据目录    RVA:5000  Size:A4

这次与MFC工程调试版的PE文件不同, IAT放在前面
明显看到
这是KERNEL32.dll的IAT(0x26 + 1个)
00005000 | BA 56 00 00 BE 57 00 00 |
00005008 | 36 55 00 00 4A 55 00 00 |
00005010 | 5C 55 00 00 6E 55 00 00 |
省略......
00005088 | 76 57 00 00 8C 57 00 00 |
00005090 | 9C 57 00 00 AC 57 00 00 |
00005098 | 00 00 00 00 ---------------- |
这是USER32.dll的IAT(0x1 + 1个)
00005099 | ---------------- 1C 55 00 00 |
000050A0 | 00 00 00 00                      |

紧跟在000050A4 后面的, 就是一些代码段用到的常量, 例如一些字符串, 后面再分析

现在看Import 数据目录
3个 IMAGE_IMPORT_DESCRIPTOR 结构数据
3个 0x14 * 3 = 0x3C(0x543C -- 0x5478) (第3个全0)
00005438 |                   +14 55 00 00 | 1. USER32.dll
00005440 | 00 00 00 00 00 00 00 00 |
00005448 | 2A 55 00 00 9C 50 00 00 |
00005450 |+78 54 00 00 00 00 00 00 | 2. KERNEL32.dll
00005458 | 00 00 00 00 D0 57 00 00 |
00005460 | 00 50 00 00+00 00 00 00 |
00005468 | 00 00 00 00 00 00 00 00 |
00005470 | 00 00 00 00 00 00 00 00 |
紧跟在 00005477 后面的, 就是
IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk数据
2. kernel32.dll的IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk数据
从 00005478 -- 00005510    0x26个 DWORD + 0x1个0的DWORD
00005478 | BA 56 00 00 BE 57 00 00 |
00005480 | 36 55 00 00 4A 55 00 00 |
00005488 | 5C 55 00 00 6E 55 00 00 |
省略......
000054F8 | 54 57 00 00 66 57 00 00 |
00005500 | 76 57 00 00 8C 57 00 00 |
00005508 | 9C 57 00 00 AC 57 00 00 |
00005510 | 00 00 00 00 ----------------- |
1. USER32.dll的IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk数据
从 00005518 -- 0000551C    0x1个 DWORD + 0x1个0的DWORD
00005514 | ---------------- 1C 55 00 00 |
00005518 | 00 00 00 00                      |

紧跟在 0000551C 后面的, 导入表的一些函数名字符了.
(0000551C --- 000057DC 就是一些字符信息了

00005510 | ------------------------------------------------ DC 01 4D 65 |
00005520 | 73 73 61 67 65 42 6F 78 41 00 55 53 45 52 33 32 |
00005530 | 2E 64 6C 6C 00 00 75 01 47 65 74 4D 6F 64 75 6C |
省略......
000057B0 | 74 53 74 72 69 6E 67 54 79 70 65 41 00 00 B2 01 |
000057C0 | 47 65 74 53 74 72 69 6E 67 54 79 70 65 57 00 00 |
000057D0 | 4B 45 52 4E 45 4C 33 32 2E 64 6C 6C             |

分析到这里为止, 这个分析过程和<PE文件格式分析系列(文章1)>的分析过程是一样的.
不同的地方也有:
1. 文章1中的PE文件Import和IAT数据目录在idata段, 而且idata段里面的数据就
   只是这两个目录的数据了, 没有其他数据.
   而这里的PE文件Import和IAT数据目录在rdata段, 而且rdata段里面还有其他数据.

2. 文章1中的PE文件Import数据目录的数据之间, 总是插入好多0, 我也不知道什么
   原因, 而这里的PE文件的这些数据是很紧凑的, 其他的0也只是对齐用的.
   (可能是Debug版与Release版的区别, 或者是MFC程序与Win32程序的区别缘故?)
   (文章1中的PE文件是MFC工程Debug版, 这里的PE文件是Win32工程Release版)

  
三.总结
这个PE文件rdata中的数据排列顺序:
1. IAT数据                      (00005000---000050A3)
2. 一些常量数据, 例如一些字符串 (000050A4---0000543D)
3. Import数据目录的IMAGE_IMPORT_DESCRIPTOR数据
                                (0000543C---00005477)
4. IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk数据
                                (00005478---0000551B)
5. Import数据目录的函数字符数据 (0000551C---000057DC)        


下面分析这个PE文件rdata段的常量数据(000050A4---0000543D)
000050A0 |                      00 00 00 00 |     .... |
000050A8 | FF FF FF FF 27 11 40 00 |     '.@. | 这像一个地址00401127
000050B0 | 3B 11 40 00 5F 5F 47 4C | ;.@.__GL | 0040113B 也是
000050B8 | 4F 42 41 4C 5F 48 45 41
| OBAL_HEA| 一段字符
......
000050E0 | 00 00 00 00 72 75 6E 74 | ....runt | 运行时错误?
000050E8 | 69 6D 65 20 65 72 72 6F | ime erro |
000050F0 | 72 20 00 00 0D 0A 00 00 | r ...... | .
......
00005128 | 52 36 30 32 38 0D 0A 2D | R6028..- | 好像是错误码
00005130 | 20 75 6E 61 62 6C 65 20 |  unable  | 不能初始化heap?
00005138 | 74 6F 20 69 6E 69 74 69 | to initi |
00005140 | 61 6C 69 7A 65 20 68 65 | alize he |
00005148 | 61 70 0D 0A 00 00 00 00 | ap...... |
...
00005370 | 4D 69 63 72 6F 73 6F 66 | Microsof | 哈哈, 这个很熟悉哦
00005378 | 74 20 56 69 73 75 61 6C | t Visual |
00005380 | 20 43 2B 2B 20 52 75 6E |  C++ Run |
00005388 | 74 69 6D 65 20 4C 69 62 | time Lib |
00005390 | 72 61 72 79 00 00 00 00 | rary.... |
...
000053E0 | 65 50 6F 70 75 70 00 00 | ePopup.. |
000053E8 | 47 65 74 41 63 74 69 76 | GetActiv |
000053F0 | 65 57 69 6E 64 6F 77 00 | eWindow. |
000053F8 | 4D 65 73 73 61 67 65 42 | MessageB |
00005400 | 6F 78 41 00 75 73 65 72 | oxA.user | 怎么也有user32.dll?
00005408 | 33 32 2E 64 6C 6C 00 00 | 32.dll.. |
...
00005428 | 22 3F 40 00 26 3F 40 00 |
00005430 | FF FF FF FF A6 40 40 00 |
00005438 | AA 40 40 00             |

待续...

原创粉丝点击