逆向第二课(Theos安装配置及Tweak工作原理)

Theos安装与配置

Theos是一个越狱开发工具包,使用它可以创建Tweak项目,动态Hook第三方程序。GitHub链接:https://github.com/theos/theos ,官网安装教程可以参考:https://github.com/theos/theos/wiki/Installation

安装
  1. 安装依赖库

    安装Theos之前先安装三个依赖库,dpkg、fakeroot和ldid

    $ brew install ldid fakeroot
    $ brew install --from-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb
    $ brew pin dpkg
    
    • ldid(作者:saurik )
      维基百科:http://iphonedevwiki.net/index.php/Ldid

      越狱iPhone下的签名工具(更改授权entitlements),可以为theos开发的程序进程签名(支持在OS X和iOS上运行)。

    • dpkg使用很简单

      $ dpkg -i/-r  deb包安装/卸载
      $ dpkg -s com.iosre.myiosreproject 查看安装包信息
      

  1. 检查Mac电脑是否存在 /opt目录,没有自己创建一个。
$ cd /opt
  1. 在新建的/opt目录下clone项目源码
$ git clone --recursive https://github.com/theos/theos.git
  1. 下载完成后执行以下命令,修改theos权限
$ sudo chown -R $(id -u):$(id -g) theos 
  1. 修改环境变量

    打开 ~/.bash_profile文件,添加以下两行

    export THEOS=/opt/theos
    export PATH=/opt/theos/bin/:$PATH
    

    配置好后,命令行查看下是否成功。

    ➜  theos git:(master) ✗ echo $THEOS
    /opt/theos
    

    如果你Mac安装了omyzsh,可能上面配置后并不会成功,解决办法是:在~/.zshrc中添加下面一行。

    source ~/.bash_profile

第一个逆向工程

下面创建我们的第一个逆向程序,以创建一个SpringBoard的动态库为例。

创建项目
  • 在你想创建项目的任一目录下执行命令

    $ nic.pl
    
  • 接着会出现一个列表让你选择创建项目的类型, 我们输入tweak前面的数字11。

  • Project Name (required): 提示输入项目名称,我们可以叫SpringBoardTest。

  • Package Name [com.yourcompany.springboardtest]: 这里是让输入项目的包名,根据喜好随便输入。

  • Author/Maintainer Name [xxx]:这里是让输入作者名字,将来会在Cydia中显示。

  • [iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:这里是输入你将要Hook程序的Bundle Identifier,我们以SpringBoard为例,所以这里输入com.apple.springboard。

  • iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:最后一步是输入要Hook项目Mach-o文件名,这里输入SpringBoard。

class2-001.png
项目目录介绍

项目创建完成后,可以看到工程目录有四个文件:Makefile、SpringBoardTest.plist、Tweak.xm 、control

  • control文件

    control文件记录了deb包管理系统所需的基本信息,会被打包进deb包里。我们可以对他修改,添加一行自己的博客地址Homepage: //www.greatytc.com/u/6fa5c59c9f2a

  • SpringBoardTest.plist

    包含我们要Hook项目的Bundle Identifier

  • Makefile

    工程的配置信息,介绍可看如下注释

    //工程包含的通用头文件
    include $(THEOS)/makefiles/common.mk
    //创建工程时指定的“Project Name,指定好之后一般不要再更改
    TWEAK_NAME = SpringBoardTest
    //tweak包含的源文件,指定多个文件时用空格隔开
    SpringBoardTest_FILES = Tweak.xm
    //tweak工程的头文件,一般有application.mk、tweak.mk和tool.mk几类
    include $(THEOS_MAKE_PATH)/tweak.mk
    //指定tweak安装之后,需要做的事情,这里是杀掉SpringBoard进程 
    after-install::
        install.exec "killall -9 SpringBoard"    
    

    补充:

    //编译debug或者release
    DEBUG = 0
    //越狱iPhone的ip地址
    THEOS_DEVICE_IP = 192.168.1.113
    //指定支持的处理器架构
    ARCHS = armv7 arm64 
    //指定需要的SDK版本iphone:Base SDK:Deployment Target
    TARGET = iphone:latest:8.0  //最新的SDK,程序发布在iOS8.0以上
    //导入框架,多个框架时用空格隔开
    SpringBoardTest_FRAMEWORKS = UIKit 
    SpringBoardTest_PRIVATE_FRAMEWORKS = AppSupport
    //链接libsqlite3.0.dylib、libz.dylib和dylib1.o
    SpringBoardTest_LDFLAGS = -lz –lsqlite3.0 –dylib1.o
    //make clean
    clean::
        rm -rf ./packages/* 
    
  • Tweak.xm

    文件后缀:“xm”中的“x”代表这个文件支持Logos语法,如果后缀名是单独一个“x”,说明源文件支持Logos和C语法;如果后缀名是“xm”,说明源文件支持Logos和C/C++语法。

    • %hook 指定需要hook的class,必须以%end结尾

    • %log 该指令在%hook内部使用,将函数的类名、参数等信息写入syslog

      Cydia内搜索安装syslogd

    • %orig该指令在%hook内部使用,执行被钩住(hook)的函数的原始代码。

编译工程

我们实现一个在手机中每次点击Home键弹框的功能。

  • 修改Tweak.xm文件如下

    %hook SpringBoard 
    - (void)_menuButtonDown:(id)down  
    {  
        UIAlertView *alert = [[UIAlertView alloc]  
        initWithTitle:@"Hello,lecoding!" 
        message:nil 
        delegate:self cancelButtonTitle:@"OK"
        otherButtonTitles:nil]; 
        [alert show]; 
        %orig; // call the original _menuButtonDown:
    }
    %end
    
  • 修改Makefile文件

    THEOS_DEVICE_IP = 109.168.1.2 这里的IP要修改为你自己越狱手机的内网IP地址。也可以不写这行,在命令行中指定。

    DEBUG = 0
    THEOS_DEVICE_IP = 109.168.1.2 
    ARCHS = armv7 arm64 
    TARGET = iphone:latest:8.0  
    include $(THEOS)/makefiles/common.mk
    
    TWEAK_NAME = MyFirstReProject
    MyFirstReProject_FILES = Tweak.xm
    MyFirstReProject_FRAMEWORKS = UIKit 
    include $(THEOS_MAKE_PATH)/tweak.mk
    
    after-install::
        install.exec "killall -9 SpringBoard"
    clean::
        rm -rf ./packages/* 
    
  • 编译命令

    在项目目录依次执行以下命令

    make  //编译
    make package  //打包
    make install  //安装
    

    执行过程如下:

class2_002.png

执行make install 时会让输入两次手机sshd的密码。安装成功后点击手机Home键就会弹框。

class2_0021.jpg

手机中卸载Tweak方法

  • 在Cydia中找到我们的项目,点击卸载
  • ssh链接到手机,使用dpkg -r bundlID ,bundlID是创建Tweak项目时输入的包名。

Deb包介绍

执行完make package这一步时,在项目目录就会多了几个目录。

  • packages目录存放着最终的deb包。

    deb包本质是一个压缩包文件。里面包含一些特定的目录和文件。安装过程就是dpkg程序按照指定的规则去拷贝文件和执行脚本。

    执行以下命令可以查看Deb包的内部目录结构:

    ➜  packages dpkg -c com.wildcat.sbtest_0.0.1-1_iphoneos-arm.deb
    drwxr-xr-x lixingle/staff    0 2017-09-04 16:41 ./
    drwxr-xr-x lixingle/staff    0 2017-09-04 16:41 ./Library/
    drwxr-xr-x lixingle/staff    0 2017-09-04 16:41 ./Library/MobileSubstrate/
    drwxr-xr-x lixingle/staff    0 2017-09-04 16:41 ./Library/MobileSubstrate/DynamicLibraries/
    -rwxr-xr-x lixingle/staff 131984 2017-09-04 16:41 ./Library/MobileSubstrate/DynamicLibraries/SpringBoardTest.dylib
    -rw-r--r-- lixingle/staff     57 2017-09-04 16:41 ./Library/MobileSubstrate/DynamicLibraries/SpringBoardTest.plist
    
  • .theos/_/DEBIAN : 该目录主要存放control文件、及安装和卸载时需要执行的脚本等

  • .theos/_/Library : 目录下是将要拷贝到手机相应目录的动态库和配置信息

  • 脚本文件

    preinst
    在Deb包文件解包之前,将会运行该脚本。许多“preinst”脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。
    
    postinst
    该脚本的主要任务是完成安装包时的配置工作。许多“postinst”脚本负责执行有关命令为新安装或升级的软件重启服务。
    
    prerm
    该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。
    
    postrm
    该脚本负责修改软件包链接或文件关联,或删除由它创建的文件。
    
  • dpkg打包时会复制当前目录下Layout目录下的所有文件和目录,这些文件和目录会镜像到目标设备上(Layout相对于设备的根目录)

Logos语法

关于Logos语法可以看wiki学习。维基百科:http://iphonedevwiki.net/index.php/Logos

Tweak工作原理

Cydia Substrate 原名为 Mobile Substrate 已经正式更名为 Cydia Substrate。它是越狱后cydia插件/软件(主要指theos开发的tweak)运行的一个基础依赖包。提供软件运行的公共库,可以用来动态替换内存中的代码、数据等所以iOS系统越狱环境下安装绝大部分插件,必须首先安装Cydia Substrate。

Cydia Substrate主要由3部分组成:MobileHooker,MobileLoader 和 safe mode

MobileHooker

MobileHooker用于替换覆盖系统的方法,这个过程被称为Hooking(挂钩)
它主要包含两个函数:

void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);
void MSHookFunction(voidfunction,void replacement,void** p_original);

MSHookMessageEx 主要作用于Objective-C函数

MSHookFunction 主要作用于C和C++函数

Logos语法%hook就是对此函数做了一层封装,让编写hook代码变的更直观。

MobileLoader

MobileLoader 将tweak插件注入到第三方应用程序中。

启动时MobileLoader会根据/Library/MobileSubstrate/DynamicLibraries/目录中plist文件指定的作用范围,
有选择的在第三方进程空间里通过dlopen函数加载同名的dylib。

每一个.dylib文件都会有一个同名的.plist文件。

.plist文件的作用就是用来指定tweak插件的作用对象。

/Library/MobileSubstrate/DynamicLibraries/目录中文件如下,会发现有一个我们刚创建的SpringBoardTest.dylib和SpringBoardTest.plist。

class2_003.png
safe mode
  • 因为APP程序质量参差不齐崩溃再所难免,tweak本质是dylib,寄生在别人进程里,如果注入Springboard等。系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。
  • 所以CydiaSubstrate引入了安全模式,在安全模式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。

更多iOS、Swift、iOS逆向最新文章请关注微信公众账号:乐Coding,或者微信扫描下方二维码关注

lecoding

icon.jpg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容