某记账App iOS客户端内购破解

2019-04-04 约 3353 字 预计阅读 7 分钟

声明:本文 【某记账App iOS客户端内购破解】 由作者 墨眉_凌迟 于 2016-11-24 10:18:00 首发 先知社区 曾经 浏览数 3946 次

感谢 墨眉_凌迟 的辛苦付出!

注:本次操作环境为-越狱iPhone 4s,ios8.3,app版本为1.6.6

由于厂商要求隐藏敏感信息,所以app名称不公开,这款app就不详细介绍了,各位看官见谅,总之这篇文章主要是给刚接触逆向面对一个陌生的app时还无从下手的新手朋友提供一个思路,小弟才学疏浅,如有纰漏,希望各位朋友积极指正,小弟洗耳恭听,与大家共同进步。

   [hr]

首先这款app中有一个高级功能,可以进行周期性自动记账,今天的任务就是运用逆向的手段来破解它。

1.1分析源代码结构,并定位关键函数

1.1.1 首先使用dumpdecrypted砸壳     

关于dumpdecrypted详细介绍在这里小弟就不再赘述了
首先ssh到越狱的手机,只打开一个目标app,这样的目的是方便我们在接下来的步骤中定位目标app的pid,在终端执行ps -e 就可以看到当前app的进程名  

linguochengde-iPhone:~ root# ps -e

PID TTY TIME CMD
1 ?? 0:09.72 /sbin/launchd
18 ?? 0:00.03 /usr/libexec/amfid
27 ?? 0:11.42 /usr/sbin/syslogd -bsd_out 1
...
1006 ?? 0:00.34 /System/Library/Frameworks/UIKit.framework/Support/pasteboardd
1102 ?? 0:02.93 /var/mobile/Containers/Bundle/Application/7E51DAF5-3FCF-42CF-B4CB-F47CC4078048/easycost.app/easycost
1219 ?? 0:00.00 (bash)
1220 ?? 0:00.28 (gssc)
770 ttys000 0:00.06 -sh
810 ttys000 0:00.30 cycript
1221 ttys000 0:00.01 ps -e



因为我们的iOS设备上只打开了一个AppStore中的app,所以唯一的那个含有/var/mobile/Containers/Bundle/Application/字样的结果就是目标可执行文件的全路径。

我们找到目标app进程的pid是1102,输入Cycript -p 1102,这时,Cycript就已经运行在目标app中了

1.1.2 class-dump获取.h头文件

在砸壳后文件的目录下,我们执行class-dump --arch armv7 -S -s -H 可执行文件 -o 自定义的文件夹路径,获得砸壳后的头文件

1.1.3 cycript打印视图层次

Cycript是由saurik推出的一款脚本语言,更多资详细资料可以查看它的官网http://www.cycript.org ,可以从MTerminal中执行Cycript,也可以ssh到ios设备中执行Cycript

我们首先根据上文介绍的方法向目标app注入Cycript
紧接着我们找到这个付费功能具体实现的界面,也就是在“周期记账”选项所在的界面中,输入 UIApp.keyWindow.recursiveDescription().toString(),来打印当前的视图层次

这里看到有好多东西,这时候需要大致浏览看有没有关键信息,突然看到一个KLSwitch,再看到前面“周期记账”的开关是一个UISwitch,于是我们先把注意力放在这个KLSwitch上面。

这时候我们的思路是:

我们可以先根据这个KLSwitch,先找到他的controller,由于这里的switch是一个对象,而这个界面是一个view,所以我们可以通过nextResponder追溯到它的controller,然后再从之前class-dump出来的头文件中查找这个controller,找一找是否有关键信息例如xxxSwitch之类的,通过我们找到的controller来响应这个switch,看看我们的猜想是否正确。

首先,先通过KLSwitch找到它的Controller,然后在class-dump中的头文件中找到它,打开后查找带有switch字样的函数

我们在 CatalogInfoViewController.h这个文件中找到了cycleSwitch这个函数,我们来通过 CatalogInfoViewController来响应它,看看这个switch到底是不是我们要找的switch

