是否可以将使用fasm获得的机器代码注入x64二进制文件?

时间:2019-07-19 02:16:20

标签: assembly x86-64 fasm

我想在运行时从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汇编中获取机器代码。

1 个答案:

答案 0 :(得分:3)

  

因为Fasm不支持x64。

否,因为这些指令的x86-64机器代码恰好是相同的。

尝试使用类似mov rax, -1inc rcxpush 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位绝对地址。