红队专题
- 招募六边形战士队员
- 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 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);
// 还是记录初始值
}
更改对话框同步更改
初始化时候调用了 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; //声明新的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);
创建列表节点类
头文件中调用这个类
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 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() //等待完善
{
}