APP逆向分析之XX音乐客户端下载歌曲权限绕过

很长一段时间没有做逆向分析相关的研究了,最近看了一部电影,电影有首插曲名字叫不见不散,那是相当的好听啊,打开XX音乐,准备下载,额….弹出付费才能下载….为了一首歌,开一个包月服务,显然不是我这个搞过逆向的人该干的事啊,于是想着,看看能否逆向分析一番,从而可以直接下载这首歌呢.

序言

虽然是米国的苹果开发的iOS系统,但是要论越狱iPhone和逆向分析的工具和相对应的环境来说,那国内远胜于米国了.可能是国内很多相关的灰色产业链吧.
在之前,我们想动态调试一个没有源码的app,通常是要借助于TheOS,自己操作LLVM来动态attach到app,然后再使用llvm的调试命令,整个的过程是非常耗时和繁琐的.
在17年的时候,iOS逆向届的后起之秀,大神AloneMonkey,基于早已停止更新的iOSOpenDev重新弄了一个极为方便的逆向调试平台MonkeyDev,这个平台集成了常用的库,工具,并且还可以更加方便的使用pod库来集成三方库.一下就将逆向调试,变得无比之方便.只要从一些第三方(通常在国内都是指PP助手)上下载一个脱了壳的应用,然后拖入由安装了MonkeyDev后创建的插件工程,就可以直接调试这个应用了.

创建工程

安装了MonkeyDev之后,XCode会多了很多工程模板,创建新工程,选择如下的模板
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第1张图片

建立工程之后,在PP助手上下载一个脱了壳的XX音乐,将其拖入刚刚建立的工程目录下的TargetApp文件夹下.
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第2张图片

接下来,把工程的证书换成你自己的,连上一台调试用的手机,运行工程,就会发现,已经是可以调试这个从PP助手上下载的 XX音乐了.

调试准备

添加FLex库

我们对于界面的定位是基于可视化的FLEX来做的.如果你是越狱手机,可以直接在cydia上下载一个Flex的插件,这样就可以开启任意App的Flex插件了.如果是非越狱手机也没关系,直接在工程中添加这个Flex库就可以了.
MonkeyDev插件库建立的工程,是一个普通的工程,我们可以直接用pod的方式来添加Flex.
来到工程目录下,运行

pod init

建立podfile文件,在其中添加

target 'XXMusicDylib' do
   use_frameworks!
   pod 'FLEX'
end

pod install

就将Flex库添加到XXMusicDylib工程中了

要Flex显示出来,还需要添加一行代码,打开XXMusicDylib.m文件,在其中的CHConstructor添加

[[FLEXManager sharedManager] showExplorer];

运行工程,没有意外的情况下,应该可以看到带有Flex的XX音乐工程运行起来了!如下图所示
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第3张图片

使用class-dump导出XX音乐的头文件

因为是逆向分析,我们是没有源码实现的,此时我们能仰仗的也只有其头文件了,一般情况下,OC的工程都没有进行方法名的混淆,所以从头文件里我们通通常能得到非常多的信息.
MonkeyDev模板建立的工程,本身已经内置了一个class-dump的实现了,你可以直接使用它的实现来导出头文件,使用方式也很简单,在dylib的Build Setting中
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第4张图片
修改,自定义的MONKEY_CLASS_DUMP的值为YES,运行工程,就能在工程的目录下导出头文件.导出的头文件在工程目录下,文件夹名字为QQMusic_Headers,如图所示:
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第5张图片
当然了,导出来之后,建议你复制出来,重新建立一个工程,将这些头文件导入到那个新建的工程中,这样,才方便利用XCode的浏览查看和搜索工程,因为我们得到头文件,就是为了能够方便的浏览查看,否则怎么能发现重要线索呢?还能有什么比XCode对于OC代码的搜索更方便的么.

当然了,其实我更建议你和我一样,自己编译class-dump,然后将那个二进制文件放到usr/loacal/bin下,然后用命令行来操作,最常用的命令行是

class-dump -S -s -H XXMusic -o xxMusicHeaders

因为经常我们是想在不建立工程的情况下来导出头文件.

开启符号表

一般应用发布后调试堆栈是没有符号信息的,例如我们调试XXMUsic的时候,在断点处
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第6张图片
我们可以看到,除了我们重载的方法(因为我们重载的是有源码的,是有符号信息的),没有符号信息的方法在调试堆栈显示的名字都是 ___lldb_unnamed_symbol845544&&XXMusic的样式,这是不利于我们根据调回时候的方法调用堆栈来分析流程的.

不过好在,由于OC语言的特性,可以根据具体方法的地址填写到符号表中还原符号表。 具体可以阅读文章 iOS符号表恢复&逆向支付宝,它提供了命令行工具来实现还原符号表.

MonkeyDev模板建立的工程已经内置了上述的工具,并且在dylib的Build Setting中添加了MONKEYDEV_RESTORE_SYMBOL,只要设置为YES,再运行工程,就会看到符号表已经还原了.
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第7张图片

准备工作都已完毕,接下来,就可以进入分析流程了

分析的过程

开始的时候,第一反应,肯定是通过界面来定位相关的ViewController和View了,然后通过头文件来浏览这些相关的类的头文件来发现线索.

播放器界面,看起来是最简单的,我们通过这个界面来开始我们的流程.

通过FLex,我们可以知道播放器界面对应的VC是QMAudioPlayerVC
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第8张图片
底下的下载控件view是QMPlayerOperationView ,有四个图标 分别是喜欢 ,下载,分享,评论.

既然我们需要的是下载,那么进入QMPlayerOperationView的头文件,看看是否能有什么收获.
我们看到头文件中
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第9张图片
有方法

- (void)downloadBtnClicked:(UIButton *)arg1;

名字这么明显,应该就是这个方法了.

接下来就是反编译工具 Hopper Disassembler上场了,将XXMusic的可执行文件拖到Hopper Disassembler去分析,等其分析完成,我们搜索 QMPlayerOperationView downloadBtnClicked
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第10张图片
Hopper Disassembler 的强大在于其有个伪代码模式,可以查看某个方法的伪代码.我们通过查看上面的伪代码可以看到,这个方法很简单,

r0 = [self delegate];
r23 = [r0 respondsToSelector:@selector(playerOperViewDidTapDownloadBtn:)];

可以看到,其只是将下载这个调用转给了其delegate的playerOperViewDidTapDownloadBtn:方法.

由于这个QMPlayerOperationView视图在播放器界面QMAudioPlayerVC这个VC上,我们有理由认为QMPlayerOperationView的delegate就是QMAudioPlayerVC.这里有两个验证方式
1 就是可以直接Hook住QMPlayerOperationView downloadBtnClicked方法,在其中下个断点,然后当程序停在断点处的时候,打印下其delegate,看是哪个对象.
2 直接在QMAudioPlayerVC中搜索,看是否有playerOperViewDidTapDownloadBtn方法(这里注意,也许是它的父类实现的),其实我们可以整个工程搜索.
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第11张图片

我们HooK住这个方法,在其中打个断点,让程序停在这里,查看方法调用堆栈.来确认是否是这样调用的.
APP逆向分析之XX音乐客户端下载歌曲权限绕过_第12张图片
从图中可以看到,大概的调用堆栈是

-[QMPlayerOperationView downloadBtnClicked:]
   -[QMAudioPlayerVC playerOperViewDidTapDownloadBtn:]
        -[QMAudioPlayerVC downLoadSong:]
          -[QMAudioPlayerVC checkBeforeDownloadSong]

由于涉及到了XX音乐的比较敏感,故以下的分析过程不公开了,各位看客见谅.

你可能感兴趣的:(IOS,XCode)