能力值:
(RANK:260 )
|
-
-
2 楼
endp ; sp-analysis failed
一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retn是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed.
我还遇到过一种情况,是因为编译器优化,结果IDA无法正确识别一个函数体的结尾部分,换句话说,它找不到C中的“大括号”应该位于哪里。例如以下代码:
int one_function( int a,int b);
int another_function( int a, int b)
{
if ( a == 0 || b == 0 )
return -1;
return one_function(a,b);
}
其中return one_function(a,b)这条语句,在某些新的编译器,可能会编译成这样的指令序列:
mov esp, ebp
pop ebp
jmp one_funcion
而IDA是通过retn指令来识别函数的结束的,因为它不知道这里的意思,会把它当成一个函数内部 的跳转,最后就会出现sp analysis failed了。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
非常感谢,
不知道有没有什么办法可以让IDA正确分析,因为函数非常长,需要伪代码来减少分析时间
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
函数开头调用了 __alloca_probe(堆栈分配函数)
是不是这个函数让IDA分析错误呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
请 forgot 解释一下,如何用ALT+K 调整SP 要输入什么值呢?
|
能力值:
( LV10,RANK:170 )
|
-
-
7 楼
并没有一个固定值,针对每一条指令执行完后,看看栈是否正常,如果不对,则通过ALT + K来修改.重点检查虚函数的调用, 如call [esi + n] , 这里不一定非得是esi,以及跳转前后的栈是否一致.
另外还需要通过ALT + P 来确认下变量起始地址,清除个数与保存个数是否正常.
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
谢谢 牛人们的解释,现在就试一试 太感谢了
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
__alloca是声明一个不设置cookie堆栈安全检测的缓冲区,既然已经识别出来了,没有理由因为它分析错误。
|
能力值:
( LV2,RANK:150 )
|
-
-
10 楼
1)用Option->General->Disassembly, 将选项Stack pointer打钩;
2)仔细观察每条call sub_xxxxxx前后的堆栈指针是否平衡;
3)有时还要看被调用的sub_xxxxxx内部的堆栈情况,主要是看入栈的参数与ret xx是否匹配;
4)注意观察jmp指令前后的堆栈是否有变化;
5)有时用Edit->Functions->Edit function...,然后点击OK刷一下函数定义。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
谢谢,热心得人真多,看来我要多多进步了
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
呵呵,真的很有用,学习了!那出现
FFFFFFFF:function frame is wrong
又是什么原因??
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
看到這篇文章討論終於懂了
多謝前輩的解釋~
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
public strHistGramProcess
.text:10002F59 strHistGramProcess proc near
.text:10002F59
.text:10002F59 var_78 = dword ptr -78h
.text:10002F59 var_74 = dword ptr -74h
.text:10002F59 var_70 = dword ptr -70h
.text:10002F59 var_6C = dword ptr -6Ch
.text:10002F59 var_68 = dword ptr -68h
.text:10002F59 var_64 = dword ptr -64h
.text:10002F59 Dst = byte ptr -60h
.text:10002F59 var_24 = dword ptr -24h
.text:10002F59 lpFileName = dword ptr -20h
.text:10002F59 Str = byte ptr -1Ch
.text:10002F59 var_1B = byte ptr -1Bh
.text:10002F59 var_1A = byte ptr -1Ah
.text:10002F59 var_19 = byte ptr -19h
.text:10002F59 var_18 = byte ptr -18h
.text:10002F59 var_14 = dword ptr -14h
.text:10002F59 var_10 = dword ptr -10h
.text:10002F59 var_C = dword ptr -0Ch
.text:10002F59 var_4 = dword ptr -4
.text:10002F59 arg_0 = dword ptr 8
.text:10002F59 arg_4 = dword ptr 0Ch
.text:10002F59 arg_8 = dword ptr 10h
.text:10002F59 arg_C = dword ptr 14h
.text:10002F59 arg_10 = dword ptr 18h
.text:10002F59
.text:10002F59 mov eax, offset loc_100073FC
.text:10002F5E call _EH_prolog
.text:10002F5E
.text:10002F63 sub esp, 70h
.text:10002F66 push ebx
.text:10002F67 push esi
.text:10002F68 push edi
.text:10002F69 mov [ebp+var_10], esp
.text:10002F6C xor edi, edi
.text:10002F6E mov [ebp+var_4], edi
.text:10002F71 mov eax, [ebp+arg_4]
.text:10002F74 cmp eax, edi
.text:10002F76 jle loc_1000308B
.text:10002F76
.text:10002F7C cdq
.text:10002F7D push 4
.text:10002F7F pop ecx
.text:10002F80 idiv ecx
.text:10002F82 cmp eax, 3Ch
.text:10002F85 jg loc_1000308B
.text:10002F85
.text:10002F8B mov esi, [ebp+arg_8]
.text:10002F8E mov eax, [esi]
.text:10002F90 cdq
.text:10002F91 idiv ecx
.text:10002F93 cmp eax, 3Ch
.text:10002F96 jg loc_1000308B
.text:10002F96
.text:10002F9C push 3Ch ; Size
.text:10002F9E push edi ; Val
.text:10002F9F lea eax, [ebp+Dst]
.text:10002FA2 push eax ; Dst
.text:10002FA3 call memset
.text:10002FA3
.text:10002FA8 add esp, 0Ch
.text:10002FAB mov [ebp+var_24], edi
.text:10002FAE mov [ebp+var_14], edi
.text:10002FB1 mov ebx, [ebp+arg_0]
.text:10002FB1
.text:10002FB4
.text:10002FB4 loc_10002FB4: ; CODE XREF: strHistGramProcess+9Ej
.text:10002FB4 mov eax, [esi]
.text:10002FB6 shl eax, 2
.text:10002FB9 cmp edi, eax
.text:10002FBB jge short loc_10002FF9
.text:10002FBB
.text:10002FBD mov al, [edi+ebx]
.text:10002FC0 mov [ebp+Str], al
.text:10002FC3 mov al, [edi+ebx+1]
.text:10002FC7 mov [ebp+var_1B], al
.text:10002FCA mov al, [edi+ebx+2]
.text:10002FCE mov [ebp+var_1A], al
.text:10002FD1 mov al, [edi+ebx+3]
.text:10002FD5 mov [ebp+var_19], al
.text:10002FD8 and [ebp+var_18], 0
.text:10002FDC lea eax, [ebp+Str]
.text:10002FDF push eax ; Str
.text:10002FE0 call ds:atoi
.text:10002FE0
.text:10002FE6 pop ecx
.text:10002FE7 mov ecx, [ebp+var_24]
.text:10002FEA mov [ebp+ecx+Dst], al
.text:10002FEE inc [ebp+var_24]
.text:10002FF1 add edi, 4
.text:10002FF4 mov [ebp+var_14], edi
.text:10002FF7 jmp short loc_10002FB4
.text:10002FF7
.text:10002FF9 ; ---------------------------------------------------------------------------
.text:10002FF9
.text:10002FF9 loc_10002FF9: ; CODE XREF: strHistGramProcess+62j
.text:10002FF9 push [ebp+arg_C]
.text:10002FFC lea ecx, [ebp+lpFileName]
.text:10002FFF call CString::CString(char const *)
.text:10002FFF
.text:10003004 mov byte ptr [ebp+var_4], 1
.text:10003008 push 0 ; int
.text:1000300A push dword ptr [esi] ; int
.text:1000300C push dword ptr [esi+18h] ; int
.text:1000300F push dword ptr [esi+14h] ; int
.text:10003012 push dword ptr [esi+10h] ; int
.text:10003015 push dword ptr [esi+0Ch] ; int
.text:10003018 push dword ptr [esi+8] ; int
.text:1000301B push dword ptr [esi+4] ; int
.text:1000301E push [ebp+var_24] ; int
.text:10003021 lea eax, [ebp+Dst]
.text:10003024 push eax ; int
.text:10003025 push [ebp+lpFileName] ; lpFileName
.text:10003028 call sub_10002397
.text:10003028
.text:1000302D add esp, 2Ch
.text:10003030 mov [ebp+var_64], eax
.text:10003033 cmp eax, 1
.text:10003036 jnz short loc_10003076
.text:10003036
.text:10003038 push [ebp+arg_10]
.text:1000303B push [ebp+lpFileName]
.text:1000303E call sub_100010CD
.text:1000303E
.text:10003043 pop ecx
.text:10003044 pop ecx
.text:10003045 mov esi, eax
.text:10003047 mov [ebp+var_68], esi
.text:1000304A test esi, esi
.text:1000304C jnz short loc_10003058
.text:1000304C
.text:1000304E mov eax, 0FFFFFF36h
.text:10003053 mov [ebp+var_6C], eax
.text:10003056 jmp short loc_10003079
.text:10003056
.text:10003058 ; ---------------------------------------------------------------------------
.text:10003058
.text:10003058 loc_10003058: ; CODE XREF: strHistGramProcess+F3j
.text:10003058 push ecx
.text:10003059 mov ecx, esp
.text:1000305B mov [ebp+var_70], esp
.text:1000305E lea eax, [ebp+lpFileName]
.text:10003061 push eax
.text:10003062 call CString::CString(CString const &)
.text:10003062
.text:10003067 mov byte ptr [ebp+var_4], 1
.text:1000306B call sub_100016DD
.text:1000306B
.text:10003070 pop ecx
.text:10003071 mov [ebp+var_74], esi
.text:10003074 jmp short loc_1000307B
.text:10003074
.text:10003076 ; ---------------------------------------------------------------------------
.text:10003076
.text:10003076 loc_10003076: ; CODE XREF: strHistGramProcess+DDj
.text:10003076 mov [ebp+var_78], eax
.text:10003076
.text:10003079
.text:10003079 loc_10003079: ; CODE XREF: strHistGramProcess+FDj
.text:10003079 mov esi, eax
.text:10003079
.text:1000307B
.text:1000307B loc_1000307B: ; CODE XREF: strHistGramProcess+11Bj
.text:1000307B and byte ptr [ebp+var_4], 0
.text:1000307F lea ecx, [ebp+lpFileName]
.text:10003082 call CString::~CString(void)
.text:10003082
.text:10003087 mov eax, esi
.text:10003089 jmp short loc_10003099
.text:10003089
.text:1000308B ; ---------------------------------------------------------------------------
.text:1000308B
.text:1000308B loc_1000308B: ; CODE XREF: strHistGramProcess+1Dj
.text:1000308B ; strHistGramProcess+2Cj
.text:1000308B ; strHistGramProcess+3Dj
.text:1000308B push 0FFFFFF9Ch
.text:1000308D pop eax
.text:1000308E jmp short loc_10003099
.text:1000308E
.text:10003090 ; ---------------------------------------------------------------------------
.text:10003090
.text:10003090 loc_10003090: ; DATA XREF: .rdata:stru_10008758o
.text:10003090 mov eax, offset loc_10003096
.text:10003095 retn
.text:10003095
.text:10003096 ; ---------------------------------------------------------------------------
.text:10003096
.text:10003096 loc_10003096: ; DATA XREF: strHistGramProcess:loc_10003090o
.text:10003096 or eax, 0FFFFFFFFh
.text:10003096
.text:10003099
.text:10003099 loc_10003099: ; CODE XREF: strHistGramProcess+130j
.text:10003099 ; strHistGramProcess+135j
.text:10003099 mov ecx, [ebp+var_C]
.text:1000309C mov large fs:0, ecx
.text:100030A3 pop edi
.text:100030A4 pop esi
.text:100030A5 pop ebx
.text:100030A6 leave
.text:100030A7 retn 14h
|