純真數據庫下載或自動更新實現

用過珊瑚蟲的童鞋都知道, 有個叫 "純真數據庫" 的東西, 能夠查詢 ip 地址對應的物理地址.php

純真數據庫是有個名爲 QQWry,DAT 的二進制文件, 能夠經過純真數據庫本身提供的查詢程序進行更新.git

有關該數據庫格式和解析的內容, 本帖子暫時不講, 有機會的話, 偶會另行開個新帖子講講.github

這裏講的是, 不經過官方的查詢程序, 如何獲取到這個數據庫. 經過對官方程序進行抓包, 得出下載此數據庫, 主要須要下載算法

http://update.cz88.net/ip/copywrite.rar數據庫

數組

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

兩個文件.ui

可是很明顯,這兩個壓根不是 rar 文件呀! 別被擴展名迷惑了.spa

由於要下載兩個文件, 因此得出一個很明顯的結論, ** 第二個文件須要用到第一個文件裏的信息才能正確解開, 得到 qqwry.dat 文件. **.net

那麼, copywrite.rar 裏到底有神馬東西呢?

咱們來打開它

ghex copywrite.rar

好吧,老實說, 根本看不明白嘛!

那咋辦?

祭出 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

相關文章
相關標籤/搜索