網路程式設計 程序間通訊(匿名管道)

2022-02-03 06:31:53 字數 4894 閱讀 9227

匿名管道概述

匿名管道就是沒有名字的管道了,還有一種管道呢,叫做命名管道。

在本地機器上可以使用匿名管道來實現父程序和子程序之間的通訊,這裡需要注意兩點,第一就是在本地機器上,這是因為匿名管道不支援跨網路之間的兩個程序之間的通訊,第二就是實現的是父程序和子程序之間的通訊,而不是任意的兩個程序。說了這麼多,到底怎麼使用匿名管道呢?

匿名管道使用

匿名管道主要用於本地父程序和子程序之間的通訊,

在父程序中,首先是要建立乙個匿名管道,

在建立匿名管道成功後,可以獲取這個匿名管道的讀控制代碼和寫控制代碼(是兩個控制代碼哦),

然後父程序就可以向這個匿名管道中寫入資料和從匿名管道中讀取資料了;

但是如果要實現的是父子程序通訊的話,那麼還必須在父程序中建立乙個子程序,

同時,這個子程序必須能夠繼承和使用父程序的一些公開的控制代碼,

為什麼呢?

因為在子程序中必須要使用父程序建立的匿名管道的讀寫控制代碼,

通過這個匿名管道才能實現父子程序的通訊,所以必須繼承父程序的公開控制代碼。

例如使用匿名管道來實現程序a和程序b之間的通訊,需要建立兩個匿名管道,乙個a傳送資料(使用管道1的寫控制代碼)b接收資料(使用管道1的讀控制代碼)的匿名管道1,乙個b傳送資料(使用管道2的寫控制代碼)a接收資料(使用管道2的讀控制代碼)的匿名管道2,這樣程序a和程序b之間的通訊才能做到「有來有回」。

同時在建立子程序的時候,必須將子程序的標準輸入控制代碼設定為父程序中建立匿名管道時得到的讀管道控制代碼,

將子程序的標準輸出控制代碼設定為父程序中建立匿名管道時得到的寫管道控制代碼。

然後在子程序就可以讀寫匿名管道了。

匿名管道的建立

bool winapi createpipe(
__out   phandlehreadpipe,
__out   phandlehwritepipe,
__in    lpsecurity_attributeslppipeattributes,
__in    dwordnsize);
引數hreadpipe為輸出引數,該控制代碼代表管道的讀取控制代碼。

引數hwritepipe為輸出引數,該控制代碼代表管道的寫入控制代碼。

引數lppipeattributes為乙個輸入引數,指向乙個security_attributes的結構體指標,

其檢測返回的控制代碼是否能夠被子程序繼承,如果此引數為null,則表明控制代碼不能被繼承,

在匿名管道中,由於匿名管道要在父子程序之間進行通訊,而子程序如果想要獲得匿名管道的讀寫控制代碼,則其只能通過從父程序繼承獲得,當乙個子程序從其父程序處繼承了匿名管道的讀寫控制代碼以後,子程序和父程序之間就可以通過這個匿名管道的讀寫控制代碼進行通訊了。所以在這裡必須構建乙個security_attributes的結構體,並且該結構體的第三個結構成員變數binherithandle引數必須設定為true,從而讓子程序可以繼承父程序所建立的匿名管道的讀寫控制代碼。

typedef struct _security_attributes  security_attributes, *lpsecurity_attributes;
子程序的建立

bool  createprocess(
lpcwstrpszimagename,lpcwstrpszcmdline,
lpsecurity_attributespsaprocess,
lpsecurity_attributespsathread,
boolfinherithandles,dwordfdwcreate,
lpvoidpvenvironment,lpwstrpszcurdir,
lpstartupinfowpsistartinfo,
lpprocess_informationpprocinfo);
引數pszimagename是乙個指向null終止的字串,用來指定可執行程式的名稱。

引數pszcmdline用來指定傳遞給新程序的命令列字串,一般做法是在pszimagename中傳遞可執行檔案的名稱,

