1、call analysis failed
由于F5在分析调用时,未能成功解析参数位置/参数个数,
解决方法:就是先undefine掉函数,在右键现在code,之后Creat function 就可以正常反编译了
2、出现sp不平衡的问题,造成F5失效
ida出错
411A04: positive sp value has been found
出现问题的原因一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retn是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed.
具体出现的问题
.text:0041194C 0DC lea edi, [ebp+var_CC]
.text:00411952 0DC mov ecx, 33h
.text:00411957 0DC mov eax, 0CCCCCCCCh
.text:0041195C 0DC rep stosd
.text:0041195E 0DC mov eax, [ebp+arg_0]
.text:00411961 0DC add eax, [ebp+arg_4]
.text:00411964 0DC mov cl, [eax]
.text:00411966 0DC mov [ebp+var_5], cl
.text:00411969 0DC push eax
.text:0041196A 0E0 xor eax, eax
.text:0041196C 0E0 jz short loc_411971
.text:0041196E 0E0 add esp, 8
.text:00411971
.text:00411971 loc_411971: ; CODE XREF: sub_411940+2C↑j
.text:00411971 0D8 pop eax //sp偏移出错
.text:00411972 0D4 movsx eax, [ebp+var_5]
.text:00411976 0D4 cmp eax, 61h
.text:00411979 0D4 jl short loc_411984
.text:0041197B 0D4 movsx eax, [ebp+var_5]
.text:0041197F 0D4 cmp eax, 7Ah
解决方法
- 1)用Option->General->Disassembly, 将选项Stack pointer打勾
- 2)仔细观察每条call sub_xxxxxx前后的堆栈指针是否平衡;使用alt+k调节sp的偏移值
- 3)有时还要看被调用的sub_xxxxxx内部的堆栈情况,主要是看入栈的参数与ret xx是否匹配;
- 4)注意观察jmp指令前后的堆栈是否有变化;
- 5)有时用Edit->Functions->Edit function…,然后点击OK,(按D再按C键)刷一下函数定义。
针对每一条指令执行完后,看栈是否正常,如果不对,则通过ALT + K来修改.重点检查虚函数的调用, 如call [esi + n] , 这里不一定非得是esi,以及跳转前后的栈是否一致.另外还需要通过ALT + P 来确认下变量起始地址,清除个数与保存个数是否正常.
参考链接:
https://blog.csdn.net/wjcsharp/article/details/11075993