プリコネ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的时候,你偷看了吧

《プリコネR 1.6 与 cdb、通信加密 与 coneshell.dll》有19个想法

      1. 那篇我有看到 可是不知道怎麼導出來 今天下班再嘗試看看 感謝

      2. 不好意思 dmm版是什麼?
        看C# DLL的話以前玩白貓的APK是用過 .NET Reflector

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

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

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

        開了直接Access拒否 囧

      5. 看來沒那麼簡單 有保護的 打開來很多東西都不給看
        再次受挫…

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

  1. 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能用吗?我在想,简单点,直接用这个算了……

发表评论

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