美文网首页
Tweak实例

Tweak实例

作者: 曾柏超 | 来源:发表于2017-11-27 15:15 被阅读0次

作者:黑炭BC
链接:http://www.jianshu.com/p/799bb3b0b12c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这次hook的是自己写的一个APP

1. APP信息

  • bundle identifier: com.heitan.button-test
    功能比较简单,如gif所示:

[图片上传中...(image-4da689-1511766876826-14)]

add每次加一,minus每次减一
HOOK后变成每次加减五

2. Tweak使用

  • 新建一个目录project(具有权限),在此目录下输入
    /opt/theos/bin/nic/pl,启动Theos。

    [图片上传中...(image-8056be-1511766876824-12)]

    可以看到有多个模板可以使用,这里选择 11 (iphone/tweak)

  • 之后输入工程信息

    • project Name(repquired) //工程名字

    • Package Name [com.yourcompany.firsttweak]

    • Author/Maintainer Name

    • [iphone/tweak] MobileSubstrate Bundle filter //输入bundle identifier

    • [iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]
      //要hook的应用名字,然后会自动重启,这里没有指定,手动重启

      [图片上传中...(image-bed50f-1511766876822-7)]

3. Tweak工程文件

  • 在工程目录下,可以看到新建的各个文件

    [图片上传中...(image-f0f5e2-1511766876824-11)]

    • Makefile

      Makefile文件指定工程用到的文件、框架、库等信息,将整个过程自动化。本工程的默认Makefile文件如图所示

      [图片上传中...(image-890146-1511766876821-6)]

      • include theos/makefiles/common.mk
        固定写法,不要更改

      • TWEAK_NAME = FirstTweak
        工程名字,自动生成,不要更改

      • FirstTweak_FILES = Tweak.xm
        这个根据你建立的工程对应不同的名字
        具体为:
        Application -> application.xm
        Tweak -> tweak.xm
        Tool -> tool.xm

      仅仅靠默认的那几个设置显然是不够的,还有一些设置如下

      • ARCHS = armv7 arm64
        指定处理器架构。表示兼容不同的处理器架构,用空格隔开

      • TARGET = iphone:Base SDK:Deployment Target
        如 TARGET = iphone:8.1:8.0,表示采用8.1的SDK,发布对象为iOS 8.0及以上版本
        可将”Base SDK“改为”lastest“,指定以Xcode附带最新版本SDK编译

      • TweakName_FRAMEWORKS = framework name TweakName_PRIVATE_FRAMEWORKS = private framework name
        导入framework,以及导入private framework
        FirstTweak_FRAMEWORKS = UIKit FirstTweak_PRIVATE_FRAMEWORKS = AppSupport ChatKit IMCore

      • TweakName_LDFLAGS = -lx
        链接Mach-O对象,大致意思是说, -lx代表链接libx.a或libx.dylib,即给“x”加上“lib”的前缀,以及“.a”或“.dylib”的后缀;如果x是“y.o”的形式,则直接链接y.o,不加任何前缀或后缀。iOS支持链接的Mach-O对象全是以“libx.dylib”和“y.o”形式命名的,完全兼容GNU Linker。其他具体可以参考详细说明

        最后修改的Makefile文件为:

        [图片上传中...(image-bf5787-1511766876817-0)]

    • plist文件

      这个文件的作用大致为 确定hook的作用范围,如图这个plist文件表示只作用于这个APP。

      [图片上传中...(image-2d5819-1511766876821-5)]

      [图片上传中...(image-39d096-1511766876821-4)]

      其中 Bundles 字段下的数组指定了若干个 bundle identifier 作为 tweak 的作用对象。默认是 springboard
      除了使用 Bundle 指定,也支持使用另外两种指定方式:

      • Class: 对列表中指定的类起作用

      • Executables: 对指定的可执行文件名起作用
        这三种配置方式可以同时指定,但是这里有个小问题。在同时指定的时候,一个文件只有满足每种 Filter 中的 array 里的至少一个条件,tweak 才能生效。如果想要满足任意一种 Filter 下的任意一个条件就能生效的话,就必须添加一个键值对:Mode: Any

    • control文件

      control 文件记录了 deb 包管理系统所需要的基本信息,会被打包到最后生成的 deb 包中.

      [图片上传中...(image-5d8c0f-1511766876820-3)]

    • Tweak.xm文件

      最后是Tweak开发最重要的部分(看名字也知道重要)
      用 Theos 创建 tweak 工程, 认生成的源文件是 Tweak.xm。如果后缀名是单独一个“ x”,说明源文件支持 Logos 和 C 语法。如果后缀名是“ xm ”,说明源文件支持 Logos 和 C/C++ 语法,与“ m ”和“ mm ”的区别类似。
      logos语法部分可参考:其他blog 官方文档
      原来APP的代码:

      [图片上传中...(image-cac8ac-1511766876820-2)]

      Tweak.xm代码
      %hook ViewController
      //hook add
      - (void)addButtonPressed:(id)sender {
          for(int i = 0;i < 5;i++)
              %orig;
          //clickCount += 4;
          //%orig;
      }
      %end
      
      %hook ViewController
      //hook minus
      - (void)minusButtonPressed:(id)sender {
          for(int i = 0;i < 5;i++) 
              %orig;
      }
      %end
      

3. 编译 + 打包 + 安装

  • 编译
    Theos采用 make 命令来编译Theos工程。在工程目录下运行make命令

    [图片上传中...(image-532891-1511766876824-10)]

  • 打包
    采用 make package 命令 ,可能出现这个问题

    [图片上传中...(image-8431dd-1511766876824-9)]

    参考这个帖子
    定位到原因应该是dpkg的版本过高。因为我是用brew安装的dpkg,直接安装最新的,版本过高,需要通过降级处理,把dpkg版本固定到1.18.10。为了防止更新的时候又把dpkg自动更新了,所以要将版本锁定到这个。具体操作如下:
    方法一(我没成功):

    brew remove dpkg
    wget -c https://homebrew.bintray.com/bottles/dpkg-1.18.10.el_capitan.bottle.tar.gz
    tar xpvf dpkg-1.18.10.el_capitan.bottle.tar.gz
    mv dpkg/1.18.10/ /usr/local/Cellar/dpkg/
    brew switch dpkg 1.18.10
    brew link dpkg
    brew pin dpkg 1.18.10
    

    方法二(自己测试可用):

    brew remove dpkg  
    HOMEBREW_NO_AUTO_UPDATE=1 brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb
    brew pin dpkg
    

若想重新编译,打包,可以使用make clean,清理make, make package生成的文件

  • 安装

    • 方法一: 通过WiFi连接手机,将deb移动到iOS中(需要在iOS中配置openssl)
      scp filePath root@iphoneIP:iphonePath
      然后通过iFile找到deb文件,点击install安装。

    • 方法二:
      在Makefile的最上一行加入 THEOS_DEVICE_IP = iOSIP

      [图片上传中...(image-3f080d-1511766876819-1)]

    然后调用make package install(编译,打包,安装一起)
    成功后如下:

    [图片上传中...(image-c00ccf-1511766876823-8)]

4. 最终效果

[图片上传中...(image-bf8cbc-1511766876825-13)]

以上为《iOS应用逆向工程 第二版》学习实践笔记

相关文章

网友评论

      本文标题:Tweak实例

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