iOS逆向-day6:最新的 theos 使用

简介: iOS逆向-day6:最新的 theos 使用

一、安装签名工具 ldid


  • 1.1、先确保安装了 brew,命令如下


image.png


/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"


  • 1.2、利用 brew 安装 ldid


brew install ldid


二、修改环境变量 和 下载theos



  • 2.1、编辑用户的配置文件
    打开.bash_profile
vim ~/.bash_profile

提示:不熟悉 vim 的可以 open .bash_profile,修改后保存


  • 配置变量,在.bash_profile文件后面追加下面的 2 行


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


提示

  • export THEOS=~/theos 配置 theos 的主路径,将来下载到哪个地方,下面 2.2 我们可以看到
  • export PATH=$THEOS/bin:$PATH 的目的是为了在任何路径下都可以找到 ~/theos/bin 下面的命令,如下面用到的 nic.pl
  • $PATH 就是引用环境变量的值


  • 配置立马生效


source ~/.bash_profile


git clone --recursive https://github.com/theos/theos.git $THEOS


提示

  • recursive: 代表递归的意思,因为在 gitmodules 里面存在依赖,如果不加 recursive 仅仅是下载 gitmodules 文件,不会下载依赖


image.png


$THEOS 等同于 ~/theos


image.png


三、theos 的使用



  • 3.1、项目的类型
    终端输入 nic.pl,会有很多的项目类型,我们要是 iphone/tweak 类型,可以进行 hook


image.png


  • 3.2、新建 tweak 项目
  • cd 到桌面 ,输入 nic.pl ,展示项目类型


wangchongdeMacBook-Pro:Desktop wangchong$ nic.pl
NIC 2.0 - New Instance Creator
------------------------------
[1.] iPhone/activator_event
[2.] iPhone/application_modern
[3.] iPhone/application_swift
[4.] iPhone/flipswitch_switch
[5.] iPhone/framework
[6.] iPhone/library
[7.] iPhone/preference_bundle_modern
[8.] iPhone/tool
[9.] iPhone/tool_swift
[10.] iPhone/tweak
[11.] iPhone/xpc_service
  • 选择 10


Choose a Template (required): 10
  • 项目的名字,我这里是以爱奇艺为例iQiYiPhoneVideo在后面加了tweak


Project Name (required): iQiYiPhoneVideotweak
  • 包名,可以随便写一个


Package Name [com.yourcompany.iqiyiphonevideotweak]: com.jk.iQiYiPhoneVideotweak
  • 作者,直接敲回车按照默认做法就行 (默认是mac上的用户名)


Author/Maintainer Name [王冲]:
  • 需要修改app的 Bundle Identifier,爱奇艺的:com.qiyi.iphone,获取一个项目的唯一标示可以使用 cycript,可以参考 第三天的博客


[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: com.qiyi.iphone
  • 创建完成,直接敲回车按照默认的就行


[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: 
Instantiating iphone/tweak in iqiyiphonevideotweak/...
Done.


  • 3.3、配置创建好的项目文件,以上面创建的为例 iqiyiphonevideotweak


image.png


  • 先配置 Makefile 文件,在Makefile文件的最前面加入环境变量,写清楚通过哪个 IP 和 端口访问手机


export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010


  • Tweak.x 去掉一些,如下,再把文件改为oc,点击右下角语言切换


image.png

image.png

  • %hook ClassName%end 之间是我们要 hook 的代码,ClassName 是我们要 hook 的类名



image.png


  • <1>、找到要hook 的类名,上图的是:QYIphonePreAdControlView
  • <2>、打开 爱奇艺脱壳后的 可执行文件,我使用的 Sublime 打开的,command + p 搜索 QYIphonePreAdControlView


image.png

  • <3>、修改 Tweak.x,设置要 hook 的内容


%hook QYIphonePreAdControlView
- (id)initWithFrame:(struct CGRect)arg1 andPlayerViewController:(id)arg2 {
     return nil;
}
%end
  • 提示:  %hook 类名  与 %end 用来放要 hook 的代码,因为我们是要去掉 QYIphonePreAdControlView,所以我们在其初始化返回 nil,那么改类的界面就会看不到
  • 可以hook多个类以及多个方法,如下


%hook 类1
方法1
方法2
%end
%hook 类2
方法1
%end
%hook 类3
方法1
%end


  • <4>、电脑的 10010 与 手机的22端口进行映射,记得电脑和手机使用线连接
  • 下载usbmuxd工具包(下载v1.0.8版本,主要用到里面的2个python脚本:tcprelay.pyusbmux.py


image.png

  • 将iPhone的 22 端口(SSH端口)映射到Mac本地的 10010 端口(不一定非是10010端口,只要不是保留端口就好)


cd usbmuxd-1.0.8
python tcprelay.py -t 22:10010

提示:-t 代表可以映射多个手机的 22 端口


  • <5>、运行hook代码,生成如下图的插件,在运行 make install 的时候会安装到手机上


cd Tweak.x 所在的文件夹
make
make package
make install


image.png

<6>、可能遇到的问题

  • make 错误一


$ make
Error: You do not have an SDK in 
/Library/Developer/CommandLineTools/Platforms/iPhoneOS.platform/Developer/SDKs
  • 原因:是因为多个 xcode 导致路径 (有可能安装多个 xcode),需要指定一下 xcode


$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/


image.png



  • make 错误二


$ make
> Making all for tweak xxx…
make[2]: Nothing to be done for `internal-library-compile'.
  • 原因:是因为之前已经编译过,有缓存导致的,clean 一下即可


$ make clean
$ make
  • make package 错误
    Can't locate IO/Compress/Lzma.pm in @INC (you may need to install the IO::Compress::Lzma module) (@INC contains: /Library/Perl/5.18/darwin�thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin�thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread�multi-2level /System/Library/Perl/Extras/5.18 .) at /Users/mj/theos/bin/dm.pl line 12. BEGIN failed--compilation aborted at /Users/mj/theos/bin/dm.pl line 12. make: *** [internal-package] Error 2
    原因:是因为打包压缩方式有问题,改成gzip压缩就行
    解决办法:修改 dm.pl 文件,用 #号注释掉下面的两句


$ vim $THEOS/vendor/dm.pl/dm.pl
#use IO::Compress::Lzma;
#use IO::Compress::Xz;
  • 修改 deb.mk 文件 第六行的压缩方式为 gzip


$ vim $THEOS/makefiles/package/deb.mk
_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip


  • 3.5、每次修改改完 Tweak.x 我们都需要做 make clean && make && make package && make install 操作,这个是我放到 自己磁盘下的文件


image.png

  • 我们在修改完 Tweak.x 我们就可以,终端先进入 Tweak.x 所在的文件夹,然后执行 sh ~/tweak.sh

提示:其实 make package 包含 make(编译),我们可以把 tweak.sh 里面的make 去掉,也就是下面的

make clean && make package && make install


四、扩展:theos 资料查询



  • %hook、%end:hook 一个类的开始和结束
  • %log:打印方法调用详情,可以通过 Xcode -> Window -> Devices and Simulators查看日志
  • HBDebugLog:跟NSLog类似
  • %new:添加一个新的方法

image.png


  • %c(className):生成一个 Class对象,比如 %c(NSObject),类似于 NSSTringFromClass()、objc_getClass()
  • %ctor:在加载静态库的时候调用
  • %dtor:在程序退出时调用
  • %logify.pl:可以将一个头文件快速转换成已经包含打印信息的 xm 文件
logify.pl xx.h > xx.xm
  • 如果有额外的资源文件(比如图片),放在项目的 layout 文件夹中,对应着手机的根路径


五、theos-tweak 是实现过程



  • 5.1、基本过程
  • 编写 Tweak 代码
  • $ make:编译 Tweak代码为动态库 (*.dylib)
  • $ make package : 将 dylib 打包为 deb 文件
  • $ make install:将deb文件传送到手机上,通过 Cydia 安装deb
  • 插件将会安装在 /Library/MobileSubstrate/DynamicLibraries文件夹中
  • *.dylib:编译后的 Tweak代码
  • *.plist:存放着需要 hook 的 APP ID
  • 当打开app的时候
  • Cydia Subsrate (Cydia 已自动安装的插件)会让App去加载对应的 dylib
  • 修改APP内存中的代码逻辑,去执行 dylib 中的函数代码
  • 所以,theos 的tweak并不会对APP原来的可执行文件进行修改,仅仅是修改了内存中的代码逻辑
  • 5.2、疑问
  • 未脱壳的APP是否支持 tweak?
    答:支持,因为tweak是在内存中实现的,并没有修改 .app中的可执行文件
  • tweak 效果是否永久性的?
    答:取决于tweak中用到的 APP 代码是否被修改过
  • 如果一旦更新APP,tweak会不会失效?
    答:取决于tweak中用到的 APP 代码是否被修改过
  • 未越狱的手机是否支持 tweak?
    答案:不支持
  • 能不能对游戏项目进行 tweak?
    答:可以,但是游戏大多数是通过 C++或者C#编写的,而且类名、函数名会进行混淆操作


六、logify.pl 注意点



  • 6.1、logify.pl 生成的 x 文件, 有很多时候是编译不通过的,需要机型一些处理
  • 删掉 __weak
  • 删掉 inout
  • 删掉协议,比如:或者声明一下协议信息 @protocol XXTestDelegate
  • 删掉 - (void).cxx_destruct { %log;%orig;}
  • 删除 HBLogDebug(@ "= 0x%x",(unsigned int));
  • 替换类名为 void,比如将 XXPerson 替换为 void 或者声明一下类信息 @class XXPerson


/System/Library/CoreServices/SpringBoard.app/SpringBoard


目录
相关文章
|
数据安全/隐私保护 iOS开发
iOS逆向小技能:解锁无密码的设备、判断设备是否锁定、锁定设备、打开某个程序
介绍lua 函数: runApp、closeApp、getScreenSize、getDeviceID、lua_exit、isFrontApp。
258 0
|
安全 程序员 Linux
IOS Theos Tweak 之 HelloWorld
IOS Theos Tweak 之 HelloWorld
IOS Theos Tweak 之 HelloWorld
|
安全 算法 开发工具
iOS逆向-day11:代码混淆
iOS逆向-day11:代码混淆
842 0
iOS逆向-day11:代码混淆
|
编译器 API iOS开发
iOS逆向-day10:LLVM 编译器(下)
iOS逆向-day10:LLVM 编译器(下)
399 0
iOS逆向-day10:LLVM 编译器(下)
|
自然语言处理 前端开发 IDE
iOS逆向-day10:LLVM 编译器(上)
iOS逆向-day10:LLVM 编译器
222 0
iOS逆向-day10:LLVM 编译器(上)
|
安全 数据安全/隐私保护 iOS开发
iOS逆向-day9:签名机制(下)
iOS逆向-day9:签名机制(下)
343 0
iOS逆向-day9:签名机制(下)
|
存储 安全 数据安全/隐私保护
iOS逆向-day9:签名机制(中)
iOS逆向-day9:签名机制(中)
179 0
iOS逆向-day9:签名机制(中)
|
算法 网络安全 数据安全/隐私保护
iOS逆向-day9:签名机制(上)
iOS逆向-day9:签名机制(上)
182 0
iOS逆向-day9:签名机制(上)
|
NoSQL 编译器 C语言
iOS逆向-day8:LLDB 动态调试
iOS逆向-day8:LLDB 动态调试
770 0
iOS逆向-day8:LLDB 动态调试
|
XML iOS开发 数据格式
iOS逆向-day7:iOS 命令行工具开发
iOS逆向-day7:iOS 命令行工具开发
361 0
iOS逆向-day7:iOS 命令行工具开发