用過珊瑚蟲的童鞋都知道, 有個叫 "純真數據庫" 的東西, 能夠查詢 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