pszcmdline中傳遞命令列引數。

引數psaprocess即代表當createprocess函式建立程序時,需要給程序物件設定乙個安全性。

引數psathread代表當createprocess函式建立新程序後,需要給該程序的主線程物件設定乙個安全性。

引數finherithandles用來指定父程序隨後建立的子程序是否能夠繼承父程序的物件控制代碼,

如果該引數設定為true,則父程序的每乙個可繼承的開啟控制代碼都將被子程序所繼承,

繼承的控制代碼與原始的控制代碼擁有同樣的訪問權。

在匿名管道的使用中,因為子程序需要使用父程序中建立的匿名管道的讀寫控制代碼,

所以應該將這個引數設定為true,從而可以讓子程序繼承父程序建立的匿名管道的讀寫控制代碼。

引數fdwcreate用來指定控制項優先順序類和程序建立的附加標記。

如果只是為了啟動子程序,則並不需要設定它建立的標記,可以將此引數設定為0

對於這個引數的具體取值列表可以參考msdn 。

引數pvenvironment代表指向環境塊的指標,

如果該引數設定為null,則預設將使用父程序的環境。通常給該引數傳遞null

引數pszcurdir用來指定子程序當前的路徑,

這個字串必須是乙個完整的路徑名,其包括驅動器的識別符號,

如果此引數設定為null,那麼新的子程序將與父程序擁有相同的驅動器和目錄。

引數psistartinfo指向乙個startupinfo的結構體的指標,用來指定新程序的主視窗如何顯示。

typedef struct _startupinfoa  startupinfoa, *lpstartupinfoa;
對於dwflags引數來說,如果其設定為startf_usestdhandles

則將會使用該startupinfo結構體中的hstdinputhstdoutputhstderror成員,

來設定新建立的程序的標準輸入,標準輸出,標準錯誤控制代碼。

引數pprocinfo為乙個輸出引數,

指向乙個process_information結構體的指標,用來接收關於新程序的標識資訊。

typedef struct _process_information
process_information;

其中hprocesshthread分別用來標識新建立的程序控制代碼和新建立的程序的主線程控制代碼。

dwprocessiddwthreadid分別是全域性程序識別符號和全域性執行緒識別符號。

前者可以用來標識乙個程序,後者用來標識乙個執行緒。

前期的準備工作做好了,下面我們來做點小例子,實現乙個雙管道主動連線型後門程式

在肉雞上執行這個程式以後,主機能夠通過telnet偷偷摸摸的連線到肉雞上,在cmd命令列模式下輸入一些命令來檢視肉雞的一些系統資訊,打槍滴不要,幹壞事滴要悄悄滴,嘻嘻

下面是**

在標頭檔案中tpdoor.cpp中定義乙個節點

class cthreadnode

};程式我親自測試過了,沒有問題。

多動手實踐,多想想為什麼,才能慢慢進步,與大家共勉!

程序間通訊 匿名管道

最近實現乙個遠端超級終端的功能,通訊模式是這樣的 客戶端 通過網路傳送cmd命令到 伺服器端 通過程序間通訊 管道 將此cmd命令發給 cmd.exe程式,cmd.exe執行此cmd命令 接下來 cmd.exe 程式將執行結果返回 伺服器端 傳送此次結果到 客戶端,客戶端對結果進行顯示 其中伺服器端...

程序間通訊 匿名管道

1.程序通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳輸給另乙個程序 2 資源共享 多個程序之間共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了什麼事情 2.管道 管道是一種程序之間通訊的一種方式,我們把從乙個程序連線到另乙個程序的資料流叫做管道 3.匿名管道...

程序間通訊 匿名管道

使用匿名管道做程序通訊,需要用父程序建立乙個子程序,該子程序的標準輸入輸出控制代碼由父程序指定。無論父程序還是子程序,都可以收發資料,這裡僅演示父程序發資料,子程序列印資料。父程序迴圈從控制台讀資料,並傳送給子程序,子程序用對話方塊列印資料,約定子程序收到 quit 後退出。define crt s...