Ios逆向开发
cydia上面的xsellize共享源
Ios上第一款通话录音软件Audio recorder
Ios逆向工程的工具可以分为四大类:
监测工具:起到嗅探、监测、记录目标程序行为的工具,这些工具通常可以记录并显示目标程序的某些操作,如UI变化,网络活动,文件访问等,常用的监测工具有Reveal、snoop-it、instospy等。如reveal能够辅助定位app中我们感兴趣的部分,让我们能迅速从UI层面切入代码层面;
反汇编工具(disassembler):从UI层面切入代码层面后,就要利用反汇编工具来梳理代码了。反汇编工具把二进制文件作为输入,经过处理后输出这个文件的汇编代码;在ios逆向工程中,常用的反汇编工具主要是IDA和Hopper。其中IDA支持Windows、linux、OSX平台和多种处理器架构。
Hopper是一款近年面世的反汇编工具,主要针对的是苹果操作系统,
调试工具(debugger):LLDB
开发工具:正向开发利用xcode,逆向的有基于xcode的iOSOpenDev和偏命令行的Theos
iOS是越狱的组织和个人:evad3rs、盘古、太极
对于未越狱的iOS,苹果官方开放给第三方直接访问iOS文件系统的接口非常有限,开发者只需要遵循规定,参考文档即可完成工作,因此,纯粹的App Store开发者可能对iOS系统结构一无所知。
来之storeapp不能访问自身目录以外的绝大多数文件,一旦越狱后来自cydia的app就可以得到更高的访问权限,从而访问全系统的文件,来自cydia的iFile是一个老牌的第三方文件管理app;
同时还可以在AFC2服务的帮助下,通过ifunBox等PC端软件访问iOS全系统文件。
iOS二进制文件类型:
1.Application 放app的文件夹
A.Bundle 的概念来源于nextstep他不是一个文件,而是一个按某种标准结构来组织的目录,其中包含了二级制文件及运行所需的资源。正向开发中常见的app和framework都是以bundle的形式存在的,在越狱iOS中常见的preferencebundle可以看成是一种依附于setting的app,结构与app类似,本质也是bundle。
Framework也是bundle,但是framework的bundle中存放的是一个dylib,而不是可执行文件。相对来说framework的地位比app更高。因为一个app的绝大多数功能是通过调用framework提供的接口来实现的,将某个bundle确立为逆向目标后,绝大多数逆向线索都可以在bundle内找到,这大大降低了逆向工程的复杂度。
B.app目录结构
Info.plist记录了app的基本信息,如bundle identifier、可执行文件名、图标文件名等,其中bundle identifier会在后续章节的cydiasubstrate中成为tweak的重要配置信息,可以通过xcode查看它的值,也可以plutil命令行控制工具查看;
C.可执行文件 其重要性不言而喻,是app目录下最核心的部分,也是逆向工程最主要的目标,同样可以通过xcode和plutil两种方式来查看info.plist定位可执行文件,
D.系统App VS store app
/applications /目录存放系统app和从cydia下载的app(我们把来自cydia的app视为系统app)
/var/mobile/Containers/目录存放的则是storeapp,
这两种app的bundle内部目录结构区别不大,都含有info.plist、可执行文件、lproj目录等,但是数据目录的位置不同:storeapp的数据目录在var/mobile/Containers/Data/下,以mobile权限运行的系统app的数据目录在var/mobile/下,而已root权限运行的系统app的数据目录在/var/root/下。
E.安装包格式与权限
sydia app的安装包格式一般是deb,storeapp的安装包ipa,其中deb是来自debian的安装包格式有cydia作者saurik移植到iOS中的,属主权限一般是root和admin,能够以root权限运行,二ipa是苹果为iOS推出的专属APP安装包格式,属主都是mobile
F.沙盒sandbox就是一种访问机制
2.dynamic library(dylib)动态库
Lib分为static和dynamic两种,其中static lib在编译阶段会成为app可执行文件的一部分,会增加可执行文件的大小,而dylib不会改变可执行文件的大小,只有当app需要用到这个dylib时,iOS才会把它加载进内存,成为app进程的一部分。dynamic lib是逆向工程的重要目标类型,但其本身并不是可执行文件,不能独立运行,只能寄生在别的进程里面,成为这个进程的一部分。因此,dylib的权限是由它寄生的那个app决定的;
3.daemon.后台程序(守护进程)
iOS其实是有后台多任务的,比如上网接电话,垃圾消息过滤等,iOS源于OSX,OSX源于Unix
daemon的逆向难度比较高初级阶段不建议使用,但是弄了回报很高,iOS上的第一款电话录音软件audio recorder就是通过逆向mediaservered这个daemon实现的。
工具篇
-->>OSX工具集
Class-dump dump(转储)
它利用obj-c语言的runtime特性将储存在mach-o(可执行文件)文件中的头文件信息提取出来,并生成对应的.h文件
点击下载后解压后会有class-dump和源码文件。将class-dump复制到/usr/bin/class-dump。如果是OS X 10.11,因为没有/usr/bin文件夹的写权限,所以将class-dump复制到/usr/local/bin/class-dump即可;
Class -dump的对象是mach-o格式的二进制文件,如framework的库文件和app的可执行文件,以.app结尾的文件,终端定位到那里 class-dump -H AppName.app -o要输出的目录,在.m出现的变量和方法都会提取出来 无论是共有还是私有变量 方法都会提取出来的
Theos
这是一个越狱开发工具包,由iOS越狱界知名人士dustin howett 开发并分享到github上,这个与其他越狱开发工具相比最大的特点就是简单,下载安装简单 logos语法简单、编译发布简单,可以让使用者把精力都放在开发工作上面,越狱开发中常用的另一工具是iOSOpenDev集成在Xcode ,但是逆向工程接触底层知识较多 很多东西无法自动化 因此推荐使用整合度并不高的Theos,
在新版的git中
https://github.com/yohunl/FlexInjected/tree/14137c231e94e881c603c83d91fe4fb20700292b
这是大神以前的https://github.com/theos/theos.
后面2015年么有维护了交给社区在打理
https://github.com/theos/theos
终端输入export THEOS=/opt/theos #这个是建立一个环境变量方便后面的操作(引用这个环境变量是用$THEOS)
这种建立环境变量的方式,只是在当前终端中起作用了,关闭终端后又得重新设置,为了避免每次都建立这个环境变量,我们可以建立一个永久的环境变量
编辑~/.profile文件,在其中添加export THEOS=/opt/theos/,这个环境变量就是永久的了. ps:怎么查看定义了哪些环境变量呢?终端中输入命令env!
git clone --recursive https://github.com/theos/theos.git $THEOS
这个目录和终端变量$THEOS只是方便我们操作,其实你也可以放在任何你想放置的目录. 新版的theos下载下来后,其内部已经内置了cydia framework和iOS的一系列私有的头文件等,不需要像以前版本那样,自己从手机上或者其它地方拷贝cydia的lib来了,其放置的目录是vendor/lib和vendor/include
brew install ldid
brew install dpkg
解决Updating Homebrew... 长时间不动解决方法。。。。。
替换brew.git:
cd "$(brew --repo)"
git remote set-url originhttps://mirrors.ustc.edu.cn/brew.git
替换homebrew-core.git:
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
可以更换清华的源 git://mirrors.tuna.tsinghua.edu.cn/homebrew.git
如果出现[error] Cowardly refusing to make a project inside $THEOS (/opt/theos/)
是cd 位置不对 另外换个 不要和theos一个目录下
-rw-r--r-- 1 Brain staff 127 Jul 30 15:21 Makefile
-rw-r--r-- 1 Brain staff 1045 Jul 30 15:21 Tweak.xm
-rw-r--r-- 1 Brain staff 204 Jul 30 15:21 control
-rw-r--r-- 1 Brain staff 47 Jul 30 15:21 firstHook.plist
Makefile 文件指定工程用到的文件、框架、库等信息,将整个过程自动化,
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = firstHook
firstHook_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
包含了名称 源文件,
根据不同的theos工程类型,通过include命令指定不同的.mk文件,在逆向工程初级阶段,我们开发的一般是application
、tweak和tool三种类型的程序,他们对应的.mkf分别是application.mk tweak.mk 和tool.mk
Tweak.xm:
Xm中的x代表这个文件支持logos语法,如果后缀名是单独一个“X”说明源文件支持logos和C语法,“xm”说明源文件支持logos和c/c++语法,与“m”和“mm”的区别类似;
里面使用logos语法,包含%hook、%log、%orig这三个预处理指令,作用如下:
%hook:
指定需要hook的class,必须以%end结尾,
%log:
该指令在%hook内部使用,将函数的类名、参数等信息写入syslog,可以以%log([(<tyoe>)<expr>,...])的格式追加其他打印信息,如下:
%orig:
该指令在%hook内部使用,执行被勾住hook的函数的原始代码,
同时还可以利用%orig更改原始函数的参数,例如
在函数中调%orig,参数可以重置;
除了这三样外还有%group:指令用于将%hook分组,便于代码管理及按条件初始化分组,必须以%end结尾。一个%group可以包含多个%hook,所有不属于某个自定义group的%hook会被隐式归类到%group——ungrouped中。其必须配合%init使用才能生效
%init 该指令用于初始化某个%group,必须在%hook或%ctor内调用,如果带参数,则初始化指定的group 如果不带参数则初始化_ungrouped
%ctor. Tweak 的construcktor,完成初始化工作,如果不显式定义会自动生成一个%ctor,并在其中调用%init(_ungrouped)
如果显式定义了%ctor,则必须定义%init,同时这个不需要以%end结尾
%new在%hook内部使用,给一个现有class添加新函数,功能与class_addMethod相同,
%c该指令的作用等同于objc_getClass或者NSClassFromString,即动态获取一个类的定义,在%hook或%ctor内使用;
control文件:
包含了包最低依赖,维护人 作者 设备架构
Plist:这个plist文件的作用和app中的info.plist类似,他们记录了一些配置信息,描述tweak的作用范围。我们可以用plutil,也可以用xcode来编辑它。最外层是一个dic,键为filter
其中filter下是一系列的array,可以分为三类:
bundles,指定若干的bundles作为tweak的作用对象,
class指定若干class为tweak的作用对象,
Executables,指定若干可执行文件为tweak的作用对象。
编译:—》》
在theos工程目录下执行Make /make package ,生成deb包,最后make clean清除所有
使用命令行安装的时候在makefile的最上面一行加上本机IP地址,然后调用make package install 免密做法:
先生成ssh秘钥对然后$cp /users/brain/.ssh/id_rsa.pub ~/authorized_keys (生成keys)
连接手机$. Ssh-keygen. (一路生成)
$ logout
切换电脑$ scp ~/authorized_keys root@iosip:/var/root/.ssh. (默认alpine)
Reveal
手机端进入sydia下载reveal loader
Mac端下载reveal 进入help找到libReveal.dylib.拷贝进:/Library/RHRevealLoader/
额外:mac和手机之间互相传递文件
Mkdir +地址/文件夹. (创建文件夹)
Vi 文件名 (创建文件)->输入“i” 开始编辑,完成后“:” 然后 wq 保存
OK
电脑传递到手机
scp /Users/brain/Desktop/libReveal.dylib root@192.168.101.127:/Library/RHRevealLoader/
手机传递到电脑
scp root@192.168.101.127:/Library/RHRevealLoader/libReveal.dylib /Users/brain/Desktop/
scp提供了几个选项 在scp后加就行了
-p 拷贝文件的时候保留源文件建立的时间。
-q 执行文件拷贝时,不显示任何提示消息。
-r拷贝整个目录www.2cto.com
-v 拷贝文件时,显示提示信息。
在手机上设置reveal 能打开的app,然后重启,在你电脑端左上角连接那里就知道了。。。太尼玛神奇了
IDA:the interactive disassembler (交互式反汇编程序)