Jako że już zajrzałem to wrzucę tego maila. Oto jego pełna treść:
"Wszystko napisalem na podstawie logow z wiresharka, wiec jest troche na sztywno.
Zauwazylem, ze kropki w nazwie hosta sa zamieniane na cos innego, przykladowo
www.google.pl
zamieni pierwsza kropke na 0x06, a druga na 0x02, niestety niewiem dlaczego tak sie dzieje ;p
Do tego przed nazwa hosta jest jeden bajcik przeznaczony chyba na jakis identyfikator, poniewaz jak wysylalem zle pakiety to mialem ze oznacza to roota, dla roznych hostow roznie wygladala ta wartosc.
Struktury samego naglowka za bardzo nie rozkminialem, ale pierwsze jest identyfikatorem, pozwalajacym polaczyc odpowiedz z zapytaniem.
Nastepnie typ zapytania, tez za bardzo w to nie wnikalem, dalej jedno pole okreslajace ilosc zapytan(tutaj sie przejechalem, bo raz nie chcacy dalem 0xFF i 255 zapytan zlych bylo :D).
Dalej niewiem co jest poniewaz na zera bylo ustawione. No i na koncu ten dziwny bajt, nazwa hosta, oraz dwa shorty okreslajace odpowiednio typ i klase zadania ;)
Kodzik wymaga podania nazwy hosta z www na poczatku oraz nie dodalem recvfrom, ale odpowiedz przychodzi, wiec jak dodasz to bedzie na pewno ip wybranego hosta.
Jeszcze jedno, struktura ta na gorze okresla wszystko oprocz tego bitu, hosta, typu i klasy."
I kod z poprawkami z drugiego maila:
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <windows.h>
//#include <ws2tcpip.h>
typedef struct {
unsigned short id;
unsigned short qr;
unsigned short wpisy;
unsigned short odp;
unsigned short bonus;
unsigned short unk;
} dns_header;
int main(int argc, char *argv[])
{
WSADATA wsaData;
int sock;
struct sockaddr_in sin;
unsigned char bufor[1024];
dns_header *dns = (dns_header*)bufor;
if(argc != 2)
{
puts("USAGE: dns.exe <host>\n");
return 0;
}
if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
{
puts("ERROR: WSAStartup");
return -1;
}
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sock == INVALID_SOCKET)
{
puts("ERROR: socket");
return -1;
}
memset(&sin, 0, sizeof(struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_port = htons(53);
sin.sin_addr.s_addr = inet_addr("208.67.222.222");//openDNS resolver1
memset(bufor, 0, 1024*sizeof(unsigned char));
dns->id = htons(0xDEAD);
dns->qr = htons(0x0100);
dns->wpisy = htons(0x0001);
int i, b = 0x02;
for(i = strlen(argv[1])-1; i >= 0; i--)
if(argv[1][i] == 0x2e)
{
argv[1][i] = b;
b += 0x04;
}
int len;
while(i < strlen(argv[1]) && argv[1][i] != 0x2e)
{
len++;//dlugosc nazwy hosta od pierwszej kropki
i++;
}
strcpy(bufor+sizeof(dns_header)+1, (unsigned char*)argv[1]);
*((unsigned char*)&bufor[sizeof(dns_header)]) = len;
*((unsigned char*)&bufor[sizeof(dns_header)+strlen(argv[1])+3]) = 1;
*((unsigned char*)&bufor[sizeof(dns_header)+strlen(argv[1])+5]) = 1;
if(sendto(sock, bufor, sizeof(dns_header)+strlen(argv[1])+6, 0, (struct sockaddr*)&sin, sizeof(struct sockaddr)) == SOCKET_ERROR)
{
puts("ERROR: sendto");
return -1;
}
closesocket(sock);
WSACleanup();
return 0;
}
Mój kod (na podstawie wniosków t0mk) nie nadaje się do pokazywania ludziom ;-P