Created
October 4, 2018 12:37
-
-
Save krepver/b2cab8d939fb36d9dd9e23dd9bcd2648 to your computer and use it in GitHub Desktop.
Попытка получить srv запись
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <winsock2.h> //winsock | |
#include <windns.h> //DNS api's | |
#include <stdio.h> //standard i/o | |
#include <winerror.h> | |
#include <locale> | |
#include <clocale> | |
//Usage of the program | |
void Usage(char *progname) { | |
fprintf(stderr,"Usage\n%s -n [HostName|IP Address] -t [Type] -s [DnsServerIp]\n",progname); | |
fprintf(stderr,"Where:\n\t\"HostName|IP Address\" is the name or IP address of the computer "); | |
fprintf(stderr,"of the record set being queried\n"); | |
fprintf(stderr,"\t\"Type\" is the type of record set to be queried A or PTR\n"); | |
fprintf(stderr,"\t\"DnsServerIp\"is the IP address of DNS server (in dotted decimal notation) "); | |
fprintf(stderr,"to which the query should be sent\n"); | |
exit(1); | |
} | |
void ReverseIP(char* pIP) | |
{ | |
char seps[] = "."; | |
char *token; | |
char pIPSec[4][4]; | |
int i=0; | |
token = strtok( pIP, seps); | |
while( token != NULL ) | |
{ | |
/* While there are "." characters in "string" */ | |
sprintf(pIPSec[i],"%s", token); | |
/* Get next "." character: */ | |
token = strtok( NULL, seps ); | |
i++; | |
} | |
sprintf(pIP,"%s.%s.%s.%s.%s", pIPSec[3],pIPSec[2],pIPSec[1],pIPSec[0],"IN-ADDR.ARPA"); | |
} | |
// the main function | |
void __cdecl main(int argc, char *argv[]) | |
{ | |
std::setlocale(LC_ALL, ""); | |
DNS_STATUS status; //Return value of DnsQuery_A() function. | |
DNS_STATUS status2; //Return value of DnsQuery() function. | |
PDNS_RECORD pDnsRecord; //Pointer to DNS_RECORD structure. | |
PDNS_RECORD pDnsRecord2; //Pointer to DNS_RECORD structure. | |
PIP4_ARRAY pSrvList = NULL; //Pointer to IP4_ARRAY structure. | |
WORD wType; //Type of the record to be queried. | |
char* pOwnerName; //Owner name to be queried. | |
char pReversedIP[255];//Reversed IP address. | |
char DnsServIp[255]; //DNS server ip address. | |
DNS_FREE_TYPE freetype ; | |
freetype = DnsFreeRecordListDeep; | |
IN_ADDR ipaddr; | |
if(argc > 4) { | |
for(int i = 1; i < argc ; i++) { | |
if ( (argv[i][0] == '-') || (argv[i][0] == '/') ) { | |
switch(tolower(argv[i][1])) { | |
case 'n': | |
pOwnerName=argv[++i]; | |
break; | |
case 't': | |
if (!stricmp(argv[i+1], "A") ) | |
wType = DNS_TYPE_A; //Query host records to resolve a name. | |
else if (!stricmp(argv[i+1], "PTR") ) | |
{ | |
//pOwnerName should be in "xxx.xxx.xxx.xxx" format | |
if(strlen(pOwnerName)<=15) | |
{ | |
//You must reverse the IP address to request a Reverse Lookup | |
//of a host name. | |
sprintf(pReversedIP,"%s",pOwnerName); | |
ReverseIP(pReversedIP); | |
pOwnerName=pReversedIP; | |
wType = DNS_TYPE_PTR; //Query PTR records to resolve an IP address | |
} | |
else | |
{ | |
Usage(argv[0]); | |
} | |
} | |
else if (!stricmp(argv[i+1], "SRV") ) | |
{ | |
wType = DNS_TYPE_SRV; //Query SRV records to resolve | |
} | |
else | |
Usage(argv[0]); | |
i++; | |
break; | |
case 's': | |
// Allocate memory for IP4_ARRAY structure. | |
pSrvList = (PIP4_ARRAY) LocalAlloc(LPTR,sizeof(IP4_ARRAY)); | |
if(!pSrvList){ | |
printf("Memory allocation failed \n"); | |
exit(1); | |
} | |
if(argv[++i]) { | |
strcpy(DnsServIp,argv[i]); | |
pSrvList->AddrCount = 1; | |
pSrvList->AddrArray[0] = inet_addr(DnsServIp); //DNS server IP address | |
break; | |
} | |
default: | |
Usage(argv[0]); | |
break; | |
} | |
} | |
else | |
Usage(argv[0]); | |
} | |
} | |
else | |
Usage(argv[0]); | |
// Calling function DnsQuery to query Host or PTR records | |
status = DnsQuery_A(pOwnerName, //Pointer to OwnerName. | |
wType, //Type of the record to be queried. | |
DNS_QUERY_BYPASS_CACHE, // Bypasses the resolver cache on the lookup. | |
pSrvList, //Contains DNS server IP address. | |
&pDnsRecord, //Resource record that contains the response. | |
NULL); //Reserved for future use. | |
if (status){ | |
if(wType == DNS_TYPE_A || wType == DNS_TYPE_SRV) | |
printf("Failed to query the host record for %s and the error is %d \n", pOwnerName, status); | |
else | |
printf("Failed to query the PTR record and the error is %d \n", status); | |
} else { | |
if(wType == DNS_TYPE_A) { | |
//convert the Internet network address into a string | |
//in Internet standard dotted format. | |
ipaddr.S_un.S_addr = (pDnsRecord->Data.A.IpAddress); | |
printf("The IP address of the host %s is %s \n", pOwnerName, inet_ntoa(ipaddr)); | |
// Free memory allocated for DNS records. | |
DnsRecordListFree(pDnsRecord, freetype); | |
} | |
else if (wType == DNS_TYPE_SRV) { | |
PCWSTR name = wcsdup(pDnsRecord->Data.SRV.pNameTarget); | |
WORD port = pDnsRecord->Data.SRV.wPort; | |
printf("Address: %s;\nPort: %d\n", name, port); | |
// Free memory allocated for DNS records. | |
DnsRecordListFree(pDnsRecord, freetype); | |
// Calling function DnsQuery to query Host records | |
status2 = DnsQuery(name, //Pointer to OwnerName. | |
DNS_TYPE_A, //Type of the record to be queried. | |
DNS_QUERY_BYPASS_CACHE, // Bypasses the resolver cache on the lookup. | |
pSrvList, //Contains DNS server IP address. | |
&pDnsRecord2, //Resource record that contains the response. | |
NULL); //Reserved for future use. | |
if (status2) { | |
printf("Failed to query the host record for %s and the error is %d \n", name, status2); | |
} | |
else { | |
ipaddr.S_un.S_addr = (pDnsRecord2->Data.A.IpAddress); | |
printf("The IP address of the host %s is %s \n", name, inet_ntoa(ipaddr)); | |
// Free memory allocated for DNS records. | |
DnsRecordListFree(pDnsRecord2, freetype); | |
} | |
} | |
else { | |
printf("The host name is %s \n",(pDnsRecord->Data.PTR.pNameHost)); | |
// Free memory allocated for DNS records. | |
DnsRecordListFree(pDnsRecord, freetype); | |
} | |
} | |
LocalFree(pSrvList); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment