红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线
  N9D7V8EkcUNl 2023年11月02日 67 0



红队专题

  • 招募六边形战士队员
  • 1.课前回顾
  • unicode编码 字符串
  • 2.界面编程(下)
  • 对话框
  • 重载消息函数
  • 更改对话框同步更改
  • 3.服务端上线,下线,以及客户端的资源销毁(上)
  • 添加socket 变量
  • 添加 socket 消息
  • 填补config信息
  • 创建线程函数 并运行
  • 添加Addhost
  • 添加 getItemData
  • 创建列表节点类
  • ItemData编写
  • 构造函数
  • 类成员监听线程
  • 运行函数
  • 监听线程


红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_初始化


1.课前回顾

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

unicode编码 字符串

_T 宏

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

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_初始化_02


红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_控件_03

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++远程控制软件RAT-C/S-[2]界面编写及上线_c++_04


红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_控件_05

重载消息函数

查看声明

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_初始化_06

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++远程控制软件RAT-C/S-[2]界面编写及上线_c++_07

更改对话框同步更改

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_java_08


初始化时候调用了 updatemain

初始化程序界面

获取客户端程序客户区 界面大小

存放在 m_rect

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

列表控件

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_c++_09

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

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

添加socket 变量

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_java_10

添加 socket 消息

头文件定义 InitSocket

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_控件_11

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++远程控制软件RAT-C/S-[2]界面编写及上线_c语言_12

创建线程函数 并运行

为了适配多线程

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

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++远程控制软件RAT-C/S-[2]界面编写及上线_c语言_13

关闭句柄

添加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++远程控制软件RAT-C/S-[2]界面编写及上线_c++_14


红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_c++_15


头文件中调用这个类

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线_控件_16

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++远程控制软件RAT-C/S-[2]界面编写及上线_c语言_17


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
N9D7V8EkcUNl