プリコネR 1.6 与 cdb、通信加密 与 coneshell.dll

早在版本更新前的一次资源更新的时候,我这边就注意到master db的改动了,新增了一个cdb,编码不明,但应该就是用来新版本的加密版db。当时故障原因是一直以来masterdb manifest只有一行,所以我直接拆逗号,但这一次cdb在unity bundle前面,于是提取失败cron爆炸

当时改完了正规按行读取后就等着新版本了,想着肯定会大改这部分。于是 8/3 的 10002700 更完,一周后1.6就更新了

下完dmm版扔进dnspy,直接看到这么个切换cdb的代码

而当跟随这个OpenCustomVFS之后,发现他调用了一个 coneshell.dll 里面的函数,而这个dll只有一个导出入口,作用是循环输出一个数组里的函数指针

然后就是和dll战了几天,本来想研究透内部逻辑的,然后星月佬一句“你调用不就完了,linux还有wine”,于是…我就扭头去模拟调用了()

不过就算是调用,也要摸好半天各种函数。打开cdb我模拟了半天也没成功,那天我就直接睡了,后来Utaha写了个另一个版本的代码给读出来了,然后调用 sqlite3_backup_init 直接保存出来db了。

就在研究cdb的时候,我又注意到另一个事情:服务器一直在报代理失效,判定原因是返回200但无body内容。而我手动curl的却发现代理没有问题,排查了好久,最后把完整的header和body都带上,果然0长度了。也就是说1.6不仅改了db,还改了通信。那天发现到这里我就去上跑步机了,在跑步时候我就发的“我有种预感,我一会儿还会碰到一个coneshell的调用”。跑完下来继续研究发现果然,unpack里还是一个外部调用。

刚开始本想直接拆一个客户端的响应,但是一直都是unpack出错,最后Utaha给我提说是有一个初始化的函数,输入了udid和随机32B。于是发觉拆解已有响应好像还不如直接自己构造客户端容易

摸了半天之后才算摸清了各个函数的用途与参数

然后经过一通猜测body并对比已有的请求大小,构造出了一堆请求后,才终于看到服务器返回的不是错误的212字节而是492字节了,也就是说构造成功了,接下来就是扔给dll 解包了

但是当我直接扔给了 _g 的时候,他依然给我返回了-1……想了二十分钟整理了下逻辑,意识到如果是游戏正常运行的话,是pack之后等待响应然后紧跟着unpack的,这里会不会有内部状态的改变?于是在unpack之前我又调用了一次pack,这次res正确返回了解包长度,成功了!

