前言
最近在钻研iOS hook技术,刚刚摸到一点门道,现做如下总结,本文中将以微信作为实验对象注入。
Theos
是Mac上的iOS插件开发环境,集成了创建,打包,安装到手机的所有功能,本文稍后会讲到如何搭建theos
开发环境。
工欲善其事必先利其器,需要的工具:
- Xcode Command Line Tools
- Xcode
- Homebrew
- dkpg
- llid
- thoes
- 一台已越狱的手机
- OpenSSH(手机端插件)
- 手机终端NewTerm
- 苹果开发者账号
- Impactor
- 一台Mac 电脑,或者一台装有Mac OSX的windows电脑
具体步骤
1.现在已经越狱的手机上,打开Cydia
搜索OpenSSH,并安装。
2.在Mac上下载Impactor,安装并打开,将越狱后的手机连接至电脑;下载手机终端NewTerm;将下载的.deb
文件拖入到Impactor
界面,按照提示输入开发者账号密码,deb文件会直接按照道手机上。
这一步可以参考我的博客:解决Cydia数据库错误:could not open file /var/lib/dpkg/status。
3.手机连接WIFI,打开手机设置,无线局域网设置,点击已连接的wifif后面的那个倒感叹号按钮,查看手机的IP地址
,如:192.168.0.1
记录下这个IP地址。
4.打开手机终端NewTerm
,输入命令:
ssh root@xx.xx.xx.xx
其中,xx.xx.xx.xx是你的手机IP地址,
输入密码:alpine
,注意要一个一个字母的输入。
5.在Mac上打开终端,配置环境变量:
export THEOS=/opt/theos
6.从Github下载theos开发环境:
sudo git clone git://github.com/DHowett/theos.git $THEOS
7.安装Homebrew
,若已安装,跳过此步:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
8.安装dpkg及llid
brew install dpkg ldid
9.下载libsubstrate.dylib,并移动到 /opt/theos/lib/
10.在Mac终端中cd到桌面,新建一个substrate.h
文件:
touch substrate.h
用文本编辑器打开substrate.h
文件,打开substrate.h,拷贝里面的所有代码,粘贴到substrate.h
中,保存关闭,将编辑好的substrate.h
文件移动到:
/opt/theos/header/
若没有header这个文件夹,则手动创建:
cd /opt/theos
mkdir header
11.运行脚本nic.pl
,在Mac终端输入命令:
/opt/theos/bin/nic.pl
若成功,会出现如下界面:
选则[11.]iphone/tweak,我们要做的是一个简单的iOS插件,输入:
11
并回车。
接着输入项目名:
Project Name (required):
我输入了test
,回车,接着输入包名
Package Name
我输入了
com.xgf.test
接着输入作者名:
Author/Maintainer Name [风过的夏]:
我在这里输入了我在简书的网名CGPointZero
下面的输入是最重要的,输入要hook的app的bundle identifier
:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
12.在hook一个app之前,你要先下载该app,下载你要hook的app;
13.获取你的手机上安装的所有app的bundle identifier。
随便新建一个Xcode项目,在ViewController.m
文件中倒入运行时头文件:
#import "ViewController.h"
#import <objc/runtime.h>
添加如下方法:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
NSLog(@"apps: %@", [workspace performSelector:@selector(allApplications)]);
}
手机连接电脑,真机调试,程序运行后,点击一下屏幕,复制打印的信息到文件编辑器中,找到你要hook的app对应的bundle identifier
:
在这里,拿微信开刀,hook微信,在进入聊天界面时,注入一段代码。
搜索wechat
,找到微信的bundle identifier
,记录这个值:
14.接着第11步,输入要hook的app的
bundle identifier
:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
输入微信的bundle identifier
:
com.tencent.xin
14.指定你开发的插件被安装完成之后,应该重启哪些部分,必比如重启SpringBoard
,若不需要重启任何东西,输入:
-
回车
15.在终端中cd到用户根目录,比如:
cd /Users/xia/
可以看到刚刚创建的tweak
项目:test
文件夹
16.打开Tweak.xm
文件,在这里,编写要注入的代码:
%hook ClassName
表示要hook的类名,这个需要通过:
dumpdecrypted
cycript
logify
hopper
lldb
debugserver
过程比较复杂,由于这里只讲入门,因此,直接hook别人已经dump
出的微信的一个类:
BaseMsgContentViewController
这个类在第一次进入某个聊天界面时会被初始化。
16.编写注入代码:
%hook BaseMsgContentViewController
%end
在%hook
和%end
之间注入我们的代码:
如,我们在视图加载完成之后,做一个简单的弹框:
-(void)viewDidLoad{
%orig;
UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"CGPointZero" message:@"这是注入的代码" delegate:nil cancelButtonTitle:@"确定 !" otherButtonTitles:nil];
[alert show];
}
其中的:
%orig;
表示执行原来的代码,若不写这一句,原来的代码将不会被执行!
17.应为我们的hook代码使用了UIKit
框架,所以需要在插件项目目录/Users/xia/test/
的Makefile
中加入framework依赖:
WelcomeWagon_FRAMEWORKS = UIKit
保存,关闭。
18.打包
进入插件项目目录:
cd /Users/xia/test
设置环境变量:
export THEOS=/opt/theos
输入指令:
make
成功后,通过ssh连接手机,并安装到手机上
执行命令:
export THEOS_DEVICE_IP=xx.xx.xx.xx
这里的xx.xx.xx.xx
是第4
步的手机IP地址,会要求输入密码,默认密码:
alpine
最后执行:
make package install
将插件直接安装到手机上
19.测试
重启微信,随便进入一个聊天界面,预期结果弹框显示之前代码中编写的内容:
打开cydia,查看刚刚安装都插件test
至此,已经完成了微信的注入!虽然只是加了个弹框,但是处理起来还是不容易啊!
下面是我个人的一些信息,欢迎交流:
关于我
- Blog: CGPointZeero
- GitHub: Insfgg99x
- Mooc: CGPointZero
- Jianshu: CGPointZero
- Email: newbox0512@yahoo.com
@CGPoitZero
网友评论