红队专题-从零开始VC++远程控制软件RAT-C/S-[3]客户端与服务端连接

在这里插入图片描述

红队专题

  • 招募六边形战士队员
  • 完善 信息条目OnBeginListen 函数
  • Common头文件新建项
    • 结构体宏定义
  • m_Mysocket C++类的编写
    • 添加C++类
  • itemData调用

招募六边形战士队员

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

完善 信息条目OnBeginListen 函数

前情回顾

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

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

红队专题-从零开始VC++远程控制软件RAT-C/S-[3]客户端与服务端连接_第1张图片

结构体宏定义

#pragma once
#include "stdafx.h"
#define SYSINFO  0x01


//  两个消息  上线  下线信息
#define ID_ONLINE WM_USER+1  
#define ID_OFFLINE WM_USER+2

typedef struct tagMSGINFO //传输消息结构体
{
    int Msg_id;
    BYTE context[1024*5];
}MSGINFO;

typedef struct tagSYSTEMINFO //上线信息
{
    int os;
    bool Cam; //摄像头
    double ver;
}SYSTEMINFO;

m_Mysocket C++类的编写

添加C++类

红队专题-从零开始VC++远程控制软件RAT-C/S-[3]客户端与服务端连接_第2张图片

头文件

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

红队专题-从零开始VC++远程控制软件RAT-C/S-[3]客户端与服务端连接_第3张图片

你可能感兴趣的:(c++,c语言,服务器)