|
发表于 2024-11-1 03:30:18
|
显示全部楼层
刚学php时写的,所以注释写得比较详细,支持ABCD段扫描(只要你有耐心),后来发现空间测绘很方便,所以这个代码已经很久不使用了,由于要用多个端口去猜,所以效率很差,你可以参考参考。
- <?php
- /*
- 食用方法:
- hotelscanner.php?fmt=http://x.x.x.x:9901/tsfile/live/1000_1.m3u8
- 或
- hotelscanner.php?fmt=http://x.x.x.x/tsfile/live/1000_1.m3u8
- 注意要点:
- 1.扫描D段就将该段定为非数字字符,比如192.168.1.x,扫描C段就将该段定为非数字字符,比如192.168.x.x,以此类推。
- 2.如果fmt格式参数不指定端口,则使用端口数组测试。
- 3.结果在网页上显示,也会实时保存到脚本目录下的同名txt文件中。
- */
- error_reporting(0); //禁止错误报告
- $arr_port = [801, 808, 8080, 8081, 8181, 8811, 8888, 9901, 9999, 18181]; //可能使用的端口数组,可自行删减
- $fmt = $_GET['fmt']; //要测试的链接地址
- if (empty($fmt)) die('需指定要扫描的链接地址格式');
- //分解URL链接
- $scheme = parse_url($fmt)['scheme']; //协议
- $host = parse_url($fmt)[ 'host' ]; //主机
- $port = parse_url($fmt)[ 'port' ]; //端口
- $path = parse_url($fmt)[ 'path' ]; //路径
- //判断使用端口数组
- if (!empty($port)) $arr_port = [$port];
- //分解IP地址
- list($a, $b, $c, $d) = explode('.', $host);
- echo "开始扫描:<br>";
- flush(); //刷新页面内容
- $arr_host = array(); //创建主机地址数组
- $start_time = microtime(true); //记录开始时间
- if (!is_numeric($a)) {
- for ($ia = 0; $ia <= 255; $ia++) {
- for ($ib = 0; $ib <= 255; $ib++) {
- for ($ic = 0; $ic <= 255; $ic++) {
- echo "<br>$ia.$ib.$ic.(0-255): >";
- for ($id = 0; $id <= 255; $id++) {
- test_http($scheme, "$ia.$ib.$ic.$id", $arr_port, $path);
- echo ".";
- }
- }
- }
- }
- } else {
- if (!is_numeric($b)) {
- for ($ib = 0; $ib <= 255; $ib++) {
- for ($ic = 0; $ic <= 255; $ic++) {
- echo "<br>$a.$ib.$ic.(0-255): ";
- for ($id = 0; $id <= 255; $id++) {
- test_http($scheme, "$a.$ib.$ic.$id", $arr_port, $path);
- echo ".";
- }
- }
- }
- } else {
- if (!is_numeric($c)) {
- for ($ic = 0; $ic <= 255; $ic++) {
- echo "<br>$a.$b.$ic.(0-255): ";
- for ($id = 0; $id <= 255; $id++) {
- test_http($scheme, "$a.$b.$ic.$id", $arr_port, $path);
- echo ".";
- }
- }
- } else {
- echo "<br>$a.$b.$c.(0-255): ";
- for ($id = 0; $id <= 255; $id++) {
- test_http($scheme, "$a.$b.$c.$id", $arr_port, $path);
- echo ".";
- }
- }
- }
- }
- $end_time = microtime(true); //记录结束时间
- $seconds = round($end_time - $start_time, 3);
- $count_time = gmdate('H:i:s', $seconds) . '.' . explode('.', $seconds)[1];
- $count_host = count($arr_host);
- echo "<br><br>扫描结束!<br><br>";
- echo "执行本次脚本获得 " . $count_host . " 个主机地址,总共消耗时间:" . $count_time . "(" . $seconds . " 秒)。<br><br>";
- echo "扫描结果:<br>";
- foreach ($arr_host as $v) echo "$v<br>"; //枚举扫描结果
- function test_http($scheme, $host, $arr_port, $path) {
- set_time_limit(0); //重置超时时间,很重要!!!
- $handles = array();
- $running = null;
- $mh = curl_multi_init(); //创建批处理句柄
- foreach ($arr_port as $port) {
- $url = "{$scheme}://{$host}:{$port}{$path}";
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_NOSIGNAL, 1); //解决CURLOPT_TIMEOUT_MS赋值小于1000报错的bug
- curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); //超时时间(毫秒),数值越大,扫描越慢
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //以字符串返回
- curl_multi_add_handle($mh, $ch);
- $handles[$port] = $ch;
- }
- do { //执行批处理句柄
- curl_multi_exec($mh, $running);
- curl_multi_select($mh);
- } while ($running > 0);
- foreach ($handles as $port => $ch) { //检查每个请求的响应内容
- $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //获取响应状态码
- $size = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD); //下载的数据总值
- if ($code == 200 && $size > 0) {
- save_result("$host:$port"); //实时保存主机地址到本地文档中
- global $arr_host; //套用全局变量
- array_push($arr_host, "$host:$port"); //添加到主机地址数组中
- echo "'$host:$port'";
- }
- }
- foreach ($handles as $ch) curl_multi_remove_handle($mh, $ch); //关闭并发请求的句柄
- curl_multi_close($mh);
- flush(); //刷新页面内容
- }
- function save_result($host) {
- $txt_name = basename($_SERVER['PHP_SELF']) . '.txt';
- $datetime = date('Y-m-d H:i:s', time());
- if ($file = fopen($txt_name, 'a')) { //打开文件
- fwrite($file, "$datetime --> $host\r\n");
- fclose($file); //关闭文件
- }
- }
- ?>
复制代码 |
|