重拾cdb

结果自己到头来还是不死心啊

还是去翻腾cdb了,记录下目前进度


9/7

拿出dll跟踪调试看了一阵,发现文件解密只涉及到开头几十行,然后文件内容就已经出来了。所以感觉比想象的稍微容易一些

首先开头有一串变换,变换完后出来一个pem公钥,然后拿着公钥对0x3c开始0x100字节内容进行解密(签名验证),得到内容比对0x2c开始0x10字节

这个没搞懂干啥的,验证文件有效?

然后进行aes解密?目前逻辑还没看懂,已经验证文件头0x8开始0x20长度数据会影响解密结果,0x4 – 0x7和 0x28 – 0x2a数据用途不明,目前看来没有意义,或者可能是后期操作有关。如果弄完密钥对文件0x13c开始到结尾的数据进行解密,就完成了

然后解密完数据直接lz4解压就可以了,虽然目前卡在aes找不出密钥

而且这些是cdb ver2的,ver3按照ios程序汇编diff看是在某一步多了对某个值的位mask操作,暂时先不看


9/8

打开ios 160和167比对后看到,cdb3对第一个初始化函数的参数(原inputPtr+8)进行了变换,而且某个参数(iv?)从+4变成了+20。本想自己提前变换写回文件结果抄完失败了,然后意识到这些部分都是有重叠,所以还是得自己搞出来才行。

但是解密前那两个初始化又是巨复杂子函数,甚至我都不知道内存里面哪个是有效密钥,挨个试都出不来结果。

于是又卡关了,gg。我好苦啊,真正牛逼的都不来帮一下,就我一个鶸在这里倒腾(人家为啥要帮你(错乱))


9/8晚(9/9凌晨)

今晚依然绝赞研究,本来想到昨晚尝试失败,今天也看不懂子函数,还得苟好一阵

然后想到我能不能改dll里面的流程?因为0x4的数据和0x8的数据有重叠,能想到的就是扔到证书验证那里。于是改dll把公钥验证步骤的jnz给noop掉,然后把那个0x4的偏移改到0x3c签名区,最后在外面递进去之前把该做的新版本的变换做好。

结果扔进去后还是失败,ショック。

于是ida复制了一波流程扔进去覆盖昨晚的手抄,F5、F10、F10……然后突然成功了!?

于是复活,等一个cdb ver4


9/22 后记

这次目前好像是稳了,cy暂时没搞什么新动作。经常google关键词也看不到其他有什么研究的,全网唯一拆解?

然后是一些细节,首先是关于那个公钥验证的,后来想了想,这个部分存在的目的是防止客户端加载假冒db,虽然细节想了想好像还是有问题,真正按照路径解密再加密回去覆盖数据段(0x13c~)不就可以了吗,或者可能还有其他我没研究透的验证(后面那么大一块呢)

第二个其实是次日就搞了更新,因为当时成功的过程是因为重新从ida复制了变换代码,所以后来又换回原始dll,变换完放回结果后把ver改回2,倒也确实能用,这就让我有另一个疑惑,0x4开头的数据按代码是读了8字节,但只有4-7影响结果,8-b并没有反应,而且还是密钥部分了(8-17),而按照复制结果来看那两部分并不相同,这又是另一个疑点。不过目前没有需求也就这样咸鱼了


9/27

绝了.jpg

 

16 thoughts on “重拾cdb”

      1. 额…是我蠢了…谢谢大佬。新的redive dmm的assembly扔进dnspy去,只有方法名,没有方法体了额…可否发下1.6的参考下…谢谢

        1. Hi, I wanted to ask if the old assembly did also show the code inside the methods etc, when opening it with dnSpy? (I only translated your posts with Google, so I didn’t understand everything.)
          If yes, would it be possible to provide a download link for it again? I would really appreciate it.

        2. Before 1.6.5 there is no protection on dll, thus all the code is there.
          For current dll dumping check this article.
          If you want to check old dlls, dm me on Twitter. Link in the sidebar (or top bar if on mobile). I don’t have a complete collection, but still a lot versions.

    1. 反正就是我上一篇所讲的,我基本没研究内部逻辑,只是调用。这次更是直接换成猜版本了。不过通信3好像是只在某一步多md5了一下。
      大体逻辑好像是输入初始化,怎么md5三次然后用做aes密钥加密,然后再对密钥怎么md5一次准备用于解密(大体流程,另一个大佬看的我记不清了)

      1. 主要是我看到Pack里面有个new Random().NextBytes(numArray);,随机了一串16bytes的数并且存在coneshell的内存里,这串数加密和解密必须对应,否则无法解密。但是又不知道他在数据包里面的存储逻辑,导致不能MITM(抓包分析之类)。另外问一下这个dll有什么动态调试的姿势吗?

      2. “拿着调用器设好参数调用”这段,我拿VS+IDA研究了半天没搞明白咋用IDA调试。。

发表回复

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

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