• win32


    如果要将exe的输出重定向到cmd,则可以使用匿名管道将子进程的标准输入和输出句柄重定向。请注意,命名管道也可以用于重定向进程I / O

    //CMD.exe
    #include <windows.h> 
    #include <tchar.h>
    #include <stdio.h> 
    #include <strsafe.h>
    
    #define BUFSIZE 4096 
    
    HANDLE g_hChildStd_IN_Rd = NULL;
    HANDLE g_hChildStd_IN_Wr = NULL;
    HANDLE g_hChildStd_OUT_Rd = NULL;
    HANDLE g_hChildStd_OUT_Wr = NULL;
    
    HANDLE g_hInputFile = NULL;
    
    void CreateChildProcess(void);
    void ReadFromPipe(void);
    void ErrorExit(LPCWSTR);
    
    int _tmain(int argc, TCHAR* argv[])
    {
        SECURITY_ATTRIBUTES saAttr;
    
        printf("
    ->Start of parent execution.
    ");
    
        // Set the bInheritHandle flag so pipe handles are inherited. 
    
        saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
        saAttr.bInheritHandle = TRUE;
        saAttr.lpSecurityDescriptor = NULL;
    
        // Create a pipe for the child process's STDOUT.   
    
        if (!CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0))
            ErrorExit(L"StdoutRd CreatePipe");
        
        // Ensure the read handle to the pipe for STDOUT is not inherited.
    
        if (!SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0))
            ErrorExit(L"Stdout SetHandleInformation");
    
        // Create a pipe for the child process's STDIN. 
    
        if (!CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0))
            ErrorExit(L"Stdin CreatePipe");
    
        // Ensure the write handle to the pipe for STDIN is not inherited. 
    
        if (!SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0))
            ErrorExit(L"Stdin SetHandleInformation");
    
        // Create the child process. 
    
        CreateChildProcess();
    
        // Read from pipe that is the standard output for child process. 
    
        printf("
    ->Contents of child process STDOUT:
    
    ");
        ReadFromPipe();
    
        printf("
    ->End of parent execution.
    ");
    
        return 0;
    }
    
    void CreateChildProcess()
    // Create a child process that uses the previously created pipes for STDIN and STDOUT.
    {
        TCHAR szCmdline[] = TEXT("Child.exe");
        PROCESS_INFORMATION piProcInfo;
        STARTUPINFO siStartInfo;
        BOOL bSuccess = FALSE;
    
        // Set up members of the PROCESS_INFORMATION structure. 
    
        ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
    
        // Set up members of the STARTUPINFO structure. 
        // This structure specifies the STDIN and STDOUT handles for redirection.
    
        ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
        siStartInfo.cb = sizeof(STARTUPINFO);
        siStartInfo.hStdError = g_hChildStd_OUT_Wr;
        siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
        siStartInfo.hStdInput = g_hChildStd_IN_Rd;
        siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
    
        // Create the child process. 
    
        bSuccess = CreateProcess(NULL,
            szCmdline,     // command line 
            NULL,          // process security attributes 
            NULL,          // primary thread security attributes 
            TRUE,          // handles are inherited 
            0,             // creation flags 
            NULL,          // use parent's environment 
            NULL,          // use parent's current directory 
            &siStartInfo,  // STARTUPINFO pointer 
            &piProcInfo);  // receives PROCESS_INFORMATION 
    
         // If an error occurs, exit the application. 
        if (!bSuccess)
            ErrorExit(L"CreateProcess");
        else
        {
            // Close handles to the child process and its primary thread.
            // Some applications might keep these handles to monitor the status
            // of the child process, for example. 
    
            CloseHandle(piProcInfo.hProcess);
            CloseHandle(piProcInfo.hThread);
    
            // Close handles to the stdin and stdout pipes no longer needed by the child process.
            // If they are not explicitly closed, there is no way to recognize that the child process has ended.
    
            CloseHandle(g_hChildStd_OUT_Wr);
            CloseHandle(g_hChildStd_IN_Rd);
        }
    }
    
    void ReadFromPipe(void)
    // Read output from the child process's pipe for STDOUT
    // and write to the parent process's pipe for STDOUT. 
    // Stop when there is no more data. 
    {
        DWORD dwRead, dwWritten;
        CHAR chBuf[BUFSIZE];
        BOOL bSuccess = FALSE;
        HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
        for (;;)
        {
            bSuccess = ReadFile(g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
            if (!bSuccess || dwRead == 0) break;
    
            bSuccess = WriteFile(hParentStdOut, chBuf,
                dwRead, &dwWritten, NULL);
            if (!bSuccess) break;
        }
    }
    
    void ErrorExit(LPCWSTR lpszFunction)
    // Format a readable error message, display a message box, 
    // and exit from the application.
    {
        LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;
        DWORD dw = GetLastError();
    
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR)&lpMsgBuf,
            0, NULL);
    
        lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
            (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
        StringCchPrintf((LPTSTR)lpDisplayBuf,
            LocalSize(lpDisplayBuf) / sizeof(TCHAR),
            TEXT("%s failed with error %d: %s"),
            lpszFunction, dw, lpMsgBuf);
        MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
    
        LocalFree(lpMsgBuf);
        LocalFree(lpDisplayBuf);
        ExitProcess(1);
    }
    //child.exe
    #include <windows.h>
    #include <stdio.h>
    
    #define BUFSIZE 4096 
    #pragma warning(disable:4996)
    
    int main(void)
    {
        CHAR chBuf[BUFSIZE] = "Hello World";
        DWORD dwRead, dwWritten;
        HANDLE hStdin, hStdout;
        BOOL bSuccess;
    
        hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
        hStdin = GetStdHandle(STD_INPUT_HANDLE);
        if (
            (hStdout == INVALID_HANDLE_VALUE) ||
            (hStdin == INVALID_HANDLE_VALUE)
            )
            ExitProcess(1);
    
        // Send something to this process's stdout using printf.
        printf("
     ** This is a message from the child process. ** 
    ");
    
        // This simple algorithm uses the existence of the pipes to control execution.
        // It relies on the pipe buffers to ensure that no data is lost.
        // Larger applications would use more advanced process control.
    
        for (;;)
        {
    
            // Write to standard output and stop on error.
            bSuccess = WriteFile(hStdout, chBuf, strlen(chBuf)+1, &dwWritten, NULL);
    
            if (!bSuccess)
                break;
        }
        return 0;
    }

    重定向exe的输入和输出,重点就是使用CreateProcess将CMD.exe的管道output和input添加到child.exe上面。

    微软文档介绍: Creating a Child Process with Redirected Input and Output

  • 相关阅读:
    汇编入门——使用DOSBox写一个HelloWorld以及相关软件安装
    HCNA-链路聚合(手工模式)
    逆向工程-真码保存在系统文件破解QQ游戏对对碰助手
    逆向工程-获得IPsearch的注册码
    遇见tongtong的思绪
    rhel7--06-预习--磁盘分区命令
    rhel7--05--第三章管道符与重定向符
    rhel7--01--安装
    虚拟机Centos8,没有网络,wired图标消失
    kali是靶体,内置工具可就地取材------网络安全法要天天供奉
  • 原文地址:https://www.cnblogs.com/strive-sun/p/13883180.html
Copyright © 2020-2023  润新知