IDA error of " positive sp value has been found"
问:用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"的更多相关文章
- 异常:已捕获: "Error creating context 'spring.root': 未将对象引用设置到对象的实例。" (System.Configuration.ConfigurationErrorsException) 捕获到一个 System.Configuration.ConfigurationErrorsException: "Error creating context 'sp
查看所指定name的context是否注册成功,以后用此容器来获取其中的object. 常见的使用方式: Application_Start中使用ContextRegistry.GetContext( ...
- 实验一:使用符号执行工具klee对软件进行破解(来自于klee官网)
原文地址:https://gitlab.com/Manouchehri/Matryoshka-Stage-2/blob/master/stage2.md 实验用代码下载地址:https://gitla ...
- [C++] 反编译器
各种开源的decompiler都不太好用,眼下最好的反编译器是IDA pro. 尽管是收费的,只是破解版非常好找. 我试过5.5版本号的,还不错. 我把windows notepad进行了反编译,多少 ...
- CVE-2014-3153 com.geohot.towelroot
futex-prevent-requeue-pi-on-same-futex.patch futex: Forbid uaddr == uaddr2 ) If uaddr == uaddr2, the ...
- 统计分析中Type I Error与Type II Error的区别
统计分析中Type I Error与Type II Error的区别 在统计分析中,经常提到Type I Error和Type II Error.他们的基本概念是什么?有什么区别? 下面的表格显示 b ...
- PID控制器(比例-积分-微分控制器)- II
Table of Contents Practical Process Control Proven Methods and Best Practices for Automatic PID Cont ...
- PID控制器(比例-积分-微分控制器)- I
形象解释PID算法 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水. 小明接到任务后就一直守在水 ...
- Bioinformatics Glossary
原文:http://homepages.ulb.ac.be/~dgonze/TEACHING/bioinfo_glossary.html Affine gap costs: A scoring sys ...
- C# DataGridView自定义分页控件
好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...
随机推荐
- pwd命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/gnail_oug/article/details/70664458 pwd是Print Working Directory ...
- lambda----jdk8重头戏
简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...
- CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法
CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法: 基本可以确定是Podfile中的内容编码有 ...
- Windows下Visual Studio2017之AI环境搭建
本博客主要包含以下3点: AI简介及本博客主要目的 环境介绍及安装原因 搭建环境及检验是否安装成功 离线模型的训练 时间分配: 时间 时长(分钟) 收集资料+写博客 6.12 11:28-12:2 ...
- YQCB绩效表
标准 队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 28 19 9 91 张晨阳 16 16 25 17 9 83 刘昭为 ...
- Codeforces Round #157 (Div. 1) B. Little Elephant and Elections 数位dp+搜索
题目链接: http://codeforces.com/problemset/problem/258/B B. Little Elephant and Elections time limit per ...
- 团队作业5-Alpha版本测试报告
1.在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? 修复的Bug: a. 修复的bug: 页面打开后比例改变: 出现中文乱码: 点击按钮时不能响应: 导航栏加入显示错误: 上传图片后 ...
- Enterprise Library 4.1 参考源码索引
http://www.projky.com/entlib/4.1/Microsoft/Practices/EnterpriseLibrary/AppSettings/Configuration/Des ...
- 循环队列的C语言实现
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构.队列分为链式队列和 ...
- 关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题
元数据是:NET 程序集中的标记信息. 是在代码中选择了转到定义时候给定位的吧.因为没有找到源代码,VS通过反射读取元数据中的信息生成了那个. 解决方法: 1. 要把项目先添加到解决方案中. 2. 再 ...