티스토리 툴바

달력

012012  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  

C# Port Scanner

.Net Programing 2010/06/15 12:27

Source File : PortScanner_src.zip
Binary File : PortScanner_bin.zip

-------------------------------------------------------------

버그 수정하여 다시 업로드했습니다.

-------------------------------------------------------------


요즘 갑자기 Port 스캔이 필요한 일이 생겼습니다.

예전엔 Advanced Port Scan 이라는 프로그램을 이용해서 사용했었는데..

 

현재 사용하는 Windows 7 환경에서는 제대로 동작하지 않는 것 같습니다.

 

그래서 간단히 사용할 수 있는 Port Scanner를 만들어 보았습니다.

 

   1: public static bool IsOpenPort(string host, int port)
   2: {
   3:     using (TcpClient TcpScan = new TcpClient())
   4:     {
   5:         try
   6:         {
   7:             TcpScan.Connect(host, port);
   8:             return true;
   9:         }
  10:         catch
  11:         {
  12:             return false;
  13:         }
  14:     }
  15: }

 

위의 소스로 해당 TCP 포트가 열려 있는지 확인합니다.

 

기본적인 열린 포트 검색기능과 추가적으로 WellKnownPort Dictionary를 만들었습니다.

 

http://ianawww.vip.icann.org/assignments/port-numbers

위의 주소에 각 포트를 사용하는 프로그램 정보가 저장되어 있습니다.

 

위의 Port 주소 정보를 가져와 Port 와 이름, 세부 정보로 구분하였습니다.

그리고 XmlSerialize 를 통해 그 정보를 저장하였습니다..

 

   1: [XmlRoot("WellKnownPort")]
   2: public class WellKnownPorts
   3: {
   4:     private const string DefaultFileName = @"KnownPorts.xml";
   5:     private bool _isAlreadyDeserialize;
   6:     private List<Port> _ports;
   7:  
   8:     [XmlElement("Ports")]
   9:     public Port[] Ports 
  10:     { 
  11:         get 
  12:         { 
  13:             return _ports.ToArray(); 
  14:         }
  15:         set
  16:         {
  17:             if (value != null)
  18:             {
  19:                 if (_ports != null)
  20:                     _ports.Clear();
  21:  
  22:                 _ports = new List<Port>();
  23:  
  24:                 foreach (Port port in value)
  25:                     _ports.Add(port);
  26:             }
  27:         }
  28:     }
  29:  
  30:     public bool IsAlreadyDeserialize
  31:     {
  32:         get
  33:         {
  34:             return _isAlreadyDeserialize;
  35:         }
  36:     }
  37:  
  38:     public int Count
  39:     {
  40:         get 
  41:         {
  42:             return _ports.Count;
  43:         }
  44:     }
  45:  
  46:     public WellKnownPorts()
  47:     {
  48:         _isAlreadyDeserialize = false;
  49:     }
  50:  
  51:     public Port GetPortInformation(int port)
  52:     {
  53:         var query = from p in _ports
  54:                     where p.PortNumber == port
  55:                     select p;
  56:  
  57:         Port portInfo = null;
  58:  
  59:         foreach (Port p in query)
  60:         {
  61:             if (p.PortNumber == port)
  62:             {
  63:                 portInfo = p;
  64:                 break;
  65:             }
  66:         }
  67:  
  68:         return portInfo;
  69:     }
  70:  
  71:     public bool IsContain(int port)
  72:     {
  73:         int count = _ports.Count(n => n.PortNumber == port);
  74:  
  75:         if (count == 0) return false;
  76:         else return true;
  77:     }
  78:  
  79:     public void AddItem(Port port)
  80:     {
  81:         int count = _ports.Count(n => n.PortNumber == port.PortNumber);
  82:         if(count == 0)
  83:             _ports.Add(port);
  84:     }
  85:  
  86:     public void Remove(int port)
  87:     {
  88:         var query = from p in _ports
  89:                     where p.PortNumber == port
  90:                     select p;
  91:  
  92:         foreach (Port p in query)
  93:         {
  94:             _ports.Remove(p);
  95:         }
  96:     }
  97:  
  98:     public void Serialization()
  99:     {
 100:         XmlSerialization(DefaultFileName);
 101:     }
 102:  
 103:     public void Serialization(string fileName)
 104:     {
 105:         XmlSerialization(fileName);
 106:     }
 107:  
 108:     private void XmlSerialization(string fileName)
 109:     {
 110:         XmlSerializer xmlSerialization = new XmlSerializer(typeof(WellKnownPorts));
 111:         TextWriter textWriter = new StreamWriter(fileName);
 112:         xmlSerialization.Serialize(textWriter, this);
 113:         textWriter.Close();
 114:     }
 115:  
 116:     public void Deserialization()
 117:     {
 118:         XmlDeserialization(DefaultFileName);
 119:     }
 120:  
 121:     public void Deserialization(string fileName)
 122:     {
 123:         XmlDeserialization(fileName);
 124:     }
 125:  
 126:     private void XmlDeserialization(string fileName)
 127:     {
 128:         if (!File.Exists(fileName))
 129:             throw new ArgumentException("File is not exists.", "fileName");
 130:  
 131:         XmlSerializer xmlSerialization = new XmlSerializer(typeof(WellKnownPorts));
 132:         Stream reader = new FileStream(fileName, FileMode.Open);
 133:  
 134:         this._ports = ((WellKnownPorts)xmlSerialization.Deserialize(reader))._ports;
 135:         _isAlreadyDeserialize = true;
 136:         reader.Close();
 137:     }
 138: }

위의 포트들의 정보를 바탕으로 WellKnownPort를 검색할 수 있는 클래스를 구성하였습니다. 검색에는 Deserialize를 통해 Port 정보를 로드하고 Linq를 이용하여 정보를 조회, 삭제 하는 방법을 사용하였습니다.

 

따라서 GetPortInformation() 을 통해 특정 포트의 정보를 가져올 수 있습니다.

 

현재 TCP Port에 대한 약 5500 개 정도의 데이터가 저장되어 있습니다.

 

 

 

위의 그림은 실행 화면 입니다. 검색 옵션으로 이제 설명 드릴 Well Known Port Scan 을 선택했습니다.

 

 

 

위의 화면은 검색에 사용할 Well Known Port를 수정하는 메뉴 입니다.

 

 

 

위의 메뉴는 Edit WellKnownPorts를 실행한 화면 입니다.

또한 위의 폼에서 Port 칸에 숫자를 입력하면 해당 Port 에 대한 정보를 Port Dictionary에서 검색하여 저장하도록 구성하였습니다.

 

메인 Port Scan 폼에서 Scan 옵션 중 Well Known Port를 선택하게 되면 위의 리스트에 저장된 포트만을 검색하게 됩니다.

 

특이한 점은 1521 포트가 오라클 기본 리스너 포트로 알고 있었는데..

위에 명시된 nCube License Manager가 기본 이랍니다.

 

Visual Studio 2010 에서 .Net Framework 4를 이용해서 제작되었습니다.

 

가끔 버그가 보이는데.. 그래도 쓸만한 것 같습니다. :)

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 오렌지농장