我想在运行时从x64汇编中获取机器代码。 并将此机器代码注入x64二进制文件。
我已经在运行时使用FASM从x86汇编中获得了机器代码。
FasmNet fasm = new FasmNet();
fasm.Clear();
fasm.AddLine("use32");
fasm.AddLine("mov eax, 1");
fasm.AddLine("retn");
var byteCode = new byte[0];
try
{
byteCode = fasm.Assemble();
}
catch (FasmAssemblerException ex)
{
Console.WriteLine("Error");
}
// result
// b8 01 00 00 00 c3
我已经完成了x64转换。 fasm.AddLine(“ use64”); 我得到了相同的机器代码。 我不确定使用fasm获得的机器代码是否会注入到x64二进制文件中。
我想知道如何在运行时从x64汇编中获取机器代码。
答案 0 :(得分:3)
因为Fasm不支持x64。
否,因为这些指令的x86-64机器代码恰好是相同的。
尝试使用类似mov rax, -1
,inc rcx
或push r15
的需要REX前缀的指令。或独特的64位助记符/操作码,如movsxd r8, edx
。
或者尝试使用已删除的指令,例如aam
。
有些指令在两种模式下都有效,但是会汇编成不同的机器代码。
inc eax
无法使用1字节编码,因为x86-64改用了0x4?
inc / dec将操作码注册为REX前缀。
或mov edx, [0x123456]
-请注意,FASM必须为寻址模式使用ModRM + SIB编码,因为x86-64重新将[disp32]
的仅ModRM编码表示为[RIP + rel32]
。仅保留较长的编码来仍然编码32位绝对地址。