我目前正在反转使用自定义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
代码块转换为函数的方法,以便我可以反编译代码并创建结构? - 阅读程序集的正确方法/使它更容易?