You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算PE头注入时目标字符串的偏移?(Hiew环境)

PE头注入代码:DX寄存器的字符串偏移计算与Hiew操作步骤

核心逻辑

如果是用DOS中断int 21h (AH=09h)输出字符串,必须让DS:DX指向字符串的内存首地址。你把字符串写到.data节后,不能直接用文件偏移填DX,得先算出PE加载后字符串的内存段偏移,再硬编码到指令里。

Hiew具体操作步骤

  1. 获取.data节的RVA
    打开目标PE文件,按F8切到PE头视图,找到.data节的Virtual Address值(比如00001000),记下来。
  2. 获取字符串的节内偏移
    按F3切到十六进制编辑视图,按F5输入刚才的RVA,Hiew会定位到.data节在文件中的起始位置。找到你写入的字符串,算它到.data节开头的字节数(比如00000020),这就是节内偏移。
  3. 计算字符串的内存段偏移
    • PE默认加载基地址是00400000(32位程序),加上.data节的RVA,得到.data节的内存起始地址:00400000 + 00001000 = 00401000
    • 加上字符串的节内偏移,得到字符串的完整内存地址:00401000 + 00000020 = 00401020
    • 转成16位段:偏移格式:0040:1020(因为0040h * 16 + 1020h = 00401020h)
  4. 注入代码到PE头(DOS Stub)
    按F3进入编辑模式,写入以下机器码(对应汇编指令):
    • B8 40 00 → mov ax, 0040h(设置DS段寄存器)
    • 8E D8 → mov ds, ax
    • BA 20 10 → mov dx, 1020h(填字符串的偏移值)
    • B4 09 → mov ah, 09h(指定int21h的输出功能)
    • CD 21 → int 21h(调用DOS中断)
  5. 验证字符串结尾
    确保你的字符串最后是$字符,因为int 21h AH=09h要求用$作为字符串结束标记,否则会输出乱码。

常见坑点排查

  • 别把文件偏移直接填DX:PE加载后节会按Section Alignment对齐,文件偏移和内存偏移不是一回事。
  • 检查DS寄存器:如果DOS Stub执行时DS不是指向PE加载基地址的段,必须手动设置,否则DX偏移会指向错误地址。
  • Hiew编辑后要按F9保存,再按F10退出。

内容的提问来源于stack exchange,提问作者Ruslan Valerievich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:35:27