1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Port scanner

Discussão em 'Programação' iniciada por Hav0c, 9 de Maio de 2007. (Respostas: 4; Visualizações: 952)

  1. Hav0c

    Hav0c Power Member

    Eu ontem estava um bocado aborrecido, por isso tentei criar um port scanner em perl. Depois, decidi fazer um em C, mas por alguma razão, so consigo apanhar apenas a primeira porta na versão em C.
    Aqui estão os códigos:

    ipscan.pl
    Código:
    #!/usr/bin/perl
    
    use IO::Socket;
    
    if(@ARGV != 1){
        print "Hav0c\'s ports scanner\nUsage: $0 [host]\n";
        exit 1;
    }
    for($i = 0; $i <= 65535; ++$i){
        $host = IO::Socket::INET->new(PeerAddr=>$ARGV[0],PeerPort=>$i,proto=>'tcp') and print "Port $i is open\n";
    }
    exit;
    A versão em C:
    Código:
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    
    int main(int argc,char *argv[])
    {
        int sock, port;
        struct sockaddr_in host;
        struct hostent *server;
        if(argc != 2){
            printf("Hav0c\'s port scanner\nUsage: %s [host address]\n",argv[0]);
            return 1;
        }
        if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1){
            perror("Error creating socket");
            return 1;
        }
        if((server=gethostbyname(argv[1])) == NULL){
            perror("Error resolving host");
            return 1;
        }
        for(port = 0; port <= 65535; port++){
            host.sin_family = AF_INET;
            host.sin_port = htons(port);
            host.sin_addr = *((struct in_addr *)server->h_addr);
            if(connect(sock,(struct sockaddr *)&host,sizeof(host)) != -1){
                printf("Port %d is open\n",port);
                continue;
            }
        }
        return 0;
    }
    O quê que se passa com esse codigo?
     
  2. spastikman

    spastikman Banido

    apanhas a primeira porta aberta, ou para na primeira porta que pesquisa ?

    Não terás de fechar o socket primeiro ?
     
  3. Hav0c

    Hav0c Power Member

    So apanho a primeira (nem sequer está programado para apanhar uma porta especifica, apenas todas as portas abertas entre 0 e 65535).

    Mas vou experimentar criar uma função que abre e fecha o socket cada vez que uma porta é encontrada. Alias, agora que penso nisso, vejo que me esqueci de fechar o socket no final do código.
     
  4. Hav0c

    Hav0c Power Member

    agora criei este novo codigo, mas quando vou executa-lo obtenho o seguinte:
    [email protected]:~/Desktop/port scanner$ ./compiled localhost
    Error resolving host: Too many open files
    Error creating socket: Too many open files

    aqui está o codigo:
    Código:
    #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <netdb.h>
    
    int ipscan(int port, char *IP[])
    {
        int sock;
        struct sockaddr_in address;
        struct hostent *host;
        if((sock = socket(AF_INET,SOCK_STREAM,0)) == -1){
            perror("Error creating socket");
            return 2;
        }
        if((host = gethostbyname(IP)) == NULL){
            perror("Error resolving host");
            return 2;
        }
        address.sin_family = AF_INET;
        address.sin_port = htons(port);
        address.sin_addr = *((struct in_addr*)host->h_addr);
        if(connect(sock,(struct sockaddr*)&address,sizeof(address)) == -1){
            return 1;
        }else{
            return 0;
        }
        close(sock);
    }
    
    int main(int argc, char *argv[])
    {
        int i;
        if(argc != 2){
            printf("Usage: %s [host]\n",argv[0]);
            return 1;
        }
        for(i = 0;i <= 65535; i++){
            if(ipscan(i,argv[1]) == 0){
                printf("Port %d is open\n",i);
            }
            else if(ipscan(i,argv[1]) == 2){
                break;
                return 1;
            }
        }
        return 0;
    }
     
  5. Hav0c

    Hav0c Power Member

    ok, finalmente consegui resolver o problema :) :

    Código:
    #include <stdio.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <netdb.h>
    
    int ipscan(int port, char *IP)
    {
        int sock;
        struct sockaddr_in serv_addr;
        struct hostent *host;
        sock = socket(AF_INET,SOCK_STREAM,0);
        if(sock == -1){
            perror("Error creating socket");
            return 1;
        }
        if((host=gethostbyname(IP)) == NULL){
            perror("Error resolving host");
            return 1;
        }
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(port);
        serv_addr.sin_addr = *((struct in_addr*)host->h_addr);
        if(connect(sock,(struct sockaddr_in *)&serv_addr,sizeof(serv_addr)) == -1){
            close(sock);
            return 2;
        }else{
            close(sock);
            return 0;
        }
    }
    
    int main(int argc,char *argv[])
    {
        int i;
        if(argc != 2){
            printf("Hav0c\'s port scanner\nUsage: %s (host IP]\n",argv[0]);
            return 1;
        }
        for(i = 0; i <= 65535; i++){
            if(ipscan(i,argv[1]) == 0){
                printf("Port %d is open\n",i);
            }
            else if(ipscan(i,argv[1]) == 1){
                break;
            }
        }
        return 0;
    }
    
    [edit]: Ja agora, desculpem por fazer estes posts todos
     

Partilhar esta Página