解析器如何解析机器码?它是一个字节一个字节的吗?解析指令时它如何知道要读取多少字节?它是否有某种字节表可以通过表直接将机器代码转换为像 AST 这样的程序集?
我开始了解如何从程序集生成机器代码,但是您如何从机器代码到程序集,从机器代码到 VM 使用的 AST?一般原则是什么?
是否有任何开源项目可以为 x86 演示这一点?我在 GitHub 上似乎有很多“x86 vms”解释汇编指令,但没有一个直接解释机器代码。我想这将是某种逆向工程项目(也许这是一个?),但不确定在哪里看。即使是采用机器代码并将其转换为汇编字符串的东西也很有价值,类似于objdump 的东西,但最好是在 JavaScript/Node.js 中:)
这看起来是一个好的开始,这是标准吗?
void
xed_instruction_length_decode(xed_decoded_inst_t* ild)
{
prefix_scanner(ild);
#if defined(XED_AVX)
if (xed3_operand_get_out_of_bytes(ild))
return;
vex_scanner(ild);
#endif
#if defined(XED_SUPPORTS_AVX512) || defined(XED_SUPPORTS_KNC)
// evex scanner assumes it can read bytes so we must check for limit first.
if (xed3_operand_get_out_of_bytes(ild))
return;
// if we got a vex prefix (which also sucks down the opcode),
// then we do not need to scan for evex prefixes.
if (!xed3_operand_get_vexvalid(ild) && chip_supports_avx512(ild))
evex_scanner(ild);
#endif
if (xed3_operand_get_out_of_bytes(ild))
return;
#if defined(XED_AVX)
// vex/xop prefixes also eat the vex/xop opcode
if (!xed3_operand_get_vexvalid(ild) &&
!xed3_operand_get_error(ild) )
opcode_scanner(ild);
#else
opcode_scanner(ild);
#endif
modrm_scanner(ild);
sib_scanner(ild);
disp_scanner(ild);
imm_scanner(ild);
}
看起来需要很多处理才能弄清楚指令。
但遗憾的是,缺少某些功能源代码,例如xed3_operand_get_out_of_bytes...