首页
社区
课程
招聘
[求助]cmd管道重定向的衍生——“管道嵌套”产生的问题
发表于: 2011-9-5 11:02 12306

[求助]cmd管道重定向的衍生——“管道嵌套”产生的问题

2011-9-5 11:02
12306
近日在编写一个小工具,其中需要实现一个类似远程控制工具中常用的cmd功能,看了一下类似的功能的源码并自己改了一下,写了个控制台程序Pipe.exe:基本功能是打开一个cmd进程并将输入输出重定向到Pipe.exe并由Pipe负责输出到控制台下。

Pipe可以完成基本功能,但是发现一个奇怪的问题:在Pipe打开的cmd进程再次打开Pipe没有输出,用ProcessExplorer查看发现Pipe的子进程cmd正常启动了另一个pipe,而且这个pipe也能启动cmd如图。


将pipe复制一份为p.exe,入口插入一个int3断点用OD调试发现函数call都正常,怀疑最终问题还是出现在管道通信的原理上。

想不明白为什么在最顶层的pipe不能接收到子pipe启动的cmd的输出,有兄弟遇到过类似的问题吗。源码在附件,谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
2
popen
fgets
2011-9-5 11:08
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢Sysnap的回复

这个程序的功能是实现一个交互式的shell,但有些功能需要在一个shell进程里实现,所以popen在这里可能不适合。sorry,在帖子里没有说明。
2011-9-5 11:18
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
说实话,没看懂LZ的什么CMD又启动pipe的 = =#
我说一下我的拙见.
远程CMD的client端创建一个匿名管道,负责cmd.exe的stdin,stdout读写.
与server通信,将收到的命令写入管道,将读到的回显信息发送给server.
(这个过程中怎么会有子进程又子进程的...- -#鄙人愚钝..求点拨)

client大致流程(socket部分代码就不写了):
{
        HANDLE hRead,hWrite;
        SECURITY_ATTRIBUTES sa;
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        char buff[1024];
        DWORD readed;

        sa.bInheritHandle = false;
        sa.lpSecurityDescriptor = NULL;
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);

        CreatePipe(&hRead,&hWrite,&sa,0);

        GetStartupInfo(&si);
        si.hStdInput = hWrite;
        si.hStdOutput = hRead;

        CreateProcess("c:\\windows\\system32\\cmd.exe",NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS ,NULL,NULL,&si,&pi);

        while(1){
                do
                {
                        ReadFile(hRead,buff,1024,&readed,NULL);
                        //printf("%s",buff);

                        向server发送buff内容();

                }while(readed==1024);
                //scanf("%s",buff);

                等待server端指令(); //recv是阻塞函数

                WriteFile(hWrite,buff,strlen(buff),&readed,NULL);
        }
        return 0;
}
2011-9-5 12:38
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
嗯,这个问题还是本人表述的不是十分清楚,大家可能不是很理解,说说思路和背景吧。

是这样的,有个以系统服务权限启动的远控,可以得到这个远控返回的shell(称其为SHELL_A)。现在需要通过这个SHELL_A启动另一个SHELL_B,以其他用户的身份完成一些事情。但是,通过这个远控得到的SHELL_A以CreateProcess方式启动cmd.exe经过单纯的shell是回不来的,所以想写个工具将另外cmd.exe的输入输出重定向到这个远控回连的SHELL_A。

pipe.exe的目的就是为了完成这个工作,但是通过远控测试发现执行pipe之后,新启动的cmd.exe的输出并没有被重定向到SHELL_A中。联想到回连shell的机制应该与pipe相同,故在本机执行pipe得到的shell中再次执行pipe,发生的现象与上面测试一致,所以推测可能是管道上产生的问题。
2011-9-5 13:42
0
雪    币: 192
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主pm我个联系方式嘛,谢谢!
2011-9-13 12:36
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
可以参考hxdef100相关代码,直接是拷贝cmd屏幕的
2011-12-14 09:29
0
雪    币: 26
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
请问楼主这个问题解决了没有?
2012-11-22 10:14
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我也想问问这个问题解决了没有,如何解决?最近遇到了类似的问题!
2013-6-26 16:38
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
问题解决了,有三种途径

1.下面这个代码是可以的,效果见图
http://bbs.pediy.com/showthread.php?t=21518



2.当时还在codeproject上找了这个文章,当时测试结果忘了
http://www.codeproject.com/Articles/16163/Real-Time-Console-Output-Redirection

3.对于telnet这种的交互式程序,当时我正好有个类似的命令行下面用的马,弄个线程进去定时fflush()应该就有回显了

后来我调了cmd,在嵌套的情况下,内层cmd是能正确得到输入的命令的,说明问题应该是出在显示上面。
用nc和上面看雪帖子里面的filtercmd是完全可以的,所以应该是我发帖之前自己写的代码上的问题,当然最好还是参考hxdef。
上传的附件:
2013-6-27 10:54
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢lhjjx兄的回答。我使用了第一种方法的filtercmd。但是ftp还是无法交互。
在输入ftp命令后,tasklist显示ftp.exe打开,但是我这边无法输入命令了。怀疑是输入焦点转移到ftp.exe 上了。望解答。
如下图:
上传的附件:
  • 1.jpg (63.47kb,11次下载)
2013-6-27 17:47
0
雪    币: 258
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
自己改一个ftp.exe,在里面起一个线程定时调用fflush(),或者可以使用vb脚本模拟键盘输入操作ftp,命令写在txt里面,telnet和这个类似。
2013-6-28 11:22
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢回答!
不光是ftp,还有ssh啥的。主要是要解决交互的问题。ftp只是个例子。
看来只能是先参考hxdef了
再次感谢lhjjx兄!
2013-6-28 17:20
0
雪    币: 3
活跃值: (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
有hxdef里面操作的源码吗 谢谢分享下
2014-1-13 09:37
0
雪    币: 358
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主的意思是说木马反弹出来的cmd支持交互,像telnet,FTP之类的命令都可以用?那些不是通过管道读取数据的吗?
2014-1-13 15:02
0
雪    币: 3
活跃值: (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
ftp在读取用户的password的时候,是通过CreateFile($CONIN,......), ReadFile得到用户输入的,不是从管道里面读出的,所以一般交互的时候都卡在这里,问题是$CONIN这个句柄对应的输入不能通过WriteFile写入,谁有好的办法解决呢
2014-1-14 10:29
0
游客
登录 | 注册 方可回帖
返回
//