本章内容涉及使用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命令的更多相关文章

  1. [转]Delphi执行CMD命令

    今天看到有人在问用代码执行CMD命令的问题,就总结一下用法,也算做个备忘. Delphi中,执行命令或者运行一个程序有2个函数,一个是winexec,一个是shellexecute.这两个大家应该都见 ...

  2. 如何使用Java执行cmd命令

    用JAVA代码实现执行CMD命令的方法! Runtime rt = Runtime.getRuntime(); Process p = rt.exec(String[] cmdarray);     ...

  3. Java 调用并执行cmd命令

    cmd java 调用 执行 概要: Java 调用并执行cmd命令 Java | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 ...

  4. JAVA之执行cmd命令

    感言在前:时隔好久没有更新博客园了,忙东忙西也没忙出个什么之所以然来.回首过去一两个月,只能用“疲倦”两个字来形容,而且是身心疲惫.每天11.12个小时的工作我都没觉得烦,但是总是想克服却又很难克服的 ...

  5. C# 执行CMD 命令

    /// <summary> /// 执行CMD 命令 /// </summary> /// <param name="strCommand">命 ...

  6. C# 执行CMD命令的方法

    /// <summary> /// 执行CMD命令 /// </summary> /// <param name="str"></para ...

  7. java执行cmd命令并获取输出结果

    1.java执行cmd命令并获取输出结果 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apa ...

  8. Atitit.执行cmd 命令行 php

    Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1 ...

  9. node执行cmd命令方法

    var cmd='tasklist';//获取 子进程模块的exec方法,用于执行cmd命令var exec = require('child_process').exec; //运行 定义的cmd命 ...

  10. java中执行cmd命令

    一.java执行cmd命令的三种方式:http://www.jb51.net/article/80829.htm 参考:https://www.cnblogs.com/zhufu9426/p/7928 ...

随机推荐

  1. 聊聊Excel解析:如何处理百万行EXCEL文件

    一.引言 Excel表格在后台管理系统中使用非常广泛,多用来进行批量配置.数据导出工作.在日常开发中,我们也免不了进行Excel数据处理. 那么,如何恰当地处理数据量庞大的Excel文件,避免内存溢出 ...

  2. Kubernetes(k8s)控制器(五):有状态应用StatefulSet

    目录 一.系统环境 二.前言 三.StatefulSet简介 四.有状态应用和无状态应用区别 五.StatefulSet 5.1 创建StatefulSet 5.2 scale扩展副本数 5.3 创建 ...

  3. border属性之border-radius

    border-radius - 指定每个圆角 如果你在 border-radius 属性中只指定一个值,那么将生成 4 个 圆角. 但是,如果你要在四个角上一一指定,可以使用以下规则: 四个值: 第一 ...

  4. .net 6 winform启动器:调用CMD命令行执行dotnet命令启动.net core程序并将控制台输出日志输出到winform textbox实现实时日志显示

    背景 历史遗留问题,生产车间运行的一个.net core signalr程序使用命令行程序启动,经常由于生产人员误操作将光标停留在控制台上导致程序假死,丢失部分测试数据,车间随便找了一台win10系统 ...

  5. 【渗透测试】Cobalt Strike制作钓鱼邮件渗透Windows

    目标 在kali中使用Cobalt Strike制作钓鱼邮件,对Windows进行渗透 机器环境 kali(服务端):192.168.175.129 win11(攻击机):192.168.175.12 ...

  6. zabbix 主动模式下报文分析

    获取监控项列表 客户端发起请求 3次握手之后,请求监控项列表: {"request":"active checks","host":&quo ...

  7. Robot Framework 自动化测试随笔(一)

    一.安装Robot Framework步骤(安装目录避免中文和特殊字符,建议以管理员身份进行全部安装过程): 1.查看ride最新支持的python版本,据此下载对应python版本: https:/ ...

  8. .NET Core多线 (5) 常见性能问题

    合集:.NET Core多线程温故知新 .NET Core多线程(1)Thread与Task .NET Core多线程(2)异步 - 上 .NET Core多线程(3)异步 - 下 .NET Core ...

  9. KIOPTRIX: LEVEL 1.1 (#2) 常规命令注入+内核提权

    0×02 Vulnhub靶机渗透总结之 KIOPTRIX: LEVEL 1.1 (#2) 系列专栏:Vulnhub靶机渗透系列 欢迎大佬:点赞️收藏关注 首发时间: 2023年8月20日 如有错误 还 ...

  10. Windows 虚拟地址 到底是如何映射到 物理地址 的?

    一:背景 1. 讲故事 我发现有很多的 .NET程序员 写了很多年的代码都没弄清楚什么是 虚拟地址,更不用谈什么是 物理地址 以及Windows是如何实现地址映射的了?这一篇我们就来聊一聊这两者之间的 ...