仓库源文站点原文


tags: [Arcaea, 逆向] title: Arcaea 的校验研究 last_modified_at: 2022-8-13 slug: arcaea-hash redirect_from:

- /posts/Arcaea的校验研究

免责声明:本博文相关内容已涉及 lowiro 的实际利益。本博文内容仅用于个人软件安全研究与学习。请勿将博文内容用于商业或者非法用途,如果阁下愿意继续阅读,请您承诺将为自己的全部行为负责。

<small><del>[出处](https://wlt.tql.moe)</del></small>

Cocos2dxPrefsFile.xml内的校验

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <!--以下注释内的代码均使用Python3的格式化字符串,如当fr_v=1时,f"a{fr_v}v"即为"a1b"-->
    <!--DEVICE_ID是随设备改变的设备识别码(非准确定义),见后文-->
    <int name="lu" value="2000001" />
    <int name="fr_v" value="0" />
    <string name="fr_k">1234321abcde12345678ababa00000</string>
    <!--md5("f{fr_v}ok{fr_v}")-->
    <string name="cs_v">anokumene|0|6,,anokumene|1|5,anokumene|2|2,axiumcrisis|0|3</string>
    <string name="cs_k">1234321abcde12345678ababa00000</string>
    <!--md5(cs_v)-->
    <string name="p_v">extend,yugamu,core</string>
    <string name="p_k">1234321abcde12345678ababa00000</string>
    <!--md5(f"{DEVICE_ID}{lu}{p_v}{int(lu)*2}")-->
    <!--lu就是最近一次登录的UID(7位)(也就是名为lu的值)(没有则为0),下同-->
    <string name="wu_v">scenery_chap1,babaroque,infinityheaven3</string>
    <string name="wu_k">1234321abcde12345678ababa00000</string>
    <!--md5(f"{DEVICE_ID}{lu}{wu_v}{int(lu)*2}")-->
    <string name="ac_v">0,1,9</string>
    <string name="ac_k">1234321abcde12345678ababa00000</string>
    <!--md5(f"{DEVICE_ID}{lu}{ac_v}{int(lu)*2}")-->
    <string name="st_v">1|1|0|0,1|2|0|0,1|3|0|0</string>
    <string name="st_k">1234321abcde12345678ababa00000</string>
    <!--md5(st_v)-->
    <string name="un_k">1234321abcde12345678ababa00000</string>
    <!--用于校验files/un文件,规则为:
    如果un文件是这样:

<?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>fractureray|0|101</key>
        <integer>0</integer>
        <key>fractureray|2|101</key>
        <integer>0</integer>
        <key>fractureray|1|101</key>
        <integer>7</integer>
    </dict>
</plist>

    那么md5的值就是:
    fractureray|2|101&0$fractureray|1|101&7$fractureray|0|101&0$

    也就是:
    key[0]&integer[0]$key[1]&integer[1]$(省略)key[x]&integer[x]$
    (最后也有一个"$")
    -->
</map>

其他

对三个 list(songlist 等)的 hash 是md5(str(md5(f.read()))*2)

(即如果 file 内容是 345,那最终的结果是md5(md5(345)+md5(345)))

Device ID 形如:12345abcde12345f

lu(即 UID)形如:2000001

int(lu)*2 形如:4000002

ac_v 形如:0,1,9

则 ac_k(对 ac_v 的校验)为:md5("12345abcde12345f20000010,1,94000002")