00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 #if !defined(AFX_TCPPORTSCANNERSTEALTH_H__25CD2089_2AAE_4914_80CF_4ECD1B9DCD9E__INCLUDED_)
00037 #define AFX_TCPPORTSCANNERSTEALTH_H__25CD2089_2AAE_4914_80CF_4ECD1B9DCD9E__INCLUDED_
00038 
00039 #if _MSC_VER > 1000
00040 #pragma once
00041 #endif // _MSC_VER > 1000
00042 
00043 #include "PeriodicThread.h"
00044 
00045 #include "SniffSocket.h"
00046 
00047 #include "TCPPortScanner.h"
00048 
00049 #include <map>
00050 
00051 KOMODIA_NAMESPACE_START
00052 
00053 class CGenericCriticalSection;
00054 
00055 class CTCPPortScannerStealth : public CTCPPortScanner  
00056 {
00057 public:
00058     
00059     virtual BOOL Scan(const std::string& rDestinationAddress);
00060     virtual BOOL Scan(IP aTarget);
00061 
00062     
00063     CTCPPortScannerStealth(IP aBindInterface);
00064     CTCPPortScannerStealth(const std::string& rBindInterface);
00065     virtual ~CTCPPortScannerStealth();
00066 protected:
00067     
00068     
00069     virtual CTCPSocketAsync* AllocateSocket(unsigned short usPort)const;
00070 
00071     
00072     virtual void DestroySocket(CTCPSocketAsync* pSocket)const;
00073 
00074     
00075     virtual void TCPScanDoneLib(BOOL bError);
00076 
00077     
00078     virtual void PortScanned(unsigned short usPort);
00079 
00080     
00081     void RemovePort(unsigned short usPort);
00082 
00083     
00084     IP GetBindInterface()const;
00085 
00086     
00087     void ResetPortsData();
00088 
00089     
00090     void StartThread(BOOL bDefaultDisconnected=TRUE);
00091 private:
00092     
00093     class CTCPScanner : public CTCPSocketAsync
00094     {
00095     public:
00096         
00097         virtual BOOL Connect(unsigned short usSourcePort,
00098                              IP aDestinationAddress,
00099                              unsigned short usDestinationPort,
00100                              BOOL bDisableAsync=FALSE,
00101                              BOOL bForceErrorEvent=FALSE)
00102         {
00103             return CTCPSocketAsync::Connect(2000,
00104                                             aDestinationAddress,
00105                                             usDestinationPort,
00106                                             bDisableAsync,
00107                                             bForceErrorEvent);
00108         }
00109 
00110         
00111         CTCPScanner() : CTCPSocketAsync(TRUE)
00112         {
00113         }
00114         virtual ~CTCPScanner()
00115         {
00116         }
00117     protected:
00118         
00119         NO_OnSocketAccept
00120         NO_OnSocketOOB
00121         NO_OnSocketWrite
00122         NO_OnSocketTimeout
00123         NO_OnSocketConnect
00124         NO_OnSocketClose
00125         NO_OnSocketReceive
00126     };
00127 private:
00128     
00129     class CSniffingSocket : public CSniffSocket
00130     {
00131     public:
00132         
00133         void Stop();
00134 
00135         
00136         CSniffingSocket(CTCPPortScannerStealth* pScanner);
00137         virtual ~CSniffingSocket();
00138     protected:
00139         
00140         virtual BOOL OnSocketReceive(int iErrorCode);
00141     private:
00142         
00143         void AnalyzeTCP(const char* pTCPBuffer);
00144 
00145         
00146         CTCPPortScannerStealth* m_pFather;
00147 
00148         
00149         BOOL m_bStop;
00150     };
00151 
00152     friend CSniffingSocket;
00153 private:
00154     
00155     typedef std::map<unsigned short,unsigned long> PortsMap;
00156 private:
00157     
00158     CTCPPortScannerStealth(const CTCPPortScannerStealth& rStealth);
00159 
00160     
00161     CTCPPortScannerStealth& operator=(const CTCPPortScannerStealth& rStealth);
00162 
00163     
00164     BOOL CreateSniffer();
00165 
00166     
00167     static BOOL TimeoutProc(CPeriodicThread::ThreadStage aStage,
00168                             LPVOID pParam);
00169 
00170     
00171     CTCPScanner* m_pScanner;
00172 
00173     
00174     IP m_aBindInterface;
00175 
00176     
00177     CSniffingSocket* m_pSniffer;
00178 
00179     
00180     CGenericCriticalSection* m_pCSection;
00181 
00182     
00183     PortsMap m_aPortsMap;
00184 
00185     
00186     CPeriodicThread* m_pThread;
00187 
00188     
00189     BOOL m_bDefaultDisconnected;
00190 };
00191 
00192 KOMODIA_NAMESPACE_END
00193 
00194 #endif // !defined(AFX_TCPPORTSCANNERSTEALTH_H__25CD2089_2AAE_4914_80CF_4ECD1B9DCD9E__INCLUDED_)