GBao Tou
5 min readApr 6, 2019

逆向学习小记:运用Hopper对app源码的分析 part1

在较为熟练使用class-dump之后,配合monkeydev进行开发插件,成功实现了许多功能,但逐渐也发现了自己的瓶颈与不足,逐渐感觉到要实现一些功能和完善一些app光知道修改返回值,参数是远远不够的,我需要知道函数体内部逻辑,正因如此,必须使用反编译工具,因为价格相对便宜,这里我使用了hopper disassember。

还是以xx音乐为例,数周前xx音乐服务端最新版对下载歌曲做了某些验证,导致xx音乐v8.9x和谐了下载付费歌曲,修改了本地vip权限后再次下载歌曲不能成功下载,会返回验证权限失败,我在上篇文章已经通过日志分析过,歌曲下载url+vkey才能从其服务器获取歌曲文件,那么在我已经完全重写本地vip方法了。他在服务端和谐了下载歌曲,是不是真的和谐了?毫无办法了?

其实并不是毫无办法的,先通过hopper对xx音乐二进制文件解包,这里不用关其汇编码,直接windows-show pseudo code of Procedure进入伪代码页面后,尝试搜索和vkey有关的类名,方法。

首先是vkeydata类,首先凭经验找到其init实例化对象的初始化方法(面向对象语言编写的程序的类包中应该都会有个这样的方法);

这里找到的是

通过方法名也能看出这个方法是用来存储服务器端拉下来的vkey,为了进一步验证我的猜想,我们继续进入方法体内部,读代码,看逻辑,

这段代码大概意思就是把从其服务器拿的各类已存到外存的数据读到内存中,那么问题来了,我vkey没从服务端拉下来,怎么存都没有用。所以能得出结论,vkeydata类没有我们想要的东西。

再看第二个类VKeyManager,其中是一些addvkey添加vkey的方法,并与之前的 vkeydata产生一些调用关系,和刚才的思路一样,在无vkey的情况,这里根本就不用谈。

继续往下看,直到发现了一个与vkey有关的的类,

这个类我之前用class-dump就已经怀疑过了,现在可以读其中的实现逻辑了,我们搞清其调用关系vkeyForSpecificSong和vkeyForSpecificSongMediaMid在函数体内部调用了自身的vkeymanager对象,并调用其方法。

再继续往下看

这个方法的实现:

简单读一下,获得缓存的vkey,如果vkey有效就写入日志,并释放内存空间,若无效,则self调用requestVkeyForSongList方法,进去该函数体内部看其实现,

如图所示第三行,这里调用了VKeyAuthCGI类的一个私有方法vkeyAuthCGIByListen,再进入该函数体,(这里可以适当记笔记,如果函数体进的多容易忘);

这里就很明显了,判断是用户请求听还是下载认证,分别进入VKeyAuthCGIListen和VKeyAuthCGIDownload类查看,发现这两个类的方法结构和方法名都一模一样,看其实现:

@class VKeyAuthCGIListen:

@class VKeyAuthCGIDownload:

对比发现,也就仅仅返回的字符串不一样,这是我就想到了之前看过的iosre的以为大佬对某云app的分析和代码,原理就是修改相关类名,保证能听的歌曲就能下载,实现听下同步,那么,我就把VKeyAuthCGIDownload的方法都改成VKeyAuthCGIListen,应该这样就行了,况且,我查阅别人实现的pathon爬取xx音乐网络接口也是这个原理,编码后hook,的确修复了下载歌曲,实现听下同步。

做到这一步,还是有完善的余地,比如如何获取数字专辑以及无版权歌曲的vkey?

待续。。。