vivisect 分析程序集

逆向工程 拆卸 Python
2021-07-11 03:29:34

我正在使用 vivisect 库来解析二进制文件中的函数,vivisect 的文档非常少,我想知道是否有办法获取有关汇编指令的信息。我正在寻找的示例是分支指令操作数是否是绝对地址,或者是否使用了任何相对位移寻址。

vivisect 提供这个还是我必须提取字节并使用像顶点这样的东西来处理程序集?

这也是静态完成的,我对动态或仪器解决方案不感兴趣。

谢谢,

1个回答

每条反汇编指令都是一个envi.Opcode 的实例。从那里,您可以以列表的形式访问各个操作数。(例如 op.opers[0] )

根据您对架构独立性的关注程度,您可以检查特定的操作码(即 op.opcode ==env.archs.i386.opconst.INS_BRANCHCC 用于条件分支),然后检查 op.opers[0].isImmed()或者可能 isDiscrete() 取决于您正在寻找的内容。

如果您正在寻找更通用(与架构无关)的解决方案,您还可以使用 op.getBranches()(不指定 emu)并检查返回的任何 (destva,flags) 元组是否具有 destva == None (其中意味着检测到一个分支,但没有仿真,目标虚拟地址是未知的)以查找既不是绝对的也不是指令指针相对的分支的指令。

但是,您可能还需要记住,编译器优化可能会将立即地址移动到寄存器中以供稍后调用(实际上是立即调用,但从技术上讲是寄存器调用)这就是为什么我会使用符号仿真子系统来回答此类问题. 这也有利于为您提供用于计算目标地址的实际代数表达式。

快乐黑客!

-visi