【发布时间】:2019-06-29 04:13:57
【问题描述】:
我有一个tcp 数据包。从 tcp 标头中,我可以获得目标 IP 地址。我的目标是找到目的地的主机名。
我尝试使用下面的代码进行反向 dns 查找。
try {
hostname = InetAddress.getByName(myIp).getHostName();
Log.w("Host for ", myIp + " is " + hostname) ;
}catch (UnknownHostException e){
Log.w("Unknown Host for ", myIp);
}
上面的代码给出的输出为:
主机为:172.217.3.33 是 iad23s57-in-f1.1e100.net
W/Host for: 216.58.217.142 是 iad23s43-in-f14.1e100.net 。 . .
我希望主机名作为网站的名称。例子。 youtube.com、stackoverflow.com 等
我尝试为此使用MiniDNS 库。
ResolverResult<A> result = DnssecResolverApi.INSTANCE.resolve(hostname, A.class);
if (!result.wasSuccessful()) {
DnsMessage.RESPONSE_CODE responseCode = result.getResponseCode();
// Perform error handling.
Log.d(TAG, “ Result Not successful");
return;
}
if (!result.isAuthenticData()) {
// Response was not secured with DNSSEC.
Log.d(TAG, ”Result Not authentic");
return;
}
Set<A> answers = result.getAnswers();
for (A a : answers) {
InetAddress inetAddress = a.getInetAddress();
// Do someting with the InetAddress, e.g. connect to.
Log.d(TAG, InetAddress.toString());
}
上面的代码给出了以下错误:
访问被拒绝查找属性“net.dns1”
我能够解析tcp/udp 数据包以获取tcp/udp header 并获取目标地址。除了目标ip,还有什么方法可以从数据包中获取主机名?
【问题讨论】:
-
为什么您认为所有主机都有反向名称?这不是强制性的,因此来自 IP 的许多请求不会产生主机名。 TCP/IP 数据包中没有主机名,只有 IP 地址。除非您分析部分部分,例如如果它是 HTTP,那么您可能有一个 Host: 标头,因此有一个“目标”主机名。然而,在 TCP/IP 级别过滤类似的东西并不容易,而且使用 HTTPS 几乎是不可能的。
-
@PatrickMevzek 我尝试使用 MiniDNS 库从我从第一个代码中获得的规范主机名中获取实际主机名,但它只工作一次,然后显示访问被拒绝错误。在线文档显示它不适用于 Android 9 及更高版本。但它也显示以前版本的相同错误。我确实为所有查询得到了一次结果,但之后它就停止了工作。
标签: android dns vpn packet packet-sniffers