在C#中怎么实现高效扫描远程计算机端口?

解决方案 »

  1.   

    多线程·我看过1个高手用c#写的SQL注入工具~不过没代码~又的话发个
    [email protected]
      

  2.   

    参考System.Net.Sockets下Socket类的用法
    相当于封装了的WinSocks
      

  3.   

    大体思路是这样了,使用线程池进行扫描
    static void Main()  
      { 
       connState = 0; 
    portSum = 0; 
    scanHost = "";//主机地址 
    try 

    IPAddress ipaddr =(IPAddress)Dns.Resolve(scanHost).AddressList.GetValue(0); 

    catch 

    MessageBox.Show("请输入正确的主机地址,该地址DNS无法解析","系统提示"); 
    return ; 
         } 
            
         for (Int32 threadNum = startPort; threadNum <=endPort; threadNum++) 
       { 
       ThreadPool.QueueUserWorkItem(new WaitCallback(Startscan),threadNum); 
       logList.Items.Add ("扫描端口:" + threadNum.ToString()); 
       } 
       
      } 
      public void Startscan(Object state) 
      { 
      Int32 port = (Int32) state; 
      string tMsg = ""; 
      string getData = ""; 
      int lindex = 0; 
      int eindex = 0; 
      connState++; //判断线程数目 
      if(endThread==true) 
      { 
      if(connState==((Int32)eNum.Value-(Int32)sNum.Value)) 
      { 
      cmdExec.Text = "&Scan"; 
      logList.Items.Add ("扫描完毕!"); 
      } 
      else 
      { 
      cmdExec.Text = "&Stop"; 
      logList.Items.Add ("正在停止对"+port.ToString()+"端口的扫描线程"); 
      } 
      logList.Items.Add("结束线程:"+port.ToString()); 
      asyncOpsAreDone.Close(); 
      } 
      else 
      { 
      try 
      { 
      TcpClient tcp = new TcpClient(); 
      tcp.Connect(scanHost,port); 
      //该处如果建立连接错误的话,将不执行下面的代码.. 
      portSum ++; 
      lindex = portList.Items.Add(port.ToString() + "端口开放",false); 
      portList.SelectedIndex=lindex; 
      Stream sm = tcp.GetStream(); 
      sm.Write(Encoding.Default.GetBytes(tMsg.ToCharArray()),0,tMsg.Length); 
      StreamReader sr = new StreamReader(tcp.GetStream(),Encoding.Default); 
      getData = sr.ReadLine(); 
      if(lindex!=0&&getData.Length!=0) 
      { 
      tMsg = " +-" + port.ToString() + "端口数据:"+getData.ToString(); 
      eindex = portList.Items.Add(tMsg); //插入一条信息记录 
      portList.Items.Insert(lindex+1,tMsg); 
      portList.Items.RemoveAt(eindex); 
      } 
      sr.Close(); 
      sm.Close(); 
      tcp.Close(); 
      } 
      catch 
      { 
      //显示坏死的端口 
      if(showdie.Checked==true) 
      { 
      portList.Items.Add(port.ToString()+"端口无法连接,回传数据为空"); 
      } 
      } 
      finally 
      { 
      Thread.Sleep(0); 
      logList.Items.Add("结束线程:"+port.ToString()); 
      asyncOpsAreDone.Close(); 
      statusBar1.Text = "端口总计:"+portSum.ToString() ; 
      if(connState==((Int32)eNum.Value-(Int32)sNum.Value)) 
      { 
      cmdExec.Text = "&Scan"; 
      } 
      } 
      } 
      }这是别人的代码,懒得写了
      

  4.   

    我知道是用System.Net.Sockets ,但我不知道怎么用
      

  5.   

    扫描的意思就是,不断的尝试连接
    也就tcp和udp协议
    端口范围是0-65535
      

  6.   

    但是这样效率太低了,一台计算机一般都开比较少的端口,但上面那段代码,任意不存在的端口都必须通过try catch 抛出,效率太低了,还有没有什么好的办法?
      

  7.   

    不一定要try/catch
    你可以使用同步的方法,然后通过超时时间判断是否可以连接
      

  8.   

    一直不断的连接就可以了System.Net.Sockets
      

  9.   

    private string[] dk=new string[256];//存放端口的数组
    private string[] sm=new string[256];//存放端口说明的数组
    常用端口列表:
    private void p_chushihua()
    {
    dk[0]="1";
    sm[0]="传输控制协议端口服务多路开关选择器";
    dk[1]="2";
    sm[1]="compressnet 管理实用程序";
    dk[2]="3";
    sm[2]="压缩进程";
    dk[3]="5";
    sm[3]="远程作业登录";
    dk[4]="7";
    sm[4]="回显(Echo)";
    dk[5]="9";
    sm[5]="丢弃";
    dk[6]="11";
    sm[6]="在线用户";
    dk[7]="13";
    sm[7]="时间";
    dk[8]="15";
    sm[8]="netstat";
    dk[9]="17";
    sm[9]="每日引用";
    dk[10]="18";
    sm[10]="消息发送协议";
    dk[11]="19";
    sm[11]="字符发生器";
    dk[12]="20";
    sm[12]="文件传输协议(默认数据口)";
    dk[13]="21";
    sm[13]="文件传输协议(控制)";
    dk[14]="22";
    sm[14]="SSH远程登录协议";
    dk[15]="23";
    sm[15]="telnet 终端仿真协议";
    dk[16]="24";
    sm[16]="预留给个人用邮件系统 ";
    dk[17]="25";
    sm[17]="smtp 简单邮件发送协议";
    dk[18]="27";
    sm[18]="NSW 用户系统现场工程师";
    dk[19]="29";
    sm[19]="MSG ICP";
    dk[20]="31";
    sm[20]="MSG验证";
    dk[21]="33";
    sm[21]="显示支持协议";
    dk[22]="35";
    sm[22]="预留给个人打印机服务";
    dk[23]="37";
    sm[23]="时间";
    dk[24]="38";
    sm[24]="路由访问协议";
    dk[25]="39";
    sm[25]="资源定位协议";
    dk[26]="41";
    sm[26]="图形";
    dk[27]="42";
    sm[27]="WINS 主机名服务";
    dk[28]="43";
    sm[28]="'绰号' who is服务";
    dk[29]="44";
    sm[29]="MPM(消息处理模块)标志协议";
    dk[30]="45";
    sm[30]="消息处理模块";
    dk[31]="46";
    sm[31]="消息处理模块(默认发送口)";
    dk[32]="47";
    sm[32]="NI FTP";
    dk[33]="48";
    sm[33]="数码音频后台服务";
    dk[34]="49";
    sm[34]="TACACS登录主机协议";
    dk[35]="50";
    sm[35]="远程邮件检查协议";
    dk[36]="51";
    sm[36]="IMP(接口信息处理机)逻辑地址维护";
    dk[37]="52";
    sm[37]="施乐网络服务系统时间协议";
    dk[38]="53";
    sm[38]="域名服务器";
    dk[39]="54";
    sm[39]="施乐网络服务系统票据交换";
    dk[40]="55";
    sm[40]="ISI图形语言";
    dk[41]="56";
    sm[41]="施乐网络服务系统验证";
    dk[42]="57";
    sm[42]="预留个人用终端访问";
    dk[43]="58";
    sm[43]="施乐网络服务系统邮件";
    dk[44]="59";
    sm[44]="预留个人文件服务";
    dk[45]="61";
    sm[45]="NI邮件?";
    dk[46]="62";
    sm[46]="异步通讯适配器服务";
    dk[47]="63";
    sm[47]="WHOIS+";
    dk[48]="64";
    sm[48]="通讯接口";
    dk[49]="65";
    sm[49]="TACACS数据库服务";
    dk[50]="66";
    sm[50]="Oracle SQL*NET";
    dk[51]="67";
    sm[51]="引导程序协议服务端";
    dk[52]="68";
    sm[52]="引导程序协议客户端";
    dk[53]="69";
    sm[53]="小型文件传输协议";
    dk[54]="70";
    sm[54]="信息检索协议";
    dk[55]="71";
    sm[55]="远程作业服务";
    dk[56]="72";
    sm[56]="远程作业服务";
    dk[57]="73";
    sm[57]="远程作业服务";
    dk[58]="74";
    sm[58]="远程作业服务";
    dk[59]="75";
    sm[59]="预留给个人拨出服务";
    dk[60]="76";
    sm[60]="分布式外部对象存储";
    dk[61]="77";
    sm[61]="预留给个人远程作业输入服务";
    dk[62]="78";
    sm[62]="修正TCP";
    dk[63]="79";
    sm[63]="Finger(查询远程主机在线用户等信息)";
    dk[64]="80";
    sm[64]="全球信息网超文本传输协议(www)";
    dk[65]="81";
    sm[65]="HOST2名称服务";
    dk[66]="82";
    sm[66]="传输实用程序";
    dk[67]="83";
    sm[67]="模块化智能终端ML设备";
    dk[68]="84";
    sm[68]="公用追踪设备";
    dk[69]="85";
    sm[69]="模块化智能终端ML设备";
    dk[70]="86";
    sm[70]="Micro Focus Cobol编程语言";
    dk[71]="87";
    sm[71]="预留给个人终端连接";
    dk[72]="88";
    sm[72]="Kerberros安全认证系统";
    dk[73]="89";
    sm[73]="SU/MIT终端仿真网关";
    dk[74]="90";
    sm[74]="DNSIX 安全属性标记图";
    dk[75]="91";
    sm[75]="MIT Dover假脱机";
    dk[76]="92";
    sm[76]="网络打印协议";
    dk[77]="93";
    sm[77]="设备控制协议";
    dk[78]="94";
    sm[78]="Tivoli对象调度";
    dk[79]="95";
    sm[79]="SUPDUP";
    dk[80]="96";
    sm[80]="DIXIE协议规范";
    dk[81]="97";
    sm[81]="快速远程虚拟文件协议";
    dk[82]="98";
    sm[82]="TAC(东京大学自动计算机)新闻协议";
    dk[83]="101";
    sm[83]="usually from sri-nic";
    dk[84]="102";
    sm[84]="iso-tsap";
    dk[85]="103";
    sm[85]="ISO Mail";
    dk[86]="104";
    sm[86]="x400-snd";
    dk[87]="105";
    sm[87]="csnet-ns";
    dk[88]="109";
    sm[88]="Post Office";
    dk[89]="110";
    sm[89]="Pop3 服务器(邮箱发送服务器)";
    dk[90]="111";
    sm[90]="portmap 或 sunrpc";
    dk[91]="113";
    sm[91]="身份查询";
    dk[92]="115";
    sm[92]="sftp";
    dk[93]="117";
    sm[93]="path 或 uucp-path";
    dk[94]="119";
    sm[94]="新闻服务器";
    dk[95]="121";
    sm[95]="BO jammerkillah";
    dk[96]="123";
    sm[96]="network time protocol (exp)";
    dk[97]="135";
    sm[97]="DCE endpoint resolutionnetbios-ns";
    dk[98]="137";
    sm[98]="NetBios-NS";
    dk[99]="138";
    sm[99]="NetBios-DGN";
    dk[100]="139";
    sm[100]="win98 共享资源端口(NetBios-SSN)";
    dk[101]="143";
    sm[101]="IMAP电子邮件";
    dk[102]="144";
    sm[102]="NeWS - news";
    dk[103]="153";
    sm[103]="sgmp - sgmp";
    dk[104]="158";
    sm[104]="PCMAIL";
    dk[105]="161";
    sm[105]="snmp - snmp";
    dk[106]="162";
    sm[106]="snmp-trap -snmp";
    dk[107]="170";
    sm[107]="network PostScript";
    dk[108]="175";
    sm[108]="vmnet";
    dk[109]="194";
    sm[109]="Irc";
    dk[110]="315";
    sm[110]="load";
    dk[111]="400";
    sm[111]="vmnet0";
    dk[112]="443";
    sm[112]="安全服务";
    dk[113]="456";
    sm[113]="Hackers Paradise";
    dk[114]="500";
    sm[114]="sytek";
    dk[115]="512";
    sm[115]="exec";
    dk[116]="513";
    sm[116]="login";
    dk[117]="514";
    sm[117]="shell - cmd";
    dk[118]="515";
    sm[118]="printer - spooler";
    dk[119]="517";
    sm[119]="talk";
    dk[120]="518";
    sm[120]="ntalk";
    dk[121]="520";
    sm[121]="efs";
    dk[122]="526";
    sm[122]="tempo - newdate";
    dk[123]="530";
    sm[123]="courier - rpc";
    dk[124]="531";
    sm[124]="conference - chat";
    dk[125]="532";
      

  10.   

    sm[125]="netnews - readnews";
    dk[126]="533";
    sm[126]="netwall";
    dk[127]="540";
    sm[127]="uucp - uucpd";
    dk[128]="543";
    sm[128]="klogin";
    dk[129]="544";
    sm[129]="kshell";
    dk[130]="550";
    sm[130]="new-rwho - new-who";
    dk[131]="555";
    sm[131]="Stealth Spy(Phase)";
    dk[132]="556";
    sm[132]="remotefs - rfs_server";
    dk[133]="660";
    sm[133]="garcon";
    dk[134]="666";
    sm[134]="Attack FTP";
    dk[135]="750";
    sm[135]="kerberos - kdc";
    dk[136]="751";
    sm[136]="kerberos_master";
    dk[137]="754";
    sm[137]="krb_prop";
    dk[138]="888";
    sm[138]="erlogin";
    dk[139]="1001";
    sm[139]="Silencer 或 WebEx";
    dk[140]="1010";
    sm[140]="Doly trojan v1.35";
    dk[141]="1011";
    sm[141]="Doly Trojan";
    dk[142]="1024";
    sm[142]="NetSpy.698 (YAI)";
    dk[143]="1025";
    sm[143]="NetSpy.698";
    dk[144]="1033";
    sm[144]="Netspy";
    dk[145]="1042";
    sm[145]="Bla1.1";
    dk[146]="1047";
    sm[146]="GateCrasher";
    dk[147]="1080";
    sm[147]="Wingate";
    dk[148]="1109";
    sm[148]="kpop";
    dk[149]="1243";
    sm[149]="SubSeven";
    dk[150]="1245";
    sm[150]="Vodoo";
    dk[151]="1269";
    sm[151]="Mavericks Matrix";
    dk[152]="1433";
    sm[152]="Microsoft SQL Server 数据库服务";
    dk[153]="1492";
    sm[153]="FTP99CMP (BackOriffice.FTP)";
    dk[154]="1509";
    sm[154]="Streaming Server";
    dk[155]="1524";
    sm[155]="ingreslock";
    dk[156]="1600";
    sm[156]="Shiv";
    dk[157]="1807";
    sm[157]="SpySender";
    dk[158]="1981";
    sm[158]="ShockRave";
    dk[159]="1999";
    sm[159]="Backdoor";
    dk[160]="2000";
    sm[160]="黑洞(本马) 默认端口";
    dk[161]="2001";
    sm[161]="黑洞(本马) 默认端口";
    dk[162]="2023";
    sm[162]="Pass Ripper";
    dk[163]="2053";
    sm[163]="knetd";
    dk[164]="2140";
    sm[164]="DeepThroat.10 或 Invasor";
    dk[165]="2283";
    sm[165]="Rat";
    dk[166]="2565";
    sm[166]="Striker";
    dk[167]="2583";
    sm[167]="Wincrash2";
    dk[168]="2801";
    sm[168]="Phineas";
    dk[169]="3129";
    sm[169]="MastersParadise.92";
    dk[170]="3150";
    sm[170]="Deep Throat 1.0";
    dk[171]="3210";
    sm[171]="SchoolBus";
    dk[172]="3389";
    sm[172]="Win2000 远程登陆端口";
    dk[173]="4000";
    sm[173]="OICQ Client";
    dk[174]="4567";
    sm[174]="FileNail";
    dk[175]="4950";
    sm[175]="IcqTrojan";
    dk[176]="5000";
    sm[176]="WindowsXP 默认启动的 UPNP 服务";
    dk[177]="5190";
    sm[177]="ICQ Query";
    dk[178]="5321";
    sm[178]="Firehotcker";
    dk[179]="5400";
    sm[179]="BackConstruction1.2 或 BladeRunner";
    dk[180]="5550";
    sm[180]="Xtcp";
    dk[181]="5555";
    sm[181]="rmt - rmtd";
    dk[182]="5556";
    sm[182]="mtb - mtbd";
    dk[183]="5569";
    sm[183]="RoboHack";
    dk[184]="5714";
    sm[184]="Wincrash3";
    dk[185]="5742";
    sm[185]="Wincrash";
    dk[186]="6400";
    sm[186]="The Thing";
    dk[187]="6669";
    sm[187]="Vampire";
    dk[188]="6670";
    sm[188]="Deep Throat";
    dk[189]="6711";
    sm[189]="SubSeven";
    dk[190]="6713";
    sm[190]="SubSeven";
    dk[191]="6767";
    sm[191]="NT Remote Control";
    dk[192]="6771";
    sm[192]="Deep Throat 3";
    dk[193]="6776";
    sm[193]="SubSeven";
    dk[194]="6883";
    sm[194]="DeltaSource";
    dk[195]="6939";
    sm[195]="Indoctrination";
    dk[196]="6969";
    sm[196]="Gatecrasher.a";
    dk[197]="7306";
    sm[197]="网络精灵(木马)";
    dk[198]="7307";
    sm[198]="ProcSpy";
    dk[199]="7308";
    sm[199]="X Spy";
    dk[200]="7626";
    sm[200]="冰河(本马) 默认端口";
    dk[201]="7789";
    sm[201]="ICQKiller";
    dk[202]="8000";
    sm[202]="OICQ Server";
    dk[203]="9400";
    sm[203]="InCommand";
    dk[204]="9401";
    sm[204]="InCommand";
    dk[205]="9402";
    sm[205]="InCommand";
    dk[206]="9535";
    sm[206]="man";
    dk[207]="9536";
    sm[207]="w";
    dk[208]="9537";
    sm[208]="mantst";
    dk[209]="9872";
    sm[209]="Portal of Doom";
    dk[210]="9875";
    sm[210]="Portal of Doom";
    dk[211]="9989";
    sm[211]="InIkiller";
    dk[212]="10000";
    sm[212]="bnews";
    dk[213]="10001";
    sm[213]="queue";
    dk[214]="10002";
    sm[214]="poker";
    dk[215]="10167";
    sm[215]="Portal Of Doom";
    dk[216]="10607";
    sm[216]="Coma";
    dk[217]="11000";
    sm[217]="Senna Spy Trojans";
    dk[218]="11223";
    sm[218]="ProgenicTrojan";
    dk[219]="12076";
    sm[219]="Gjamer 或 MSH.104b";
    dk[220]="12223";
    sm[220]="Hack?9 KeyLogger";
    dk[221]="12345";
    sm[221]="netbus木马 默认端口";
    dk[222]="12346";
    sm[222]="netbus木马 默认端口";
    dk[223]="12631";
    sm[223]="WhackJob.NB1.7";
    dk[224]="16969";
    sm[224]="Priotrity";
    dk[225]="17300";
    sm[225]="Kuang2";
    dk[226]="20000";
    sm[226]="Millenium II (GrilFriend)";
    dk[227]="20001";
    sm[227]="Millenium II (GrilFriend) ";
    dk[228]="20034";
    sm[228]="NetBus Pro";
    dk[229]="20331";
    sm[229]="Bla";
    dk[230]="21554";
    sm[230]="GirlFriend 或 Schwindler 1.82";
    dk[231]="22222";
    sm[231]="Prosiak";
    dk[232]="23456";
    sm[232]="Evil FTP 或 UglyFtp 或 WhackJob";
    dk[233]="27374";
    sm[233]="SubSeven";
    dk[234]="29891";
    sm[234]="The Unexplained";
    dk[235]="30029";
    sm[235]="AOLTrojan";
    dk[236]="30100";
    sm[236]="NetSphere";
    dk[237]="30303";
    sm[237]="Socket23";
    dk[238]="30999";
    sm[238]="Kuang";
    dk[239]="31337";
    sm[239]="BackOriffice";
    dk[240]="31339";
    sm[240]="NetSpy";
    dk[241]="31666";
    sm[241]="BO Whackmole";
    dk[242]="31787";
    sm[242]="Hack a tack";
    dk[243]="33333";
    sm[243]="Prosiak";
    dk[244]="33911";
    sm[244]="Trojan Spirit 2001 a";
    dk[245]="34324";
    sm[245]="TN 或 Tiny Telnet Server";
    dk[246]="40412";
    sm[246]="TheSpy";
    dk[247]="40421";
    sm[247]="MastersParadise.96";
    dk[248]="40423";
    sm[248]="Master Paradise.97";
    dk[249]="47878";
    sm[249]="BirdSpy2";
    dk[250]="50766";
    sm[250]="Fore 或 Schwindler";
    dk[251]="53001";
    sm[251]="Remote Shutdown";
    dk[252]="54320";
    sm[252]="Back Orifice 2000";
    dk[253]="54321";
    sm[253]="SchoolBus 1.6";
    dk[254]="61466";
    sm[254]="Telecommando";
    dk[255]="65000";
    sm[255]="Devil";
    }