问:用IDA静态分析,函数结尾出现 endp ; sp-analysis failed 用F5调不出伪代码,不知道是什么原因,请问有什么解决办法没有?

答:endp ; sp-analysis failed.

一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来实际跳转,而IDA会以为retn是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed.

我还遇到过一种情况,是因为编译器优化,结果IDA无法正确识别一个函数体的结尾部分,换句话说,它找不

到C中的“大括号”应该位于哪里。例如以下代码:

int one_function( int a,int b);

int another_function( int a, int b)
{
if ( a == 0 || b == 0 )
return -1;
return one_function(a,b);
}

其中return one_function(a,b)这条语句,在某些新的编译器,可能会编译成这样的指令序列:

mov esp, ebp
pop ebp
jmp one_funcion

而IDA是通过retn指令来识别函数的结束的,因为它不知道这里的意思,会把它当成一个函数内部 的跳转,最后就会出现sp analysis failed了。

问:有没有什么办法可以让IDA正确分析,因为函数非常长,需要伪代码来减少分析时间?
答:用alt-k调整sp来解决。

问:如何用ALT+K 调整SP 要输入什么值呢?
答:并没有一个固定值,针对每一条指令执行完后,看看栈是否正常,如果不对,则通过ALT + K来修改.重点检查虚函数的调用, 如call [esi + n] , 这里不一定非得是esi,以及跳转前后的栈是否一致.另外还需要通过ALT + P 来确认下变量起始地址,清除个数与保存个数是否正常.

1)用Option->General->Disassembly, 将选项Stack pointer打勾;
2)仔细观察每条call sub_xxxxxx前后的堆栈指针是否平衡;
3)有时还要看被调用的sub_xxxxxx内部的堆栈情况,主要是看入栈的参数与ret xx是否匹配;
4)注意观察jmp指令前后的堆栈是否有变化;
5)有时用Edit->Functions->Edit function...,然后点击OK,(按D再按C键)刷一下函数定义。

以上是转载。小结下:SP是堆栈指针,上面的问题就是堆栈不平衡,其实问题解决的主要思路就是修正SP,其实勾选Stack pointer选项后每行汇编代码和指令地址之间会多一列数字,这些数值就是SP实际的偏移值。call sub_xxx前面如果显示-0x07H,则将光标停在紧接着这个call后面的一行指令之前(即刚返回的地方),按Alt+K设置新的SP值为-0x07H,再按D按C刷新下函数定义就可以了。

IDA error of " positive sp value has been found"的更多相关文章

  1. 异常:已捕获: "Error creating context 'spring.root': 未将对象引用设置到对象的实例。" (System.Configuration.ConfigurationErrorsException) 捕获到一个 System.Configuration.ConfigurationErrorsException: "Error creating context 'sp

    查看所指定name的context是否注册成功,以后用此容器来获取其中的object. 常见的使用方式: Application_Start中使用ContextRegistry.GetContext( ...

  2. 实验一:使用符号执行工具klee对软件进行破解(来自于klee官网)

    原文地址:https://gitlab.com/Manouchehri/Matryoshka-Stage-2/blob/master/stage2.md 实验用代码下载地址:https://gitla ...

  3. [C++] 反编译器

    各种开源的decompiler都不太好用,眼下最好的反编译器是IDA pro. 尽管是收费的,只是破解版非常好找. 我试过5.5版本号的,还不错. 我把windows notepad进行了反编译,多少 ...

  4. CVE-2014-3153 com.geohot.towelroot

    futex-prevent-requeue-pi-on-same-futex.patch futex: Forbid uaddr == uaddr2 ) If uaddr == uaddr2, the ...

  5. 统计分析中Type I Error与Type II Error的区别

    统计分析中Type I Error与Type II Error的区别 在统计分析中,经常提到Type I Error和Type II Error.他们的基本概念是什么?有什么区别? 下面的表格显示 b ...

  6. PID控制器(比例-积分-微分控制器)- II

    Table of Contents Practical Process Control Proven Methods and Best Practices for Automatic PID Cont ...

  7. PID控制器(比例-积分-微分控制器)- I

    形象解释PID算法 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水. 小明接到任务后就一直守在水 ...

  8. Bioinformatics Glossary

    原文:http://homepages.ulb.ac.be/~dgonze/TEACHING/bioinfo_glossary.html Affine gap costs: A scoring sys ...

  9. C# DataGridView自定义分页控件

    好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...

随机推荐

  1. 高可用OpenStack(Queen版)集群-3.高可用配置(pacemaker&haproxy)

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  2. kali linux执行apt-get update失败(数字签名过期)

    想要安装某个软件,执行apt-get update 失败,出现下面的错误: 自己查看了更新源是没有问题的,根据提示的错误google了一下,发现是数字签名过期了. 执行下面命令: apt-key ad ...

  3. MyBatis学习(一)————纯jdbc编程

    什么是JDBC  JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...

  4. RabbitMQ理论部分

    概念 queue        队列 exchange   交换机 bind          绑定 channel     通道 一个发送消息流程包含上述四个概念.消息经过channel传递给exc ...

  5. 10.openldap备份与恢复

    备份方式 一.使用slapcat指令备份 使用slapcat备份后的数据 经过相关无用条目处理,即可实现数据上的条目备份 备份指令如下 #备份 #slapcat -v -l openldap-back ...

  6. lastlog命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/qiyebao/p/4331078.html last 显示所有用户最后登录信息(会显示系统用户) last -u 50 ...

  7. 互评Beta版本——Thunder组爱阅app(探路者团队测评)

    基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的作品. 1.根据(不限于)NABCD评论作品的选题;   N(Need,需求):在Beta中加入了书友QQ群,以及反馈建议,更好的 ...

  8. spring boot的maven项目报404错误

    $.ajax({ async: false, type: "POST", url:'searchFileSource', contentType : "applicati ...

  9. Daily Scrum (2015/11/7)

    今晚谢金洛同学的UI工作完成,我们进行了UI和后端的拼接,准备开始规范化地进行系统测试. 成员 今日任务及成果 时间 明日任务 符美潇 1.把之前PM分配的编码任务及其说明准备好发给PM 1h 待定 ...

  10. Chapter 7 面向对象分析

    面向对象的分析模型由功能模型.分析对象模型.动态模型三个独立的模型组成,从软件的需求功能来看分析类可以划分为实体类.边界类和控制类三种类型.识别分析类.控制类和实体类需要充分理解系统内部的行为.一个参 ...