xcode反汇编调试iOS模拟器程序(六)函数出入口处的处理与局部变量

引用第二节的例子:

函数的入口处,通常都是把esp的值传给ebp保存,然后下面的操作以ebp为基准做偏移量引用。因为esp作为栈指针,push和pop都会自动修改其值,所以用ebp可以不受影响。

还有的常见情形是开头和结尾对应着

subl $8, %esp
addl $8, %esp

这里体现着所谓的“局部变量在栈上分配”原则,说明本函数需要用8字节作为局部变量的保存空间。同时因为ebp已指向未subl前的esp地址,所以往下的操作中,-x($ebp)这样的地方是在操作局部变量,其中x为非负整数。不过需要明确的是,未必x字节是被用完作为局部变量的,编译器出于字节对齐的考虑,如果只用了7字节,那么也会分配到8字节。

嗯,这节很短,但对于理解代码很重要。

时间: 2024-10-25 06:57:46

xcode反汇编调试iOS模拟器程序(六)函数出入口处的处理与局部变量的相关文章

xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数

在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数. 以esp为基址,往后的偏移分别是: 0:函数执行完毕后的返回地址(不是返回值的地址哦) 4:对象实例的指针,即self指针 8:selector,实际是一个char数组型的字符串,即char* 12:(如果有)第一个参数 -(前一个参数的基址+前一个参数所占的字节数):(如果有)第n个参数 由此,要调试这样一个函数 - (void)para1:(id)p1 para2:(CGRect)p2 para3:(CGPoi

xcode反汇编调试iOS模拟器程序(一)查看反汇编

iOS模拟器程序的实质就是Mac OS X程序,只不过它需要以模拟器为载体来运行显示.故它的反汇编代码指令都是x86 CPU的,不是真机上的arm指令. 研究模拟器程序的反汇编有两个目的,或叫做好处: 一是为了研究深入到iOS系统的类库,你可以较容易地发现私有API,以及看到系统的实现. 二是,很直接地,模拟器调试比真机快.而且,相信大多数人更懂x86指令,各类高校教材的汇编教程都不是arm指令的吧. 首先问题是如何看到反汇编代码: 操作:Xcode顶部菜单->Product->Debug W

xcode反汇编调试iOS模拟器程序(八)反汇编自己的代码来掌握规则

掌握了基本技巧后,基本上已不难理解所有的反汇编结果.授之以鱼不如授之以渔: 通过观察自己写的代码的反汇编来掌握各种代码的反汇编结果,从而逆向推测系统代码的源码. 调试自己写的代码时,可以不断切换查看源码和反汇编来定位代码执行到何处 这里分别用两个很简单的C++和Objective-C类来做示例: class TestC { int m_var; public: int getVar(); void setVar(int var); }; @interface TestOC : NSObject

xcode反汇编调试iOS模拟器程序(四)自动断点应用之NSNotificationCenter

知道怎么查看后,先看看有什么实际应用,拿NSNotificationCenter来做实践吧. 首先在某个容易进入的地方加断点,并停在那,例如main函数.在gdb或lldb输入命令,手工添加断点.如下图: 输入的命令如下: b -[NSNotificationCenter addObserver:selector:name:object:] b -[NSNotificationCenter addObserverForName:object:queue:usingBlock:] 然后contin

xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别

首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编 - (void)test { UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.0, 20.0f, 30.1, 40)]; [button setTitle:@"test" forState:UIControlStateNormal]; [button setTitleColor:[UI

IDA反汇编/反编译静态分析iOS模拟器程序(一)话说IDA

上个月写了一系列文章<xcode反汇编调试iOS模拟器程序>,是使用xcode来动态反汇编分析iOS模拟器程序的.这个系列则是静态分析,用到IDA来做反汇编/反编译.一些概念不会在此重复,遇到时可回读xcode反汇编系列. 之前有提到一些IDA的常识和下载地址,可看 <IDA Pro权威指南>读书笔记,同时这本书也是更深入挖掘IDA的参考书,只不过书里不会提到Objective-C.本系列使用的是Windows IDA 6.1和Mac IDA 6.4. 详细的关于IDA的介绍还是由

IDA反汇编/反编译静态分析iOS模拟器程序(三)函数表示与搜索函数

打开IDA一般都是去搜索函数,可以说函数是IDA工程的基本单位吧,数据结构什么的都是为函数服务而已.函数列表在界面左侧的Functions Window: 可以看到,UIKit有27789个函数呢.在搜索前要先知道函数的表示方式. Objective-C函数的表示: 拿UIView来做例子吧.在xcode documentation中,UIView的函数会有这样的表示: + (void)beginAnimations:(NSString *)animationID context:(void *

IDA反汇编/反编译静态分析iOS模拟器程序(二)加载文件与保存数据库

启动windows版的IDA,在Quickstart界面点击New,弹出一个对话框选择文件.也可以按取消后再把文件拖进IDA.由于Mac版的IDA没注册,没有save功能,所以只好先把Mac上的东西拷贝到windows再打开了. 能拖进IDA的文件可以是静态库.动态库.可执行程序等.对ios而言,可执行程序通常是build出来的.app包里的同名文件,当然,也可以是系统自带的程序.库文件主要是SDK中各个framework,以UIKit为例,它的iOS6.1模拟器版静态链接库的路径为: /App

IDA反汇编/反编译静态分析iOS模拟器程序(八)IDA for Mac

iOS多用OC(Objective-C)编程,Mac也类似,所以IDA for Mac对OC的支持似乎强些.Windows的IDA在反汇编某些SDK库文件时会识别不出OC的函数名,而且对OC运行时的结构体也没识别出来.当然,因为我用的是6.1版的windows IDA, Mac上用的是6.4版,不知道是不是windows IDA 6.1的bug了. 总之在界面操作流程上,感觉Mac IDA是对OC有做优化的.当加载一个app时, 会询问是否解析和重命名OC的函数: 如果选择No,所有OC函数都会