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_)