反转 VM 的正确方法

逆向工程 艾达 拆卸 反编译 虚拟机 虚拟机
2021-06-12 02:47:26

我目前正在反转使用自定义VM 字节码的虚拟化示例在打败了反反汇编技巧之后,我终于面对了这个vm_dispatch功能。我必须弄清楚自定义 vm 操作码才能确定程序实际执行的操作。与大多数其他vftables虚拟机不同,没有哪个让我很难逆转,因为有 100 多个虚拟处理程序没有定义为函数(所有处理程序都在loc_XXXX代码块中定义。示例图像如下)。

在此处输入图片说明

尝试反编译该vm_dispatch函数让我得到了这个:

  ...
  a lot of local variable initialization
  ...
  assign vm handlers
  ...
  bytecode_array[53] = &loc_4041A3;
  regs->VIP = 0x6000;  // virtual ip
  memcpy(bytecode_array + regs->VIP, bytecode, bytecode_size);
  regs->R5 = -1;
  vm_code = *(bytecode_array + regs->VIP++);
  __asm { jmp     [ebp+eax*4+vm_handler_array]; jump to the appropriate handler }// switch jmp
}

我知道它没有完全反编译,因为有 100 多个块,每个块都执行一个特定的 vm 字节码。这些都没有反映在反编译器输出中。

loc_XXXX在无法定义 VM 特定结构(如VM和 )REG和读取低级程序集的情况下,遍历每个程序确实非常耗时我的问题是,有没有:

  • loc_XXXX代码块转换为函数的方法,以便我可以反编译代码并创建结构?
  • 阅读程序集的正确方法/使它更容易?
0个回答
没有发现任何回复~