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

Ghidra 10.3 Python脚本创建内存引用异常问题(MS-DOS 16位程序)

问题描述

在使用Ghidra 10.3处理MS-DOS 16位可执行文件时,通过Python脚本定位MOV DX,VALUE指令,当VALUE为字符串地址时,希望实现右键点击VALUE选择“Create Memory Reference”的等效效果,但调用createMemoryReference后,并未在指令的VALUE处生成指向目标地址的引用,反而在字符串位置出现异常引用。

原问题代码

def tryRefStr(address):
    result = False
    opcode = getByteAt(address)
    if opcode == opcodeMovDX:       
        valu = getWordAt(address.add(1))        #hex value (0x12b1)
        addr = getAddress(valu)                 #hex value as address object
        data = listing.getDefinedDataAt(addr)   #data object from 0x12b1 (the string)
        if data is not None:            
            dtyp = data.getDataType()           #datatype of the object at 0x12b1
            if str(dtyp) == 'string':           #see if it's a string (crude, I know)
                result = True
                createMemoryReference(data, addr, ghidra.program.model.symbol.RefType.DATA)
    return result

解决方法

问题核心是createMemoryReference的参数调用错误,手动右键创建引用时,起点是指令中VALUE的位置,而非目标字符串的位置。以下是修正后的实现:

修正后代码

def tryRefStr(address):
    result = False
    opcode = getByteAt(address)
    if opcode == opcodeMovDX:       
        # 获取指令中操作数VALUE的实际地址(MOV DX, imm16的操作数从opcode后1字节开始)
        operand_addr = address.add(1)
        valu = getWordAt(operand_addr)
        target_addr = getAddress(valu)
        data = listing.getDefinedDataAt(target_addr)
        
        if data is not None:            
            # 更严谨的字符串类型判断
            if data.getDataType().isString():           
                result = True
                # 正确调用:起点为操作数地址,目标为字符串地址
                createMemoryReference(operand_addr, target_addr, ghidra.program.model.symbol.RefType.DATA)
    return result

关键修正点

  • 参数顺序调整:createMemoryReference的第一个参数是引用的起点地址(即指令中VALUE所在的operand_addr),第二个参数是引用的目标地址(字符串所在的target_addr),和手动创建引用的逻辑完全匹配;
  • 字符串类型判断优化:用data.getDataType().isString()替代字符串比较,避免类型名称字符串匹配的误差;
  • 引用起点修正:原代码错误地将目标字符串的data对象作为起点,现在改为指令中操作数的实际内存位置,这才是右键点击VALUE对应的位置。

内容的提问来源于stack exchange,提问作者user177731

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:22