我想将 x 代码注入到 PE 标头中(为了体验),将字符串输出到控制台。 我已经快要达到目标了,只剩下一击了…… 我想将要输出的字符串的偏移量放入 dx 寄存器。 我已经能够将行本身放入 .data 部分.data 部分。 我不明白如何指定偏移量,或者更确切地说计算它 (我在 hiew 项目工作)
我尝试的一切都没有多大帮助。
既然你提到将地址放入 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 个字节。
如果您希望将字符串放在数据部分中,请按以下步骤操作:
address_of_data = 0x403000
address_of_text = 0x401000
file_offset_of_data = 0x2400
file_offset_of_text = 0x0600
file_offset_of_string - file_offset_of_data + address_of_data
计算字符串的虚拟地址,例如address_of_string = 0x2410 - 0x2400 + 0x403000 = 0x403010
lea
计算file_offset_of_lea - file_offset_of_text + address_of_text
指令的地址,例如: address_of_lea = 0x0bcf - 0x600 + 0x401000 = 0x4015cf
address_of_string - address_of_lea - size_of_lea
计算 rip 相对偏移量,例如0x403010 - 4015cf - 7 = 0x1a3a
这是您需要放入
lea
中的内容,例如48 8D 15 3a 1a 00 00
。