QQWry.dat文件结构分析(zz)

TITLE  : QQWry.dat文件结构分析
AUTHOR : lionel@nkbbs.org
DATE   : 2004/12/18

CONTENT: 
        最近写一个程序,其中一部分功能是关于ip地址查询的,上网找了很久ip数据库,得到的结果却不太理想。唯一找到比较全的数据库就是从 QQWry.dat导出的纯文本文件,比较大,所以我觉得不如索性就直接用 QQWry.dat,这个文件每一个能显示ip的QQ里面都有。以下内容参考了两篇文章,感谢这两篇文章的作者。一位是自称是设计这种格式的人,一位则是自己研究出这种 格式的人。但上述两篇文章写得都不够具体,前者因为是作者,所以具体细节写得不够清楚;后者由于是自己研究的,所以有些东西分析不够透彻。我则借鉴了这两篇文章,下面我详细介绍一下 QQWry.day的文件格式,有不正确之处还请大家指正。

        总体上说,QQWry.dat有 3部分组成:

         [文件头] + [结束IP + 地区1 + 地区2][m] + [开始IP + 结束IP偏移][n]

        先说明一下以上每个部分指的具体是什么。在QQWry.dat 中每个记录描述如下:
       
         202.113.16.0   - 202.113.16.255 南开大学   网络中心

         其中202.113.16.0就是[开始IP],202.113.16.255就是[结束IP],

         [开始IP] - [结束IP]组成一个IP段,所有IP段是按照从小到大排列的。

         南开大学就是[地区1],网络中心就是[地区2]

         一般来说[地区1]比较大,例如美国;[地区2]比较精确,例如纽约。

         [文件头]以及每一个[开始IP + 结束IP偏移] 大小是固定的,但每一个

         [结束IP + 地区1 + 地区2]的大小是不定的,并且所有偏移都是绝对偏移。

         下面具体分析各部分:

         1.[文件头]

             文件头总共有 8个字节,结构如下:

             typedef struct
             {
                //指向[开始IP + 结束IP偏移][0]
                unsigned long first_start_ip_offset;
                //指向[开始IP + 结束IP偏移][n - 1]
                unsigned long last_start_ip_offset;
             }header;

             所以用[文件头]的这两个指针就可以遍历所有的[开始IP + 结束IP偏移]

         2.[开始IP + 结束IP偏移]

             每一个[开始IP + 结束IP偏移]结构有 7个字节,

             typedef struct
             {
                //具体的[开始IP]
                unsigned long start_ip;
                //指向对应的[结束IP + 地区1 + 地区2]
                unsigned char end_ip_offset[3];
             }start_ip;

             例如记录的[开始IP]是202.113.16.0,则

             start_ip.start_ip = 0xCA711000

             但注意,保存在文件中的数据是倒过来的,即0x001071CA。

              通过start_ip.end_ip_offset可以定位到相应的[结束IP+地区1+地区2]

         3.[结束IP + 地区1 + 地区2]

             这部分相对复杂一些,他的长度是不定的,将前面出现过的重复的地区字符串删掉,而只保留一个指针,这样可以起到适当的数据压缩作用。

             [结束IP]同样是 4个字节,与start_ip.start_ip保存方式相同。

             下面具体介绍地区的保存方式,保存方式总共有 4种:

             1)[地区1] + 0x00 + [地区2] + 0x00

                 其中[地区1][地区2]都是字符串,例如:"美国"+ 00+ "纽约"+ 00

             2)0x01 + [地区偏移]

                 表示[地区1 + 地区2] 前面出现过,通过 3字节的[地区偏移]就可以找到,值得注意的是利用这个[地区偏移]找到的[地区1+ 地区2]不一定就是1),可能是下面要讲的 3) 4),但一定不是2),也就是说2)不会递归的出现,至少我遍历了所有150000条记录,没有出现这样的情况。

             3)0x02 + [地区偏移] + [地区2] + 0x00

                 表示[地区1] 前面出现过,利用 3字节的[地区偏移]即可找到,并且找到的 [地区1][0] != 0x01 && [地区1][0] != 0x02,也就说不会再出现2),并且3)不递归,所以找到的数据一定是[地区1] + 0x00这种情形。

             4)0x02 + [地区偏移] + 0x02 + [地区偏移]

                 表示[地区1][地区2]分别在前面出现过,分别利用这两个偏移就可以找到[地区] + 0x00这样的字符串。找到的数据不会再是2) 3)中的那样,也不会是4)本身。

         现在网上有几种QQ IP数据格式,例如:Phoenix版、纯真版、梧州版,我以上分析的数据是纯真网络2004年9月5日的IP数据。

BIBLI-OGRAPHY: 
http://blog.csdn.net/taft/ 《QQwry格式》
http://blog.csdn.net/cnss/ 《关于QQWry格式》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值