Whois 简单来说,就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商、域名注册日期和过期日期等)。通过域名Whois服务器查询,可以查询域名归属者联系方式,以及注册和到期时间。通常情况下,whois信息均为真实信息,通过whois信息可以找到域名注册人的很多真实信息,像电话,邮箱,NS记录,是对网站进行社工非常好的信息来源,对于安全从业人员来说,快速获取whois信息,能够帮助自己掌握目标网站的很多有用信息。
而whois信息通常是保存在各级域名注册机构中,平常我们要查询whois信息都是通过godaddy、name.com、万网、新网等域名注册商网站通过查询页面提交域名进行查询,既慢又不能批量查询,太费劲了,这里我就把我珍藏很久的一个PS function贡献给大家,这个脚本支持140多种后缀的域名进行查询,尤其是一些生僻的域,找一个能支持这个域注册的注册商就不容易了,现在你不需要再为这个事情发愁了。
老规矩,先上代码,然后对关键操作进行解释:
=====文件名:Get-whois.ps1=====
Get-WhoIs {
[CmdletBinding()]
(
[Parameter(Position=0, ValueFromRemainingArguments=$true)]
[]$query,
[]$server,
[]$NoForward
)
{
$TLDs = DATA {
@{
= ,
= ,
= ,
= ,
=
=
=
=
=
= ,
=
=
=
=
=
=
= ,
=
= ,,
=
=
= ,
= ,
= ,
=
=
= ,
= ,
=
=
= ,
=
=
= ,
=
=
=
= ,,
= ,
= ,
=
= ,
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
}
}
$EAP, $ErrorActionPreference = $ErrorActionPreference,
$query = $query.Trim()
($query ) {
($query ) {
$query =
}
(!$server) { $server = }
} (!$server) {
$server = $TLDs.GetEnumerator() |
{ $query (+$_.name) } |
-Expand Value | Get-Random
}
(!$server) { $server = }
$maxRequery = 3
{
$client = System.Net.Sockets.TcpClient $server, 43
{
$stream = $client.GetStream()
$data = [System.Text.Encoding]::Ascii.GetBytes( $query + )
$stream.($data, 0, $data.Length)
$reader = System.IO.StreamReader $stream, [System.Text.Encoding]::ASCII
$result = $reader.ReadToEnd()
($result ) {
(!$NoForward) {
(!$cachedResult) {
$cachedResult = $result
$cachedServer = $server
}
$server = $matches[1]
$query = ($query -split )[-1]
$maxRequery--
} { $maxRequery = 0 }
} { $maxRequery = 0 }
} {
($stream) {
$stream.Close()
$stream.Dispose()
}
}
} ($maxRequery 0)
$result
($cachedResult ($result -split ).count 5) {
$cachedResult
}
$ErrorActionPreference = $EAP
}
}
函数里定义了三个参数,两个[string]类型,一个[switch]类型,分别用于接收要进行whois查询的域名,指定whois域名服务器,以及是否允许将查询请求转发到其他域名解析服务器。随后创建了一个枚举值的哈希表,目的是用于存储不同域名后缀和whois服务器的对应关系,因为不同的域名后缀对应的域名信息是存储在不同的服务器上的。需要强调的是像.com、.net、.org、.info这几个注册量特别大的域名后缀指定了多个whois服务器,避免查询量过大无法有效返回结果的问题。
接下来通过New-Object创建一个System.Net.Sockets.TcpClient的TCP对象,连接上面指定的whois服务器的43端口用于查询whois信息,在通过一个System.IO.StreamReader对象接收whois信息返回的数据,并对数据进行解析。除此之外再加上try{}cache{}finally{}进行容错处理,在数据解析是也用到了正则表达式用于匹配目标字符串。
程序的运行方法有如下四种:
get-whois dnspod.com
先看看dnspod在被腾讯收购后有没有更改whois信息,貌似鹅厂没有改过
get-whois n 128.11.5.98 -server whois.arin.net
作者: 付海军
出处:http://blog.csdn.net/fuhj02
版权:本文版权归作者和csdn共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://www.fuhaijun.com/