17.1 隐藏执行CMD命令

2023-10-22 10:44
文章标签 命令 隐藏 执行 cmd 17.1

本文主要是介绍17.1 隐藏执行CMD命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本章内容涉及使用Socket APICMD命令行工具实现本地CMD命令执行、无管道正向CMD和无管道反向CMD三种功能。执行本地CMD实现使用CreateProcess函数创建一个新的CMD进程,并将标准输入、输出和错误输出重定向到当前进程的标准输入、输出和错误输出。无管道正向CMD和无管道反向CMD使用WSASocket函数创建TCP套接字,并将CMD进程的标准输入、输出和错误输出重定向到套接字的句柄上,通过网络连接实现远程命令执行功能。

首先来实现一个CMD命令行运行功能,通过使用CreatePipe创建匿名管道,并使用CreateProcess函数创建一个新的CMD进程,然后将标准输入、输出和错误输出重定向到当前进程的标准输入、输出和错误输出。这样就可以通过当前进程的输入输出来执行CMD命令并获取命令输出结果。

CreatePipe 函数,用于创建一个匿名管道。匿名管道是一种用于进程间通信的机制,允许一个进程将输出数据传输给另一个进程。CreatePipe函数的原型如下:

BOOL CreatePipe(PHANDLE               hReadPipe,PHANDLE               hWritePipe,LPSECURITY_ATTRIBUTES lpPipeAttributes,DWORD                 nSize
);

参数hReadPipehWritePipe是指向HANDLE类型的指针,用于接收创建的管道的读端和写端的句柄。参数lpPipeAttributes是一个指向SECURITY_ATTRIBUTES结构体的指针,用于设置管道的安全性。参数nSize是一个DWORD类型的值,用于指定管道的缓冲区大小,通常可以设置为0表示使用系统默认值。

创建匿名管道后,可以使用ReadFile函数从管道的读端读取数据,使用WriteFile函数将数据写入管道的写端。在使用完管道后,应使用CloseHandle函数关闭管道的句柄,以释放资源。

CreateProcess 函数可以创建一个新的进程,并为该进程分配内存空间、初始化环境变量、创建主线程等。其中,参数lpApplicationName用于指定需要执行的可执行文件名,参数lpCommandLine用于指定命令行参数。如果lpApplicationName参数为NULL,则系统会自动使用lpCommandLine参数指定的命令行来创建进程。

该函数原型如下:

BOOL CreateProcess(LPCSTR                lpApplicationName,LPSTR                 lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL                  bInheritHandles,DWORD                 dwCreationFlags,LPVOID                lpEnvironment,LPCSTR                lpCurrentDirectory,LPSTARTUPINFO         lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation
);

该函数可以创建包括控制台窗口的进程。如果需要使用CreateProcess()函数创建不带控制台窗口的进程,则需要在dwCreationFlags参数中指定CREATE_NO_WINDOW标志位。

在创建进程时,可以通过STARTUPINFO结构体设置进程的一些属性,例如标准输入、标准输出和标准错误输出的重定向,启动窗口的显示方式等。同时,CreateProcess()函数会返回一个PROCESS_INFORMATION结构体,其中包含新进程的句柄和ID等信息。

如下RunCommand函数所示,该函数传入一个字符串类型的命令参数,并返回一个字符串执行结果,在函数内部,使用 CreatePipe() 函数创建了一个匿名管道,并使用 CreateProcess() 函数启动了一个新的 CMD 进程并将其标准输出和错误输出重定向到管道的写入端。接着使用 ReadFile() 函数从管道的读取端读取输出数据,并将读取到的数据存储到一个缓冲区中。最后,它将缓冲区的内容拼接成一个完整的输出结果返回给调用者。

// 以隐藏方式执行CMD命令
BOOL RunCommand(char* cmdStr, char* message)
{DWORD readByte = 0;// 执行命令行char command[1024] = { 0 };// 缓冲区char buf[8192] = { 0 };HANDLE hRead, hWrite;// 启动配置信息STARTUPINFO si;// 进程信息PROCESS_INFORMATION pi;// 管道安全属性SECURITY_ATTRIBUTES sa;// 拼接CMD命令sprintf(command, "cmd.exe /c %s", cmdStr);// printf("-- CMD 命令: [%s]n", command);// 配置管道安全属性sa.nLength = sizeof(sa);// 管道句柄可被继承sa.bInheritHandle = TRUE;sa.lpSecurityDescriptor = NULL;// 创建匿名管道,管道句柄是可被继承的if (!CreatePipe(&hRead, &hWrite, &sa, 1024)){// printf("管道创建失败 %xn", (unsigned int)GetLastError());return FALSE;}// 配置 cmd 启动信息ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);                                       // 获取兼容大小si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; // 标准输出等使用额外的si.wShowWindow = SW_HIDE;                                 // 隐藏窗口启动si.hStdOutput = si.hStdError = hWrite;                    // 输出流和错误流指向管道写的一头// 创建子进程,运行命令,子进程是可继承的if (!CreateProcess(NULL,       // 不传程序路径, 使用命令行command,    // 命令行命令NULL,       // 不继承进程句柄(默认)NULL,       // 不继承线程句柄(默认)TRUE,       // 继承句柄0,          // 没有创建标志(默认)NULL,       // 使用默认环境变量NULL,       // 使用父进程的目录&si,        // STARTUPINFO 结构存储启动信息&pi))       // PROCESS_INFORMATION 保存启动后的进程相关信息{// printf("创建进程失败 %x \n", (unsigned int)GetLastError());CloseHandle(hRead);CloseHandle(hWrite);return FALSE;}CloseHandle(hWrite);/*管道的 write 端句柄已被 cmd 的输出流和错误流继承,即 cmd 输出时会把数据写入管道。我们通过读取管道的 read 端,就可以获得 cmd 的输出*/while (ReadFile(hRead, buf, 8192, &readByte, NULL)){strcat(message, buf);ZeroMemory(buf, 8192);}//printf("-- [CMD] Message: [%s] Length:%d n", message, strlen(message) + 1);CloseHandle(hRead);return TRUE;
}

上述函数的调用非常容易,我们以执行ipconfig函数为例,调用案例为RunCommand((char*)"ipconfig", szBuffer),函数执行命令ipconfig参数,并将返回值存储值szBuffer变量内,输出效果图如下所示;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/4fefd4fc.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

这篇关于17.1 隐藏执行CMD命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/260916

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061