Ghidra修改函数签名后寄存器别名无作用域问题咨询
Ghidra寄存器别名替换问题解答
这是预期行为吗?
是Ghidra当前版本的预期行为。Ghidra修改函数签名后,会基于函数入口的寄存器-参数绑定关系(x86-64架构下main的前两个参数对应RDI、RSI),对整个函数范围内的对应寄存器引用统一替换成参数名——哪怕后续寄存器被重新赋值,用于调用其他函数(比如puts的RDI参数),也会被替换。它的参数别名逻辑没做寄存器生命周期的精细化跟踪,只看初始绑定关系。
解决方法
- 手动恢复特定寄存器显示:在汇编列表里选中被错误替换的参数名(比如puts调用前的
param_1),右键选「Convert to Register」,就能改回RDI寄存器的原始显示。 - 创建局部变量覆盖:如果寄存器被重新赋值后存储了其他数据,在对应位置创建局部变量,Ghidra会优先用局部变量名显示,不再用参数别名。
- 调整显示设置:打开「Edit > Tool Options > Disassembly」,找到「Parameter Substitution」相关选项,要么全局取消「Substitute Parameters for Registers」的勾选,要么针对当前函数禁用该功能,强制显示原始寄存器名。
内容的提问来源于stack exchange,提问作者Mark Morgan Lloyd
相关产品推荐
相关产品推荐

