Exemplo simples, pra começar, de como se criar um portscanner utilizando php.
<?php // Define as portas que serao verificadas durante o scan. // Nenhuma verificacao sobre a validade da porta sera feita, // entao utilize apenas portas validas, ou seja, numeros entre // 1 e 65535 $ports = array ( 21, 22, 23, 80 ); // Endereco ip inicial e final // Novamente, nenhume verificacao sera feita, entao utilize um // endereco ip valido, sendo o ipInicial menor que o ipFinal $ipInicial = '10.0.0.1'; $ipFinal = '10.0.0.254'; // Para facilitar a execucao, transformamos o endereco ip no formato // padrao para um formato indicando o mesmo endereco em um numero inteiro. // Por exemplo, o endereco 10.0.0.1 sera transformado em 167772161 e o // endereco 10.0.0.254 sera transformado em 167772414 (ou seja, // 167772161+253) // // Tendo o ip inicial e o ip final em um numero inteiro, fica mais simples // executar um loop que comece no ip inicial e termine no ip final $ipInicialL = intval(ip2long($ipInicial)); $ipFinalL = intval(ip2long($ipFinal)); $ips = array(); // Aqui iniciamos o loop. Enquanto o ipInicial for menor que o // ipFinal, o loop continuara. Internamente no loop, a funcao long2ip // ira efetuar o oposto do que foi feito acima, em ip2long, ou seja // o numero inteiro sera transformado em um endereco ipv4 padrao. // // Funcionara assim: No inicio do loop, $cont valera 167772414. A funcao // ip2long ira transforma este numero no endereco ipv4 equivalente, que // e' 10.0.0.1 . Apos isso sera adicionado 1 ao $cont, que valera // 167772415, o equivalente a 10.0.0.2 . E assim vai, ate que o loop // chegara no valor final, que seria 167772414, ou seja, 10.0.0.254 . // Desta forma temos uma lista com todos os enderecos ips que serao // verificados for ( $cont = $ipInicialL; $cont < $ipFinalL; $cont++ ) $ips[] = long2ip($cont); // Apenas para "nao ficar na cara" que um scan esta sendo executado em // rede, a ordem com que as portas serao verificadas e a ordem com que os // ips serao verificados e' pseudo-randomizada. A funcao shuffle serve // apenas para isso, randomizar um array shuffle ($ips); shuffle ($ports); // Aqui abrimos um file descriptor para o arquivo que contera o resultado // da verificacao. $fd = fopen ( 'result.txt', 'w+' ); $cont = 1; // variavel auxiliar $total = sizeof($ips); // aqui verificamos quantos ips serao analisados // foreach ira passar por todos os itens no array $ips foreach ( $ips as $ip ) { // exibimos a contagem atual do ip que esta sendo verificado, juntamente // com o total de ips e o endereco ip atual echo sprintf('(%s/%s)%s...%s', $cont, $total, $ip, "n"); // Para cada um dos ips que sera verificado, verifica-se cada uma // das portas definidas em $ports, no comeco do script foreach ( $ports as $port ) { // Aqui e' efetuada a conexao em $ip, utilizando a porta // $port. O numero 0.2 indica o tempo maximo de espera na conexao // antes de indicar, por conta de um timeout, que a porta esta fechada. // Este numero pode ser aumentado caso a verificacao nao esteja ocorrendo // em rede local $a = @fsockopen ( $ip, $port, $es, $en, 0.2 ); // verifica-se se a conexao foi bem sucessida. Caso positivo, // executa proximas acoes. Caso negativo, retorna para o foreach e verifica // a proxima porta. Caso seja a ultima porta, retorna para o primeiro // foreach e utiliza-se um outro endereco ip. Caso seja o ultimo endereco ip, // a execucao do script e' finalizada if ( $a ) { // formata e exibe o endereco ip e a porta que foi encontrada aberta $msg = sprintf('%s %s%s', $ip, $port, "n"); echo sprintf('[open] %s%s', $msg, "n"); // escreve para o arquivo a mensagem formatada fwrite ( $fd, $msg, strlen($msg) ); // finaliza a conexao efetuada anteriormente fclose($a); } } // incremeta o contador que esta sendo utilizado para exibir o host // atual sendo verificado $cont++; } // Por ultimo, fecha o arquivo com o resultado da verificacao fclose($fd);