有人用过QQWry.Dat么?

ClsData 2007-06-26 11:06:00
多数网上关于利用QQWry.Dat文件查找ip地址的
都是已知ip地址,可查出相对应的城市。

有没有前辈们用过利用QQWry.Dat文件,但给出城市求出对应的ip字段
例如IPlook这种输入杭州,然后刷出很多杭州的ip字段的?

给个代码连接或者方法提示,用已知ip查城市的算法好多,看不错来了。
急用
谢谢
...全文
1080 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
konic 2007-06-27
  • 打赏
  • 举报
回复
这是爱的奉献:)

using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;

namespace WSY.SchoolManage.MyComponet
{
/// <summary>
/// IPScan 的摘要说明。
/// </summary>
public class IPScan
{
#region 私有成员

private string dataPath;
private string ip;
private string country;
private string local;

private long firstStartIp=0;
private long lastStartIp=0;
private FileStream objfs = null;
private long startIp=0;
private long endIp=0;
private int countryFlag=0;
private long endIpOff=0;
private string errMsg=null;

#endregion

#region 构造函数
public IPScan()
{

}
#endregion

#region 公共属性
public string DataPath
{
set{dataPath=value;}
}

public string IP
{
set{ip=value;}
}

public string Country
{
get{return country;}
}

public string Local
{
get{return local;}
}

public string ErrMsg
{
get{return errMsg;}
}

#endregion

#region 搜索匹配数据
private int QQwry()
{
string pattern = @"(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))";
Regex objRe = new Regex(pattern);
Match objMa = objRe.Match(ip);
if(!objMa.Success)
{
this.errMsg="IP格式错误";
return 4;
}

long ip_Int = this.IpToInt(ip);
int nRet=0;
if(ip_Int>=IpToInt("127.0.0.0")&&ip_Int<=IpToInt("127.255.255.255"))
{
this.country="本机内部环回地址";
this.local="";
nRet=1;
}
else if((ip_Int>=IpToInt("0.0.0.0")&&ip_Int<=IpToInt("2.255.255.255"))||(ip_Int>=IpToInt("64.0.0.0")&&ip_Int<=IpToInt("126.255.255.255"))||(ip_Int>=IpToInt("58.0.0.0")&&ip_Int<=IpToInt("60.255.255.255")))
{
this.country="网络保留地址";
this.local="";
nRet=1;
}
objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);
try
{
//objfs.Seek(0,SeekOrigin.Begin);
objfs.Position=0;
byte[] buff = new Byte[8] ;
objfs.Read(buff,0,8);

firstStartIp=buff[0]+buff[1]*256+buff[2]*256*256+buff[3]*256*256*256;
lastStartIp=buff[4]*1+buff[5]*256+buff[6]*256*256+buff[7]*256*256*256;
long recordCount=Convert.ToInt64((lastStartIp-firstStartIp)/7.0);
if(recordCount<=1)
{
country="FileDataError";
objfs.Close();
return 2;
}
long rangE=recordCount;
long rangB=0;
long recNO=0;
while(rangB<rangE-1)
{
recNO=(rangE+rangB)/2;
this.GetStartIp(recNO);
if(ip_Int==this.startIp)
{
rangB = recNO;
break;
}
if(ip_Int>this.startIp)
rangB=recNO;
else
rangE=recNO;
}
this.GetStartIp(rangB);
this.GetEndIp();
if(this.startIp<=ip_Int&&this.endIp>=ip_Int)
{
this.GetCountry();
this.local=this.local.Replace("(台湾是祖国大陆的一部分!!!)","");
}
else
{
nRet=3;
this.country="未知";
this.local="";
}
objfs.Close();
return nRet;
}
catch
{
return 1;
}

}
#endregion

#region IP地址转换成Int数据
private long IpToInt(string ip)
{
char[] dot = new char[]{'.'};
string [] ipArr = ip.Split(dot);
if(ipArr.Length==3)
ip=ip+".0";
ipArr=ip.Split(dot);

long ip_Int=0;
long p1=long.Parse(ipArr[0])*256*256*256;
long p2=long.Parse(ipArr[1])*256*256;
long p3=long.Parse(ipArr[2])*256;
long p4=long.Parse(ipArr[3]);
ip_Int=p1+p2+p3+p4;
return ip_Int;
}
#endregion

#region int转换成IP
private string IntToIP(long ip_Int)
{
long seg1=(ip_Int&0xff000000)>>24;
if(seg1<0)
seg1+=0x100;
long seg2=(ip_Int&0x00ff0000)>>16;
if(seg2<0)
seg2+=0x100;
long seg3=(ip_Int&0x0000ff00)>>8;
if(seg3<0)
seg3+=0x100;
long seg4=(ip_Int&0x000000ff);
if(seg4<0)
seg4+=0x100;
string ip=seg1.ToString()+"."+seg2.ToString()+"."+seg3.ToString()+"."+seg4.ToString();

return ip;
}
#endregion

#region 获取起始IP范围
private long GetStartIp(long recNO)
{
long offSet = firstStartIp+recNO*7;
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position=offSet;
byte [] buff = new Byte[7];
objfs.Read(buff,0,7);

endIpOff=Convert.ToInt64(buff[4].ToString())+Convert.ToInt64(buff[5].ToString())*256+Convert.ToInt64(buff[6].ToString())*256*256;
startIp=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256+Convert.ToInt64(buff[3].ToString())*256*256*256;
return startIp;
}
#endregion

#region 获取结束IP
private long GetEndIp()
{
//objfs.Seek(endIpOff,SeekOrigin.Begin);
objfs.Position=endIpOff;
byte [] buff = new Byte[5];
objfs.Read(buff,0,5);
this.endIp=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256+Convert.ToInt64(buff[3].ToString())*256*256*256;
this.countryFlag=buff[4];
return this.endIp;
}
#endregion

#region 获取国家/区域偏移量
private string GetCountry()
{
switch(this.countryFlag)
{
case 1:
case 2:
this.country=GetFlagStr(this.endIpOff+4);
this.local=( 1 == this.countryFlag )?" ":this.GetFlagStr(this.endIpOff+8);
break;
default:
this.country=this.GetFlagStr(this.endIpOff+4);
this.local=this.GetFlagStr(objfs.Position);
break;
}
return " ";
}
#endregion

#region 获取国家/区域字符串
private string GetFlagStr(long offSet)
{
int flag=0;
byte [] buff = new Byte[3];
while(1==1)
{
//objfs.Seek(offSet,SeekOrigin.Begin);
objfs.Position=offSet;
flag = objfs.ReadByte();
if(flag==1||flag==2)
{
objfs.Read(buff,0,3);
if(flag==2)
{
this.countryFlag=2;
this.endIpOff=offSet-4;
}
offSet=Convert.ToInt64(buff[0].ToString())+Convert.ToInt64(buff[1].ToString())*256+Convert.ToInt64(buff[2].ToString())*256*256;
}
else
{
break;
}
}
if(offSet<12)
return " ";
objfs.Position=offSet;
return GetStr();
}
#endregion

#region GetStr
private string GetStr()
{
byte lowC=0;
byte upC=0;
string str="";
byte[] buff = new byte[2];
while(1==1)
{
lowC= (Byte)objfs.ReadByte();
if(lowC==0)
break;
if(lowC>127)
{
upC=(byte)objfs.ReadByte();
buff[0]=lowC;
buff[1]=upC;
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("GB2312");
str+=enc.GetString(buff);
}
else
{
str+=(char)lowC;
}
}
return str;
}
#endregion

#region 获取IP地址

public string IPLocation()
{
this.QQwry();
return this.country+this.local;
}

public string IPLocation(string dataPath,string ip)
{
this.dataPath=dataPath;
this.ip=ip;
this.QQwry();
return this.country+this.local;
}

#endregion
}
}
SassyBoy 2007-06-27
  • 打赏
  • 举报
