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