You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Binary Ninja中通过Python API获取MediumLevelILVar类型变量引用?

获取Binary Ninja中变量的交叉引用(解决MediumLevelILVar转Variable问题)

问题原因

你遇到的AttributeError是因为get_var_uses API要求传入**Variable类型**的对象,但你直接传入了MediumLevelILVar实例——后者是MLIL层面的变量引用节点,并非底层的Variable对象。

解决方法

MediumLevelILVar对象自带一个var属性,直接通过这个属性就能拿到对应的Variable实例,之后就可以正常调用get_var_uses了。

示例代码

import binaryninja

def find_var_xrefs(bv, func, var_name):
    # 先定位目标Variable对象
    target_var = None
    for var in func.vars:
        if var.name == var_name:
            target_var = var
            break
    if not target_var:
        print(f"变量 {var_name} 未找到")
        return
    
    # 获取所有交叉引用
    uses = func.get_var_uses(target_var)
    print(f"找到 {len(uses)} 处引用:")
    for use in uses:
        # use为MediumLevelILInstruction对象,打印地址与指令内容
        print(f"0x{use.address:x}: {use}")

# 调用示例(需替换为你的BinaryView和目标函数)
# find_var_xrefs(bv, bv.get_function_at(0x123456), "var_3290")

精细控制:遍历MLIL指令区分读写

如果需要区分变量的读/写操作,可以直接遍历函数的MLIL指令逐个检查:

def find_var_mlil_xrefs(func, var_name):
    target_var = None
    for var in func.vars:
        if var.name == var_name:
            target_var = var
            break
    if not target_var:
        print(f"变量 {var_name} 未找到")
        return
    
    print(f"变量 {var_name} 的所有MLIL引用:")
    for block in func.medium_level_il:
        for instr in block:
            # 检查指令的所有操作数
            for op in instr.operands:
                if isinstance(op, binaryninja.mediumlevelil.MediumLevelILVar) and op.var == target_var:
                    print(f"0x{instr.address:x}: {instr} (操作数: {op})")
                    # 区分读写操作
                    if instr.operation == binaryninja.mediumlevelil.MediumLevelILOperation.MLIL_SET_VAR:
                        print("  类型: 写入操作")
                    else:
                        print("  类型: 读取操作")

关键说明

  • MediumLevelILVar.var:这是关联MLIL变量节点与底层Variable对象的核心属性,是解决类型不匹配问题的关键
  • func.get_var_uses(var):返回变量在MLIL层面的所有使用指令(包含读、写)
  • 若需要LLIL或汇编层面的引用,可对应切换到func.low_level_il或func.instructions进行遍历

内容的提问来源于stack exchange,提问作者jdir.s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:40:03