从这一篇文章开始,我么就要开搞iOS相关的东西了,包括正向开发和逆向分析,因为不能仅仅局限于Android的世界,iOS的世界依然很美,同时我也是经常使用iPhone的,一直都想用上自己开发的插件,不过越来越觉得iOS不如Android好用了,本文主要介绍一下后续开搞的基本知识点。看看开发iOS需要知道哪些东西和需要准备哪些工具,具体和Android做比对。
一、应用开发和发布
关于应用发布已经账号开发,iOS和Android有着很大的区别,有这么大的区别应该是iOS整个生态系统比Android完善吧,Android我们都知道只要有AndroidStudio和一个设备就可以入门开发了,当然这里忽略模拟器效果哈。但是iOS不行,iOS不是说只要有一个Xcode和一个iPhone就可以开发了,还需要设置证书啥的。还有发布的时候也是,对于Android国内是免费的,只要你能够过了各个市场的审核就可以,国外GooglePlay需要开通账号我记得我当时是给了29美金,但是这个是终生的哦,所以还觉得可以,但是iOS就恶心了,只要购买就必须每年是99美金,记得是每年哦,说实话为了个人学习购买的话我是不愿意的,不过他也有免费的但是限制很恶心。下面来看一下iOS中应用发布和开发账号类型的区别
看到这张表格很好的诠释了iOS中开发者账号的几个类型,这里更多的关注是个人账号和公司企业账号:
1》其中个人账号有免费的也有交钱的,区别在于本地Xcode中项目的bundleid没有限制,在我开发学习过程中一直都是用免费的个人账号的,但是有一天我遇到这么个错误:
当时遇到这个问题很郁闷也问了很多人,最后发现原来是个人免费开发者账号他创建的工程配发的bundleid是有限制的,可能这个bundleid就是我最后一个了,具体这个限制数量好像官方也没说是多少个。当然免费的和付钱的还有一个最大的区别在于你开发完的应用是否可以发布到AppStore上,其实一直没搞懂苹果为啥在开发的过程中要把付钱的和没付钱的区分那么细,觉得上传发布到市场上区分付钱还可以理解。但是本地开发为啥还要区分,当然还有其他区别,这里就不在列举了。
2》公司账号和企业账号的最大的区别在于,公司账号和付费的个人账号都是可以发布应用到AppStore上的,这两个的区别是发布之后再AppStore里面显示的开发者名称不一样,而对于企业账号是不允许发布到AppStore市场中的和个人免费开发者账号类似,但是他有个好处就是没有设备限制,企业账号最常用的就是公司里面的应用内侧版本,就是不能泄露出去的版本,一般我们都是通过扫描二维码然后浏览器中提示安装,而且这种安装之后需要去 设置->通用->描述文件与设备管理 手动信任这个应用的,因为苹果认为从非AppStore中安装的应用都是不安全的,当然也有一些公司开发的应用不符合AppStore审核被拒的时候也是采用这种方式发布应用的,一般我们经常看一些网站上就是弹出一个提示让你安装,然后在让你去设置手动信任一下。
我们只要开发不管是发布还是不发布,都需要先去官网申请一个账号:https://developer.apple.com/account 这个主要用于后续开发用哪个账号进行app签名然后安装到真机中方便测试,其实如果你有iPhone设备了,肯定就有账号了,因为现在用iPhone的都需要用账号激活设备,然后iCould啥的,AppStore里面安装应用都需要账号的,没有账号其实设备是几乎用不了的。
关于账号这里还有一些区别,就是和我们后期出包类型有很大关系,比如我们现在用Xcode导出一个ipa包:
选择菜单Product->Archive:
然后这里选择Distrute App:
到这里就出现了四种类型的的打包方式了:
1、App Store Connect
保存到本地,准备上传App Store或者在越狱的iOS设备上使用,很明显的需要发布到App Store上的,那么结合上面的那张图,需要是付费的个人账号以及公司账号和政府账号才可以。
2、Ad Hoc
保存到本地,准备在已添加账号的可使用设备上使用(具体为在开发者账户下添加可用设备的UDID),该app包是发布证书编译的,安装测试用的但是有udid限制,那么可以理解是没有上传的AppStore的,那么除了一个免费的个人账号,其他类型账号都可以,有的同学好奇了免费的账号为啥不可以呢,其实直接点击next就知道了:
看到了这个就是我的免费账号被侮辱的结果,所以做人一定要有钱!
3、Enterprise
这种主要针对企业级账户下,可以本地服务器分发的app,这个一看就是没有任何udid设备数量限制,那么只有企业账号可以做到
4、Deployment
针对内部测试使用,主要给开发者的设备(具体也为在开发者账户下添加可用设备的UDID)。该app包是开发证书编译的,其实这个和第二Ad Hoc很类似,唯一区别是这个用开发证书编译的,而Ad Hoc用的是发布证书编译的。
其实后面大家会经常看到这两种类型的的发布包方式(ipa):
第一、In-House 企业应用发布
1》不能提交到AppStore
2》发布应用的具体内容不需要苹果官方审核(因为提交不了AppStore所以也不需要苹果审核哈哈哈)
3》安装设备的数量没有任何限制
4》把程序放到网站中,提供给用户一个链接,他们就能直接下载并且自动安装
只有企业账号可以做这种类型的应用分发
第二、Ad Hoc 应用发布方式
1》不能提交到AppStore
2》不需要经过苹果的评审
3》限制每个应用不能发布到超过100个设备上
4》把程序放到网站中,提供给用户一个链接,他们就能直接下载并且自动安装
除了个人免费的账户以外,其他类型的账户类型都可以进行分发
其实上面两种发布方式一般用于App因为不合规的内容被苹果商店拒绝了,或者是公司开发的应用内侧包等,所以就用这方式搞个链接到网站上引导用户下载,不过这种下载安装之后是直接打不开的,需要进行设备证书授权的:
苹果为了安全不允许任何从非不可以发布应用的账号打出来的包直接打开的,就是如果这个ipa包是你用不可以发布app的类型账号打出来的都必须要授权信任:
我们去 设置->通用->设备描述文件管理 找到信任选项直接信任即可打开使用了。不过我们知道Ad-Hoc这种形式因为设备有数量限制,所以大部分公司分发应用都会用企业账户进行打包。其实这里还有应用签名的区别,后面会介绍。
二、应用文件说明(ipa/app)
这里说的文件种类不包括我们正向开发里面的程序文件比如代码是.h和.m呀,我们说的是逆向中或者说程序应用的文件,比如我们知道Android中最终编译出来的是apk文件,apk其实是一个压缩包格式,他内部包含了dex文件主要是代码编译后的东西,还有资源编译后的文件arsc格式等,这个格式都可以用010Editor按照指定模板打开,那么iOS编译后的应用包是ipa格式,其实ipa也是一个压缩包格式,我们可以直接用解压软件打开即可,打开之后就是app文件了,这个我们可以直接右键->显示包内容就可以看到整个应用的所有资源文件了,比如这里我们从爱思助手或者PP助手上下载一个ipa下来解压看到,一般都是Payload目录包含了xxx.app内容
这里其实MTPotal.app是一个文件夹,我们可以右键->显示包内容:
我们可以用命令行看到这个其实就是一个文件夹:
其实就是一个文件夹而已,我们看到的.app文件,包括我们Mac中的安装的程序在Applications中也是如此:
这里也可以看到其实Mac和iPhone采用的很多机制都一样的,整个苹果的生态系统也是很完整的,所以如果我们对iOS逆向比较了解了,Mac中的逆向也是没啥难度。
到这里看到这里有很多内容了,不过这里不会介绍那么多,因为其他文件暂时用不到,等后面有具体场景会具体分析,这个有点类似Android的apk解压后的可以看到这么信息,当然这里最重要的就是二进制可以执行文件文件了:
我们一般打开.app目录之后可以看到这种二进制可执行文件的,其实这个文件就是整个程序的运行代码内容,已经被编译成二进制文件了,类似于Android中的dex文件,但是这类文件有个统称叫做:Mach-O,关于这个文件是整个苹果生态系统中的二进制文件:
Mach-O格式全称为Mach Object文件格式的缩写,是mac上可执行文件的格式,类似于Windows上的PE格式或者是Linux上的elf格式,Mach-o文件类型分为:
1、Executable:应用的主要二进制
2、Dylib Library:动态链接库(又称DSO或DLL)
3、Static Library:静态链接库
4、Bundle:不能被链接的Dylib,只能在运行时使用dlopen( )加载,可当做macOS的插件
5、Relocatable Object File :可重定向文件类型
拓展说明:在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库
.a与.framework的区别
.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework可以单独使用。
FatFile/FatBinary文件格式:
简单来说,就是一个由不同的编译架构后的Mach-O产物所合成的集合体。一个架构的Mach-O只能在相同架构的机器或者模拟器上用,为了支持不同架构需要一个集合体。
了解了Mach-O文件之后,就应该有类似的工具可以查看他的内容格式,比如Android中如果想查看so文件,可以用命令readelf,或者用010Editor借助模板可以UI功能查看等,这里也不例外,如果想用UI功能查看的工具MachOview:
MachOView下载地址:http://sourceforge.net/projects/machoview
MachOView源码地址:https://github.com/gdbinit/MachOView
比如上面我们打开应用的可执行文件,看到他最外层是一个Fat Binary格式,可以看到,Fat文件只是对各种架构文件的组装,点开 “Fat Header”可以看到支持的架构,图中显示的支持ARM_V7 、ARM_64 :
其实这里还有很多元信息,比如系统支持等,这里就不多介绍了,但是这里我们需要重点看一个重要信息就是,应用是否加壳了: