zyfsky666 发表于 2022-3-27 16:50:58

powershell快速扫描网络主机多功能版本

基于powershell多线程技术,搭载.net 的socket类和webapi的json数据解析,可以很方便的了解对方的外网主机和自己网络的服务和端口,
更专业,更高效,更智能
不仅能扫描单个IP,包含外网主机内网主机和本地内网,还能扫描局域网整个网段,带自定义端口扫描,还加入了文件共享资源探测功能,此工具只能用于检查网络,不能用于任何非法途径!!后果自负
有需要的小伙伴赶紧来下载哦,网络安全,我们都是专业的!
以下为部分核心代码
::LoadWithPartialName("System.Net")
::LoadWithPartialName("System.Net.Sockets")
function Scanports ()
{
param($ip_host,
$port,
$rangeports,
$serverports,
$timeout=3) ###tcp连接超时时间

$throttleLimit = 30 ###限制同时运行的线程数
$SessionState = ::CreateDefault()
$Pool = ::CreateRunspacePool(1, $throttleLimit, $SessionState, $Host)
$Pool.Open()
$okports=@()
$serports=@"
ftp文件传输服务,21
ssh超级终端服务,22
telnet终端服务,23
web网站服务,80
web证书加密服务,443
sqlserver数据库服务,1433
mysql数据库服务,3306
oracle数据库服务,1521
smb共享文件服务,445
dns域名解析服务,53
Exchange imap服务,143
PPTP远程隧道服务,1723
POP3邮件传输服务,110
SMTP邮件传输服务,25
windows远程桌面服务,3389
域LDAP服务器,389
域全局编录服务器,3268
windows更新wsus服务,8530
DHCP服务,547
web代理服务,8080
"@|ConvertFrom-Csv -Header "描述","端口" -Delimiter ","; ##设置服务器常用端口
if ($port -ne $null){ $okports+=$port}
if ($rangeports -ne $null){
#正确添加端口范围
$rangeports -split ","|%{
if ($_ -match '^\d{1,5}$'){
$okports+=$_
}
if ($_ -match '^\d{1,5}-\d{1,5}$'){
$ary=$_ -split '-'
$okports+=$ary..$ary
}
}

}
if ($serverports){ $okports=$serports.端口}
$handles=@() #全局线程句柄组对象
$threads = @() #全局线程ID组对象
for ($x = 0; $x -lt $okports.length; $x++) {


$task={
param($ip_host,$ports,$timeout,$serports)
#找mac
$whomymac = Add-Type -memberDefinition @"
public static extern int SendARP(Int32 dest,Int32 host,byte[] mac,ref Int32 length);
public static extern Int32 inet_addr(string ip);
"@ -passthru -name MACSEE
#找主机名,或是IP
if($ip_host -match '\d+\.\d+\.\d+\.\d+'){
##如果是ip
$hostname=::GetHostByAddress($ip_host).HostName
$ip=$ip_host
}
else{
$hostname=::GetHostByName($ip_host)
$ip=($hostname.AddressList|%{$_.IPAddressToString}) -join ','
$hostname=$ip_host
}
$aa=New-Object Byte[] 6;
$ldest= $whomymac::inet_addr($ip)
$len=6
$res=$whomymac::SendARP($ldest,0,$aa,$len)
$mac= ::ToString($aa,0,6)
$tcp=New-Object System.Net.Sockets.TcpClient
$tcp.Connect($ip_host,$ports)
if ($? -ne $true){$success=$false}Else {$success=$true}
$state=""|select "主机名","IP地址","MAC地址","端口","描述","状态"
$index=$serports.端口.IndexOf($ports.ToString())
if ($index -ne -1){$state.描述=$serports[$index].描述} else{$state.描述="未知"}
$state.主机名=$hostname;$state.IP地址=$ip;$state.MAC地址=$mac;$state.端口=$ports
if ($success){$state.状态="打开"}else{$state.状态="关闭"}
return $state#|?{$_.状态 -eq "打开"}
}
###任何模块都要传递变量,不能直接用外面的要.AddArgument
$powershell = ::Create().AddScript($task).AddArgument($ip_host).AddArgument($okports[$x]).AddArgument($timeout).AddArgument($serports)
$powershell.RunspacePool = $Pool
$handle=$powershell.BeginInvoke()
$threads += $powershell
$handles +=$handle
}
##等待所有线程自动结束并返回结果.....
$receivePS=@() #收集所有线程执行结果
   
do {
$i = 0
$done = $true
foreach ($handle in $handles) {
    if ($handle -ne $null) {
      if ($handle.IsCompleted) {

       $receivePS +=$threads[$i].EndInvoke($handle)
      $threads[$i].Dispose()
      $handles[$i] = $null
      } else {
      $done = $false
      }
    }
    $i++
}
if (-not $done) { Start-Sleep -Milliseconds 500}
} until ($done)
return $receivePS|?{$_.状态 -eq "打开"}
}







幻剑游云 发表于 2022-3-27 17:15:54

希望楼主这个系列可以一直做下去,真的实用,谢谢

H.U.C清风 发表于 2022-3-28 08:03:43

谢谢分享,楼主加油

hacker_liao 发表于 2022-3-31 15:53:45

楼主楼主,下次可以附个教程吗?

幻剑游云 发表于 2022-3-31 22:13:49

hacker_liao 发表于 2022-3-31 15:53
楼主楼主,下次可以附个教程吗?

其实以前这位大大发过非常非常非常相信的教学       

H.U.C清风 发表于 2022-4-1 17:39:00

hacker_liao 发表于 2022-3-31 15:53
楼主楼主,下次可以附个教程吗?

我赞成你的说法
页: [1]
查看完整版本: powershell快速扫描网络主机多功能版本