IDA反汇编/反编译静态分析iOS模拟器程序(九)block

在第三节 函数表示与搜索函数 提到block函数和普通的OC函数不同。 反汇编分析前需要理解block的实现原理,故推荐先看看这几篇文章及其所引用的参考资料: Block介绍(一)基础 Block介绍(二)内存管理与其他特性 block介绍(三)揭开神秘面纱(上) block介绍(四)揭开神秘面纱(下) block函数的命名与上文提到类似。函数内部定义的block会以sco...
阅读(5988) 评论(8)

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是对O...
阅读(24361) 评论(17)

IDA反汇编/反编译静态分析iOS模拟器程序(七)识别类的信息

C++类的实质是个结构体。先举个例: class TestClass { int m_val1; int m_val2; public: int getVal1(); int getVal2(); }; int TestClass::getVal1() { return m_val1; } int TestClass::getVal2() {...
阅读(9118) 评论(0)

IDA反汇编/反编译静态分析iOS模拟器程序(六)交叉引用

交叉引用cross reference是指 这个地址的 数据或代码 引用了哪个地址 以及 被哪些地址的代码所引用。引用了哪个地址,在反汇编就能看出来,一行汇编代码自然只会引用一个地址。但被引用是一对多的关系,正如一个函数可以被很多函数在内部调用。查看“被引用”是静态分析中得到堆栈的方法,当然,因为一对多的关系,还需要猜。这主要是看分析的目的是什么,与运行时动态分析相比各有好处,静态分析能得到完整的...
阅读(14800) 评论(3)

IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译

反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品。既然是产品,那当然就另外收费,demo版是没有的。反编译的快捷键是F5,菜单位置在 顶部菜单View->Open Subviews->Pseudocode。 在显示反汇编的窗口中按F5,经过分析后,会多了一个标签栏Pseudocode-A: 继续上一节(可用两个浏览器窗口对比)的示...
阅读(14598) 评论(12)

IDA反汇编/反编译静态分析iOS模拟器程序(四)反汇编的符号信息与改名

首先看看windows IDA和xcode的反汇编有什么不同。因为不确定直接分析UIKit的代码会不会有法律问题,还是自己写个例子吧。分析UIKit的时候因为没有完整的debugging symbols,所以得到的反汇编信息会比自己写的代码较少。 一个在命名空间ANameSpace的类DataInternal,一个DataModel的C++类,一个继承自UIButton的TestButton。演...
阅读(6406) 评论(3)

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

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

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

启动windows版的IDA,在Quickstart界面点击New,弹出一个对话框选择文件。也可以按取消后再把文件拖进IDA。由于Mac版的IDA没注册,没有save功能,所以只好先把Mac上的东西拷贝到windows再打开了。 能拖进IDA的文件可以是静态库、动态库、可执行程序等。对ios而言,可执行程序通常是build出来的.app包里的同名文件,当然,也可以是系统自带的程序。库文件主要是S...
阅读(10896) 评论(0)

利用IDA和LLDB探索WebCore的C++类的继承关系

开刀的类名叫 PluginWidgetIOS,利用lldb可以得到: (lldb) image lookup -r -s PluginWidgetIOS 7 symbols match the regular expression 'PluginWidgetIOS' in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSim...
阅读(3092) 评论(0)

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

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

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" f...
阅读(7392) 评论(1)

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

引用第二节的例子: 函数的入口处,通常都是把esp的值传给ebp保存,然后下面的操作以ebp为基准做偏移量引用。因为esp作为栈指针,push和pop都会自动修改其值,所以用ebp可以不受影响。 还有的常见情形是开头和结尾对应着subl $8, %esp addl $8, %esp这里体现着所谓的“局部变量在栈上分配”原则,说明本函数需要用8字节作为局部变量的保存空间。同时因为ebp已...
阅读(3589) 评论(0)

xcode反汇编调试iOS模拟器程序(五)调试objc_msgSend函数

反汇编调试objective-c,遇到最多的就是objc_msgSend这函数了,本节主要讲讲它的实现以及调试过程的一些技巧。 以UIWebView为例子,看看它在loadRequest时做了什么。 首先必须明白,原始代码中调用 [uiWebViewInstance loadRequest:request]的实质是调用了objc_msgSend(uiWebViewInstance, "loa...
阅读(7081) 评论(6)

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

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

xcode反汇编调试iOS模拟器程序(二)看懂反汇编

这里当然不会从零开始讲汇编代码了,零基础的话可以看看 王爽 写的书《汇编语言》,请自己找度娘或谷哥要了。 这一节主要讲讲书上没有的东西。 在xcode中看到的汇编语法不是熟悉的intel格式,而是叫AT&T汇编。基本上只要懂intel,at&t会很快上手。两者的区别请参考这篇文章: AT&T汇编http://blog.csdn.net/bigloomy/article/details...
阅读(7962) 评论(1)

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

在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数。 以esp为基址,往后的偏移分别是: 0:函数执行完毕后的返回地址(不是返回值的地址哦) 4:对象实例的指针,即self指针 8:selector,实际是一个char数组型的字符串,即char* 12:(如果有)第一个参数 …(前一个参数的基址+前一个参数所占的字节数):(如果有)第n个参数 由此...
阅读(6130) 评论(0)

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

iOS模拟器程序的实质就是Mac OS X程序,只不过它需要以模拟器为载体来运行显示。故它的反汇编代码指令都是x86 CPU的,不是真机上的arm指令。 研究模拟器程序的反汇编有两个目的,或叫做好处: 一是为了研究深入到iOS系统的类库,你可以较容易地发现私有API,以及看到系统的实现。 二是,很直接地,模拟器调试比真机快。而且,相信大多数人更懂x86指令,各类高校教材的汇编教程都不是arm...
阅读(15585) 评论(0)

二进制/十六进制转浮点数的编程(互转类似)

转换的程序: // 输入十进制整数,输出同样内存排布的float表示 inline float i2f(int i) { float f = 0; assert(sizeof(int) == sizeof(float)); memcpy(&f, &i, 4); return f; } inline double ll2d(long long...
阅读(3109) 评论(0)
    个人资料
    • 访问:964400次
    • 积分:9357
    • 等级:
    • 排名:第1928名
    • 原创:126篇
    • 转载:0篇
    • 译文:0篇
    • 评论:430条
    联系方式
    博客专栏
    最新评论