iOS逆向开发笔记

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([(),...])的格式追加其他打印信息,如下:

%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 [email protected]:/Library/RHRevealLoader/

手机传递到电脑

scp [email protected]:/Library/RHRevealLoader/libReveal.dylib  /Users/brain/Desktop/

scp提供了几个选项  在scp后加就行了 


    -p 拷贝文件的时候保留源文件建立的时间。 

    -q 执行文件拷贝时,不显示任何提示消息。 

-r拷贝整个目录www.2cto.com

    -v 拷贝文件时,显示提示信息。

在手机上设置reveal 能打开的app,然后重启,在你电脑端左上角连接那里就知道了。。。太尼玛神奇了

IDA:the interactive disassembler (交互式反汇编程序)

你可能感兴趣的:(iOS逆向开发笔记)