2011年5月15日星期日

让Windows通过TCP协议发送DNS请求

起因是我这(beijing urban network co. ltd)把DNS服务器改为8.8.8.8或者8.8.4.4的时候就无法使用了,表现为发出DnsQuery后没有任何响应,猜测大概是GFW搞的鬼 吧。唔。。。不管是不是反正这黑锅都让GFW来背,呵呵。

默认情况下Windows的DNS交互使用UDP协议承载,于是抱着试试的心理尝试了一下用TCP来发送DNS请求,结果Google DNS很给力的返回了结果。
接下来的工作就是怎样让Windows用TCP来发送了。悲催的是翻了一遍组策略,网络连接属性等等都没找到哪个选项可以让Windows发送 TCP的DNSQuery,也不知道是真没有还是没找到。没办法只好自己动手丰衣足食啦,分析后发现判断用UDP或TCP的关键位置在 DnsApi.dll中,修改之,覆盖,重启,用Wireshark看到发送的都是TCP的DNS请求,目前除了nslookup工具,其他使用一切正 常,用nslookup发出的请求不受影响,默认还是UDP的,反正不影响上网,无视了。
提一下用的系统是Win7 Ultimate,版本号 6.1.7601
DnsApi.dll版本号为6.1.7601.17570
.text:6DC08FC8 8B 46 10        mov     eax, [esi+10h]
.text:6DC08FCB 89 45 F4        mov     [ebp+var_C], eax
关键代码,此处让var_C值为2即可,这里给出我的修改方法
85A0: 90 90 90 90 90 -> 33 C0 40 EB 25
85C8: 8B 46 10 -> EB D6 40
后记:
测试了一下似乎也能绕过GFW的DNS投毒
测试方法:
1. 用UDP协议dig www.google.com,没有任何返回
2. 仍用UDP协议dig www.twitter.com 有返回结果,不过给的IP地址不正确,是随机值
说明GFW的DNS投毒在拦截DNS请求之前,下面看看TCP协议请求的实验结果
1. 用TCP协议dig www.google.com 返回正确IP
2. 用TCP协议dig www.twitter.com 也返回了正确的IP
均返回了正确结果,看来GFW的DNS劫持目前还仅限于UDP协议,对于TCP协议则没有过滤:)
不过这仅是我这里的情况,还不知道是否在其他网络中也适用,如果不适用说明GFW可以根据不同的运营商或者地区来部署不同的版本。那就比较恶心了。
附上修改后的DnsApi.dll
Size: 270,336 bytes
MD5Sum   : c2e583928d087a631cff925e27a5edb4
Download :  dnsapi.dll

原文链接:http://www.bingtech.net/wordpress/?p=233

[通吃 http://like-chilli.blogspot.com]

没有评论:

发表评论