回复
没有,不过看来挺好玩的。
ClsData 2007-06-27
  • 打赏
  • 举报
回复
尼姑?你给的那个示例
值为192*256^3+168*256^2+1*256^1+1*256^0

192*256^3 = 3221225472

后面的我还没算,到这里已经超过8位了,而地址对应列都是8位的呀

另外:假如我现在已经导出所有的ip段了,仍然需要实现如下功能
输入辽宁,30(需求的随机ip个数)

不知哪位做过,通过一个select语句的
where 指定地区和ip个数这个条件,查询出所有的实际随机ip地址???

例如段192.168.3.1到192.168.3.165 对应辽宁
我输入辽宁 30
就可以得到随机的 30个详细ip地址

amandag 2007-06-27
  • 打赏
  • 举报
回复
不过,有ip库玩
ClsData 2007-06-27
  • 打赏
  • 举报
回复
没晚,欢迎继续讨论
ClsData 2007-06-27
  • 打赏
  • 举报
回复
这个的结果已经是3221225472了
列号一共才8位阿
Red_angelX 2007-06-27
  • 打赏
  • 举报
回复
yun 来晚了
ClsData 2007-06-27
  • 打赏
  • 举报
回复
已经导出ip段库了,谢谢各位参与。
pzhuyy 2007-06-27
  • 打赏
  • 举报
回复
67108864,另一列对应为:67829759
反推IP地址

示例:
ip为192.168.1.1

值为192*256^3+168*256^2+1*256^1+1*256^0

同理你可以用67108864/(256^3) 得到的商为第一位的IP,用余数除以256的二次方(256^2)得到的商为第二位的IP.
wszhoho 2007-06-26
  • 打赏
  • 举报
回复
网上好像有算法的,以前也想搞这个,无奈时间不允许。
nyzfl 2007-06-26
  • 打赏
  • 举报
回复
路过
ClsData 2007-06-26
  • 打赏
  • 举报
回复
就是如何利用QQWry.Dat数据库,指定一具体地区,如辽宁,能够查找出辽宁地区的所有ip地址。

目前通过转化软件,已经把QQWry.Dat转化成sql数据库的一张表,大约有30万记录.虽然有地区字段,
但没有具体的ip地址,而是两列数值(如一列为:67108864,另一列对应为:67829759,地区为美国),通过什么偏移量来计算实际的ip.不知哪位做过,通过一个select语句的
where 指定地区这个条件,查询出所有的实际ip地址???

当然,也可以不用这个数据库,大家有别的办法能实现这个功能也行.
pzhuyy 2007-06-26
  • 打赏
  • 举报
回复
说得不太明白,IP库很多的呀
CathySun118 2007-06-26
  • 打赏
  • 举报
回复
每个地区都有ip段范围的,你搜集到数据库中就可以查询了

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