本文适合
已经能读普通校验逻辑,但遇到自定义 opcode、解释器循环和字节码数组时不知道从哪里下手的学习者。学完你能:识别 VM 解释器,提取字节码,建立 opcode 语义表,并写反汇编器或模拟器还原校验逻辑。
VM 逆向题会把原本直接执行的逻辑转换成自定义字节码,再由解释器执行。分析重点从“读机器指令”变成“理解这个虚拟机的指令集和状态机”。
一句话判断
如果程序有一段字节码数组、一个指令指针、一个分发循环,并根据 opcode 执行不同处理器,就要按自定义 VM 题分析。
本文适合
已经能读普通校验逻辑,但遇到自定义 opcode、解释器循环和字节码数组时不知道从哪里下手的学习者。学完你能:识别 VM 解释器,提取字节码,建立 opcode 语义表,并写反汇编器或模拟器还原校验逻辑。
VM 逆向题会把原本直接执行的逻辑转换成自定义字节码,再由解释器执行。分析重点从“读机器指令”变成“理解这个虚拟机的指令集和状态机”。
如果程序有一段字节码数组、一个指令指针、一个分发循环,并根据 opcode 执行不同处理器,就要按自定义 VM 题分析。
本文适合
已经能读普通分支和循环,但遇到巨大 while-switch 状态机就迷路的逆向学习者。学完你能:识别控制流平坦化,记录状态变量和状态转移,用动态路径或脚本恢复关键业务逻辑。
控制流平坦化是一种混淆技术。它把原本清晰的分支和循环改造成一个调度循环,让反编译结果看起来像巨大的状态机。
如果一个函数被改造成 while(true) + switch(state),每个 case 只做一小段逻辑并更新状态变量,就要怀疑控制流平坦化。
本文适合
已掌握基本逆向工程的学习者。学完你能:为简单 CrackMe 配置 angr 的符号输入、目标地址、失败地址和约束,并用求出的输入回到原程序验证
当目标二进制的成功地址和失败地址明确,输入从 stdin、argv 或固定内存进入,且校验逻辑不依赖复杂外部环境时,可以尝试用 angr 自动探索成功路径。
angr 适合“找一条能到成功分支的路径”,不适合盲目丢给所有复杂程序。