IDA中常见的堆栈不平衡问题及解决方法
问题描述:
错误提示为:
Decompilation failure:
xxxxxx positive sp value has been found
Please refer to the manual to find appropriate actions
其中xxxxxx代表地址,也可以理解为造成堆栈不平衡的指针地址
问题原理
- F5时出现上述错误,一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retn是函数要结束,
解决方法
- 首先,打开Options ,选择 General,然后把Stack pointer勾选上。(如果是汉化的ida,则应该打开“选项”,点击“常规”,在 “反汇编”中 把 “堆栈指针” 打勾)
- 在“IDA-view-A”找到出问题的地址,可以看到函数变成红色,且无法F5反汇编。
- 在其附近找到 “retn” 或者“retf” ,发现其前面的数字不为0,即堆栈不平衡
- 找到出问题的函数,右键,点击“更改堆栈指针”(快捷键为Alt+K),输入对应的值,只需使“retn” 或“retf” 前面的值为0即可
- 修改后即可正常F5反汇编
额外问题
由于是强行平衡堆栈,所以可能会冒出一系列问题,比如函数参数过多,代码变得奇怪等等
- 可以通过在函数上按 Y 来修改传递的参数个数
- 可以通过在汇编代码上,按 alt+p ,做出的函数的进一步调整