sábado, 18 de junho de 2011

Tutorial de Winsocket em C (Parte II)

Ao longo de aproximadamente 7 matérias irei mostrar para vocês a funcionalidade de sockets no windows com a linguagem C. Será necessário um conhecimento considerável em C para o uso desta matéria. Usaremos o DEV C++, disponível no site do bloodshed, para compilar todos os exemplos aqui expostos.

Início:
Bem, como vimos no tutorial passado, montamos um programa que vê se a porta 80 do IP da UOL está aberto. Hoje agente verá uma função que permitirá que digitemos o endereço e ele converterá para IP. A função gethostbyname(). Isso irá aumentar a funcionalidade do nosso scanner da matéria passada. Então proponho fazermos um pequeno programa que dirá o IP de um endereço qualquer. Após entendermos este exemplo, será fácil implementar isso no scanner.

gethostbyname()

Está função nos permite digitar um endereço e ele retornará o endereço IP. Ela está descrita da seguinte forma na biblioteca Winsock.h:

DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*);

Logo, para usarmos esta função, temos que entender da estrutura hostent (que é onde ela está inserida). Então vamos analizar a estrutura hostent de acordo com a biblioteca winsock.h.
struct hostent {
char *h_name;
char **h_aliases;
short h_addrtype;
short h_length;
char **h_addr_list;
#define h_addr h_addr_list[0]
};
Vamos lá então:
- h_name – Nome do domínio do host
- h_aliases – Lista de nomes alternativos que o site pode ter
- h_addrtype – O tipo de endereço que está retirando na conexão. Vimos que pode ser AF_INET, – AF_UNIX, AF_ISSO e AF_NS.
- h_lenght – Tamanho, em bytes, do endereço
- h_addr_list – Um array que termina em zero do endereço de rede do host.

Bem, vamos então montar um pequeno exemplo que agente digite o endereço do site e ele nos retorna o IP.
#include
#include
int main(int argc, char *argv[])
{

WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);

struct hostent *ip; //definimos a variável IP como sendo da estrutua hostent

if(argc < 2) {
printf(“Usage: %s \n”,argv[0]);
printf(“Made by Mago__\n”);
exit(1);
}

if ((ip=gethostbyname(argv[1])) == NULL) { //aqui testamos se o host existe
perror(“gethostbyname”);
}

printf(“Hostname: %s \n”,ip->h_name); // Mostra o hostname
printf(“IP Address: %s \n”,inet_ntoa(*((struct in_addr *)ip->h_addr))); //Mostra o IP

WSACleanup();
}
Aqui estra uma coisa muito importante que deve ser explicada. Note que para mostrar o host nós tivemos que fazer o ip apontar para o h_name (que nos mostra o host) e para mostrar o ip tivemos que apontar para h_addr (que nos mostra o IP). Porém tivemos que usar a função inet_ntoa(), porque? Lembre-se que o endereço virá em números de redes, ilegíveis para nós. Então usamos a função inet_ntoa() que faz a conversão de Network-to-ASCII, ou seja, faz a conversão de números de Rede para ASCII (que é legível). Esta função está descrita da seguinte forma no Winsock.h:

DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr);

Logo, para usarmos o inet_ntoa() devemos tem um struct in_addr dentro.
Bem pessoal, com o que aprendemos hoje, podemos fazer um portscanner completo. Porém para incrementar mais, próxima matéria ensinarei sobre a função getservbyport(). Abraços a todos e até a próxima matéria.

0 comentários:

Postar um comentário