ios tweak制作

on under 二进制
2 minute read

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>: [xupload] Tweak.xm:20 DEBUG:  = 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>: [xupload] Tweak.xm:21 DEBUG:  = 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>: [xupload] Tweak.xm:12 DEBUG: -[<PARSPedometerInfo: 0x1708d8f70> setIntegratedSteps:36]
Nov  6 12:05:32 iPhone PALxxx[4494] <Notice>: [xupload] Tweak.xm:8 DEBUG: -[<PARSPedometerInfo: 0x1708d8f70> setStartDate:2017-11-04 16:00:00 +0000]
Nov  6 12:05:32 iPhone PALxxx[4494] <Notice>: [xupload] Tweak.xm:21 DEBUG: -[<PARSPedometerInfo: 0x174ad8100> init]
Nov  6 12:05:32 iPhone PALxxx[4494] <Notice>: [xupload] Tweak.xm:20 DEBUG: -[<PARSPedometerInfo: 0x174ad8100> description]
Nov  6 12:05:32 iPhone PALxxx[4494] <Notice>: [xupload] Tweak.xm:20 DEBUG:  = 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>: [xupload] Tweak.xm:21 DEBUG:  = 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>: [xupload] Tweak.xm:12 DEBUG: -[<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==&amp;mid=2653577384&amp;idx=1&amp;sn=b44a9c9651bf09c5bea7e0337031c53c&amp;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任意版本的插件
ios, tweak, lldb
home
github
archive
category