前言
最近手痒想听歌,发现酷我音乐好多歌都要 VIP 才能听,作为一个穷逼程序员,当然是选择自己动手丰衣足食了。这篇文章记录一下我逆向分析酷我音乐 iOS 版并实现 VIP 破解的全过程,仅供学习交流使用。
环境准备
- 越狱 iPhone(我用的是 iOS 16.3.1)
- IDA Pro 9.3
- Hopper Disassembler(可选)
- Theos 开发环境
- class-dump 工具
一、砸壳与导出头文件
首先从越狱设备上把酷我音乐的 ipa 拉下来,用 dumpdecrypted 砸壳。
# 使用 dumpdecrypted 砸壳
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/xxx/KuwoMusic.app/KuwoMusic
砸壳完成后,用 class-dump 导出头文件,方便后续分析:
class-dump -H KuwoMusic -o Headers/
导出来一堆头文件,大概看了下有几千个类,直接懵逼。不过没关系,我们可以通过关键字搜索来定位目标。
二、定位关键类
2.1 寻找 VIP 相关的类
既然要破解 VIP,那肯定要找跟 VIP 相关的类。我直接在头文件目录里搜索包含 "Vip"、"Fee"、"Pay" 等关键字的类名:
grep -r "Vip" Headers/ | grep "@interface"
grep -r "Fee" Headers/ | grep "@interface"
很快就发现了几个可疑的类:
KWMusicFeeUserManager - 看名字就知道是管理付费用户的
KWSuperVipInfo - 超级 VIP 信息类
KWMusicFeeFlagObject - 付费标记对象
UserInfoManager - 用户信息管理
2.2 用 IDA 分析二进制文件
把砸壳后的二进制文件拖进 IDA,等待分析完成(这个过程比较慢,可以去泡杯咖啡)。
分析完成后,按 Shift+F12 打开字符串窗口,搜索 "vip"、"fee" 等关键字,能看到很多相关的字符串引用。
三、Hook 点分析
3.1 分析 KWMusicFeeUserManager
在 IDA 的 Functions 窗口搜索 KWMusicFeeUserManager,找到这个类的方法列表。重点关注以下几个方法:
-[KWMusicFeeUserManager isVip]
-[KWMusicFeeUserManager isSuperVip]
-[KWMusicFeeUserManager isLogin]
-[KWMusicFeeUserManager isAutoPaySuperVip]
双击进入 isVip 方法,看到伪代码大概是这样:
bool __cdecl -[KWMusicFeeUserManager isVip](KWMusicFeeUserManager *self, SEL a2)
{
// ... 一堆判断逻辑
if ( self->_vipInfo )
{
if ( self->_vipInfo->_vipLevel > 0 )
return 1;
}
return 0;
}
很明显,这个方法返回 BOOL 值,用来判断用户是否是 VIP。那我们只需要 hook 这个方法,直接返回 YES 就行了。
同理,isSuperVip、isLogin、isAutoPaySuperVip 这几个方法也是类似的逻辑,都可以直接返回 YES。
3.2 分析 KWMusicFeeFlagObject
这个类有个方法特别关键:
-[KWMusicFeeFlagObject feeFlag:authType:useVip:isAudio:]
在 IDA 里看伪代码:
long long __cdecl -[KWMusicFeeFlagObject feeFlag:authType:useVip:isAudio:](
KWMusicFeeFlagObject *self,
SEL a2,
long long a3,
long long a4,
long long a5,
long long a6)
{
// ... 复杂的判断逻辑
if ( 某些条件 )
return 1; // 需要付费
else
return 0; // 免费
}
这个方法返回的是付费标记,0 表示免费,非 0 表示需要付费。那我们直接让它返回 0 就完事了。
3.3 分析 UserInfoManager
搜索 UserInfoManager 类,找到 vipLevel 方法:
-[UserInfoManager vipLevel]
这个方法返回用户的 VIP 等级,原本可能返回 0(非会员)、1(普通会员)等。我们可以直接返回一个很大的数字,比如 999,让它显示为超级 VIP。
3.4 分析 KWSuperVipInfo
继续在 IDA 里搜索 KWSuperVipInfo 类,找到两个关键方法:
-[KWSuperVipInfo isAutoPay]
-[KWSuperVipInfo isYearUser]
这两个方法分别用来判断是否自动续费和是否年费用户。看伪代码逻辑也很简单,都是返回 BOOL 值。我们同样让它们返回 YES。
3.5 分析 KWVersionManager
在分析过程中,我还发现了一个有意思的类 KWVersionManager,它有个方法:
-[KWVersionManager setClientInstallSource:]
这个方法用来设置客户端的安装来源。在 IDA 里追踪交叉引用发现,某些特殊的安装来源可能会有不同的权限判断逻辑。我尝试把安装来源改成车载版的包名 kwplayercar_ar_6.0.0.9_B_jiakong_vh.apk,这样可能会绕过一些额外的检测。
四、编写 Tweak
分析完成后,思路已经很清晰了,直接开始写 tweak。使用 Theos 的 Logos 语法非常简单。
4.1 创建 Theos 项目
$THEOS/bin/nic.pl
# 选择 iphone/tweak
# Project Name: KWCrack
# Package Name: com.macxk.kwcrack
# Author: MacXK
# Bundle filter: com.kuwo.kwmusic
4.2 编写 Tweak.xm
在生成的 Tweak.xm 文件中编写 hook 代码:
#import <UIKit/UIKit.h>
%hook KWMusicFeeFlagObject
// 付费标记修改
- (long long)feeFlag:(long long)arg1 authType:(long long)arg2 useVip:(long long)arg3 isAudio:(long long)arg4 {
return 0; // 直接返回 0,表示免费
}
%end
%hook KWMusicFeeUserManager
// VIP 状态修改
- (BOOL)isVip {
return YES;
}
- (BOOL)isSuperVip {
return YES;
}
- (BOOL)isLogin {
return YES;
}
- (BOOL)isAutoPaySuperVip {
return YES;
}
%end
%hook KWSuperVipInfo
// 超级 VIP 状态修改
- (BOOL)isAutoPay {
return YES;
}
- (BOOL)isYearUser {
return YES;
}
%end
%hook KWVersionManager
// 安装来源修改
- (void)setClientInstallSource:(NSString *)source {
%orig(@"kwplayercar_ar_6.0.0.9_B_jiakong_vh.apk");
}
%end
%hook UserInfoManager
// 用户信息修改
- (long long)vipLevel {
return 999; // 返回超高等级
}
%end
4.3 配置 Makefile
编辑 Makefile:
TARGET := iphone:clang:latest:7.0
INSTALL_TARGET_PROCESSES = KuwoMusic
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = KWCrack
KWCrack_FILES = Tweak.xm
KWCrack_CFLAGS = -fobjc-arc
include $(THEOS_MAKE_PATH)/tweak.mk
4.4 配置 plist
编辑 KWCrack.plist,指定要注入的 Bundle ID:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Filter</key>
<dict>
<key>Bundles</key>
<array>
<string>com.kuwo.kwmusic</string>
</array>
</dict>
</dict>
</plist>
五、编译与安装
5.1 编译
make package
编译成功后会生成 .deb 安装包。
5.2 安装到设备
make install
或者手动把 deb 包传到设备上,用 dpkg 安装:
dpkg -i com.macxk.kwcrack_0.1-1_iphoneos-arm.deb
5.3 重启 SpringBoard
killall -9 SpringBoard
六、测试效果
重启后打开酷我音乐,可以看到:
- 个人中心显示为超级 VIP
- VIP 歌曲可以正常播放
- 无损音质可以正常下载
- 所有 VIP 功能都可以使用
完美!
七、注意事项
- 仅供学习交流:本教程仅用于技术研究和学习,请勿用于商业用途
- 支持正版:如果经济条件允许,请支持正版音乐
- 版本兼容性:不同版本的酷我音乐可能类名和方法名有所不同,需要根据实际情况调整
八、总结
这次逆向分析主要用到了以下技巧:
- 通过关键字搜索快速定位目标类
- 使用 IDA Pro 9.3 分析方法逻辑和伪代码
- 追踪交叉引用理解代码调用关系
- 使用 Theos 编写简洁的 tweak 代码
整个过程其实不复杂,关键是要找准 hook 点。对于这种客户端验证的应用,只要找到关键的判断方法,直接修改返回值就能达到目的。IDA 9.3 的伪代码质量很高,基本上看伪代码就能理解逻辑,不需要看汇编。
希望这篇教程对大家有帮助,有问题欢迎在评论区交流!
声明:本文仅供技术学习交流使用,请勿用于非法用途。破解他人软件可能涉及法律风险,请谨慎使用。