用DUMP的方式解决IDA F5失败
本帖最后由 白影33 于 2021-4-27 16:38 编辑# 用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; //
ms_exc.registration.TryLevel = 0;
MEMORY = 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里直接改成 JMP40164A
分析之后不难发现不能F5的原因,就在于跳转.
一个函数里面的一个跳转在未知的情况下会出现不能F5.
```
这个办法来自于《IDA sp-analysis failed 不能F5的 解决方案之(一)》
```
.text:00401859 mov , 0
.text:00401860 mov eax,
.text:00401866 mov dword ptr , 1982h
.text:0040186C jmp
```
函数内所有的jmp都看了一下,只有40186c这个不是跳转的一个确定的地址。
本来想在OD里看一下值是多少,然后把这个jmp改成跳转到固定地方,
结果发现开头的这一小段的任何一句汇编都没有执行,也就是说这里是什么都不影响程序执行。
```
.text:00401860 mov eax,
.text:00401866 mov dword ptr , 1982h
.text:00401866 sub_401810 endp
.text:00401866
.text:00401866 ; ---------------------------------------------------------------------------
.text:0040186C db 0FFh
.text:0040186D db 0A5h
.text:0040186E db58h ; 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成功。 楼主的方法不错,学习了。我照着操作了一下,还是有学习的地方
楼主的方法不错 “宁一个办法”有错别字。 Hmily 发表于 2021-4-27 16:03
“宁一个办法”有错别字。
谢谢老大的指出,已改正 请问下有源文件嘛想试试 我总是用菊花 发表于 2021-4-27 22:24
请问下有源文件嘛想试试
面试题程序,不方便给 下次遇到试试看
页:
[1]