iOS逆向工程(七):使用Theos逆向项目
使用Theos逆向项目
一、Theos是什么?
-
Theos是一套跨平台的开发工具,用于在不使用Xcode的情况下开发、部署iOS插件,大多数插件开发人员都使用Theos。
-
Theos工具套件包含一些重要组件:
-
配置好Theos后,就可以使用Theos中的
tweak模板
,快速创建逆向工程,并使用Logos语法
修改别人App的一些行为 ,例如:微信自动抢红包、腾讯视频去广告等等,最后使用make构建系统
编译、打包、分发。 -
Theos环境变量和目录:http://iphonedevwiki.net/index.php/Theos
二、如何配置Theos?
Theos.最初由DHowett进行开发,由于DHwoett去了微软,不再有时间维护了,所以Adam Demasi(kirb)接手了他的工作,并且添加了很多全新的功能。现在我们来讲一下最新的安装方法。
- 安装dpkg
Dpkg是Debian的软件包。
(Ldid是越狱祖师爷Saurik开发的一款二进制授权管理软件,可以对越狱应用进行SHA1运算生成授权,让软件包可以在iPhone上执行。
在这里我们使用Homebrew来安装他们。它是一款Mac上的基于Ruby的包管理器,可以理解为与Yum、Apt、Pecman类似即可。)
$ brew install dpkg
- 安装ldid
ldid是专门用来签名iOS可执行文件的工具,用来代替Xcode的codesign.
越狱iPhone下的签名工具(更改授权entitlements),可以为theos开发的程序进程签名 (支持在OS X和iOS上运行)。
$ brew install ldid fakeroot
-ldid 用于签名
-fakeroot 用于模拟root权限
- 安装theos
之前我们把Theos安装在/opt/theos,现在我们还是安装在这个文件夹。
$ sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
提示
recursive: 代表递归的意思,因为在 gitmodules 里面存在依赖,如果不加 recursive 仅仅是下载 gitmodules 文件,不会下载依赖
- 然后把/opt/theos的权限改成你自己:
$ sudo chown $(id -u):$(id -g) /opt/theos
- 修改环境变量
最后这一步也很重要,要把theos的执行路径加入到环境变量之中,在.bash_profile文件后面追加下面的 2 行
export THEOS=/opt/theos
export PATH=/opt/theos/bin/:$PATH
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
- 编辑用户的配置文件
打开.bash_profile
$ vim ~/.bash_profile
提示:不熟悉 vim 的可以 open .bash_profile,修改后保存
提示
export THEOS=/opt/theos配置 theos 的主路径,将来下载到哪个地方
export PATH=/opt/theos/bin/:$PATH的目的是为了在任何路径下都可以找到/opt/theos/bin/下面的命令,如下面用到的 nic.pl
$PATH 就是引用环境变量的值
- 配置立马生效
$ source ~/.bash_profile
三、theos 的使用
项目->给屏幕添加弹框
创建tweak工程,进入工程目录(cd到任意可执行目录,例如桌面)执行命令:
nic.pl
填写项目信息
Project Name: 项目名称,可以随便写,例如:111
Package Name: 项目ID,可以随便写,例如:com.gn.111
Author/Maintainer Name: 作者,直接敲回车,默认就是Mac上的当前用户名
MobileSubstrate Bundle filter: 需要逆向的App的BundleID,可以通过Cycript查看,
例如:
微信的BundleID就是com.tencent.wechat
桌面的BundleID就是com.apple.springboard
(Springboard 就是iOS的桌面)
List of applications to terminate upon installcation,直接敲回车,默认即可
之后就会生成一个文件夹,里面包含:control、Makefile、Tweak.x、xxx.plist等文件,这些文件的具体作用,后续会说到
编写逆向代码
- 打开Tweak.x文件,编写自己的逆向代码,如下所示,
%hook、%end
属于Logos语法
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application{
%orig;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"我来了,哈哈哈" delegate:nil cancelButtonTitle:@"不见" otherButtonTitles:@"好的", nil];
[alert show];
}
%end
编辑Makefile文件
-
在Makefile中加入环境变量,写清楚通过哪个IP和端口访问手机,如下所示,由于会把接口转发到本地的10010端口,所以这里可以这样写:
-
THOS_DEVICE_IP 手机IP
-
THOS_DEVICE_PORT 要访问的端口号
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
- 如果不想每个项目的Makefile都编写IP和端口环境变量,也可以添加到用户配置文件中,如下所示,编辑完成后,记得使用
source ~/.bash_profile
命令,让配置生效
$ vim ~/.bash_profile
export THEOS=/opt/theos
export PATH=/opt/theos/bin/:$PATH
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
$ source ~/.bash_profile
编译-打包-安装
- 编译成dylib动态库
cd进入工程目录
$ make
- 把动态库打包成deb文件
$ make package
- 安装到手机
$ make install
提示,这一步需要iOS 设备,USB 连接电脑!!!
新建终端页面,输入iproxy 10010 22把当前连接设备的22端口(SSH端口),映射到电脑的10010端口。
新建终端页面,输入ssh -p 10010 root@127.0.0.1 连接iOS设备。密码默认是:alpine
手机端显示如下:
以上大功告成,完成了锁屏状态下加弹框。
- 工程被打包到:
./packages/com.yahibo.first_0.0.1-23+debug_iphoneos-arm.deb
中,可使用dpkg
查看deb
包信息:
dpkg -I ./packages/com.yahibo.first_0.0.1-23+debug_iphoneos-arm.deb
-
在
Cydia
应用中搜索syslogd to/var/log/syslog
并安装;搜索Core Utilities
并安装,安装后可以使用tail
命令查看文件。 -
项目打包成一个
.dylib
动态库在越狱手机/Library/MobileSubstrate/DynamicLibraries/
目录下。
修改内容需要清除包
make clean
rm -rf packages
- 重启
SpringBoard
杀死进程会自动重启
$ killall -9 SpringBoard
常用的Logos语法简介
1、%hook
指定需要hook
的类名,以%end
结尾。
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application{
%orig;//执行原始操作
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"我来了,哈哈哈" delegate:nil cancelButtonTitle:@"不见" otherButtonTitles:@"好的", nil];
[alert show];
}
%end
示例代码为钩住SpringBoard
类的applicationDidFinishLaunching
函数,先执行原始操作,再显示弹框。
2、%log
用来打印log的,将信息输入到syslog
中,格式%log([(<type><expr>,...)])
。
%hook SpringBoard
-(void)applicationDidFinishLaunching:(id)application{
%orig;//执行原始操作
%log((NSString *)@"iOSRE",(NSString *)@"Debug");
}
%end
3、%orig
执行被hook
函数的原始代码,类似于super.method
功能,如果去掉,原始代码不会执行。还可以使用该函数更改原始函数的参数:
%hook SBLockScreenDateViewController
-(void)setCustomSubtitleText:(id)arg1 withColor:(id)arg2{
%orig(@"hello I am hibo",arg2);
}
%end
4、%group
该指令用于%hook
的分组,%group
后边跟的是组名,%group
也是必须以%end
结尾,其中可以包含多个%hook
。
5、%init
该指令用来初始化某个%group
,一个group
只有被初始化后才可生效,init
必须在hook
中进行执行。
6、%ctor tweak
的构造器,用来初始化,如果不显式定义,Theos就会自动生成一个%ctor,并在其中调用%init(_ungrouped).
如:%ctor { %init(_ungrouped)}
。
7、%new
该指令用来给现有的class
添加一个新的函数。与Runtime
中的class_addMethod
相同。
8、%c
该指令用来获取一个类的名称,类似于objc_getClass
。
从越狱手机中我们可以拿到苹果设备的桌面程序SpringBoard.app
,砸壳后获取到SpringBoard
对应的头文件。根据头文件我们可以大致猜测到类及类方法的作用,因此使用以上方法,我们也可以更改其他一些显示,修改桌面时间文本、颜色、电池状态、电量,当然这些可能没有实用价值,我们只是通过这种方式来进一步了解逆向。
苹果设备桌面头文件
小小优化
每次修改改完 Tweak.x 我们都需要做
make clean && make && make package && make install
操作,这个是我放到 自己磁盘下的文件
我们在修改完 Tweak.x
我们就可以,终端先进入 Tweak.x 所在的文件夹,然后执行 sh ~/tweak.sh
提示:其实
make package
包含make
(编译),我们可以把 tweak.sh 里面的make 去掉,也就是下面的make clean && make package && make install