如何计算偏移线

问题描述 投票:0回答:1

我想将 x 代码注入到 PE 标头中(为了体验),将字符串输出到控制台。 我已经快要达到目标了,只剩下一击了…… 我想将要输出的字符串的偏移量放入 dx 寄存器。 我已经能够将行本身放入 .data 部分.data 部分。 我不明白如何指定偏移量,或者更确切地说计算它 (我在 hiew 项目工作)

我尝试的一切都没有多大帮助。

assembly disassembly
1个回答
0
投票

既然你提到将地址放入 dx 寄存器,我假设你在 64 位 Windows 上并且想要使用

WriteFile
,它恰好在
rdx
中获取缓冲区地址。

虽然你说你已经在 .data 部分中有该字符串,但实际上最简单的方法是将其放入代码旁边的 .text 部分并使用 rip 相对寻址:

lea rdx, [rel string]
call WriteFile
call ExitProcess
string: db "Hello world!", 10, 13

(nasm 语法,我假设您已经处理了其他参数和堆栈布局)。在本例中,

lea rdx, [rel string]
会生成机器代码
48 8D 15 0A 00 00 00
,因为字符串的偏移量是距下一条指令开头的 10 个字节。

如果您希望将字符串放在数据部分中,请按以下步骤操作:

  1. 从 header 中确定 .data 的基地址,例如
    address_of_data = 0x403000
  2. 从标题中确定.text的基地址,例如
    address_of_text = 0x401000
  3. 确定 .data 与标头的文件偏移量,例如
    file_offset_of_data = 0x2400
  4. 确定 .text 与标题的文件偏移量,例如
    file_offset_of_text = 0x0600
  5. 通过执行
    file_offset_of_string - file_offset_of_data + address_of_data
    计算字符串的虚拟地址,例如
    address_of_string = 0x2410 - 0x2400 + 0x403000 = 0x403010
  6. 通过执行
    lea
    计算
    file_offset_of_lea - file_offset_of_text + address_of_text
    指令的地址,例如:
    address_of_lea = 0x0bcf - 0x600 + 0x401000 = 0x4015cf
  7. 通过执行
    address_of_string - address_of_lea - size_of_lea
    计算 rip 相对偏移量,例如
    0x403010 - 4015cf - 7 = 0x1a3a

这是您需要放入

lea
中的内容,例如
48 8D 15 3a 1a 00 00

© www.soinside.com 2019 - 2024. All rights reserved.