【发布时间】:2022-09-27 15:29:00
【问题描述】:
我正在做一些代码注入,我发现很难将代码从 C 转录到 Rust。
情况如下,在相对地址0x40147D我们跳转到了dll注入指令的地址,这是通过手动插入字节来完成的。
let rel = target_address - to_hook - 5;
let bytes: [u8; 4] = transmute(rel.to_be());
buf[0] = 0xE9;
for x in 1..5 {
buf[x] = bytes[4-x]
}
所以我们在 asm 中运行任何代码,最后它应该返回到 0x401484,即指令 0x40147D + 7。 在 C 中这可以按预期工作,但在 Rust 中却没有。
C:
DWORD jmp_back = 0x40147D + 7;
__asm {
add dword ptr[ebp - 0x0C], 03
mov eax, [ebp - 0x0C]
jmp [jmp_back]
}
Rust(我贴了一个标签以免程序崩溃):
let jump_back: u32 = 0x40147D + 7;
unsafe {
asm!(
\"2:\",
\"add dword ptr [ebp-0x0C],01\",
\"mov eax,[ebp-0x0C]\",
// \"jmp 2b\", //back to label 2
\"jmp [{}]\", in(reg) jump_back,
// \'invalid operand for instruction\'
//\"jmp 0x401484\"
);
}
什么会被忽视?
编辑
正如@prl 评论的那样,删除方括号会导致:
我正在研究以了解 eax 寄存器中的实际内容。 但是通过这种修改,程序崩溃并关闭。
OBS为了测试,我删除了之前的 jmp 指令 (\"jmp 5D7B145D\")
编辑 2
如Inline Asm 所述,显然是为了在指令中使用值作为操作数,Rust 将值加载到块开头的寄存器中。
所以也许这就是我的指令也使用相同寄存器的问题。
我稍后会尝试,但我可能不得不更改 Rust 使用的寄存器。
理想的情况是不必使用寄存器来执行此类操作。
编辑 3
到目前为止,我将我的答案作为这个问题的解决方案,但它仍然存在问题。
Rust 作为 asm 块的第一条指令将您要使用的值移动到寄存器中,有几点:
- 如果寄存器中包含值?
- 为什么不在块 asm 中使用常量?
-
@prl我进行了更改,在后期编辑中我显示了图像,但是程序现在崩溃并关闭
-
我对帖子进行了第二次编辑,确实在 Rust 中使用操作数导致将它们加载到寄存器中。我的问题是,是否有可能解决这个问题?
标签: assembly rust x86 inline-assembly