DIY一个DNS查询器:程序实现

简介: 上一篇文章《DIY一个DNS查询器:了解DNS协议》中讲了DNS查询协议的原理和数据结构。经过两个星期的开发,完成了该查询器的编写。期间也遇到了一些问题,如:1资源记录(Resource Record)中的RDData内容的格式。

上一篇文章《DIY一个DNS查询器:了解DNS协议》中讲了DNS查询协议的原理和数据结构。经过两个星期的开发,完成了该查询器的编写。期间也遇到了一些问题,如:

1资源记录(Resource Record)中的RDData内容的格式。

2关于压缩编码的指针问题。

3代码冗余结构不清晰。

尤其是压缩编码的问题,困扰了我很久,找了很多中文资料,都说到当长度的值为“192”的时候为指针,下一字节的内容即偏移的位置,但是在过程中却发现存在该值为“193”的情况,一直不解了好久。这里我给解释下:

 

假设第13字节内容为:05-6c-69-78-69-6e-02-6d-6e

翻译为“5-l-i-x-i-n-2-m-e”

而其后的某个地方,同样出现了lixin.me的字符串,那么就会使用指针编码:"c0-0c”。

c0十进制是192,代表下面的内容是一个指针,0c是个地址,指向了data[12]的位置。

而为什么会出现193呢,也好理解,因为用一个字节的内容来表示偏移,顶多也只能偏移256个字节,那么假设udp包有500个字节长,而要指向第300字节就无能为力了。因此实际上的偏移量不是由oc这个字节内容决定的,正确的偏移量是:(Cn-C0)*256+0c。

如果值为193,下一字节为1,那么具体偏移就是 (193-192)*256+1 。

还有一点要注意到就是可变长度的Name字段以什么为结尾。有3中结尾方式:

1.长度+内容+~+长度0

2. 偏移标识+偏移量

3.长度+内容+~+偏移标识+偏移量

能成功解决该问题,主要还是靠资料,虽然知道rfc1034和rfc1035里面一定有我要的内容,可惜外文比较难懂,一直看不下去,通过搜索得到的中文和少量外文资料也没说清楚。最后还得感谢《TCP-IP详解卷一:协议》的第14章Dns协议的介绍,虽然只有短短的17页,但还是帮我解决了问题。所以在同样搞协议的同学,不妨弄本先去瞧瞧,或者遇到问题也可以先去看看。

 

现在来说说这个程序了。

我按dns协议的结构把项目分成 MyDnsHeader.cs、MyDnsQuestion.cs、MyDnsRecord.cs 这样的3个大结构。

发送dns请求时只需要构造MyDnsHeader和MyDnsQuestion结构,然后通过GetBytes()函数得到构造好的字节数组,然后通过udp发送出去。然后接受来自服务器的响应,将接收到的字节数组通过Parse(byte[] recvData)方法让3个结构去解析,最后通过这些结构的属性字段获取相应的查询信息。

其中的资源记录,目前能分析 A记录、SOA记录、TXT记录、CNAME记录、MX记录、NS记录。

示例代码:

         MyDns mydns = new MyDns();//

         //想8.8.8.8域名服务器查询lixin.me这个域名的a记录, 
         if (!mydns.Search(“lixin.me”QueryType.A, “8.8.8.8”,null )) 
         {

             //如果服务器返回错误信息,则显示错误的内容

             MessageBox.Show(mydns.header.RCODE.ToString()); 
             return; 
         } 
         txtInfo.Clear(); 
         txtInfo.AppendText (string.Format ("回复记录数:{0}\n",mydns.header.ANCOUNT) ); 
         txtInfo.AppendText(string.Format("回复额外记录数:{0}\n", mydns.header.ARCOUNT )); 
         txtInfo.AppendText(string.Format("回复权威记录数:{0}", mydns.header.NSCOUNT ));

         txtContent.Clear(); 
         foreach (MyDnsRecord item in mydns.record.Records) 
         {

            //循环资源记录,并打印出来。 
             txtContent.AppendText(item.QType.ToString() + "   " + item.RDDate.ToString()+"\n"); 
         }

界面截图:

MydnsSearch

 

代码下载及浏览:

我把代码放在了CodePlex.com 上面了。地址为:http://mydnspackage.codeplex.com/

欢迎园友测试。如果发现错误,请告知我。

目录
相关文章
|
云安全 安全 网络安全
|
6天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
1977 1
|
12天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2083 41
|
9天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1377 3
|
13天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
2573 0
|
6天前
|
安全 应用服务中间件 Go
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
PHP2Shell 双 RCE 已遭在野利用:WordPress、Drupal 全在射程内,nginx 其实另有洞。拆成因与修复顺序
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
|
14天前
|
安全 Linux 芯片
【万字长文】Ollama下载、安装、配置、使用保姆级教程(2026最新图解)
Ollama 是一款免费开源的本地大模型运行工具,支持 DeepSeek、Qwen 等主流模型,一条命令即可下载运行。2026 最新版 v0.35.1 官方安装包(1.47GB)已提供国内直连下载,纯本地、离线可用、无广告、无隐私泄露风险。
1286 5
|
7天前
|
开发者 索引
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
Open Plugin Market 是一个开放插件索引平台,收录800+优质DSH插件,支持分类浏览、智能推荐与随机发现。无需安装市场,粘贴索引地址即可一键接入,网页版直访 dshopen.org,助力小开发者被看见。(239字)
1436 1
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
|
5天前
|
安全 程序员 应用服务中间件
PHP 被曝两大致命漏洞,请所有程序员抓紧做这件事!
PHP 官方发布了紧急安全更新,一口气修复了两个严重漏洞。如果网站和服务器用了 PHP 应该怎么处理?漏洞的原理是什么?本文给你讲清楚
634 0