.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