ios tweak制作
0x00 工具准备
1.tweak制作工具(框架):theos
2.ios app脱appstore加的壳工具:clutch,如果失败则用dumpdecrypted尝试
3.ios app头文件提取工具:class-dump
4.class-dump的swift+object c不报错版本:项目地址,可执行文件
5.查看运行时函数调用及调用参数值工具:logify.pl,logify是theos的一个内置工具,路径为/opt/theos/bin/logify.pl
6.远程调试ios工具:debugserver+lldb+[ida pro]
7.查看ios app中的ui对应的类的工具(安装在手机上):flex_injected
0x01 tweak制作实例
实现一个app上传步数大于5000
ssh root@iphone.ip
wget https://github.com/KJCracks/Clutch/releases/download/2.0.4/Clutch-2.0.4 -O /usr/bin/Cluth
Cluth -i
Cluth -d index_number_of_target_app
scp output.ipa user@pc_ip:
exit
unzip output.ipa -d ~/output
class-dump -H ~/output/Payload/xxx.app/xxx -o ~/output_header
分析出可疑类中的函数为PARSPedometerInfo.h中的函数[结合flex_injected,ida pro,frida,logify.pl得出]
nic.pl
选择新建一个iphone tweak,项目目录为~/xupload
设置MobileSubstrate Bundle filter的值为output.ipa的bundleid的值,可从output.ipa的info.plist中得到
logify.pl ~/output_header/PARSPedometerInfo.h > ~/xupload/Tweak.xm[这一步是为了hook可疑函数,查看调用及参数]
cd xupload
export THEOS_DEVICE_IP=ios_device_ip
make
make package
make install
手机连接mac,打开xcode,在windows|device and simulators|点击查看log按钮(小三角形状)
这里查看app的日志还有以下2种方法:
a)在ios的cydia中安装syslog,日志将记录到/var/log/syslog文件中
b)使用ida调试ios的app,日志将在ida的output窗口显示
运行目标app并点击上传步数
查看xcode中函数的调用日志如下
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:20[m [0;30;46mDEBUG:[m = PARSPedometerInfo<0x1708d8f70>:
integration=0
iPhone=0
watch=0
heartRat=0
at:2017-11-05 16:00:00 +0000
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:21[m [0;30;46mDEBUG:[m = PARSPedometerInfo<0x1708d8f70>:
integration=0
iPhone=0
watch=0
heartRat=0
at:2017-11-05 16:00:00 +0000
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:12[m [0;30;46mDEBUG:[m -[<PARSPedometerInfo: 0x1708d8f70> setIntegratedSteps:36]
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:8[m [0;30;46mDEBUG:[m -[<PARSPedometerInfo: 0x1708d8f70> setStartDate:2017-11-04 16:00:00 +0000]
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:21[m [0;30;46mDEBUG:[m -[<PARSPedometerInfo: 0x174ad8100> init]
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:20[m [0;30;46mDEBUG:[m -[<PARSPedometerInfo: 0x174ad8100> description]
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:20[m [0;30;46mDEBUG:[m = PARSPedometerInfo<0x174ad8100>:
integration=0
iPhone=0
watch=0
heartRat=0
at:2017-11-05 16:00:00 +0000
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:21[m [0;30;46mDEBUG:[m = PARSPedometerInfo<0x174ad8100>:
integration=0
iPhone=0
watch=0
heartRat=0
at:2017-11-05 16:00:00 +0000
Nov 6 12:05:32 iPhone PALxxx[4494] <Notice>: [1;36m[xupload] [m[0;36mTweak.xm:12[m [0;30;46mDEBUG:[m -[<PARSPedometerInfo: 0x174ad8100> setIntegratedSteps:2305]
从上面日志中发现关键函数及参数setIntegratedSteps:2305,于是要hook这个函数并设置参数为大于5000的值. 回到Tweak.xm中查看这个函数
- (void)setIntegratedSteps:(long long )integratedSteps { %log; %orig; }
从中看出setIntergratedSteps函数传入了一个参数,参数类型是long long,这也是一种int类型,大小范围是int类型的4倍,直接修改 成
%hook PARSPedometerInfo
- (void)setIntegratedSteps:(long long )integratedSteps { %log; %orig(15347); }
%end
make clean
make
make package
scp packages/xxx.deb root@iphone.ip:
ssh root@iphone.ip
dpkg -P com.yourcompany.xupload
dpkg -i xxx.deb
重新运行目标app并点击上传步数,成功上传,后来分析上面setIntegratedSteps函数调用的参数为integratedSteps函数,也即 integratedSteps参数的返回值作为setIntegratedSteps函数的参数,也即同样可通过hook integratedSteps函数来实现,分析认为 integratedSteps函数是获取本地的步数值,而setIntegratedSteps函数是上传本地步数.hook integratedSteps函数可如下修改
将
- (long long )integratedSteps { %log; long long r = %orig; HBLogDebug(@" = %lld", r); return r; }
修改为:
- (long long )integratedSteps { %log; long long r =15347; return r; }
或者用cycript更快地调用这个函数:
ssh root@iphone_ip
ps aux | grep PALife*
cycript -p process_id
choose(PARSPedometerInfo)
这里的PARSPedometerInfo是setIntegratedSteps函数所在的类名
[#0x147a0d450 setIntegratedSteps:99998]
这里的0x147a0d450是cycript找到的一个PARSPedometerInfo类的对象的地址,如果没有找到PARSPedometerInfo的对象可手动创建一个对象,
创建方法:myobj=[PARSPedometerInfo alloc]
然后再[myobj setIntegratedSteps:99998]
ps:*#0x147a0d450可查看当前对象的所有属性,获取对象属性和对象的方法的更多用法可参考这里:https://www.jianshu.com/p/7c41b03c9eb3
然后在手机上点击上传步数即可
0x02 注意事项
1.在运行nic.pl新建tweak项目时在输入bundleid时默认值为com.apple.springboard,这里要修改,且要修改成要hook的app的 bundleid,查看bundleid可在app的安装包的Info.plist文件中得到
2.hook原理理解
http://blog.l4ys.tw/2017/06/tmctf-2017-rev400/
https://www.oschina.net/question/565065_68287
3.如果使用ida pro动态调试ios app,需要设置使用远程gdb server(使用ios debugsever失败),在mac上用ida加载脱壳后的 mach-o文件[在iphone上运行的是未脱壳的app,运行脱壳后的重新安装的app应该也可以,未尝试],需要在ida中重新设置加载基址, 在ida菜单的edit|segment|rebase program处设置,如果不设置加载基址会导致无法下断点,因为断点是在真实的内存偏移处中断, 而不设置加载基址看到的ida中的偏移只是相对偏移,相对偏移不是真实的内存地址,真实的内存地址=加载基址+相对偏移.目前暂 未找到好用的查看app运行的加载基址的方法,网上有篇文章使用的是vmmap查看,实际编译没成功.
4.动态调试最好用lldb调试,ida调试很慢,在lldb中调试下断点时,断点地址可根据image list -o -f得到的加载基址加上ida pro 中查看到的相对偏移得到
0x03 Refer
1.ida远程调试ios程序
a.debugserver
http://blog.csdn.net/u013538542/article/details/72853521
http://bbs.iosre.com/t/debugserver-lldb-gdb/65
b.ios安装gcc,ldid,make
http://kimi.it/517.html
c.调试
1)http://blog.csdn.net/proteas/article/details/78083512
2)https://www.hex-rays.com/products/ida/support/tutorials/ios_debugger_tutorial.pdf
2.ios越狱应用开发
http://www.jianshu.com/p/bc63492e4847
http://www.swiftyper.com/2016/01/25/ios-tweak-install-guide/
破解加密
ssl
flex搜索evaluate server trust,hook可过强校验
破解CCCrypt加密
http://rexq.me/2017/05/19/破解非对等加密/
lldb与gdb命令对照:
http://lldb.llvm.org/lldb-gdb.html
ios脱appstre的壳:Clutch与dumpdecrypted的使用
http://sunhongyi.com/2017/01/05/iOSReverse-decrytion-tools/
clutch用法:
http://www.jianshu.com/p/47836c78eb0a
make出错时尝试这样:
http://bbs.iosre.com/t/theos/2049
实例开发:
https://github.com/jackrex/FakeWeChatLoc
http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577384&idx=1&sn=b44a9c9651bf09c5bea7e0337031c53c&scene=0#wechat_redirect
logify.pl方法加日志
http://www.qingpingshan.com/m/view.php?aid=156771
免越狱tweak开发
https://juejin.im/entry/58931dd5128fe10065441717
http://www.chinapyg.com/thread-88593-1-1.html
http://dev.qq.com/topic/5791da152168f2690e72daa4
动态调试(在ida中要设置基址)
http://www.cnblogs.com/ludashi/p/5730338.html
hook原理
hook理解:
http://blog.l4ys.tw/2017/06/tmctf-2017-rev400/
https://www.oschina.net/question/565065_68287
hook种类
https://bbs.kafan.cn/thread-471551-1-1.html
http://www.epubit.com.cn/book/onlinechapter/33620
inline hook原理
http://www.cnblogs.com/zhangdongsheng/archive/2013/04/08/3007154.html
百科
http://www.baike.com/wiki/API+HOOK
got hook
http://ele7enxxh.com/Android-Arm-Inline-Hook.html
http://gslab.qq.com/article-164-1.html
http://www.jianshu.com/p/4f6d20076922
3.ios逆向工具汇总
- flex(cydia),patch app的函数参数和返回值
- flex_injected,找到app中的按钮对应的类
- syslogd to /var/log/syslog(cydia),和xcode中日志面板功能相同[需要执行cat /dev/null > /var/log/syslog]
- frida
- class-dump,脱壳工具
- dumpdecrypted,脱壳工具
- app admin(cydia插件),够下载APP任意版本的插件