结果不出意料,在执行了[#0x14d00820 cycleSwitch:YES]之后,提醒购买的弹框弹了出来,这就初步确定了我们的目标函数
并且也确定了CatalogInfoViewController这个controller,在接下来的操作中我们会用到它

1.1.4 debugserver+lldb动态调试确认关键函数

接下来该我们该祭起debugserver和lldb了
debugserver运行在iOS设备上,顾名思义,它作为服务端,实际执行LLDB(作为客户端)传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的“远程调试”。

通过命令image list -o -f 查看它的ASLR偏移

我们可以看到它的ASLR偏移为0x0003c000

紧接着我们把之前砸壳后得到的文件拖进hopper或ida,搜索前面得到的CatalogInfoViewController ,大致浏览一遍,可以看到有一个[CatalogInfoViewController cycleSwitch]这和我们之前的猜想不谋而合,也就是说这里肯定有问题

这时候下面的一个isPurchased (购买)引起了我的注意,我想要看看这个isPurchased到底做了什么事情,究竟是不是我们猜想的那样,于是在函数开始时(0x0004fdf0)打断点,由于之前看到ASLR偏移为0x0003c000,所以要把他们相加才是函数偏移后的地址

进入到函数中后,一直使用ni命令,直到函数到这里

打印r0,发现参数为nil,我们来尝试着把r0的值改为1,然后我们发现这时候就可以使用我们的所谓“周期记账”的高级功能了,当然这还没完,现在这里只是确定目标函数以及参数,接下来我们就开始最关键也最必不可少的一步,就是用theos来编写tweak


1.2编写tweak
我们首先在导出的头文件中查找isPurchased,找到Purchased.h文件

然后我们在打开的Purchased.h文件中找到@property(nonatomic,getter=isPurchased,setter=setPurchased:) BOOL purchased,我们把这个purchased永久返回1,应该就可以完成我们的任务了。

继续,新建工程

编辑makefil

然后继续编辑tweak

打包编译安装到越狱手机,就可以看到我们可以使用所谓的高级功能了。

2.0关于防护措施杂谈

俗话说得好,有攻就有防,ios安全防护措施虽说没有安卓这么多,但也有逐渐发展的趋势,小弟觉得首先一个原因可能是国内代码混淆技术没有普及,而且大多数app也只有核心功能才会被混淆,不然全文混淆的话运行过程中的内存加解密也是很大的开销。

关于防护措施,较为普遍的就是引入动态防护组件,个人觉得x维安全相对做的还不错,就目前来说绝大多数app连基本的反调试功能都没有,引入动态防护组件,可以一定程度上防止动态注入、动态调试,方法名类名混淆等,还有关于llvm的一些东西,如在IR层实现一些混淆逻辑,加入各种跳转各种无用逻辑但又不会影响原有的程序逻辑,具体可以参考https://github.com/obfuscator-llvm/obfuscator/,不过挺久没维护了需要自己大动干戈折腾一番,对个人能力要求较高,而且IR层的混淆本身问题较多可能使app存在很多潜在的bug,并且在一定程度上可以被还原,所以只要能做到以上的一些,可以防止新手逆向,在一定程度上已经把很多人挡在了外面。ps:黑灰产朋友应该感谢微信没做防护措施。

除了这些当然还有其他方面的防护措施,随着计算机的发展安全也会越来越被重视,对ios逆向感兴趣推荐@大名狗剩的《ios应用逆向工程》以及论坛bbs.iosre.com,微博:看雪iOS小组,欢迎前来交流。

小结:本文为这款记账软件制作了去除高级功能限制插件,让我们可以更全面的使用这款app,虽然最后的代码只有几行,但整个分析过程却是一环扣一环,哪怕其中一环出错不注意就会被误导,逆向这款app虽然说挺简单的,但主要希望能为正在学习逆向并且自己对心仪的app无从下手的朋友提供一些帮助。
有些朋友觉得本文运气成分很大,没错,逆向工程不比app开发,没有官方文档作为参考,最有效的方式就是不断尝试,不断犯错,再不断改进,我们面对的总是一些未知的东西,或许你离成功只差一步,但却因为看不到前方,而走向一条更困难的路,我们在计算机的行业里只有不断探索,才有可能逐渐超越自我,小弟也是初学逆向,对自己说也对路上的朋友说,愿我们在探索的道路上一直勇敢下去。

关键词:[‘技术文章’, ‘技术文章’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now