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

上个月写了一系列文章《xcode反汇编调试iOS模拟器程序》,是使用xcode来动态反汇编分析iOS模拟器程序的。这个系列则是静态分析,用到IDA来做反汇编/反编译。一些概念不会在此重复,遇到时可回读xcode反汇编系列。

之前有提到一些IDA的常识和下载地址,可看 《IDA Pro权威指南》读书笔记,同时这本书也是更深入挖掘IDA的参考书,只不过书里不会提到Objective-C。本系列使用的是Windows IDA 6.1和Mac IDA 6.4。

详细的关于IDA的介绍还是由官方自己说吧:https://www.hex-rays.com/products/ida/index.shtml。毕竟连官方都说“很难说清楚”,呵呵。

What is IDA all about?

IDA is a Windows, Linux or Mac OS X hosted multi-processor disassembler and debugger that offers so many features it is hard to describe them all. Just grab an evaluation version if you want a test drive.

另外官网也提供demo下载https://www.hex-rays.com/products/ida/support/download_demo.shtml,可以使用最新版。Mac版的IDA没找到crack,只能用demo了。

IDA是逆向工程的重要工具,它既能杀人也能救人。本系列只会谈怎么救人,即目的是弄懂iOS系统的底层实现,查找更多私有API。逆向真机的ARM指令程序就不会提及了。因此这个系列仍然是对iOS模拟器程序来做分析,即32位的x86程序,并以SDK做分析例子。其实学会x86也很容易类比到ARM上,IDA都支持,不过别人发布的apps都不会包含symbol file,所以用到的逆向工程知识会远比这里介绍的多。

这里再补充一下反汇编和反编译这两个概念的区别。反汇编是把机器语言形成的文件内容“翻译”成汇编语言,这些文件主要包括可执行文件/链接库文件/中间目标文件。反编译则是把汇编语言“转换”成高级语言,转换的结果也叫伪码,语言则是C语言(C++和Objective-C都可以用C来实现)。由于机器语言是针对特定CPU的,所以反汇编工具也需要识别各种CPU指令。

IDA能完成xcode做不到的事情有:

  • 跳转查看特定地址代码,包括静态存储区的信息、vtable等
  • 部分地自动计算出偏移地址处的symbol含义
  • 反编译
  • 记录自己添加的信息
  • 查看交叉引用

xcode比IDA好的地方有:

  • 确定运行时的数据数值
  • 清晰地显示调用堆栈

当然,IDA也是支持动态调试iOS程序的,不过我感觉用不上。官方教程:https://www.hex-rays.com/products/ida/support/tutorials/remote-debugging.shtml

PS:IDA图标上的女子:Ada Lovelace

简介:
  阿达·奥古斯塔,19世纪诗人拜伦的女儿,数学家。穿孔机程序创始人,建立了循环和子程序概念。为计算程序拟定“算法”,写作的第一份“程序设计流程图”,被珍视为“第一个给计算机写程序的人”。
  生平:
  1815年生于伦敦,她是英国著名诗人拜伦(L.Byron)的女儿。因父母婚姻破裂,出生5星期后就一直跟随母亲生活。母亲安娜·密尔班克(A.Millbanke)是位业余数学爱好者,阿达没有继承父亲诗一般的浪漫热情,却继承了母亲的数学才能。
  阿达19岁嫁给了威廉·洛甫雷斯伯爵,因此,史书也称她为洛甫雷斯伯爵夫人(Lady Lovelace)。由于巴贝奇晚年因喉疾几乎不能说话,介绍分析机的文字主要由阿达替他完成。阿达的生命是短暂的,她对计算机的预见超前了整整一个世纪。阿达早逝,年仅36岁,与她父亲拜伦相似。根据她的遗愿,她被葬于诺丁汉郡其父亲身边。
  阿达设计了巴贝奇分析机上解伯努利方程的一个程序,并证明当时的19世纪计算机狂人巴贝奇的分析器可以用于许多问题的求解。她甚至还建立了循环和子程序的概念。由于她在程序设计上的开创性工作,Ada Lovelace被称为世界上第一位程序员。当时的阿达甚至不顾自己已是三个孩子的母亲,坚定地投身于分析机研究,成为巴贝奇的合作伙伴。在1843年发表的一篇论文里,阿达认为机器今后有可能被用来创作复杂的音乐、制图和在科学研究中运用,这在当时确是十分大胆的预见。以现在的观点看,阿达首先为计算拟定了“算法”,然后写作了一份“程序设计流程图”。这份珍贵的规划,被人们视为“第一件计算机程序”。
  美国国防部据说花了10年的时间,把所需软件的全部功能混合在一种计算机语言中,希望它能成为军方数千种电脑的标准。1981年,这种语言被正式命名为ADA(阿达)语言,以纪念这位“世界上第一位软件工程师”。
目录
(一)话说IDA
(二)加载文件与保存数据库
(三)函数表示与搜索函数
(四)反汇编的符号信息与改名
(五)F5反编译
(六)交叉引用
(七)识别类的信息
(八)IDA for Mac
(九)block
时间: 2024-08-03 17:14:54

IDA反汇编/反编译静态分析iOS模拟器程序(一)话说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函数都会

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

反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品.既然是产品,那当然就另外收费,demo版是没有的.反编译的快捷键是F5,菜单位置在 顶部菜单View->Open Subviews->Pseudocode.(有网友问到为什么按照第一篇的地址下载IDA后也没有F5,最终是发现他自己装了python,设了环境变量,这会令IDA工作不正常) 在显示反汇编的窗口中按F5,经过分析后,会多了一个标签栏Pseudocode-A: 继续上一节(可用两个浏览

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() { return m_val2; } 反编译两个函数,得到的是 int __cdecl TestClass__getVal1(int a1) { return

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

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

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

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

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