DNS数据包

来源:互联网 发布:改进的区域增长算法 编辑:程序博客网 时间:2024/05/18 03:05

.386
.model flat, stdcall
option casemap :none
include   windows.inc
include   user32.inc
includelib user32.lib
include   kernel32.inc
includelib kernel32.lib
include   wsock32.inc
includelib wsock32.lib

;;DNS头部数据包结构定义
dns_head struct
id    dw ?   ;16位标识
logo   dw ?   ;16位标志
query   dw ?   ;16位问题记录数
answer dw ?   ;16位回答记录数
autho   dw ?   ;16位授权记录数
addit   dw ?   ;16位附加记录数
dns_head ends
;;DNS查询数据包结构定义
dns_Query struct
qtype   dw ?   ;16位查询类型,比如1代表A记录,15代表MX记录
qclass dw ?   ;16位查询类,这里只用1,代表互联网
dns_Query ends
;;DNS响应数据包结构定义
dns_Answer struct
TTL   dd ?   ;生存时间
Alength dw ?   ;资源长度
dns_Answer ends

.data?
dns_Query_Name db 512 dup (?) ;查询名字缓冲区
dns_Qnswer_Res db 512 dup (?) ;资源数据缓冲区
s dd ?
SendBuf db 64 dup (?) ;缓冲区
Sendlen dd ?   ;缓冲区有效长度
stWsa   WSADATA <>
stsin   sockaddr_in <>
iphead ip_head <>
tcphead tcp_head <>
wtcp   wtcp_h <>

.data
flag db TRUE

.const
dns_s db '61.147.37.1',0 ;DNS服务器地址
dns_c db '126.com',0 ;域名

.code
start:
;初始化SOCKET并发送数据
invoke inet_addr,addr dns_s   ;转换IP地址为网络顺序
mov stsin.sin_addr,eax   ;转换后的IP地址保存到结构里
mov stsin.sin_family,AF_INET
invoke htons,25   ;把端口转换为网络顺序
mov stsin.sin_port,ax   ;转换后端口保存到结构里
invoke WSAStartup,2h,addr stWsa   ;装载SOCKET
invoke socket,AF_INET,SOCK_RAW,IPPROTO_RAW ;初始化SOCKET为原始套接字模式
mov s,eax   ;保存初始化成功的句柄
invoke setsockopt,s,IPPROTO_IP,1,addr flag,sizeof flag
invoke WSAGetLastError
invoke sendto,s,addr SendBuf,sizeof iphead+sizeof tcphead,0,addr stsin,sizeof sockaddr_in   ;发送缓存里的字符到服务器
invoke closesocket,s   ;关闭SOCKET
invoke WSACleanup   ;卸载SOCKET
invoke ExitProcess,NULL   ;程序退出
end start

0 0
原创粉丝点击