C段查询雏形之在Java中反查一个IP上的所有域名(旁站查询)

这里使用了两个接口来反查IP,分别是“站长工具”和“爱站”的接口,两者各有千秋,结合起来查询就较为准确了。

注:我目前只写了个初始版本,还不太完善,但是可以基本使用了,代码中关键地方有注释,所以我就不多解释了

算法核心:

package NmapTest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SearchDomainByIP {
	/**
	 * IP反查(旁站查询),综合两个接口的结果
	 * @param ip 待查IP
	 * 
	 * @return 返回结果集
	 * */
	public Set<String> getDomains(String ip){
		Set<String> set = new HashSet<String>();
		set = getDomainByChinaz(searchDomainByChinaz(ip));  //chinaz接口

		try {
			String[] domainByAiZhan = searchDomainByAiZhan(ip, 1, false).split(" ");  //aizhan接口
			for(String s : domainByAiZhan){
				if(!s.equals(""))
					set.add(s);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return set;
	}

	/**
	 * 使用站长工具的接口,IP反查域名
	 * @param ip 待查IP
	 * 
	 * @return 返回包含结果的字符串
	 * */
	private String searchDomainByChinaz(String ip){
		try {
			URL url = new URL("http://s.tool.chinaz.com/same");
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();

			connection.setRequestMethod("POST");
			connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			connection.setDoInput(true);
			connection.setDoOutput(true);
			connection.setUseCaches(false);

			String str = "s=" + ip;  //POST参数
			OutputStream outputStream = connection.getOutputStream();
			outputStream.write(str.getBytes("UTF-8"));
			outputStream.flush();  //开始请求
			outputStream.close();

			//返回数据包
			if(connection.getResponseCode() == 200){
				InputStream inputStream = connection.getInputStream();
				BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
				String line = "";
				String reg = "\\s*<ul><li><span>1.</span>(.*)?";  //匹配到目标行

				while((line = reader.readLine()) != null){
					if(line.matches(reg)){
						inputStream.close();
						reader.close();
						connection.disconnect();
						return line.replaceFirst("\\s*<ul><li><span>1.</span>", "");  //返回包含目标的字符串
					}

				}
			}

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return "";
	}

	/**
	 * 正则匹配出需要的一个个域名
	 * @param data 包含所有结果的字符串
	 * 
	 * @return 目标域名的List集合
	 * */
	private Set<String> getDomainByChinaz(String data){
		String reg = "target=_blank>(.*?)</a></li>";  //准确匹配出查到的域名
		Pattern pattern = Pattern.compile(reg);
		Matcher matcher = pattern.matcher(data);

		Set<String> set = new HashSet<String>();
		while(matcher.find()){
			set.add(matcher.group(1));
		}

		return set;
	}

	/**
	 * 使用爱站网的接口,IP反查域名
	 * @param ip 待查IP
	 * @param currentPage 当前页
	 * @param checkNum 判断域名总数是否已获取
	 * 
	 * @return 返回包含结果的字符串
	 * @throws IOException 
	 * */
	private String searchDomainByAiZhan(String ip,int currentPage,boolean checkNum) throws IOException{
		URL url = new URL("http://dns.aizhan.com/" + ip + "/" + currentPage +"/");
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestMethod("GET");
		connection.setConnectTimeout(10000);  //毫秒
		connection.setReadTimeout(10000);

		InputStream inputStream = connection.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
		String line = "";
		String numReg = "共有  <font color=\"#FF0000\" id=\"yhide\">(\\d*)?</font> 个域名解析到该IP";
		String domainReg = "\\s*<td class=\"dns-links\">\\s*";  //匹配到目标行的上一行

		int domainNumber = 0;  //查到的域名总数
		String domainNames = "";  //查到的所有域名的字符串集
		boolean point = false;  //从false置为true时,表示已经找到目标行的上一行了,下一次循环即可取出目标行		

		Pattern pattern = Pattern.compile(numReg);
		Matcher matcher = null;
		while((line = reader.readLine()) != null){
			//查域名总数
			if(!checkNum){
				matcher = pattern.matcher(line);
				if(matcher.find()){
					domainNumber = Integer.valueOf(matcher.group(1));
					checkNum = true;
				}
			}
			//查域名
			if(point){
				pattern = Pattern.compile("target=\"_blank\">(.*)?</a>");
				matcher = pattern.matcher(line);
				if(matcher.find()){
//					System.out.println(matcher.group(1));
					domainNames = domainNames + matcher.group(1) + " "; 
					point = false;
				}
			}
			else if(line.matches(domainReg)){
				point = true;
			}

		}
		inputStream.close();
		reader.close();
		connection.disconnect();

		//如果当前页下一页还有内容,则进行递归调用查询
		if(domainNumber > (20 * currentPage)){
			try {
				Thread.sleep(1000);  //线程休息1秒钟
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return domainNames + searchDomainByAiZhan(ip,currentPage+1,true);
		}
		else{
			return domainNames;
		}
	}
}

调用测试:

package NmapTest;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Domains {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SearchDomainByIP searchDomain = new SearchDomainByIP();
		Set<String> set = new HashSet<String>();
		set = searchDomain.getDomains("162.211.183.152");

		Iterator<String> iterator = set.iterator();
		System.out.println("一共查到 " + set.size() + "个旁站");
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
	}

}

输出:

一共查到 55个旁站
www.anhao.ga
www.3ga.cc
www.xiaotwl.cn
wapfeih.com
www.52zyw.net
lgdyw.pw
xxin888.com
www.hksf-expres.com
www.zbhz.top
yk666.cn
www.mfdhw.cn
danshenwl.com
qq67.cn
gjdc.cc
www.5x2y0.com
www.wz288.com
wapzx.org
85pj.cn
www.txbk.cc
yajie520.com
www.wuyunzhu.top
huanyan520.com
lequk.com
www.ddcd.net
ail.so
3pojie.com
www.hacksg.com
www.yin361.cn
www.wapfeih.com
xg-sfkd.com.cn
www.xuexi47.cn
www.huaxia47.com
wz288.com
www.sucaiziyuan.com
wapsog.com
qm6.cc
www.58dh.cn
hacksg.com
zhuilixiang.com
www.xhhzyw.com
www.360360.pw
www.495o.com
surfs.cn
shineky.cn
www.danshenwl.com
52daizi.com
www.hei-tan.com
xg-sfg.cn
www.qqjudian.com
sucaiziyuan.com
moran.cc
lghk.pw
www.huanyan520.com
hongbao.qq.com.mooyu.pub
lexunc.com

PS:通过IP反查域名本身就没有确定的算法,因此有误差再所难免。这也是我使用两个不同接口来查询的意义所在,可以互相弥补,使结果更加精确

(PS:打个广告,更多原创文章,尽在我的个人博客网站:http://www.zifangsky.cn

时间: 2024-10-27 05:28:53

C段查询雏形之在Java中反查一个IP上的所有域名(旁站查询)的相关文章

使用必应查询接口开发搜索工具:反查一个IP上的旁站

前言:必应提供了"Bing Search API",免费版的一个月可以查询5000次,我们可以通过调用这个API方便的使用必应的查询服务.其中"K8_C段旁注查询工具V2.0"就使用到了这个API,接下来我将详细说明在Java中如何使用这个API 一 API申请 申请地址:https://datamarket.azure.com/dataset/bing/search 当然首先要进行登陆,没有账号的话就注册一个,但是需要注意的是"国家/地区"这个

Java中如何判断一个double类型的数据为0?

Java中如何判断一个double类型的数据为0 其实这个问题很简单,只是很多时候考虑复杂了,直接用==判断即可.下面给出测试例子: /**  * 如何判断一个double类型的数据为0  *  * @author leizhimin 2014/8/27 10:31  */ public class Test4 {     public static void main(String[] args) {         double x = 0.00000000000000000;       

在java中如何创建一个内存泄露

今天访问java 并发编程网,看到一个翻译征集令,并发编程网的作者从stackoverflow 网站上选取了一些经典问答,遂决定翻译几篇 征集令地址:http://ifeve.com/stackoverflow-assembly/ 翻译系列文章: 1.Java 核心类库中的一些设计模式 2. hashMap 与hashTable之间的区别 3.  在java中如何创建一个内存泄露 译文: 在java中如何创建一个内存泄露 问题: 我之前参加了一个面试, 被问到在java中如何创建一个内存泄露.不

java中如何实现一个优美的equals方法

java中的任何类都从老祖宗Object中集成了equals方法,在编程实践中应用使用equals方法判断两个对象是否相同的场景无处不在,所以我们在实现自己的类是必须重写出一个优美的equals方法. 首先让我们来看看java语言规范中对equals方法的说明,一个equals方法应当满足如下几个特性: 自反性,对任何一个非空的引用x,x.equals(x)必须返回true: 对称性,对任何引用x和y来说,如果x.equals(y)返回true,那么y.equals(x)也必须返回true: 传

Java中如何查看一个类依赖的包

Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包? ? 测试语句: ? public static void main(String[] args) { ????????ProtectionDomain pd = JSONArray.class.getProtectionDomain(); ????????CodeSource cs = pd.getCodeSource(); ????????System.out.printl

批量扫描雏形之在Java中调用nmap进行主机探测

在Java中通过调用Runtime这个类可以执行其他的可执行程序,执行后返回一个进程(Process),利用Process这个类我们可以取得程序执行的回显,因此在Java中调用nmap进行主机探测的原理就很清晰了.通过给函数传递nmap所在路径和我们需要执行的命令即可 具体实现代码: /**  * 调用nmap进行扫描  * @param nmapDir nmap路径  * @param command 执行命令  *   * @return 执行回显  * */ public String g

Java中的集合框架(上)

Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的条目: 3.有的集合接口,提供了一系列排列有序的元素,并且 可以在序列中间快速的插入或删除有关的元素. 4.有的集合接口,提供了映射关系,可以通过 关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型. 与数组的对比一为何选择集合而不是数组 1.数组的长度固定,集合长度可变 2.数

Java 中多态的实现(上)

Java 中语法上实现多态的方式分为两种:1. 重载.2. 重写,重载又称之为编译时的多态,重写则是运行时的多态. 那么底层究竟时如何实现多态的呢,通过阅读『深入理解 Java 虚拟机』这本书(后文所指的书,如无特殊说明,指的都是这本书),对多态的实现过程有了一定的认识.以下内容是对学习内容的记录,以备今后回顾. 写着写着突然发现内容有点多,分为上和下,上主要记录重载的知识点,下则是重写的相关知识点. 重载 重载就是根据方法的参数类型.参数个数.参数顺序的不同,来实现同名方法的不同调用,重载是通

Java中如何判断一个日期字符串是否是指定的格式

判断日期格式是否满足要求 import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date; public class Test2{public static void main(String[] args) { String date_string="201609";// 利用java中的SimpleDateFormat类,指定日期格式,注意yyyy,MM大小写// 这里的日