首页
论坛
课程
招聘
[推荐]IDA sp-analysis failed 不能F5的 解决方案之(一)
2011-9-11 23:30 27235

[推荐]IDA sp-analysis failed 不能F5的 解决方案之(一)

2011-9-11 23:30
27235
有时候用IDA F5的时候遇到带sp-analysis failed 的函数会失败.
这只是一个极其简单的一个例子.希望大家能依此类推.也更希望大家把类似的代码放出来一起解决。原本是一朋友问我的,我只是顺便发出来.以后遇到类似情况百度就可以找到了。

.text:004015ED sub_4015ED      proc near               ; CODE XREF: sub_40116A+1A6p
.text:004015ED                                         ; sub_40116A+1C7p
.text:004015ED
.text:004015ED var_C           = byte ptr -0Ch
.text:004015ED var_8           = dword ptr -8
.text:004015ED var_4           = dword ptr -4
.text:004015ED arg_0           = dword ptr  10h
.text:004015ED
.text:004015ED                 push    ecx
.text:004015EE                 push    esi
.text:004015EF                 push    ebp
.text:004015F0                 mov     ebp, esp
.text:004015F2                 add     esp, 0FFFFFFF8h
.text:004015F5                 mov     ebx, offset String
.text:004015FA                 cmp     dword ptr [ebx], 0FFFFFFFFh
.text:004015FD                 jz      short loc_401606
.text:004015FF                 mov     eax, offset loc_401607
.text:00401604                 jmp     eax
.text:00401606 ; ---------------------------------------------------------------------------
.text:00401606
.text:00401606 loc_401606:                             ; CODE XREF: sub_4015ED+10j
.text:00401606                 nop
.text:00401607
.text:00401607 loc_401607:                             ; DATA XREF: sub_4015ED+12o
.text:00401607                 xor     eax, eax
.text:00401609                 mov     esi, [ebp+arg_0]
.text:0040160C                 mov     al, [esi+ebx]
.text:0040160F                 xor     ebx, ebx
.text:00401611                 push    eax
.text:00401612                 call    sub_4014BF
.text:00401617                 mov     [ebp+var_4], ebx
.text:0040161A                 call    sub_4014D5
.text:0040161F                 mov     [ebp+var_8], ebx
.text:00401622                 push    0
.text:00401624                 push    offset dword_403425
.text:00401629                 push    [ebp+var_4]
.text:0040162C                 push    [ebp+var_8]
.text:0040162F                 call    sub_401561
.text:00401634                 mov     eax, dword_403425
.text:00401639                 ror     eax, 8
.text:0040163C                 cmp     eax, 5
.text:0040163F                 jz      short loc_401649
.text:00401641                 push    eax
.text:00401642                 mov     eax, offset loc_40164A
.text:00401647                 jmp     eax
.text:00401649 ; ---------------------------------------------------------------------------
.text:00401649
.text:00401649 loc_401649:                             ; CODE XREF: sub_4015ED+52j
.text:00401649                 nop
.text:0040164A
.text:0040164A loc_40164A:                             ; DATA XREF: sub_4015ED+55o
.text:0040164A                 pop     eax
.text:0040164B                 xor     ah, [ebp+var_C]
.text:0040164E                 xor     al, [ebp+var_C]
.text:00401651                 xor     edx, edx
.text:00401653                 mov     bx, ax
.text:00401656                 mov     ecx, 4
.text:0040165B
.text:0040165B loc_40165B:                             ; CODE XREF: sub_4015ED+83j
.text:0040165B                 and     al, 0Fh
.text:0040165D                 cmp     al, 9
.text:0040165F                 jle     short loc_401663
.text:00401661                 add     al, 7
.text:00401663
.text:00401663 loc_401663:                             ; CODE XREF: sub_4015ED+72j
.text:00401663                 add     al, 30h
.text:00401665                 mov     dl, al
.text:00401667                 ror     edx, 8
.text:0040166A                 shr     bx, 4
.text:0040166E                 mov     al, bl
.text:00401670                 loop    loc_40165B
.text:00401672                 add     esp, 1Ch
.text:00401675                 pop     ebp
.text:00401676                 pop     esi
.text:00401677                 pop     ecx
.text:00401678                 retn
.text:00401678 [COLOR="Red"]sub_4015ED      endp ; sp-analysis failed[/COLOR]


废话我就不多说了,造成不能F5的原因在于:
.text:00401642                 mov     eax, offset loc_40164A
.text:00401647                 jmp     eax
用OD打开之后 改掉代码在保存,然后重新用IDA打开 F5就可以了,sp-analysis failed 也就消失了.

在OD里直接改成 JMP  40164A   

分析之后不难发现不能F5的原因,就在于跳转.
一个函数里面的一个跳转在未知的情况下会出现不能F5.

结果:
char __cdecl sub_4015ED(int a1)
{
  unsigned __int16 v1; // ax@1
  int v2; // edx@1
  signed int v3; // ecx@1
  unsigned __int16 v4; // bx@1
  char v5; // ST10_1@1
  int v6; // eax@1
  char v7; // ST10_1@1
  char v8; // al@2

  sub_4014BF(String[a1]);
  sub_4014D5(v5);
  sub_401561(0, 0, &dword_403425, 0);
  v6 = __ROR__(dword_403425, 8);
  HIBYTE(v1) = v7 ^ BYTE1(v6);
  LOBYTE(v1) = v7 ^ v1;
  v2 = 0;
  v4 = v1;
  v3 = 4;
  do
  {
    v8 = v1 & 0xF;
    if ( v8 > 9 )
      v8 += 7;
    LOBYTE(v2) = v1 + 48;
    v2 = __ROR__(v2, 8);
    v4 >>= 4;
    LOBYTE(v1) = v4;
    --v3;
  }
  while ( v3 );
  return v1;
}

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

