关于搜狗浏览器收藏夹favorite3.dat的逆向分析




 背景:
        实际上搜狗浏览器收藏夹favorite3.dat之前就已经搞定了,但是搞定的方式还是比较奇葩的,那就是外挂式,什么意思呢,就是找到SogouExplorer.dll关键调用call,然后分析好参数之后,动态调用call来实现,也或者是用它的矛攻它的盾,但是存在一个很严肃的问题,那就是因为浏览器是经常要更新的,每次更新之后虽然核心算法不变,但是调用的call会发生变化,所以说:如果程序来寻找到安装目录下的SogouExplorer.dll然后进行调用的话,要call的函数地址可以肯定每个版本都不会相同,所以,逼的没有办法了,那就只有把找一个体积相对较小的版本的SogouExplorer.dll,然后一起打包进资源,然后内存调用。当然思路是可行的,但是问题是什么呢?问题是这玩意的体积高达5M的大小,就算进行7z高效压缩,也有2m的大小。为了个收藏夹,还要捎带着一个多达2m的体积的不算累赘的累赘,说实话,心里还是很别扭的,但是也没有办法啊,毕竟那玩意没那么好解密。
        随着时间的推移,心里越想越别扭,痛定思痛,决心搞下它!于是就有了下文。好吧,我们开门见山直奔主题吧。

1: 先看之前call方式的片段代码。

sql = "pragma rekey='';";
MessageBox(NULL,"a","a",MB_OK);
if (api->exec(db, sql, callback, NULL, &err) != SQLITE_OK)
{
perror("sqlite3_exec failed\n");
perror(err);
}
api->close(db);
        
        为什么要加个MessageBox呢?当然看意思就明白,后面要执行的代码就是rekey当然就是还原数据库为明文了。所以在这个后面
        打上软断,一点点的跟踪就能找到关键的加密的地方。

2: 一步步走下来如下图:
        A:
        关于搜狗浏览器收藏夹favorite3.dat的逆向分析1
        也就是说由一个已知的orikey = "AES256:xxxxxxxxxxxxxxxx" (
当然其中x是乱写的,真正的有16个字节的真实内容的。)
        得到一个真实的key,内容为两份x 
        伪代码如下:
        key = copy2(getlast16(orikey))  大小32字节

        继续往下走如图
        B:
        关于搜狗浏览器收藏夹favorite3.dat的逆向分析2
        也就是说:到了这里会有上面的key进行rijndael_set_key_encrypt的加密得到rk
        伪代码如下:
        rk = rijndael_set_key_encrypt(key) 大小256字节
        
        继续往下走如图
        C:
        关于搜狗浏览器收藏夹favorite3.dat的逆向分析3

        
也就是说:到了这里会上面产生的256字节的rk对初始化的一个16字节的内容进行加密我们姑且叫做esi16(来源暂时未知
        得到16字节dsi16,一直循环进行直到产生1024个字节的表,我们就叫做hash1024吧
        伪代码如下:
        dsi16 = rijndael_encrypt_sogou(esi16)
        for i = 0;i < 64;++i
            dsi16+ = rijndael_encrypt_sogou(dsi16)

        hash1024 = dsi16 + dsi16_1 + dsi16_2 + ....dsi16_63  字节大小总共1024个

        
        继续往下走如图
        D:
        关于搜狗浏览器收藏夹favorite3.dat的逆向分析4
        也就是说:到了这里原始文件的buffer和上面得到的hash一个字节一个字节的异或,就得出明文结果了,但是只能是1024-12
        个字节也就是0xcf4个字节能解出明文,但是后面的12个字节是干什么的未知,也不知道如何加密解密。
        伪代码如下:
        buffer[i] ^= hash[i] 大小0xcf4

        后面再从1025个字节到-2048个字节开始循环上面的操作,也就是说每1024个字节为一个段落。
        整个文件要根据1024字节进行分段

        继续往下走如图
        E:
        关于搜狗浏览器收藏夹favorite3.dat的逆向分析5
        也就是说:在前面的1024个字节 解密完了之后,还得对从16到23的字节再异或回去,或者说这几个字节不修改
        原因是什么呢?我们不知道,反正它就是那么定义的。我们不管,按照它的做就是了。
        伪代码如下:
        buffer[j] ^= hash[j]  大小为8个字节


        我们对上面的先来进行总结:
        A:key = copy2(getlast16(orikey))  大小32字节
        B:
rk = rijndael_set_key_encrypt(key) 大小256字节
        C:
                
dsi16 = rijndael_encrypt_sogou(esi16)
                for i = 0;i < 64;++i
                    dsi16+ = rijndael_encrypt_sogou(dsi16)
                hash1024 = dsi16 + dsi16_1 + dsi16_2 + ....dsi16_63  字节大小总共1024个
        D:
buffer[i] ^= hash[i] 大小0xcf4
        E:
buffer[j] ^= hash[j]  大小为8个字节
        F:按照文件大小除以1024 得到的结果 进行循环从C到E
        
        
我们可以看到上面从A到F只有这个esi16也就是这个16个字节到底是什么到底是哪里来的,说实话我没跟踪到
        但是运气不错,当我用hex工具查看favorite3.dat的时候,突然发现了一个有趣的问题
        那就是每论1024字节的最后12个字节,恰好是esi16的最后12个字节,而esi16的前面4个字节是循环的值
        譬如说第一论循环就是01 00 00 00第二论就是02 00 00 00
        哈哈,全通了。也恍然大悟了,原来sogou这个家伙原来是把敏感的东西藏在这里了,想想也是,不然它再怎么加密。当然
        得找个地方保存起来。

        另外说个题外话,先看图
        关于搜狗浏览器收藏夹favorite3.dat的逆向分析6
        
        感谢findcrypt插件作者,通过这个迅速我就判断出是aes加密了,至于是多少位的,当然最后分析后得出是AES256.

        好了上图为证:
        关于搜狗浏览器收藏夹favorite3.dat的逆向分析7

        关于搜狗浏览器收藏夹favorite3.dat的逆向分析8



CopyRight @2018, Www.LiuLanQiCode.Com, Inc.All Rights Reserved.鲁ICP备18034788号-1, QQ:8560851 转载请标明来源,否则木有小jj

鲁公网安备 37078302000299号