-
-
[原创]用DUMP的方式解决IDA F5失败
-
发表于: 2021-4-26 16:05 7431
-
在定位关键算法后我们一般使用F5,查看算法,在按下后提示
Decompilation failure:
401E37: positive sp value has been found
Please refer to the manual to find appropriate actions
中文意思是sp的值有问题
找到的解决办法说修改sp,让sp为0
我们在设置打开option》GENERAL》stack pointer把这个选项勾上,就可以看见sp是多少了
红圈里那个绿色的值就是sp,现在为-0x18,我们按atl+k,打开修改sp窗口,修改宁一个红圈的值为-0x18,
点击ok,就修复完成了,可以看到sp为0了
我们按F5看一下,结果明显是错的。这个方法不行。
宁一个办法
这个办法来自于《IDA sp-analysis failed 不能F5的 解决方案之(一)》
函数内所有的jmp都看了一下,只有40186c这个不是跳转的一个确定的地址。
本来想在OD里看一下值是多少,然后把这个jmp改成跳转到固定地方,
结果发现开头的这一小段的任何一句汇编都没有执行,也就是说这里是什么都不影响程序执行。
干脆直接按d改成数据,再次F5依旧是错的。
既然在od里是可以运行的,说明函数有办法识别
我就在函数各处下断,断在0x401980 jmp short 00401991,发现在函数内这条指令之前的汇编代码都没有执行
选择函数内所有会执行的代码->备份->保存数据到文件.
ida打开文件,Edit->Segments->Rebase Program修改基地址,od里查看基地址为0x401000,
然后找到0x401980 jmp short 00401991的位置,在这条汇编那进行图中的选择创建函数,我已经创建过了所以是灰的。
简单看了一下,算法没问题,F5成功。
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;
}
int
sub_401810()
{
int
result;
/
/
eax
CPPEH_RECORD ms_exc;
/
/
[esp
+
8C0h
] [ebp
-
18h
]
ms_exc.registration.TryLevel
=
0
;
MEMORY[
0
]
=
6530
;
赞赏
- [翻译]Windows预取文件 12743
- [翻译]基于堆栈的文件对象 7143
- [翻译]文件过滤驱动中各种上下文的使用场景 11965
- [翻译] 文件流与流上下文 10884