求助:IDA Pro 9.1调试时Locals窗口局部变量显示异常
调试时Locals窗口栈变量显示错误的解决思路
问题现象
- 函数开头断点暂停时,Locals窗口变量显示正常,Location列标记为
rsp+NN(栈上变量) - 单步执行第一条使用
rbp访问栈的指令(mov [rbp+57h+var_40], rax)后,Location列变为rbp-NN,所有栈变量值错误,推测是rbp相对偏移计算错误 - 函数初始化代码如下:
PAGE:FFFFF8045FF70778 ; __unwind { // __GSHandlerCheck PAGE:FFFFF8045FF70778 mov [rsp-8+arg_8], rbx PAGE:FFFFF8045FF7077D push rbp PAGE:FFFFF8045FF7077E push rsi PAGE:FFFFF8045FF7077F push rdi PAGE:FFFFF8045FF70780 push r12 PAGE:FFFFF8045FF70782 push r13 PAGE:FFFFF8045FF70784 push r14 PAGE:FFFFF8045FF70786 push r15 PAGE:FFFFF8045FF70788 lea rbp, [rsp-27h] PAGE:FFFFF8045FF7078D sub rsp, 0E0h PAGE:FFFFF8045FF70794 mov rax, cs:__security_cookie PAGE:FFFFF8045FF7079B xor rax, rsp PAGE:FFFFF8045FF7079E mov [rbp+57h+var_40], rax ; <=== 此处Locals内容开始错误 PAGE:FFFFF8045FF707A2 xor r13d, r13d PAGE:FFFFF8045FF707A5 mov [r8+8], r8
- 执行该指令前后,变量
P的值与内存实际内容不符,所有栈变量标记为红色 - Pseudocode-A窗口中变量
P的注释显示正确的rsp和rbp偏移,但tooltip显示错误值 - 寄存器变量显示正常,栈变量用
rsp寻址时正确,用rbp寻址时错误 - 尝试修改Edit Function对话框参数,仅能添加"Local variables area",修改Saved registers、Purged bytes等参数无法保存
解决步骤
手动修正
rbp基址偏移
暂停在lea rbp, [rsp-27h]执行后的位置,计算rbp实际指向的栈位置:- 从
push rbp到push r15共8个寄存器,每个占8字节,总计64字节(0x40) lea rbp, [rsp-27h]执行时,rsp指向push r15后的栈顶,后续又执行sub rsp, 0E0h,调试器可能未正确识别这个复合栈帧布局
打开Edit Function对话框,找到Frame pointer setup相关选项,手动输入正确的rbp偏移值,修正调试器对rbp基址的认知
- 从
强制调试器使用
rsp寻址显示变量
在Locals窗口右键菜单中找到Display Options,勾选"Use RSP for stack variables",强制调试器始终用rsp解析栈变量,绕过rbp偏移计算错误的问题修复函数签名与栈帧信息
手动计算函数总栈空间:保存寄存器的64字节(0x40) +lea rbp的偏移0x27 +sub rsp, 0E0h的0xE0 = 0x147字节
打开Edit Function对话框,手动设置Purged bytes为正确值,同时确认Saved registers数量为8个(rbp、rsi、rdi、r12-r15)
如果参数无法保存,关闭调试器重新加载目标程序,或清除调试器缓存文件后再尝试修改验证内存地址一致性
执行到出错指令后,手动计算变量实际内存地址:比如变量P的正确rsp偏移为rsp+NN,用当前rsp值加上偏移得到实际地址,对比rbp-NN指向的地址,定位调试器rbp偏移计算错误点,手动修正该变量的偏移
内容的提问来源于stack exchange,提问作者LamerDrv
相关产品推荐
相关产品推荐

