红队专题
- 招募六边形战士队员
- 1.课前回顾
- unicode编码 字符串
- 2.界面编程(下)
- 对话框
- 重载消息函数
- 更改对话框同步更改
- 3.服务端上线,下线,以及客户端的资源销毁(上)
- 添加socket 变量
- 添加 socket 消息
- 填补config信息
- 创建线程函数 并运行
- 添加Addhost
- 添加 getItemData
- 创建列表节点类
- ItemData编写
- 构造函数
- 类成员监听线程
- 运行函数
- 监听线程
招募六边形战士队员
一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
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("未知"));}
}头文件#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() //等待完善
{
}