收藏
点赞1
打赏
分享
最新回复 (20)
雪    币: 2258
活跃值: 活跃值 (512)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2011-9-12 00:09
2
0
还有一个问题
看看OPENFILENAMEA的声明:
typedef struct tagOFN {   DWORD lStructSize;   HWND hwndOwner;   HINSTANCE hInstance;   LPCTSTR lpstrFilter;   LPTSTR lpstrCustomFilter;   DWORD nMaxCustFilter;   DWORD nFilterIndex;   LPTSTR lpstrFile;   DWORD nMaxFile;   LPTSTR lpstrFileTitle;   DWORD nMaxFileTitle;   LPCTSTR lpstrInitialDir;   LPCTSTR lpstrTitle;   DWORD Flags;   WORD nFileOffset;   WORD nFileExtension;   LPCTSTR lpstrDefExt;   LPARAM lCustData;   LPOFNHOOKPROC lpfnHook;   LPCTSTR lpTemplateName;   #if (_WIN32_WINNT >= 0x0500)   void * pvReserved;   DWORD dwReserved;   DWORD FlagsEx;   #endif // (_WIN32_WINNT >= 0x0500)   } OPENFILENAME, *LPOPENFILENAME;

有个条件就是#if (_WIN32_WINNT >= 0x0500) 的时候,结构多出三个DWORD,结果大小为0X58H,在MASM32中,没有这三个DWORD,结果为0X4CH,看看反汇编代码:

如果按下F5就会酱紫:

这个时候的解决方法:
SHIFT+F9打开结构subview,双击tagOFNA,在最后三个成员上按U键,取消掉它们,结果如下:

然后返回反汇编窗口,在函数名上按U,然后按P键,现在按F5就可以啦!!
上传的附件:
  • 1.jpg (58.88kb,727次下载)
  • 2.jpg (56.41kb,727次下载)
  • 3.jpg (64.59kb,726次下载)
雪    币: 109
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GzsIceberg 活跃值 2011-9-12 13:13
3
0
不错
不错。。的确这种东西有时候会成为一个问题
雪    币: 70
活跃值: 活跃值 (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yaneng 活跃值 2011-9-13 13:38
4
0
.text:004015FF                 mov     eax, offset loc_401607
.text:00401604                 jmp     eax

这个地方为什么不需要OD修改,IDA就能识别呢??
雪    币: 78
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 活跃值 2011-9-21 20:52
5
0
说白了就是IDA的bug吧
雪    币: 100
活跃值: 活跃值 (107)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
eGirlAsm 活跃值 2011-10-26 10:50
6
0
继续。。
0xXXXXXX: call analysis failed 的解决方案

原因是:反编译插件无法确定其中函数的参数个数.

push    4D8h
call    xxxx
push    eax
[COLOR="Red"]call    xxxPrint[/COLOR]
add     esp, 8


在IDA里双击这个函数,进去之后

按 Y, 修改函数约定和参数个数....(Y 是IDA中的一个快捷键)


把函数 修改成 如图


然后就可以 F5 继续分析了.

这个函数本身是别人写的,格式化字符串的函数,像format 参数本就是无法确定的.所以IDA没能识别出来.
我知道 这个函数有两个参数是固定的 后面是不确定的,所以  三个点 ... 就ok啦
希望对某些人能有所帮助.
上传的附件:
  • 1.jpg (15.40kb,482次下载)
  • 2.jpg (19.97kb,484次下载)
  • 3.jpg (10.12kb,486次下载)
雪    币: 100
活跃值: 活跃值 (107)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
eGirlAsm 活跃值 2011-10-26 10:53
7
0
http://www.hex-rays.com/products/decompiler/manual/failures.shtml

英语好的人,可以去官方主页去找解决方案.

不好的人也,也可以去,用工具翻译。
雪    币: 111
活跃值: 活跃值 (81)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bbbsl 活跃值 2011-10-26 14:10
8
0
堆栈分析错误好像可以手工修正的
雪    币: 420
活跃值: 活跃值 (15)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 活跃值 6 2011-10-26 17:59
9
0
路过,买不起F5。。。
雪    币: 48
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
notmorw 活跃值 2012-9-25 14:53
10
0
支持,遇到栈不平了
雪    币: 1112
活跃值: 活跃值 (111)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
ycmint 活跃值 5 2012-9-28 11:08
11
0
db xx(有效的 指令码)
+ 指令 ,也会出现第一种情况 ,解决方法类似 ,转化即可
雪    币: 43842
活跃值: 活跃值 (164135)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 活跃值 2012-9-28 18:46
12
0
Thanks you.

Welcome forum.forum is a home.


Please respect the copyright from the Internet.
Пожалуйста, уважайте авторское право в Интернете.
來源于互聯網, 請尊重版權.
所發資源全部來自對互聯網公共資源的收集和整理,僅供學習之用,請于下載后24小時自行刪除!
Issued by all the resources of public resources from the Internet to collect and collate,
study purposes only,
please delete themselves 24 hours after downloading!
Выпущено всеми ресурсами государственных ресурсо
в из Интернет
а на сбор и обобщение, изучение целей, пожалуйста,
удалите себя
24 часов после скачивания!
You can Google.

Программное обеспечение выпуска и Windows Crack
Обучение Нам-Dabei Guanyin Бодхисаттва Нам без митабха
Compassion are compulsory for any Buddhist, Jew money for the people of the world will a
break this oath can be satisfactorily beings all desire and governance 84 000 kinds of
diseases. Bodhisattva white Buddha: "If living beings recite the Great Compassion Mantra,
Health Buddhas States, not the immeasurable Samadhi eloquence, if not then by all seek in
the now Health rest into Zhengjue, provided that in addition to the poor and not sincere .
No merciful Avalokitesvara Bodhisattva, would like to sincerely recite this mantra, who obtain Nirvana.
Нет милосердный Бодхисаттвы Авалокитешвары, хоте
л бы искренне повторять эту мантру,
которые получают нирваны.


南无大慈大悲圣观世音菩萨


Нет милосердный Бодхисаттвы Авалокитешвары, хотел бы и
скренне повторять эту мантру, которые получают нирваны.
Сострадание является обязательным для любого буддиста, деньги
еврей для людей всего мира будут нарушать эту клятву может быть
удовлетворительно существа все желания и управления 84 000 видов
заболеваний. Бодхисаттва белого Будды: "Если живые существа чит
ать мантру Великого Сострадания, здоровье Будды государств, а н
е неизмеримый красноречие самадхи, если нет, то все стремятся в
настоящее время здоровье отдых в Zhengjue, при условии, что в дополн
ение к бедным, а не искренняя .


Бодхисаттва нарушить эту клятву была земля шесть переменной ви
брации, дождь Baohua, весело и дальше, Shifangzhufo Xijie радость, демоны ер
етиков, террористические валовой вертикальные, все общество, в
се сертификаты на фрукты, или слишком Сюй Tuohuan фруктов , или имет
ь Situo Хан фруктов или есть фрукты Nahan, Get Arahantship, или один за два to
триста сорок пять, даже десять которая неизмерима бодхичитты с
уществ.


Blessing forum!
雪    币: 6
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
northli 活跃值 2013-4-21 12:40
13
0
好文大家一起分享
雪    币: 274
活跃值: 活跃值 (79)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wwihacker 活跃值 2017-9-23 21:37
14
0
继续补充:
如果找到某块代码想F5,此时提示请在一个函数的位置按F5。原因分析,此代码段是一个函数的函数块,编译器经常把不经常执行的代码段移到分页内存里面去,由此造成了函数块。

解决方法:
找到调用此函数块的函数,然后按F5,  此时这块函数块变为了函数的伪函数。为什么说伪函数,是因为在函数调用此函数块的时候用到是JMP  loc_xxxxxx.  而此时loc_xxxx函数已经可以F5了。作为一个单独的伪C的代码出现。
雪    币: 1129
活跃值: 活跃值 (1197)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengyunabc 活跃值 1 2017-9-23 22:14
15
0
赞楼上!
雪    币: 107
活跃值: 活跃值 (290)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yangya 活跃值 2017-9-25 22:00
16
0
还有个现在很多代码都开启了CFG,不知道怎么找到真正的函数。
雪    币: 245
活跃值: 活跃值 (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
airbus 活跃值 2017-12-6 17:25
17
0
CFG是啥?
==============
另外经常遇到,sub_xxx  重命名为  some_xxx,后再F5,sp失败的,这个请问大家是如何解决的呢?
也就是之前F5都是正常工作的,只是改了某个它调用的函数名,就不能F5了.
雪    币: 1620
活跃值: 活跃值 (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
chkds 活跃值 2017-12-11 22:30
18
0
一次CTF做题的时候有一个函数里面的垃圾代码全都nop掉之后还是没F5出来,报错是call  analysis  failed,然而那个地址是一个库函数的call,事后看其他人的writeup也是一样改的却能f5,这种报错怎么解决?求助~~~
雪    币: 113
活跃值: 活跃值 (456)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 活跃值 1 2018-8-13 20:25
19
0
mark
雪    币: 232
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scxn 活跃值 2019-11-12 15:51
20
0
chkds 一次CTF做题的时候有一个函数里面的垃圾代码全都nop掉之后还是没F5出来,报错是call analysis failed,然而那个地址是一个库函数的call,事后看其他人的writeup也是一样改的 ...
类似这种?求大佬解答

雪    币: 15833
活跃值: 活跃值 (516)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
潇湘公子 活跃值 2019-11-12 15:55
21
0
好文mark
游客
登录 | 注册 方可回帖
返回