如何计算PE头注入时目标字符串的偏移?(Hiew环境)
PE头注入代码:DX寄存器的字符串偏移计算与Hiew操作步骤
核心逻辑
如果是用DOS中断int 21h (AH=09h)输出字符串,必须让DS:DX指向字符串的内存首地址。你把字符串写到.data节后,不能直接用文件偏移填DX,得先算出PE加载后字符串的内存段偏移,再硬编码到指令里。
Hiew具体操作步骤
- 获取.data节的RVA
打开目标PE文件,按F8切到PE头视图,找到.data节的Virtual Address值(比如00001000),记下来。 - 获取字符串的节内偏移
按F3切到十六进制编辑视图,按F5输入刚才的RVA,Hiew会定位到.data节在文件中的起始位置。找到你写入的字符串,算它到.data节开头的字节数(比如00000020),这就是节内偏移。 - 计算字符串的内存段偏移
- PE默认加载基地址是
00400000(32位程序),加上.data节的RVA,得到.data节的内存起始地址:00400000 + 00001000 = 00401000 - 加上字符串的节内偏移,得到字符串的完整内存地址:
00401000 + 00000020 = 00401020 - 转成16位段:偏移格式:
0040:1020(因为0040h * 16 + 1020h = 00401020h)
- PE默认加载基地址是
- 注入代码到PE头(DOS Stub)
按F3进入编辑模式,写入以下机器码(对应汇编指令):B8 40 00→mov ax, 0040h(设置DS段寄存器)8E D8→mov ds, axBA 20 10→mov dx, 1020h(填字符串的偏移值)B4 09→mov ah, 09h(指定int21h的输出功能)CD 21→int 21h(调用DOS中断)
- 验证字符串结尾
确保你的字符串最后是$字符,因为int 21h AH=09h要求用$作为字符串结束标记,否则会输出乱码。
常见坑点排查
- 别把文件偏移直接填DX:PE加载后节会按
Section Alignment对齐,文件偏移和内存偏移不是一回事。 - 检查DS寄存器:如果DOS Stub执行时DS不是指向PE加载基地址的段,必须手动设置,否则DX偏移会指向错误地址。
- Hiew编辑后要按
F9保存,再按F10退出。
内容的提问来源于stack exchange,提问作者Ruslan Valerievich
相关产品推荐
相关产品推荐

