初探#

很常规的两个路径:

apk\lib\arm64-v8a\libil2cpp.so

.apk\assets\bin\Data\Managed\Metadata\global-metadata.dat 但有加密。

魔数头被抹掉,可以看到大量的 0x66,有明显的统计特征,0x00 占比 20.477%20.477\%0x66 占比 7.175%7.175\%0x99 占比 1.868%1.868\%

image-20260625005456472
image-20260625005456472

直接怀疑是固定密钥 xor 或 sub,进一步猜测是纯 xor,但部分区段是不符合明显 0x66 的特征,猜测是按区块的异或解密。

此外,0x1000-0x4FFF 区间的统计熵显著变大。

image-20260625010430806
image-20260625010430806

推测这段有单独的 Key 或 AES 等加密算法。

安装#

需指定安装来源安装:

Terminal window
adb install -r -d -g -i com.android.vending "アワーノーツ.apk"

否则会被 Google Play 劫持。

安装完毕:

image-20260625005002429
image-20260625005002429

metadata dump#

朋友搞的,尚未复现,

il2cppdumper#

把 IDA 配好让 opus 4.8 自己去迭代进行,得到一个尚有缺陷的魔改版 il2cpp dumper

https://github.com/MetaMikuAI/Il2CppDumper-0x66

能导出大概 47.4 MB 的 dump.cs 和 3.35 MB 的字符串表,剩有几万个方法导出失败,大多是泛型之类,等需要的时候再细分吧。

导入 IDA 很快,想要什么上 il2cpp-to-csharp-skill 让 AI 自己来分析就行了。

毕竟个人对这个游戏不是很感冒,主要是研究了一些 il2cpp dumper 的魔改,剩下的等有需要的时候再进行研究了。

抓取日志#

Terminal window
adb logcat -s Unity

SF#

内测已经过了,忘记预先抓包一下初始个人数据模板,要做的话也基本是盲测了,因此此处只做一次尝试。

时间校验#

由于内测时间结束,且游戏本身有时间校验,虽然可以通过修改系统时间绕过,但还是最好解决一下时间校验的问题。

image-20260707140420257
image-20260707140420257

定位时间校验相关逻辑

// 0x73A64AC
void *App_Display_Presenter_TitleDisplayPresenterBase_object___ValidateCbt(
App_Display_Presenter_TitleDisplayPresenterBase__CreateUI_d__14_T__o *this,
const MethodInfo_73A64AC *method)
{
__int64 v2; // x1
__int64 v3; // x1
__int64 v4; // x1
void *JstNow; // x19
App_Master_MasterLoader_o *Instance; // x0
void *Parameter; // x0
System_String_o *v8; // x20
System_DateTime_o v9; // x1
System_DateTime_o v10; // x0
App_Display_Presenter_TitleDisplayPresenterBase__OnBack_d__13_T__o *v12; // x0
const MethodInfo_73A6594 *v13; // x1
if ( (byte_A3414E3 & 1) == 0 )
{
sub_4451420(&Fwk_Generic_AppTime_TypeInfo, method);
sub_4451420(&System_DateTime_TypeInfo, v2);
sub_4451420(&Method_Fwk_Generic_SingletonBase_MasterLoader__get_Instance___167494936, v3);
sub_4451420(&StringLiteral_34379, v4);
byte_A3414E3 = 1;
}
if ( !*(&Fwk_Generic_AppTime_TypeInfo->_2.cctor_finished + 1) )
((void (*)(void))sub_44515A0)();
JstNow = Fwk_Generic_AppTime___c__get_JstNow(0LL);
Instance = (App_Master_MasterLoader_o *)Fwk_Generic_SingletonBase_object___get_Instance((const MethodInfo_7199538 *)Method_Fwk_Generic_SingletonBase_MasterLoader__get_Instance___167494936);
if ( Instance
&& (Parameter = App_Master_MasterLoader__GetParameter(Instance, (System_String_o *)StringLiteral_34379, 0LL)) != 0LL )
{
v8 = (System_String_o *)*((_QWORD *)Parameter + 5);
if ( !*(&System_DateTime_TypeInfo->_2.cctor_finished + 1) )
sub_44515A0(System_DateTime_TypeInfo);
v9.fields._dateData = (uint64_t)System_DateTime__Parse(v8, 0LL);
v10.fields._dateData = (uint64_t)JstNow;
return System_DateTime__op_GreaterThanOrEqual(v10, v9, 0LL);
}
else
{
v12 = (App_Display_Presenter_TitleDisplayPresenterBase__OnBack_d__13_T__o *)sub_44516CC();
return App_Display_Presenter_TitleDisplayPresenterBase_object___OnKill(v12, v13);
}
}

整个函数直接干掉

il2cpp:00000000073A64AC 00 00 80 52 MOV W0, #0
il2cpp:00000000073A64B0 C0 03 5F D6 RET

重新打包,签名并安装即可

api 地址#

一共两个主要的地址

https://api-cbt.bang-dream-on.jp
https://static-cbt.bang-dream-on.jp

前者是业务 API,后者应该是资源站的地址。这里只改前者。

xor 0x66 后填回 global-metadata.dat,这里 metamiku 直接配了公网服务器、SSL 证书和等长的域名,因此也不涉及什么 padding。

这里应该没人不会吧(?)不会可以看 metamiku 另一篇博客。

可行性验证#

根据 PrivateSekai 总结的 skill,让 AI 分析并搓了一个小 demo(gpt 编造了好些资源,导致进度有点拖延了)

稍后会将代码整理发一下。

image-20260707183200714
image-20260707183200714

持续开发#

基本交给 Sol 干了,纯 vibe 真的很爽。仓库地址不方便贴,就麻烦自己翻吧。