首页
社区
课程
招聘
[原创]用DUMP的方式解决IDA F5失败
发表于: 2021-4-26 16:05 7431

[原创]用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;

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//