本文转自脉搏战略合作伙伴先知技术社区 原帖地址  原作者: 墨眉_凌迟  安全脉搏编辑Joey整理发布

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

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


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

1

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

关于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中了

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

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

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

2

3

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

这时候我们的思路是:

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

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

4
5

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

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

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

9

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

10

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

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

 

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

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

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

13
14

1.2编写tweak

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

15

16

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

继续,新建工程
17

 

编辑makefile
18
然后继续编辑tweak
19
20
打包编译安装到越狱手机,就可以看到我们可以使用所谓的高级功能了。

21

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开发,没有官方文档作为参考,最有效的方式就是不断尝试,不断犯错,再不断改进,我们面对的总是一些未知的东西,或许你离成功只差一步,但却因为看不到前方,而走向一条更困难的路,我们在计算机的行业里只有不断探索,才有可能逐渐超越自我,小弟也是初学逆向,对自己说也对路上的朋友说,愿我们在探索的道路上一直勇敢下去。

 

【本文转自脉搏战略合作伙伴先知技术社区 原帖地址  原作者: 墨眉_凌迟  安全脉搏编辑Joey整理发布】

源链接

Hacking more

...