Parsi Coders
سورس کد پرت اسکنر (پی اچ پی) - نسخه قابل چاپ

+- Parsi Coders (http://parsicoders.com)
+-- انجمن: Web Development and Design (http://parsicoders.com/forumdisplay.php?fid=47)
+--- انجمن: PHP Forum (http://parsicoders.com/forumdisplay.php?fid=48)
+--- موضوع: سورس کد پرت اسکنر (پی اچ پی) (/showthread.php?tid=2454)



سورس کد پرت اسکنر (پی اچ پی) - Amin_Mansouri - 06-18-2012

کد:
<?
  /*******************************************************************************
   *  Copyright 2002 - Adrian Ritchie :: GrinGod Productions :: aidy@gringod.com
   *  
   *  This software is being release by Adrian Ritchie for educational purposes.
   *  Whilst it may be re-used by other parties, the copy-right remains with
   *  Adrian Ritchie.  Should this code be re-used either whole or in part, this
   *  agreement should be attached.
   *
   *  Dislaimer:
   *    This software is for educational / private network use only.  Do with it
   *    what you may, but on your own head be it!
   *******************************************************************************/
  class PortScanner {
   var $start_ip;    /* start of the ip range to scan */
    var $stop_ip;     /* end of the ip range to scan */
    var $current_ip;  /* current ip address being scanned (this is for future features) */
    var $ports;       /* array of ports to be scanned */
    var $wait;        /* how long to wait for a response from the port */
    var $delay;       /* how long to pause between each port */    /***
     * Function PortScanner()
     * Class constructor.
     * Sets the start and end address of the scan range
     * must be passed... but may be the same.
     * The end address must be greater than the start address.
     ***/
    function PortScanner($start, $stop) {
     $this->start_ip = ip2long($start);  /* store the start ip address as a long number */
     $this->stop_ip = ip2long($stop);    /* store the end ip address as a long number */
    }    /***
     * Function set_ports
     * Adds the passed ports to the array of ports to be scanned.
     * This can either be a single port, a range of ports e.g. 1-90
     * a a combination of both separated by commas (no spaces).
     ***/
    function set_ports($ports) {
     /* Explode ports into an array based on comma seperation.
         Will create an array even if there is no comma so no need
         to check for an array in following code */
      $ports_array = explode(",",$ports);      /* loop through array of ports */
      foreach($ports_array as $key=>$val) {
        /* try to explode port range into an array */
       if(ereg("([0-9]+)\-([0-9]+)",$val, $buff)) {
          /* loop through range to add each port */
        for($ii=$buff[1]; $ii<=$buff[2]; $ii++) {
         $this->ports[] = $ii;
          }
        } else {
          /* only one port was sent so add that */
          $this->ports[] = $val;
        }
      }
    }    /***
     * Function set_wait
     * Sets the time to wait for response from socket.
     * Good object-oriented design doesn't allow access to class
     * attributes, so accessor functions are provided.
     ***/
    function set_wait($wait) {
      $this->wait = $wait;
    }
    
    /***
     * Function set_delay
     * Sets the delay between each port check. Delay is in micro-seconds.
     * Good object-oriented design doesn't allow access to class
     * attributes, so accessor functions are provided.
     ***/
    function set_delay($seconds=0, $microseconds=0) {
     $this->delay = (1000000*$seconds) + $microseconds;
    }    /***
     * Function do_scan
     * Does the actual scan, based on the given details (see above functions).
     ***/
    function do_scan() {
      /* Loop through ip addresses.
         This is why ip addresses are stored as long numbers as apposed
         to Internet Protocol dotted addresses */
      for($this->current_ip=$this->start_ip; $this->current_ip<=$this->stop_ip; $this->current_ip++) {
       /* convert the long number back to a dotted address */
        $ip = long2ip($this->current_ip);
        
        /* loop through the ports and check each */
        foreach($this->ports as $key=>$port) {
          /* for unix systems, this will obtain the name of the service running
             on that port. Win32 systems will just return N/A. */
          if (!getservbyport($port,"tcp")) {$pname = "N/A";}
          else {$pname = getservbyport($port,"tcp");}
          
          /* attempt to open a socket to the port at the current ip address */
          $ptcp = fsockopen($ip, $port, &$errno, &$errstr, $this->wait);
          if($ptcp) {$status=1;} /* return 1 for open port (so users can display their own message */
          else {$status=0;}      /* return 0 for closed port (so users can display their own message */          /* return the results in a structured multi-dimensioned array
             so the user can choose how to display the results */
          $results["$ip"]["$port"]["pname"] = "$pname";
          $results["$ip"]["$port"]["status"] = "$status";          /* start the delay before moving on to the next port */
          $this->do_delay($this->delay);
        }
      }      /* returnt the results to the user */
      Return $results;
    }    /***
     * Function do_delay
     * This pauses execution for the passed length of time (micro-seconds)
     * This allows a delay of less than 1 second for system which do not
     * support usleep (Win32).
     * This code was post on the PHP manual by "dsc at c2i dot net"
     * I'm not sure if this works or not, so if your running *nix you
     * may want to change this to use usleep();
     ***/
    function do_delay($delay) {
      $start = gettimeofday();
      do{
        $stop = gettimeofday();
        $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + $stop['usec'] - $start['usec'];
      }while  ($timePassed < $delay);
    }
  }  /* get the target ip address */
  $ip_address = gethostbyname("www.vbweb.co.uk");  /* set all the require atributes */
  $my_scanner = new PortScanner($ip_address,$ip_address);
  $my_scanner->set_ports("15-25,80,110,3306,1337,666");
  $my_scanner->set_delay(1);
  $my_scanner->set_wait(2);  /* do the scan and capture the results */
  $results = $my_scanner->do_scan();
  /* display the results - this simply loops through the ip addresses and indents the results */
  foreach($results as $ip=>$ip_results) {
   echo gethostbyaddr($ip)."\n<blockquote>\n";
    foreach($ip_results as $port=>$port_results) {
     echo "\t".$port." : ".$port_results['pname']." : ";
      if ($port_results['status']==1){echo "open";}else {echo "closed";}
      echo "<br>\n";
    }
    echo "</blockquote>\n\n";
  }
?>
The following is an example of the way in which the results of the port scanner can be displayed:
کد:
foreach($results as $ip=>$ip_results) {
    echo gethostbyaddr($ip)."\n<blockquote>\n";


    foreach($ip_results as $port=>$port_results) {
        echo "\t".$port." : ".$port_results['pname']." : ";
        if ($port_results['status']==1){echo "open";}
        else {echo "closed";}echo "<br>\n";
    }
    echo "</blockquote>\n\n";
  }