纯真数据库下载或自动更新实现

本文详细介绍了如何绕过官方程序直接下载并解析纯真数据库的方法。通过抓包分析,发现了解析过程中的关键步骤及算法,包括解密算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用过珊瑚虫的童鞋都知道, 有个叫 "纯真数据库" 的东西, 可以查询 ip 地址对应的物理地址.

纯真数据库是有个名为 QQWry,DAT 的二进制文件, 可以通过纯真数据库自己提供的查询程序进行更新.

有关该数据库格式和解析的内容, 本帖子暂时不讲, 有机会的话, 偶会另行开个新帖子讲讲.

这里讲的是, 不通过官方的查询程序, 如何获取到这个数据库. 通过对官方程序进行抓包, 得出下载此数据库, 主要需要下载

http://update.cz88.net/ip/copywrite.rar

http://update.cz88.net/ip/qqwry.rar

两个文件.

但是很明显,这两个压根不是 rar 文件呀! 别被扩展名迷惑了.

因为要下载两个文件, 所以得出一个很明显的结论, ** 第二个文件需要用到第一个文件里的信息才能正确解开, 获得 qqwry.dat 文件. **

那么, copywrite.rar 里到底有神马东西呢?

我们来打开它

ghex copywrite.rar

05131047_GUyT.png

好吧,老实说, 根本看不明白嘛!

那咋办?

祭出 IDA !!!!!!


struct copywritetag{  
    uint32_t sign;// "CZIP"   
    uint32_t version;//一个和日期有关的值  
    uint32_t unknown1;// 0x01   
    uint32_t size;// qqwry.rar大小   
    uint32_t unknown2;    
    uint32_t key;// 解密qqwry.rar前0x200字节所需密钥  
    char text[128];//提供商  
    char link[128];//网址 
};

最新--2016-2-5版本

array(6) { 
[1]=> int(1346984515)//时间戳
[2]=> int(42405) //
[3]=> int(1) //未知
[4]=> int(4825373) //文件大小
[5]=> int(783947556) //未知
[6]=> int(205) //key
}


这里,最重要的就是 key 这个整数拉! 接下来要在解码 qqwry.rar 里用到

下载, qqwry.rar 初步断定这个是一个压缩文件. 为啥? 因为比 qqwry.dat 明显小了不少!

别看他是 rar 扩展名, 肯定不是用的 rar 压缩算法. 为啥? 明显会用 zlib 这样的开源库来压缩嘛! 何况这样的压塑 php 都能做,是吧. 初步估计是 inflate 压塑, 对, 就是 zlib 用的那个. 约莫估计用 php 的 compress() 函数直接压塑来的.

但是,用 zlib 将 qqwry.dat 压塑后, 文件大小居然一样! 哈,不过,文件头看着他怎么就是不一样呢?

注意到上面的注释没? key 用来解码 qqwry.rar 的头 0x200 个字节. 也就是说, 先用 key 把开头的  0x200 个字节给解码了, 新的数据就可以 zlib 解压了.

啥? 你问我,这 0x200 偏移量怎么来的 ? 诶,笨, 自己比较去吧, 却是和 zlib 压塑的, 就只有前面 0x200 不一样罢了.

那么,这 0x200 个字节的数据, 到底如何解码呢?

来,再次祭出 IDA !!!!!!




好了,网上已经有了祭出 IDA 然后得出解码算法了, 咱看下

 for (int i = 0; i<0x200; i++)     {
          key *= 0x805;
          key++; 
          key &= 0xFF;   
          uint32_t v = reinterpret_cast<const uint8_t*>(qqwry_rar.data())[i] ^ key;    
          qqwry_rar[i] = v; 
}


good 这样就完成了.

接下来把 qqwry_rar 这个数组里的数据喂给 zlib 的 uncompress 函数就完成解压了! bingo


https://github.com/shuax/QQWryUpdate


转载于:https://my.oschina.net/u/574928/blog/614030

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值