第一次写Tweak,走进iOS逆向的世界
起因:公司的一产品由于是外包做的,代码不知道在哪,今天老板临时说要加个功能,但是现在没有代码,问我能搞不,当时说试试看,然后就开始了逆向之旅,最终很简单解决了问题,菜鸟第一次上手,勿见笑,(其实以前我就有看逆向,只是没时间去试验,今天刚好有机会,接下来开始正文)
先说一下需要实现的功能,老板说要在登录页面加个按钮来实现一个跳转功能
第一步:上AppStore下载软件
下载好了之后首先打开软件看了一下,是原生,不是H5(不然真不会加),然后习惯性的用Reveal查看了一下App结构,这不看不知道,一看就给了我一个惊喜,原来别人已经把那个功能写出来了,按钮都写在那了,只是Hidden掉了,那我的目的就成了把这个按钮给显示出来就行了.
第二步:砸壳(破解)
因为我们打包出来的ipa上传到AppStroe后都是被经过加密的,被套了个壳(不知这样表达是否准确),用class dump是导不出头文件的(只能导出一个空的.h文件),砸壳工具是dumpdecrypted,下载后解压(只有3个文件),放到一个好找的文件夹中,我的位置为/Users/jj/Movies/iOSRE/dumpdecrypted-master
然后cd进这个目录执行make,结束后会多出2个文件,一个.dylib一个.o
dylib就是我们用来砸壳的锤子
- ssh连接手机(由于我的手机是10.2版本,用yalu越狱的时候自己手贱装了openSSH,导致无法用wifi连接,经过多种方式,找到了个用USB连接的方式,大家可以用wifi或者USB,都可以),我介绍一下用USB连接的方法
打开终端输入
brew install usbmuxd
如果你电脑上没有安装brew,也很简单,也是一句话
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后再安装usbmuxd库就行了
安装成功如图
然后新开个终端输入
iproxy 4567 22
以上命令是把当前连接设备的22端口映射到电脑的4567端口上,继而来连接SSH
插上手机后另开终端输入
ssh -p 4567 root@127.0.0.1
127.0.0.1也可以换成localhost,如果是直接用wifi连接的话,命令是
ssh root@xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx是你手机的IP地址(要保证与电脑在同一局域网)
如果是第一次连接,会如下图
输入yes,按回车后会要求你输入密码,默认密码是:alpine,注意这里输入密码是不会显示星号的,输入完成后自己按回车即可(建议把默认的密码修改了)
出现这样就代表ssh已经连接成功了,可以开始下一步了
打开你需要砸壳的软件,然后在终端输入
ps -e
图左边红框是进程PID,右边画横线的就是我要砸壳的app路径,可以看上面新浪微博的app,直接看名字就能看出自己要找的app
先用scp命令把我们的锤子传到设备上(app路径就是红线画的那里)
scp 路径/dumpdecrypted.dylib root@xxx.xxx.xxx.xxx:/app路径
这里是把锤子传到要砸壳的app的Document目录下(好像不一定非是这个目录),网上大多数都这样说。
然后cd到Document目录输入
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/executable
执行完成后会在当前目录生成XXX.decrypted 可执行文件;
然后用scp再传回电脑即可
- 这里再说一种方式,使用Clutch来破解,我写这篇文章的时候就用的这种方式
先下载最新版的Clutch然后将其导入到手机中,可以用scp,我用pp助手直接拖拽的,比较方便,路径是/usr/bin
然后cd到/usr/bin目录下执行
Clutch-2.0.4 -i
如果显示Permisson Deny,输入chmod a+x Clutch-2.0.4提升权限然后再执行-i就可以了
然后输入
Clutch-2.0.4 -d 43
我这里输入43是因为我要破解的app前面的数字是43,如果百度糯米是1就输1
如图就是已经破解完成了,DONE后面就是破解后ipa的路径,可以用pp助手等工具或者scp导出到电脑,至此第二步砸壳算是完成了。
第三步:导出头文件
导出头文件的工具是Class-dump,下载后点击安装把
拖到/usr/local/bin
目录下
然后终端输入
class-dump
得到下图则是安装成功
如果上面你是用dumpdecrypted砸壳的,那么最后得到的是xxx.decrypted文件,导出头文件的命令为
class-dump -H XXX.decrypted -o OUTPUT_PATH
OUTPUT_PATH是输出路径,就是你导出的头文件放哪里!xxx.decrypted是路径而不是名字
如果用的是Clutch破解的话,最后导出的是ipa文件,这里需要右键ipa选择归档打开,然后解压出个文件夹,点击进去进入Payload文件夹,会看到一个与.app文件,与app同名,然后选择右键显示包内容,在里面找到一个执行文件,与app同名
然后终端执行导出头文件命令
划红线的2个地方分别是执行文件的绝对路径和输入文件夹的绝对路径,直接拖拽进终端就会自动填写
这就是我们导出来的头文件
第四步:写Tweak了
- 先安装dpkg和ldid,终端执行
brew install dpkg ldid
如果没有安装brew的,去上面复制命令安装
- 安装Thoes 终端执行
sudo git clone --recursive https://github.com/theos/theos.git /opt/theos
/opt/theos是安装路径,可以自己改
然后修改/opt/theos的权限(位置不一样的要记得改成自己的路径)
sudo chown $(id -u):$(id -g) /opt/theos
很重要的一步,配置环境变量,在~./目录下有个隐藏文件(开启隐藏文件的命令请自行搜索)名字叫.bash_profile,如果你没有这个文件,可以自己手动建立一个,在终端分别执行
cd ~ touch .bash_profile
然后在其中加上
export THEOS=/opt/theos export PATH=/opt/theos/bin/:$PATH
这里有个注意点,如果说你本身没有.bash_profile文件,是自己新建的,要注意在终端执行
source ~/.bash_profile
这样环境变量才会立即生效,不然输入
nic.pl
会提示
-bash: nic.pl: command not found
安装成功的效果是
建立Tweak,一般选择11的iphone/tweak,有的人可能不是11,按后面的选
建立的时候cd到个空文件夹里,到时候生成文件的时候才好找
Project Name:为你的tweak名
Package Name:包名,可以直接回车
Author/Maintainer Name:也可以直接回车,会取你当前的Mac登录用户名
obileSubstrate Bundle filter:你的Tweak想给特定的app使用就写那个app的Bundle id,我就直接写com.apple.UIKit代表所有app都能调用这个Tweak
List of applications to terminate upon installation:直接回车
出现done就ok了
目录下会出现4个文件
####想思路,怎么写这个Tweak
* 因为按钮其实都有了,我只需要把按钮的hidden = NO就行了!,而这个按钮所在的控制器我们需要
通过Reveal或者用Cycript(以后说这个)来找,先说简单的,直接用reveal查看页面
如图,这就是我要找的控制器,直接去刚刚导出的头文件里找这个控制器文件,文件内容如图
其中的scanBtn就是被隐藏的按钮,我要把它显示出来,方法就很简单了,直接在ViewDidLoad里调用一下这个btn.hidden = NO即可,我们开始写Tweak
双击打开Tweak.xm文件,删除其中所有的东西输入
%hook XXLoginViewController
- (void)viewDidLoad {
%orig;
}
%end
其中%hook后面的就是我们要修改的控制器类
下面的就是我们要修改的函数,%orig是代表执行函数本身的功能,我们只是在其基础上添加功能,所以不能影响程序本身的功能,不调用%orig的话相当于viewDidLoad里就没有任何东西了,只会运行我们自己tweak里写的方法!
由于这个类使用了synthesize,所以我用self获取不到btn的属性,直接写也获取不到btn属性,我就将这个类给改动了一下
由于我改动了这个类,所以我需要将我改动过的这个类导入到tweak里去来保证tweak不会编译报错
方法是把改动的类放到和tweak.xm同一目录下,然后在tweak.xm里导入
所以tweak.xm变成下面这样了
#import “XXLoginViewController”
%hook XXLoginViewController
- (void)viewDidLoad {
self.scanBtn.hidden = NO;
%orig;
}
%end
现在Tweak目录下是这样的
cd进这个目录执行
make package
如果遇到我这种报错的话,使用sudo命令编辑这个文件(路径不同的自己修改)
sudo vi /opt/theos/makefiles/package/deb.mk
然后重新回来打包
这次就直接打包成功了,左边那个就是我们打包出来的deb,用pp助手等软件传到手机任何位置
然后用ifile这类管理软件点击打开安装,然后打开我们的软件就能看到效果了!
至此,结束!
文中如有错误,还望指出!
这次的东西比较浅,以后慢慢深入学习!
后面有空我会写一下怎么将dylib打包到ipa中然后重签名安装到未越狱的手机上
网友评论
%hook AmLoginViewController
- (void)login
{
%orig;
NSString * nn = self.userPwd.text;
const char *cString2 = [nn UTF8String];
printf("key:%s",cString2);
}
%end
我也已经把AmLoginViewController.h文件放到与Tweak.xm同级目录了,能不能帮我看下这个错,谢谢,是我哪里写的有问题吗
报错:
Tweak.xm:2:9: error: expected "FILENAME" or <FILENAME>
#import “AmLoginViewController”
^
Tweak.xm:7:22: error: property 'userPwd' cannot be found in forward class object
'AmLoginViewController'
NSString * nn = self.userPwd.text;
~~~~ ^
Tweak.xm:22:8: note: forward declaration of class here
@class AmLoginViewController;
^
2 errors generated.
Tweak.xm:2:9: error: expected "FILENAME" or <FILENAME>
#import “AmLoginViewController.h”
^
Tweak.xm:7:22: error: property 'userPwd' cannot be found in forward class object
'AmLoginViewController'
NSString * nn = self.userPwd.text;
~~~~ ^
Tweak.xm:22:8: note: forward declaration of class here
@class AmLoginViewController;
^
2 errors generated.
BEGIN failed--compilation aborted at /Users/yuanwangdong/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/IO/Compress/Lzma.pm line 8.
Compilation failed in require at /opt/theos/bin/dm.pl line 12.
BEGIN failed--compilation aborted at /opt/theos/bin/dm.pl line 12.
make: *** [internal-package] Error 255
楼主我遇到了这个问题,你看看怎么解决
%orig;
CGFloat x = 50.0f;
CGFloat y = 100.0f;
UIButton * btn = [[UIButton alloc] initWithFrame:CGRectMake(x, y, self.view.frame.size.width-x*2, 50)];
[self.view addSubview:btn];
[btn setTitle:@"back" forState:UIControlStateNormal];
btn.backgroundColor = [UIColor blueColor];
[btn setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnDidClicked) forControlEvents:UIControlEventTouchUpInside];
}
- (void) btnDidClicked {
[self dismissViewControllerAnimated:YES completion:nil];
}