2011年9月23日星期五
[轉載]IDA sp-analysis failed 不能F5的解决方案之(一)
有时候用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 sub_4015ED endp ; sp-analysis failed
用外径湾岸之后改掉程式码在储存,然后重新用开发协会打开F5键就可以了,SP -分析失败也就消失了。
在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;
}
标签:
IDA 6.2,
IDA 6.2測試版,
IDA程式教程
订阅:
博文评论 (Atom)
没有评论:
发表评论