于是美滋滋完成编译,rpm源还只有x64 wine,又去找了个一键x86 wine编译在服务器跑了一个小时才跑完。然后就直接扔上去了,于是service back online(

redive/main.php

Coneshell_call/main.cpp


后话:

我挂上了新版本cdb代码,原本猜测的是Hatsune’s Notes现有版本估计就完全死了。但是14号 10002800 更新后发现怎么还有bundle版本的db,虽然有点奇怪cy为什么还不停用传统db,不过他有我就继续用着

这几天其他几位大佬依然在缓慢地彻底研究内部逻辑,我这种不会的咸鱼只能在旁边膜了


8/22 后记2

你西歪太拼了,我这刚完成没几天,现在有了cdb ver.3了,怕是下版本实装


8/28 后记3

cy昨天更了167了,cdb ver3 online

我这种菜渣,拆是不可能拆的,这辈子也看不懂汇编的,您们谁大能收了西歪吧

prcn-ios-1.6.7.7z

等一个最终提交,这破游戏我研究也就到这了,打扰了,告辞

cy,我前天拆cdb的时候,你偷看了吧

30 thoughts on “プリコネR 1.6 与 cdb、通信加密 与 coneshell.dll”

  1. 想运行一下大佬的项目,但是Coneshell_call卡在auto _a = (IntPtr()()) _fx00();不知道是不是coneshell.dll的问题,大佬方便传一份你用的文件吗,感谢

  2. 大佬,请问一下您做的公主连结资源站内可以加装一下游戏剧情内无角色立绘的空白背景吗,跪求QAQ

  3. This post helps a lot. When I searched for cdb (maybe compressed db?) and coneshell, google bring me to here. This and your ‘unity-texture-toolkit’ are greatly helpful. Recently, I have deeply dived into KR version app and resources. Thank you for your post and endeavor.

    1. Wait… KR version uses coneshell too???
      Stopped checking TW ver a while ago, did they use cdb as well?

      Also, I guess “c” is for crypted or ConeShell

      1. Actually not. There was no ‘Coneshell’ folder on it. I have tried to disassemble KR version app, but many functions remains blank. I could access on the JP version of the project and read through the codes from it, with help of Vibbit. Then, I faced the cdb. There was no relation on cdb and KR ver., sorry 🙂 But, with your post, I could quickly know how it works, and with your toolkit, I could know how cdn stores the data.
        I just download the master.mdb file from rooted android and it costs a lot. So, I am going to find an automatic update ways as you did. Maybe I could trace your works. 🙂

    1. 整理邮件才来回复,抱歉
      访问通知页面需要特定UA,这是我反代的配置

          server {
                  listen  1520    ssl     http2;
                  listen  [::]:443        ssl     http2;
                  ssl_certificate   biliplus.crt;
                  ssl_certificate_key       biliplus.pem;
                  server_name     pcr-notice.estertion.win pcr-notice.biliplus-vid.top;
                  location / {
                          access_by_lua_file              lua/pcr_access.lua;
                          header_filter_by_lua_file       lua/pcr_header.lua;
                          body_filter_by_lua_file lua/pcr_body.lua;
                          add_header      Cache-Control   max-age=60;
      
                          proxy_set_header        Host    "app.priconne-redive.jp";
                          proxy_connect_timeout   5s;
                          proxy_read_timeout      5s;
                          proxy_http_version      1.1;
                          proxy_set_header        Connection  "";
                          proxy_set_header        Accept-Encoding      "";
                          proxy_set_header        User-Agent  "Mozilla/5.0 (iPad; CPU OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77";
                          proxy_ssl_verify        off;
                          proxy_ssl_session_reuse on;
                          proxy_pass      https://app.priconne-redive.jp;
                          proxy_buffering off;
                  }
          }
      
  4. 你好! 最近有個遊戲的global-metadata.dat想破解 想要遊戲裡的圖片進行攻略與翻譯 是否能請大大幫我破解呢?~

      1. 另外再補問,只是要看globametadata的話會需要去研究coneshell.dll嗎?那個我完全不知道是什麼 orz

      2. so檔打開照著issue有搜到 不過不會反 (太菜了

        現在嘗試看DMM不過不開VPN會顯示「ページを表示できませんでした」

        開了直接Access拒否 囧

    1. dmm版怎么说呢,是pc版(需要下载dmm game player),好处就是可以直接给unity的dll打断点,还有就是资源文件直接在appdata里有……
      虽然文件名是被加密了,但是还是能还原的的。
      大佬们都是如何拆二进制的那几个,skel动画也是,根本不会……

  5. cdb是不是一种远古的数据库结构
    利用wiki搜能搜到只有日文版本的cdb解释

    然后我找了一下能看到部分格式说明:
    http://www.unixuser.org/~euske/doc/cdbinternals/index.html

    但是看不懂,能用dnspy把hsa的key可提取出来已经是我最大的努力了。
    我是制作了一个pcr的wiki:pcrwiki.liantui.moe
    之前是使用sqlite文件的,但好像很蠢,准备换成sql文件
    手动很累,不知道该如何订阅大佬的sql来自动更新,感觉需要大量的工作。

    1. cdb应该意思只是 crypted database,是cy自己搞了一个加密+压缩,解密后用了sqlite vfs虚拟文件系统进行加载,里面最后还是标准sqlite3 db
      vfs标准接口在 https://www.sqlite.org/c3ref/vfs.html ,但其实没啥用,知道是个标准接口也没地方操作

      我这边进行完提取然后用brotli压缩了, https://redive.estertion.win/db/redive_jp.db.br
      检测更新用 https://redive.estertion.win/last_version_jp.json 就可以了

      1. 头疼,大佬压缩完的br文件,我利用google的js解压失败了……
        以及之前大佬的 github 上给了我个 Coneshell_call.exe 的c源码,但是自己编译缺少几个include……Orz
        大佬仓库里的sql能用吗?我在想,简单点,直接用这个算了……

回复 Jason 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax