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

本文深入分析了一个Win32 Release版PE文件的rdata段,探讨了其中包含的VC++运行时错误信息如R6028等的含义和用途。这些错误信息在代码段中未直接引用,而是通过全局变量rterrs间接使用,rterrs存储在data段而非rdata段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

下面分析这个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...... |
00005150 | 52 36 30 32 37 0D 0A 2D | R6027..- |
00005158 | 20 6E 6F 74 20 65 6E 6F |  not eno |
00005160 | 75 67 68 20 73 70 61 63 | ugh spac |
00005168 | 65 20 66 6F 72 20 6C 6F | e for lo |
00005170 | 77 69 6F 20 69 6E 69 74 | wio init |
00005178 | 69 61 6C 69 7A 61 74 69 | ializati |
00005180 | 6F 6E 0D 0A 00 00 00 00 | on...... |
00005188 | 52 36 30 32 36 0D 0A 2D | R6026..- |
00005190 | 20 6E 6F 74 20 65 6E 6F |  not eno |
00005198 | 75 67 68 20 73 70 61 63 | ugh spac |
000051A0 | 65 20 66 6F 72 20 73 74 | e for st |
000051A8 | 64 69 6F 20 69 6E 69 74 | dio init |
000051B0 | 69 61 6C 69 7A 61 74 69 | ializati |
000051B8 | 6F 6E 0D 0A 00 00 00 00 | on...... |
000051C0 | 52 36 30 32 35 0D 0A 2D | R6025..- |
000051C8 | 20 70 75 72 65 20 76 69 |  pure vi |
000051D0 | 72 74 75 61 6C 20 66 75 | rtual fu |
000051D8 | 6E 63 74 69 6F 6E 20 63 | nction c |
000051E0 | 61 6C 6C 0D 0A 00 00 00 | all..... |
000051E8 | 52 36 30 32 34 0D 0A 2D | R6024..- |
...
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             |

分析过程如下:
OD反汇编了一下代码段, 看到一些指令
00401055  |.  68 A8504000   PUSH OFFSET 004050A8  ; FF FF FF FF
00401B0B  |.  68 B4504000   PUSH OFFSET 004050B4  ; |Arg1 = ASCII "__GLOBAL_HEAP_SELECTED"
00401ACC  |.  68 CC504000   PUSH OFFSET 004050CC  ; |Name = "__MSVCRT_HEAP_SELECT"
00401F46  |.  68 70534000   PUSH OFFSET 00405370  ; ASCII "Microsoft Visual C++ Runtime Library"
00401F1E  |.  68 98534000   PUSH OFFSET 00405398     ; ASCII ""
00401F00  |.  68 9C534000   PUSH OFFSET 0040539C     ; ASCII "Runtime Error! Program: "
00401EEC  |.  68 B8534000   PUSH OFFSET 004053B8     ; ASCII "..."
00401EAA  |.  68 BC534000   PUSH OFFSET 004053BC     ; ASCII "<program name unknown>"
00403C11  |.  68 D4534000   PUSH OFFSET 004053D4      ; /Procname = "GetLastActivePopup"
00403C09  |.  68 E8534000   PUSH OFFSET 004053E8     ; /Procname = "GetActiveWindow"
00403BF8  |.  68 F8534000   PUSH OFFSET 004053F8      ; /Procname = "MessageBoxA"
00403BE1  |.  68 04544000   PUSH OFFSET 00405404     ; /FileName = "user32.dll"
00403DB5  |.  68 10544000   PUSH OFFSET 00405410     ; |Src
00403D94  |.  68 14544000   PUSH OFFSET 00405414      ; |Src = ""
00403D63  |.  68 18544000   PUSH OFFSET 00405418
00403FB2  |.  68 30544000   PUSH OFFSET 00405430

看到了吗? 看看PUSH后面的地址, 就是对应了rdata段的位置的地址, 对应了响应的字符.
但是找不到 R6028, R6027, R6026, ...在哪里有使用.


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...... |

其实这个Win32工程就只是一个只有WinMain函数的工程, 为什么会有这么多其他的东西的呢?
很明显, 这些字符常量是VC帮我们加的, WinMain函数并不是PE的入口点.

在VC的安装目录C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC
搜索"<program name unknown>", 找到了对应的代码在文件CRT0MSG.C中:
void __cdecl _NMSG_WRITE (int rterrnum)
{
        int tblindx;
        DWORD byte

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值