用DUMP的方式解决IDA F5失败
0x0 问题表述
在定位关键算法后我们一般使用F5,查看算法,在按下后提示
Decompilation failure:
401E37: positive sp value has been found
Please refer to the manual to find appropriate actions
中文意思是sp的值有问题
0x1 常规方法尝试
找到的解决办法说修改sp,让sp为0
我们在设置打开option》GENERAL》stack pointer把这个选项勾上,就可以看见sp是多少了
红圈里那个绿色的值就是sp,现在为-0x18,我们按atl+k,打开修改sp窗口,修改宁一个红圈的值为-0x18,
点击ok,就修复完成了,可以看到sp为0了
int sub_401810()
{
int result; // eax
CPPEH_RECORD ms_exc; // [esp+8C0h] [ebp-18h]
ms_exc.registration.TryLevel = 0;
MEMORY[0] = 6530;
JUMPOUT(__CS__, 0);
return result;
}
我们按F5看一下,结果明显是错的。这个方法不行。
另一个办法
废话我就不多说了,造成不能F5的原因在于:
.text:00401642 mov eax, offset loc_40164A
.text:00401647 jmp eax
用OD打开之后 改掉代码在保存,然后重新用IDA打开 F5就可以了,sp-analysis failed 也就消失了.
在OD里直接改成 JMP 40164A
分析之后不难发现不能F5的原因,就在于跳转.
一个函数里面的一个跳转在未知的情况下会出现不能F5.
这个办法来自于《IDA sp-analysis failed 不能F5的 解决方案之(一)》
.text:00401859 mov [ebp+ms_exc.registration.TryLevel], 0
.text:00401860 mov eax, [ebp+var_8A8]
.text:00401866 mov dword ptr [eax], 1982h
.text:0040186C jmp [ebp+var_8A8]
函数内所有的jmp都看了一下,只有40186c这个不是跳转的一个确定的地址。
本来想在OD里看一下值是多少,然后把这个jmp改成跳转到固定地方,
结果发现开头的这一小段的任何一句汇编都没有执行,也就是说这里是什么都不影响程序执行。
.text:00401860 mov eax, [ebp+var_8A8]
.text:00401866 mov dword ptr [eax], 1982h
.text:00401866 sub_401810 endp
.text:00401866
.text:00401866 ; ---------------------------------------------------------------------------
.text:0040186C db 0FFh
.text:0040186D db 0A5h
.text:0040186E db 58h ; X
.text:0040186F db 0F7h
.text:00401870 db 0FFh
.text:00401871 db 0FFh
干脆直接按d改成数据,再次F5依旧是错的。
0x2我的办法
既然在od里是可以运行的,说明函数有办法识别
我就在函数各处下断,断在0x401980 jmp short 00401991,在函数内这条指令之前的汇编代码都没有执行
选择函数内所有会执行的代码->备份->保存数据到文件.
ida打开文件,Edit->Segments->Rebase Program修改基地址,od里查看基地址为0x401000,
然后找到0x401980 jmp short 00401991的位置,在这条汇编那进行图中的选择创建函数,我已经创建过了所以是灰的。
简单看了一下,算法没问题,F5成功。