iOS逆向开发笔记

作者: chance395 | 来源:发表于2019-02-25 18:25 被阅读0次

    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 (交互式反汇编程序)

    相关文章

      网友评论

        本文标题:iOS逆向开发笔记

        本文链接:https://www.haomeiwen.com/subject/rhzgyqtx.html