描述
- 利用
CreateProcess
和匿名管道,获取远程命令执行的结果
- 使用
MoveFileEx
和批处理脚本,实现文件自删除
远程CMD
- 关键在于捕获命令的输出结果
- 创建匿名管道,一端写,一端读
- 用
CreateProcess
创建进程,并将输出重定向到写端的管道
- 用
WaitForSingleObject
等到主线程和进程执行完毕
- 将读端的管道的内容读入缓冲区
#include "stdafx.h"
#include "PipeCmd.h"
void ShowError(char *pszText)
{
char szErr[MAX_PATH] = {0};
::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
::MessageBox(NULL, szErr, "ERROR", MB_OK);
}
BOOL PipeCmd(char *pszCmd, char *pszResultBuffer, DWORD dwResultBufferSize)
{
HANDLE hReadPipe = NULL;
HANDLE hWritePipe = NULL;
SECURITY_ATTRIBUTES securityAttributes = {0};
BOOL bRet = FALSE;
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
securityAttributes.bInheritHandle = TRUE;
securityAttributes.nLength = sizeof(securityAttributes);
securityAttributes.lpSecurityDescriptor = NULL;
bRet = ::CreatePipe(&hReadPipe, &hWritePipe, &securityAttributes, 0);
if (FALSE == bRet)
{
ShowError("CreatePipe");
return FALSE;
}
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
bRet = ::CreateProcess(NULL, pszCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if (FALSE == bRet)
{
ShowError("CreateProcess");
}
::WaitForSingleObject(pi.hThread, INFINITE);
::WaitForSingleObject(pi.hProcess, INFINITE);
::RtlZeroMemory(pszResultBuffer, dwResultBufferSize);
::ReadFile(hReadPipe, pszResultBuffer, dwResultBufferSize, NULL, NULL);
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
::CloseHandle(hWritePipe);
::CloseHandle(hReadPipe);
return TRUE;
}
#include "stdafx.h"
#include "PipeCmd.h"
int _tmain(int argc, _TCHAR* argv[])
{
char szCmd[] = "ping 127.0.0.1";
char szResultBuffer[512] = {0};
DWORD dwResultBufferSize = 512;
if (FALSE == PipeCmd(szCmd, szResultBuffer, dwResultBufferSize))
{
printf("pipe cmd error.\n");
}
else
{
printf("CMD执行结果为:\n%s\n", szResultBuffer);
}
system("pause");
return 0;
}
文件自删除
利用MoveFileEx
函数自删除
#include "stdafx.h"
#include <Windows.h>
BOOL RebootDelete(char *pszFileName)
{
char szTemp[MAX_PATH] = "\\\\?\\";
::lstrcat(szTemp, pszFileName);
BOOL bRet = ::MoveFileEx(szTemp, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
return bRet;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (FALSE == RebootDelete("C:\\Users\\Test\\Desktop\\520.exe"))
{
printf("Set Reboot Delete Error.\n");
}
else
{
printf("Set Reboot Delete OK.\n");
}
system("pause");
return 0;
}
批处理脚本
- 通过
del *.exe
、del %0
删除程序和bat脚本自身
- 利用ping、choice等命令延迟执行删除指令,保证程序执行完后再删除
- 写一个生成bat脚本的程序,并用
CreateProcess
通过cmd调用脚本,创建进程成功后,立即结束进程
#include "stdafx.h"
#include <Windows.h>
BOOL CreateChoiceBat(char *pszBatFileName)
{
int iTime = 5;
char szBat[MAX_PATH] = { 0 };
::wsprintf(szBat, "@echo off\nchoice /t %d /d y /n >nul\ndel *.exe\ndel %%0\n", iTime);
FILE *fp = NULL;
fopen_s(&fp, pszBatFileName, "w+");
if (NULL == fp)
{
return FALSE;
}
fwrite(szBat, (1 + ::lstrlen(szBat)), 1, fp);
fclose(fp);
return TRUE;
}
BOOL CreatePingBat(char *pszBatFileName)
{
int iTime = 5;
char szBat[MAX_PATH] = {0};
::wsprintf(szBat, "@echo off\nping 127.0.0.1 -n %d\ndel *.exe\ndel %%0\n", iTime);
FILE *fp = NULL;
fopen_s(&fp, pszBatFileName, "w+");
if (NULL == fp)
{
return FALSE;
}
fwrite(szBat, (1 + ::lstrlen(szBat)), 1, fp);
fclose(fp);
return TRUE;
}
BOOL DelSelf(int iType)
{
BOOL bRet = FALSE;
char szCurrentDirectory[MAX_PATH] = {0};
char szBatFileName[MAX_PATH] = {0};
char szCmd[MAX_PATH] = {0};
::GetModuleFileName(NULL, szCurrentDirectory, MAX_PATH);
char *p = strrchr(szCurrentDirectory, '\\');
p[0] = '\0';
::wsprintf(szBatFileName, "%s\\temp.bat", szCurrentDirectory);
::wsprintf(szCmd, "cmd /c call \"%s\"", szBatFileName);
if (0 == iType)
{
bRet = CreateChoiceBat(szBatFileName);
}
else if (1 == iType)
{
bRet = CreatePingBat(szBatFileName);
}
if (bRet)
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi;
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;
BOOL bRet = CreateProcess(
NULL,
szCmd,
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
if (bRet)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
exit(0);
::ExitProcess(NULL);
}
}
return bRet;
}
int _tmain(int argc, _TCHAR* argv[])
{
BOOL bRet = DelSelf( 0 );
if (FALSE == bRet)
{
printf("Selft Delete Error!\n");
}
else
{
printf("Selft Delete OK!\n");
}
system("pause");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库