Você está na página 1de 4

Tutorial de Winsocket em C (Parte I)

Julho 13th, 2008

Ao longo de aproximadamente 7 matrias irei mostrar para vocs a funcionalidade de sockets no windows com a linguagem C. Ser necessrio um conhecimento considervel em C para o uso desta matria. Usaremos o DEV C++, disponvel no site do bloodshed, para compilar todos os exemplos aqui expostos. Lembrando que ensinarei apenas o socket puro. No passarei pela parte de Raw-Sockets nestas matrias. Tudo que se comunica com algo fora do seu pc faz-se necessrio o uso de um tipo de programao especial que se chama socket. Eu imagino que todas as linguagens de programao tenham programao em socket. C/C++, Delphi, PHP, Perl, Pascal, at Assembly tem programao em socket. A partir do momento que voc sabe sockets, voc conseguir facilmente fazer servidores/clientes, backdoors, portscanner, e quase tudo relacionado a internet. E exatamente isso que ensinarei com essas matrias. Um grande problema para quem quer entrar nesta rea achar uma documentao sobre isso na internet Pois todos os grandes tutoriais so voltados para Unixes likes. O que , na verdade, uma grande utopia. Pois se a inteno de um tutorial como esse que todos conheam e saibam fazer seus prprios programas, commo postam tutorias em Unixes j que a maioria dos usurios usam Windows? Por isso decidi postar um tutorial que abrir muitas portas a vocs. Na internet tudo tem sua famlia e seu respectivo protocolo. As famlia que voc mais encontrar so: AF_INET (Arpa Internet Protocols) - a que agente mais vai usar, talvez a nica. AF_UNIX (Unix Internet Protocols) AF_ISSO (Iso Protocols) AF_NS (Xerox Network System Protocols) E os protocolos so baseados no TCP (SOCK_STREAM) e UDP (SOCK_DGRAM) e podem ser estes: 0 - IP - Internet Protocol 1 - ICMP - Internet Control Message Protocol 2 - IGMP - Internet Group Multicast Protocol 3 - GGP - Gateway-Gateway Protocol 6 - TCP - Transmission Control Protocol 17 - UDP - User Datagram Protocol

Para se comear a programar em sockets no C necessrio declarar a biblioteca winsock.h. Vamos a um esboo agora de como comearia um programa: #include <stdio.h> #include <winsock.h> //Biblioteca para se programar em sockets int main(){ int sock; //declaramos no socket como sendo uma varivel inteira structure sockaddr_in alvo; /*declaramos que o alvo uma varivel de structure sockaddr_in. Vamos ver isso mais a frente*/ WSADATA wsaData; WSAStartup(MAKEWORD(1, 1), &wsaData); /*estas duas linhas fazem o windows entender que para iniciar a dll e ocx responsvel por comunicao na internet. Todo o programa de socket deve conter essas linhas. Mais a frente vamos ver isso melhor*/ sock=socket(AF_INET, SOCK_STREAM, 0); /*declarao do socket que da seguinte forma: socket(famlia, tipo do protocolo, nmero do protocolo);*/ alvo.sin_family=AF_INET; //Famlia que usaremos para conectar no alvo alvo.sin_port=htons(80); //porta que conectaremos alvo.sin_addr.s_addr=inet_addr(10.100.23.2); //meu ip na minha rede, mude para outro qualquer memset(&(alvo.sin_zero), /0, 8); //zera a estrutura(sin_zero) e copia na memria(memset) . . . } Bem, esse o incio do nosso primeiro programa. Vamos entender tudo por partes. A structure sockaddr_in tem a seguinte estrutura segundo o winsock.h: struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; Ento voc deve declarar cada uma dessas coisas quando voc declara algo do tipo struct sockaddr_in. Outra coisa foi a seguinte linha: WSAStartup(MAKEWORD(1, 1), &wsaData); Nessa linha agente inicia as dlls responsveis por conexes a internet (winsock.dll se no me engano e algumas outras) e usamos a verso 1.1. Essa verso pode ser alterar para 2.0 e 2.2. Mas como a matrias sero feitas para todos os windows, usaremos a verso 1.1.

Outra linha importante foi a linha: alvo.sin_port=htons(80); Essa linha transforma o nmero 80 para um network short. Nos protocolos, as mquinha se comunicam atravs de nmeros de rede, podem ser short ou long, depende do tipo. Tudo est descrito na biblioteca Winsock.h. Connect( ) A funo connect tem por objetivo conectar no alvo. Sua sintaxe segundo a biblioteca winsock.h : int PASCAL connect(SOCKET,const struct sockaddr*,int); Isso significa: connect(socket_que_declaramos, (struct sockaddr *)&alvo (usa algumas coisas que especificamos l em cima do alvo), e um valor inteiro que define o tamanho da struct do destino); Quando o valor de connect retorna 0, significa que a conexo foi feita. Se retorna um nmero negativo, a conexo no foi feita. Vamos a um pequeno exemplo agora? #include <stdio.h> #include <winsock.h> int main(){ int sock, conecta; struct sockaddr_in alvo; WSADATA wsaData; WSAStartup(MAKEWORD(1, 1), &wsaData); if ((sock=socket(AF_INET, SOCK_STREAM, 0))<0){ perror(Erro em socket!); exit(1); } alvo.sin_family=AF_INET; alvo.sin_port=htons(80); alvo.sin_addr.s_addr=inet_addr(200.221.2.45); //Esse o IP da UOL! memset(&(alvo.sin_zero), /0, 8); conecta=connect(sock, (struct sockaddr *)&destino, sizeof(struct sockaddr)); if (conecta<0) printf(Porta fechada); else printf(Porta aberta!);

getch(); closesocket(sock); //Fecha o socket WSACleanup(); //Limpa a estrutura WSA return 0; } possvel que d erro ao compilar. Para Isso voc deve fazer o seguinte: Clique em Tools, Compiler Options, ative a checkbox que diz Add the following commands when calling compiler, e digite o seguinte comando -l wsock32 sem as aspas!. Bem, este um exemplo bem remoto de um pequeno portscanner, j que ele escaneia a porta 80. Deixo um pequeno desafio a vocs, faa um programa que escaneie das portas 10 a 8080.

Você também pode gostar