这文章一直了拖到6月2日啦!
2017年5月追记:
我探索这些的目的,是以一个玩家的身份,让 CGSS 变得更好玩。私下里我类比过普罗米修斯,将天火——谱面的制作和玩的能力从“天上”分一点出来。其实,修改 CGSS 去作弊是很简单的,无论是客户端还是 MITM。但是我不会去作弊,也不希望这系列文章的读者们将文章内容用在歪门邪道上,不希望去作弊、破坏平衡性。玩过 LLSIF、SB69、GF(note)、Arcaea 之后,我仍然认为 CGSS 的综合指标(游戏性、操作体验、曲目等等)是行业内翘楚,Cy这次比较用心。那么作弊还有什么意思嘛!对了,我不氪金,不冲分,只是闲暇时间来两局,玩得舒心。
当然,まゆさまが見ています。
一、声明
The Idolmaster Cinderella Girls Starlight Stage 软件和相关媒体的著作权为 Bandai Namco Entertainment Inc. 所有。本系列文章仅从兴趣出发,研究数据反向过程。在此不会给出完整的反向过程、反向结果和源代码,只给出思路和部分非关键数据。
相信大牛即使是没有看过我写的这些玩意儿也能上的。
二、打包
得到自己的程序集之后,我们要用我们编译的程序集替换原装程序集。
然而,在做了这次替换以后,文件内容就发生了变化。所以 MANIFEST.MF
是一定要修改的。好在这个不难,一段小程序足够:
class Program {
static void Main(string[] args) {
if (args.Length <= 0) {
ShowHelp();
} else {
using (Sha1Managed = new SHA1Managed()) {
Sha1Managed.Initialize();
foreach (var path in args) {
if (File.Exists(path)) {
Digest(path);
} else {
Console.WriteLine($"{path} >> (NOT EXISTS)");
}
}
}
}
}
static void ShowHelp() {
var help = "Usage: SHA1Digest.exe <file1> [<file2>, [<file3>, ...]]";
Console.WriteLine(help);
}
static void Digest(string path) {
var bytes = File.ReadAllBytes(path);
var digest = Sha1Managed.ComputeHash(bytes);
var info = Convert.ToBase64String(digest);
Console.WriteLine($"{path} >> {info}");
}
private static SHA1Managed Sha1Managed;
}
用这个小程序就能计算文件的 SHA-1 散列值,并输出为 Base64 编码的字符串。用输出的值替换 MANIFEST.MF
中的原始值即可:
F:\TEMP\cgss-managed\cracked>SHA1Digest Assembly-CSharp-firstpass.dll
将制作好的 APK 安装到设备中:
F:\Google\Android\SDK\platform-tools>adb install F:\TEMP\cgss-managed\cracked\cgss_cracked.apk
然而,弹出的是一个安装失败的错误,错误信息为缺少签名。如果要在 Android 中安装一个 APK,这个 APK 必须是经过签名的。它使用了一个密钥散列了所有的文件,记录在了某个地方(这个我没深究),保证文件的完整性,保证它们未被篡改。因此为了发布到真系统(是不是模拟器倒没关系,只要是放到非调试状态的 Android 系统下都需要),我们得要给这个 APK 签名。在测试用的版本(1.5.3)中 CGSS 主程序没有进行签名验证,所以我们才能运行自己的程序集。附带说一句,主程序里判断是否作弊,其中就有一段检测加载的程序集是否是白名单上的几个。我们修改的是 CGSS 自身的程序集,所以不会被检测出来——而且没有进行程序集的文件完整性校验。也就是说,在没启用 APK 签名校验和程序集完整性校验的情况下,整个反向才能完整进行。
根据网上的日志,使用 keytool
(在 JDK 中)生成一个 keystore:
set PATH=%PATH%;C:\Program Files\Java\jdk1.8.0_40\bin
F:\TEMP\cgss-managed\cracked\keystore>keytool -genkey -alias cgss.keystore -keyalg RSA keystore cgss.keystore
嗯,现在我们有了自己的 keystore,就该对修改后的 CGSS 安装包进行签名了:
F:\TEMP\cgss-managed\cracked>jarsigner -verbose -keystore .\keystore\cgss.keystore -signedjar cgss_cracked_signed.apk cgss_cracked.apk cgss.keystore
等到签名完成,这个 APK 就能顺利安装了。能顺利安装还没完,还要测试运行,并从 logcat 收集输出信息。这部分其实很好做:
F:\Google\Android\SDK\platform-tools>adb logcat -d -s Unity > log.txt
分析调试信息就不仔细展开了,这活儿也是很简单的。