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
相关产品推荐
相关产品推荐

