Skip to content

Instantly share code, notes, and snippets.

@esterTion
Created November 13, 2024 06:45
Show Gist options
  • Select an option

  • Save esterTion/2e52dd4e2047c5ffc69a2f783013d01e to your computer and use it in GitHub Desktop.

Select an option

Save esterTion/2e52dd4e2047c5ffc69a2f783013d01e to your computer and use it in GitHub Desktop.

Revisions

  1. esterTion created this gist Nov 13, 2024.
    52 changes: 52 additions & 0 deletions 2411-bcomic-ImageToken-hit_encrypt=true.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@
    ### 触发条件:
    * 不含`mobi_app=iphone_comic``mobi_app=android_comic`(触发web加密),或
    * `version``6.8.5`及以上(触发app加密)

    ### 额外需求:
    app加密时需要发送`m1`参数,参数不是有效的加密参数时,返回加密域名下未经加密处理的响应

    ### 格式粗看:
    文件头为
    ```C++
    bool encrypted
    long dataSize
    ```

    `encrypted == false`:
    `dataSize`为0,响应去除5字节文件头即为图片未加密内容

    `encrypted == true`:
    文件头后跟随`dataSize`的内容,后跟随 aes密钥(web加密)或JWK EC公钥(app加密)

    ### 解密流程(web)
    提取图片地址的`cpx`参数并base64解码,得到的数据中,0x1开始0x20长度数据为AES key,0x3c开始0x10长度的数据为AES IV,
    对响应的内容部分前`0x5010`字节进行AES-256-CBC解密(多出来的0x10为AES padding,正常处理会自动去除)
    解密得到的内容和`0x5010`后的未加密部分拼接,得到原始图片

    ### 解密流程(app)(未完成)
    ????? 获得 ??? key 和 IV
    对响应的内容部分前`0x6410`字节进行 ??? 解密
    解密得到的内容和`0x5010`后的未加密部分拼接,得到原始图片

    ### 额外笔记
    流程逻辑来自 https://s1.hdslb.com/bfs/manga-static/manga-pc/static/js/bili.599a7faf18.js
    web部分为对密文
    `CEpQTVYaSwsFR1dLLSQ8QyojLUVIRwUKS1c6QkRSXDFNSwsHR1cyWlFDWV88QkUFEUZbMl1NQVg8EkBDW0hTHk8IAENVTCgkPUonJydDRU8AGEpbNF1NWlk0SU8IAkNVNV9RQlBSOEhDCBlDSTNRQ15RNBcU`
    base64解码后,使用密钥 `shaolaijiemilaoniangdedaima` 进行循环字符异或 (haha very funny)
    得到aes配置
    ```
    {
    "1":{"al":"AES-CBC","ak":[1,33],"an":[60,76],"at":[0,20]},
    "2":{"al":"AES-CBC","ak":[1,33],"an":[60,76],"at":[0,20]}
    }
    ```
    在web加密配置旁边疑似有一个相似流程的配置获取函数,但是此函数内的所有变量都不存在
    由于flutter反编译基本等于不存在,故而app加密逻辑若是无法推算出来,基本无法还原其逻辑
    (可以猜想app和web类似,也是使用aes,但是key和iv从何而来,以及api发送的`m1`有何作用,无从知晓)

    ### 目前如何应对
    * 现阶段只要带上`mobi_app=iphone_comic`即可获得未加密图片,在阿B切断所有旧版本app的使用前,这条路应该不会出问题
    * 至于切断时间是一个月,一个季度,一年,或者永远,就要看漫画部的营收了(这么看来应该会很快,毕竟漫画快倒闭了)
    * web加密逻辑已经完全理解,可以正常通过web渠道拿到加密流程的图片并正常解密,并且即使更换流程逻辑应该也不难跟进修改