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 #include "stdafx.h"
00037 #include "UDPScanner.h"
00038
00039 #include "ErrorHandlerMacros.h"
00040
00041 #include "UDPSocket.h"
00042
00043 #ifdef _MEMORY_DEBUG
00044 #define new DEBUG_NEW
00045 #define malloc DEBUG_MALLOC
00046 static char THIS_FILE[] = __FILE__;
00047 #endif
00048
00049 KOMODIA_NAMESPACE_START
00050
00051
00052
00053 #define CTCPScanner_Class "CTCPScanner"
00054
00055 CUDPScanner::CTCPScanner::CTCPScanner() : CTCPSocketAsync(TRUE),
00056 m_pSocket(NULL)
00057 {
00058 try
00059 {
00060
00061 SetName(CTCPScanner_Class);
00062
00063
00064 m_pSocket=new CUDPSocket(FALSE);
00065 }
00066 ERROR_HANDLER("CTCPScanner")
00067 }
00068
00069 CUDPScanner::CTCPScanner::~CTCPScanner()
00070 {
00071 try
00072 {
00073 delete m_pSocket;
00074 }
00075 ERROR_HANDLER("~CTCPScanner")
00076 }
00077
00078 BOOL CUDPScanner::CTCPScanner::Create()
00079 {
00080 try
00081 {
00082
00083 return m_pSocket->Create();
00084 }
00085 ERROR_HANDLER_RETURN("Create",FALSE)
00086 }
00087
00088 BOOL CUDPScanner::CTCPScanner::Connect(unsigned short usSourcePort,
00089 IP aDestinationAddress,
00090 unsigned short usDestinationPort,
00091 BOOL bDisableAsync,
00092 BOOL bForceErrorEvent)
00093 {
00094 try
00095 {
00096
00097 return m_pSocket->Send(usSourcePort,
00098 aDestinationAddress,
00099 usDestinationPort,
00100 NULL,
00101 0)!=GetErrorCode();
00102 }
00103 ERROR_HANDLER_RETURN("Connect",FALSE)
00104 }
00105
00106
00107
00108
00109
00110 #define CSniffingSocket_Class "CSniffingSocket"
00111
00112 CUDPScanner::CSniffingSocket::CSniffingSocket(CUDPScanner* pScanner) : CICMPSocketAsync(TRUE),
00113 m_pFather(pScanner)
00114 {
00115 try
00116 {
00117
00118 SetName(CSniffingSocket_Class);
00119 }
00120 ERROR_HANDLER("CSniffingSocket")
00121 }
00122
00123 CUDPScanner::CSniffingSocket::~CSniffingSocket()
00124 {
00125 }
00126
00127 BOOL CUDPScanner::CSniffingSocket::OnSocketReceive(int iErrorCode)
00128 {
00129 try
00130 {
00131
00132 if (iErrorCode)
00133 return TRUE;
00134
00135
00136 if (CICMPSocketAsync::OnSocketReceive(iErrorCode))
00137
00138 if (GetLastICMPHeader()->ucICMPType==ICMP_Unreachable &&
00139 GetLastIPHeader()->ulSourceAddress==m_pFather->GetTarget())
00140 {
00141
00142 UDPHeader aHeader;
00143 memcpy(&aHeader,
00144 GetLastData(),
00145 ICMP_DATA_SIZE);
00146
00147
00148 unsigned short usPort;
00149 usPort=htons(aHeader.usDestinationPort);
00150
00151
00152 m_pFather->RemovePort(usPort);
00153
00154
00155 m_pFather->SocketDone(usPort,
00156 FALSE);
00157
00158 return TRUE;
00159 }
00160
00161
00162 return TRUE;
00163 }
00164 ERROR_HANDLER_RETURN("OnSocketReceive",FALSE)
00165 }
00166
00167
00168 #define CUDPScanner_Class "CUDPScanner"
00169
00170 CUDPScanner::CUDPScanner(IP aBindInterface) : CTCPPortScannerStealth(aBindInterface),
00171 m_pScanner(NULL),
00172 m_pSniffer(NULL)
00173 {
00174 try
00175 {
00176
00177 SetName(CUDPScanner_Class);
00178 }
00179 ERROR_HANDLER("CUDPScanner")
00180 }
00181
00182 CUDPScanner::CUDPScanner(const std::string& rBindInterface) : CTCPPortScannerStealth(rBindInterface),
00183 m_pScanner(NULL),
00184 m_pSniffer(NULL)
00185 {
00186 try
00187 {
00188
00189 SetName(CUDPScanner_Class);
00190 }
00191 ERROR_HANDLER("CUDPScanner")
00192 }
00193
00194 CUDPScanner::~CUDPScanner()
00195 {
00196 try
00197 {
00198
00199 delete m_pScanner;
00200
00201
00202 delete m_pSniffer;
00203 }
00204 ERROR_HANDLER("~CUDPScanner")
00205 }
00206
00207 BOOL CUDPScanner::Scan(const std::string& rDestinationAddress)
00208 {
00209 try
00210 {
00211 return Scan(CSpoofBase::StringToLong(rDestinationAddress));
00212 }
00213 ERROR_HANDLER_RETURN("Scan",FALSE)
00214 }
00215
00216 BOOL CUDPScanner::Scan(IP aTarget)
00217 {
00218
00219 if (GetMaxSockets()<=0 ||
00220 !IsDone() ||
00221 !aTarget)
00222 {
00223
00224 ReportError("Scan","Invalid parameters!");
00225
00226
00227 return FALSE;
00228 }
00229
00230 try
00231 {
00232
00233 ResetPair();
00234
00235
00236 if (!CanScan())
00237 {
00238
00239 ReportError("Scan","No ports given!");
00240
00241
00242 SetError(TRUE);
00243
00244
00245 return FALSE;
00246 }
00247
00248
00249 ResetPortsData();
00250
00251
00252 if (m_pScanner)
00253 delete m_pScanner;
00254
00255
00256 m_pScanner=new CTCPScanner;
00257
00258
00259 if (!m_pScanner->Create())
00260 {
00261
00262 ReportError("Scan","Failed to create socket!");
00263
00264
00265 return FALSE;
00266 }
00267
00268
00269 if (!CreateSniffer())
00270 {
00271
00272 ReportError("Scan","Failed to create sniffer!");
00273
00274
00275 SetError(TRUE);
00276
00277
00278 return FALSE;
00279 }
00280
00281
00282 SetError(FALSE);
00283 SetDone(FALSE);
00284
00285
00286 ResetSocketCount();
00287
00288
00289 DeletePortsMap();
00290
00291
00292 ResetData();
00293
00294
00295 SetTarget(aTarget);
00296
00297
00298 StartThread(FALSE);
00299
00300
00301 for (int iCounter=0;
00302 iCounter<GetMaxSockets();
00303 ++iCounter)
00304 {
00305 BOOL bQuit;
00306 bQuit=FALSE;
00307
00308
00309 while (!bQuit)
00310 {
00311
00312 AdjustNumberOfSockets(1);
00313
00314
00315 if (!(bQuit=NewSocket()))
00316 ReportError("Scan","Failed to create socket!");
00317 }
00318 }
00319
00320
00321 return TRUE;
00322 }
00323 ERROR_HANDLER_RETURN("Scan",FALSE)
00324 }
00325
00326 CTCPSocketAsync* CUDPScanner::AllocateSocket(unsigned short usPort)const
00327 {
00328 return m_pScanner;
00329 }
00330
00331 void CUDPScanner::DestroySocket(CTCPSocketAsync* pSocket)const
00332 {
00333 }
00334
00335 BOOL CUDPScanner::CreateSniffer()
00336 {
00337 try
00338 {
00339
00340 if (m_pSniffer)
00341 {
00342 delete m_pSniffer;
00343 m_pSniffer=NULL;
00344 }
00345
00346
00347 CSniffingSocket* pSocket;
00348 pSocket=new CSniffingSocket(this);
00349
00350
00351 std::auto_ptr<CSniffingSocket> pProtection(pSocket);
00352
00353
00354 if (!pSocket->Create())
00355 {
00356
00357 ReportError("CreateSniffer","Failed to create sniffer");
00358
00359
00360 return FALSE;
00361 }
00362
00363
00364 if (!pSocket->Bind(GetBindInterface(),0))
00365 {
00366
00367 ReportError("CreateSniffer","Failed to bind sniffer");
00368
00369
00370 return FALSE;
00371 }
00372
00373
00374 m_pSniffer=pProtection.release();
00375
00376
00377 return TRUE;
00378 }
00379 ERROR_HANDLER_RETURN("CreateSniffer",FALSE)
00380 }
00381
00382 void CUDPScanner::TCPScanDoneLib(BOOL bError)
00383 {
00384 try
00385 {
00386
00387 CSniffingSocket* pSocket;
00388 pSocket=m_pSniffer;
00389 m_pSniffer=NULL;
00390
00391
00392 pSocket->DeleteSocketFromThread();
00393
00394
00395 CTCPPortScannerStealth::TCPScanDoneLib(bError);
00396 }
00397 ERROR_HANDLER("TCPScanDoneLib")
00398 }
00399
00400 KOMODIA_NAMESPACE_END