IDA pro分析的常见问题

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