BOOL CAdminSocket::Init() { char *buffer = new char[100]; char *p = buffer; strcpy(buffer, "FZS"); p += 3; *p++ = 0; *p++ = 4; memcpy(p, &SERVER_VERSION, 4); p += 4; *p++ = 0; *p++ = 4; memcpy(p, &PROTOCOL_VERSION, 4); p += 4; COptions options; CStdString pass = options.GetOption(OPTION_ADMINPASS); CStdString peerAddress; UINT port = 0; if (GetPeerName(peerAddress, port) && IsLocalhost(peerAddress) && pass == _T("")) { BOOL res = Send(buffer, p-buffer) == p - buffer; delete [] buffer; if (!res) { Close(); return FALSE; } return FinishLogon(); } else { *p++ = 0; DWORD len = 20; memcpy(p, &len, 4); p += 4; *p++ = 0; *p++ = 8; int i; for (i = 0; i < 8; ++i) { m_Nonce1[i] = std::uniform_int_distribution<unsigned int>(0, 255)(std::random_device()); *p++ = m_Nonce1[i]; } *p++ = 0; *p++ = 8; for (i = 0; i < 8; ++i) { m_Nonce2[i] = std::uniform_int_distribution<unsigned int>(0, 255)(std::random_device()); *p++ = m_Nonce2[i]; } } int res = Send(buffer, p-buffer) == p-buffer; delete [] buffer; return res; }
BOOL CAdminSocket::Init() { char *buffer=new char[100]; char *p=buffer; strcpy(buffer, "FZS"); p+=3; *p++=0; *p++=4; memcpy(p, &SERVER_VERSION, 4); p+=4; *p++=0; *p++=4; memcpy(p, &PROTOCOL_VERSION, 4); p+=4; SOCKADDR_IN sockAddr; memset(&sockAddr, 0, sizeof(sockAddr)); int nSockAddrLen = sizeof(sockAddr); if (GetPeerName((SOCKADDR*)&sockAddr, &nSockAddrLen) && sockAddr.sin_addr.S_un.S_addr == 0x0100007f) { BOOL res=Send(buffer, p-buffer) == p-buffer; delete [] buffer; if (!res) { Close(); return FALSE; } return FinishLogon(); } else { *p++=0; DWORD len = 20; memcpy(p, &len, 4); p+=4; *p++=0; *p++=8; int i; for (i=0;i<8; i++) { m_Nonce1[i]=(rand()*256)/(RAND_MAX+1); *p++=m_Nonce1[i]; } *p++=0; *p++=8; for (i=0;i<8; i++) { m_Nonce2[i]=(rand()*256)/(RAND_MAX+1); *p++=m_Nonce2[i]; } } int res=Send(buffer, p-buffer) == p-buffer; delete [] buffer; return res; }
BOOL CAdminSocket::ParseRecvBuffer() { if (m_nRecvBufferPos<5) return FALSE; if ((m_pRecvBuffer[0]&0x03) != 0) { SendCommand(_T("Protocol error: Unknown command type, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } else { DWORD len; memcpy(&len, m_pRecvBuffer+1, 4); if (len > 0xFFFFFF) { SendCommand(_T("Protocol error: Invalid data length, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } if (m_nRecvBufferPos < len+5) return FALSE; else { int nID = (m_pRecvBuffer[0]&0x7C)>>2; if (m_bStillNeedAuth) { if (nID) { SendCommand(_T("Protocol error: Not authenticated, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } if (len != 16) { SendCommand(_T("Protocol error: Auth data len invalid, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } MD5 md5; md5.update(m_Nonce1, 8); COptions options; CStdString pass = options.GetOption(OPTION_ADMINPASS); if (pass.GetLength() < 6) { SendCommand(_T("Protocol error: Server misconfigured, admin password not set correctly"), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } md5.update((unsigned char *)pass.c_str(), pass.GetLength()); md5.update(m_Nonce2, 8); md5.finalize(); unsigned char *digest = md5.raw_digest(); if (memcmp(m_pRecvBuffer + 5, digest, 16)) { SendCommand(_T("Protocol error: Auth failed, closing connection."), 1); Close(); m_pAdminInterface->Remove(this); return FALSE; } delete [] digest; FinishLogon(); } else m_pAdminInterface->ProcessCommand(this, nID, m_pRecvBuffer+5, len); memmove(m_pRecvBuffer, m_pRecvBuffer+len+5, m_nRecvBufferPos-len-5); m_nRecvBufferPos-=len+5; } } return TRUE; }