VC 模擬CMD 匿名管道

2022-04-01 01:17:52 字數 3026 閱讀 8082

#include "stdafx.h"

#include #include #include int call(char cmd)

startupinfo si;

process_information pi;

zeromemory(&si,sizeof(startupinfo));

si.cb = sizeof(startupinfo);

getstartupinfo(&si);

si.hstderror = hwrite;

si.hstdoutput = hwrite;

si.wshowwindow = sw_hide;

si.dwflags = startf_useshowwindow | startf_usestdhandles;

memset(&pi,0,sizeof(process_information));

char cmdline[1024 ] = "cmd /c";

strcat(cmdline,cmd);

if (!createprocessa(null,cmdline,null,null,true,null,null,null,&si,&pi))

closehandle(hwrite);

char buff[1024] = ;

//char cres[max_path] = ;

dword bytesread;

while (true)

int ilen = strlen(buff);

for (int i =0;i使用管道createpipe,來進行程序間的相互通訊,然後在進行資料的讀取。

什麼是管道,管道就是一種通訊機制,也就是記憶體共享,乙個程序向管道寫入資料後,由另外乙個管道讀出。

匿名管道是在父程序和子程序間單向傳輸資料的一種未命名的管道,只能在本地計算機中使用,而不可用

於網路間的通訊。

匿名管道由createpipe()函式建立,該函式在建立匿名管道的同時返回兩個控制代碼:管道讀控制代碼和管道寫句

柄。createpipe()的函式原型為:

bool createpipe(

phandle hreadpipe,    // 指向讀控制代碼的指標

phandle hwritepipe, &nb sp;  // 指向寫控制代碼的指標

lpsecurity_attributes lppipeattributes,  // 指向安全屬性的指標

dword nsize     // 管道大小

);   

返回值   

long,非零表示成功,零表示失敗。會設定getlasterror

程式具體實現過程:

(1) 初始化安全屬性的指標 //建立匿名管道前期,就得初始化安全屬性的指標。

security_attributes sa;

sa.nlength = sizeof(sa);

sa.lpsecuritydescriptor = 0;

sa.binherithandle = true;

(2) 建立匿名管道 //開始建立匿名管道

handle hreadpipe1,hwritepipe1;

createpipe(&hreadpipe1,&hwritepipe1,&sa,0);

在建立程序前,先初始化兩個結構體:lpstartupinfo 和lpprocess_information

startupinfo結構用於指定新程序的主視窗特性,應用程式必須將cb初始化為sizeof(startupinfo)

startf_useshowwindow使用wshowwindow成員:wshowwindow用於設定如果子應用程式初次呼叫的

showwindows將sw_showdefault作為ncmdshow引數傳遞時,該應用程式的第乙個重疊視窗應該如何出現。

startf_usestdhandles使用hstdinput、hstdoutput和hstderror成員:handle hstdinput用於設定供控制台

輸入和輸出用的快取的控制代碼。按照預設設定,hstdinput 用於標識鍵盤快取,hstdoutput和hstderror用於

標識控制台視窗的快取。

startupinfo si;

memset(&si,0,sizeof(si));

getstartupinfo(&si);  //該函式返回程序在啟動時被指定的startupinfo 結構

si.cb = sizeof(si);

si.dwflags = startf_useshowwindow | startf_usestdhandles;

si.wshowwindow = sw_hide;

si.hstdoutput = si.hstderror = hwritepipe1;

process_information pinfo;

memset(&pinfo,0,sizeof(process_information));

建立程序

char szcmd[maxlength] = "cmd.exe /c";

//接收遠端傳入的程序執行引數

int dwsize = ((ratproto*)szrecvcmd)->ratlen - sizeof(ratproto);

strncat(szcmd,szrecvcmd+sizeof(ratproto),dwsize);

createprocessa(null,szcmd,null,null,1,0,null,null,&si,&pinfo);

(3) 通過管道通訊,得到程序執行結果

memset(szcmd,0,maxlength);

int dwread;

//判斷管道內是否有傳入資料

int nret = peeknamedpipe(hreadpipe1,szcmd,maxlength,(lpdword)&dwread,null,null);

for (int i=0;i<5&&dwread==0;i++)

if (dwread)  }

(4) 將執行結果傳給客戶端

.......

獲取CMD執行結果 匿名管道

管道是一種在程序間共享資料的機制,其實質是一段共享記憶體。windows系統為這段共享的記憶體設計使用資料流i o的方式來訪問。乙個程序讀,另乙個程序寫,這類似於乙個管道的兩端,因此這種程序間的通訊方式稱為 管道 管道分為匿名管道和命名管道。匿名管道只能在父子程序間進行通訊,不能在網路間通訊,而且資...

利用匿名管道實現CMD回顯

security attributes sa handle hread,hwrite sa.nlength sizeof security attributes sa.lpsecuritydescriptor null 使用系統預設的安全描述符 sa.binherithandle true 建立的程...

匿名管道實現基於Socket的簡單cmd後門

back.h ifndef backdoor h define backdoor h extern handle hreadone pipe one read extern handle hwriteone pipe one write extern handle hwritetwo pipe tw...