#include "stdafx.h"匿名管道由createpipe()函式建立,該函式在建立匿名管道的同時返回兩個控制代碼:管道讀控制代碼和管道寫句#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()的函式原型為:
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...