免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2822 | 回复: 0
打印 上一主题 下一主题

使用Python查询纯真IP [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-27 20:12 |只看该作者 |倒序浏览

纯真IP挺全,IP数据库也是中文的,最近由于把一个服务器放到公网上,老是有一堆人用ssh暴力破解,用 DenyHosts 禁止暴力破解之余,还想看看到底这些 IP 是 哪里的(不过基本上都是代理 ^_^),就找了一个纯真IP的查询脚本。
纯真IP的格式详解
在网上找到一个 Python 脚本,修改后在linux下的 UTF-8 环境正常使用了,添加一些注释,使用的时候下载最新的纯真IP库,解压后把 QQWry.Dat 文件放到下面脚本同一个目录下。使用”./脚本名字.py IP地址"就可以查询了:
#!/usr/bin/env python
# coding: utf-8
'''用Python脚本查询纯真IP库
QQWay.dat的格式如下:
+----------+
|  文件头  |  (8字节)
+----------+
|  记录区  | (不定长)
+----------+
|  索引区  | (大小由文件头决定)
+----------+
文件头:4字节开始索引偏移值+4字节结尾索引偏移值
记录区: 每条IP记录格式 ==> IP地址[国家信息][地区信息]
   对于国家记录,可以有三种表示方式:
       字符串形式(IP记录第5字节不等于0x01和0x02的情况),
       重定向模式1(第5字节为0x01),则接下来3字节为国家信息存储地的偏移值
       重定向模式(第5字节为0x02),
   
   对于地区记录,可以有两种表示方式: 字符串形式和重定向
   最后一条规则:重定向模式1的国家记录后不能跟地区记录
索引区: 每条索引记录格式 ==> 4字节起始IP地址 + 3字节指向IP记录的偏移值
   索引区的IP和它指向的记录区一条记录中的IP构成一个IP范围。查询信息是这个
   范围内IP的信息
'''
import sys
import socket
from struct import pack, unpack
class IPInfo(object):
    '''QQWay.dat数据库查询功能集合
    '''
    def __init__(self, dbname):
        ''' 初始化类,读取数据库内容为一个字符串,
        通过开始8字节确定数据库的索引信息'''
        
        self.dbname = dbname
        f = file(dbname, 'r')
        self.img = f.read()
        f.close()
        # QQWay.dat文件的开始8字节是索引信息,前4字节是开始索引的偏移值,
        # 后4字节是结束索引的偏移值。
        (self.firstIndex, self.lastIndex) = unpack('II', self.img[:8])
        # 每条索引长7字节,这里得到索引总个数
        self.indexCount = (self.lastIndex - self.firstIndex) / 7 + 1
   
    def getString(self, offset = 0):
        ''' 读取字符串信息,包括"国家"信息和"地区"信息
        QQWay的记录区每条信息都是一个以''结尾的字符串'''
        
        o2 = self.img.find('', offset)
        #return self.img[offset:o2]
        # 有可能只有国家信息没有地区信息,
        gb2312_str = self.img[offset:o2]
        try:
            utf8_str = unicode(gb2312_str,'gb2312').encode('utf-8')
        except:
            return '未知'
        return utf8_str
    def getLong3(self, offset = 0):
        '''QQWay.dat中的偏移记录都是3字节,本函数取得3字节的偏移量的常规表示
        QQWay.dat使用“字符串“存储这些值'''
        s = self.img[offset: offset + 3]
        s += ''
        # unpack用一个'I'作为format,后面的字符串必须是4字节
        return unpack('I', s)[0]
    def getAreaAddr(self, offset = 0):
        ''' 通过给出偏移值,取得区域信息字符串,'''
        
        byte = ord(self.img[offset])
        if byte == 1 or byte == 2:
            # 第一个字节为1或者2时,取得2-4字节作为一个偏移量调用自己
            p = self.getLong3(offset + 1)
            return self.getAreaAddr(p)
        else:
            return self.getString(offset)
    def getAddr(self, offset, ip = 0):
        img = self.img
        o = offset
        byte = ord(img[o])
        if byte == 1:
            # 重定向模式1
            # [IP][0x01][国家和地区信息的绝对偏移地址]
            # 使用接下来的3字节作为偏移量调用字节取得信息
            return self.getAddr(self.getLong3(o + 1))
        
        if byte == 2:
            # 重定向模式2
            # [IP][0x02][国家信息的绝对偏移][地区信息字符串]
            # 使用国家信息偏移量调用自己取得字符串信息
            cArea = self.getAreaAddr(self.getLong3(o + 1))
            o += 4
            # 跳过前4字节取字符串作为地区信息
            aArea = self.getAreaAddr(o)
            return (cArea, aArea)
            
        if byte != 1 and byte != 2:
            # 最简单的IP记录形式,[IP][国家信息][地区信息]
            # 重定向模式1有种情况就是偏移量指向包含国家和地区信息两个字符串
            # 即偏移量指向的第一个字节不是1或2,就使用这里的分支
            # 简单地说:取连续取两个字符串!
            cArea = self.getString(o)
            o += len(cArea) + 1
            aArea = self.getString(o)
            return (cArea, aArea)
    def find(self, ip, l, r):
        ''' 使用二分法查找网络字节编码的IP地址的索引记录'''
        if r - l
我在 DenyHosts 禁止的IP查询示例:
for i in `sed -e '/^ALL/!d' /etc/hosts.deny |cut -d' ' -f2`; do /root/查询纯真IP.py $i;done
122.224.7.146 浙江省绍兴市/电信
89.163.144.165 俄罗斯/
211.174.187.161 韩国/首尔
59.166.120.184 日本/ATHOME网络
147.231.70.91 捷克/
85.28.26.66 英国/伦敦大学皇家医学院皇家法医实验鉴定中心
218.239.223.77 韩国/
216.146.47.37 美国/加拿大/未知
122.155.0.62 泰国/ CZ88.NET
69.31.5.120 美国/
75.109.170.56 美国/
69.43.142.150 美国/
59.109.6.83 北京市/方正宽带
125.46.248.158 河南省郑州市/网通
201.17.35.128 巴西/圣保罗
212.175.84.152 土耳其/
219.134.242.67 广东省深圳市/电信ADSL
213.228.142.42 葡萄牙/
85.17.182.198 荷兰/阿姆斯特丹Leaseweb IDC
218.77.129.6 海南省/
61.151.248.152 上海市/电信
210.210.18.218 印度/ CZ88.NET
194.171.247.21 荷兰/
59.57.251.57 福建省厦门市/电信
218.56.61.114 山东省济南市/网通
220.130.208.19 台湾省台北市/中华电信数据通信分公司
201.63.218.70 美国/中部/南部(IANA)
118.102.25.161 北京市/光环恒通数字技术

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39544/showart_1946537.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP