Winsocket em C

Started by Ch1p5, 24 de December , 2006, 08:39:04 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Ch1p5

Winsocket em C

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, nessse tutorial a gente verá uma função que permitirá que digitemos o endereço e ele converterá para IP. A função gethostbyname(). 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 isso, podemos fazer um portscanner completo.

Fonte: Invasão


"Minha impressora está normal, mas não imprime"