Schwarzer教你破解Cytus2谱面加密

前前言


Lanotalium(Lanota可视化制谱器)的开发基本上也算完成了,闲的没事,把前些天尝试破解Cytus2谱面校验的过程记录下来,免得以后要用的时候自己都不知道搞过逆向(x

前言


Cytus2 iOS版发布了,立刻拿出来研究一番,il2CppDumper,启动!IDA,启动!
一看Dumper还有了新功能生成DummyDll,dnSpy,启动!

看起来比台湾诺西高到不知道哪里去了,直接加密了谱面,而不是采用校验的方式

一路查找KeyStore来历

查KeyStoreFactory.Create
其中反序列化了一段二进制文件,调用了IKeyStoreExtension.Init,跳转

发现了和string ”ASSET“ 比较了一番

初始化了一个Aes加密和另一个啥玩意,不过不重要,注意到解密谱面的时候

用的就是ASSET这个来寻找加密器,接下来就分析AesEncryptor

构造函数和一个静态解密方法中传递了Key数组,我们寻找一下这个静态函数的调用

发现接口函数实际上也调用了他,所以分析此静态函数就好
猜想解密的时候会调用此函数,我也打算学习一个动态调试,破解由此展开

环境


Windows:
  • VMWare Workstation 12
  • macOS 10.13 High Sierra 镜像
  • 能玩Cytus2的越狱iOS设备

配置


  1. 这篇文章装好macOS虚拟机与VMWare Tools
  2. 在macOS上下载并安装xcode
  3. 在macOS里去iFunbox官网下载iFunbox
  4. 打开xcode,把你的iOS设备与电脑连接
  5. xcode中 Window-Devices and Simulators 添加你的iOS设备

准备


以下步骤均在macOS中操作

1.usbmuxd

  • 点击下载
  • 打开命令行窗口A(窗口比较多,做个记号)切换到 /usbmuxd-1.0.8/python-client
  • 接着 sudo python ./tcprelay.py -t 22:2222
    这个窗口就可以放着不动了

2.debugserver

  • 打开iFunbox,点击Raw File System
  • /Developer/usr/bin下,把debugserver拖出来
  • 开启新命令行窗口B,切换到debugserver目录
    lipo -thin arm64 debugserver -output debugserver
    (若你是iPhone5/5c等32位设备请把arm64换为armv7s)
  • 新建一个文件,贴入以下文本,命名为ent.xml,放到debugserver旁边
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>com.apple.springboard.debugapplications</key>
        <true/>
        <key>get-task-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
        <key>run-unsigned-code</key>
        <true/>
</dict>
</plist>
  • 接着敲ldid -Sent.xml debugserver,没错,-Sent.xml没有空格,没有ldidbrew install ldid一下,没有brew自己百度装brew(x
  • 再次打开iFunbox,把debugserver复制到iOS设备中的/usr/bin

3.连接

  • 在命令行窗口B,切换到/usbmuxd-1.0.8/python-client输入sudo python ./tcprelay.py -t 12345:12345,也可以放着不动了
  • 开启新命令行窗口C,输入ssh root@localhost -p 2222,SSH连接到iOS设备,密码一般是alpine
  • 输入ps -ef | grep "cytus2"
    记下cytus2的pid
  • 输入debugserver *:12345 --attach pid,此处为1650
  • 你会发现cytus2中断运行了,命令行窗口C也可放着不管了

破解


  • 打开命令行窗口D,敲lldb,回车,发现C,D同时走字,即连接iOS设备上的debugserver成功
  • 打开IDA,运行il2CppDumper提供的导入符号py脚本,定位至AesEncryptor$$_Decrypt
  • 记录下地址0x00000001000C5D74
  • 回到命令行窗口D,键入process connect connect://127.0.0.1:12345,等待连接
  • 显示如图则连接完成
  • 键入image list -o -f,拖到[1]项
  • 记录下模块地址0x00000000000b4000
  • 则实际代码地址为0x00000000000b4000 + 0x00000001000C5D74 = 0x0000000100179D74
  • 在命令行D输入br s -a 0x0000000100179D74下断点
  • 输入c继续cytus2运行,随便进首歌
  • 断点命中!再看看函数形参列表
  • key位于第四项,输入p $x4输出他的地址
  • 并不知道byte[]这个类的结构,先看内存为敬
  • 发现这个16很可疑,因为密钥长度可以为16
  • 再次dump后面的内存
  • 则密钥已呈现在眼前
  • Aes还需要一个IV向量才能解密,返回IDA
  • 经过我对注释位置下断点并单步调试得出设置IV向量的位置
  • 类似方法得到IV向量,发现竟然就是谱面文件5-20字节,这也和调用解密函数的第二个参数offset相吻合,为20

总结


  • 至此Cytus2破解工作已经结束
  • 解密只需用得到的Key,提取谱面5-20字节部分作IV向量,解密21字节及以后的部分,并用UTF8编码读出即可
  • 加密随机得到IV向量,先写入c2cd前缀,再写入IV向量,再写入加密数据即可

声明


  • 破解仅为学习使用,不会用于盗版或商用,用途包含自制导入,谢谢
原创文章 12 获赞 13 访问量 2万+

猜你喜欢

转载自blog.csdn.net/schwarzer_w/article/details/79254014
今日推荐