• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Проблема Анонимные каналы и поиск файлов через консольную команду "dir"

|Snake|

Green Team
14.03.2018
37
3
BIT
0
Приветствую. Есть задача: разработать программу для вывода списка файлов в указанном каталоге. Для получения списка использовать анонимные каналы.

Как пытаюсь решить: создаю приложение которое вызывает консоль, процессу консоли передаются дескрипторы канала. Вбиваю в консоли нужные команды, вывод идёт на "сервер". Но что-то не получается, запускается консоль не реагирующая ни на что:

C++:
#include <windows.h>
#include <conio.h>
#include <iostream>

using namespace std;

int main()
{
    WCHAR CommandLine[] = L"C:\\Windows\\System32\\cmd.exe";
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    HANDLE hWritePipe, hReadPipe;
    SECURITY_ATTRIBUTES sa;

    // устанавливает атрибуты защиты канала
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    // защита по умолчанию
    sa.bInheritHandle = TRUE;
    // дескрипторы наследуемые

    // создаем анонимный канал
    if (!CreatePipe(
        &hReadPipe,
        // дескриптор для чтения
        &hWritePipe,
        // дескриптор для записи
        &sa,
        // атрибуты защиты по умолчанию,
        // в этом случае дескрипторы
        // hReadPipe и hWritePipe ненаследуемые
        0))
        // размер буфера по умолчанию
    {
        _cputs("Create pipe failed.\n");
        _cputs("Press any key to finish.\n");
        _getch();
        return GetLastError();
    }

    ZeroMemory(&si, sizeof(si));  //обнуляем память
    ZeroMemory(&pi, sizeof(pi));
    si.cb = sizeof(STARTUPINFO);
    // использовать стандартные дескрипторы
    si.dwFlags = STARTF_USESTDHANDLES;
    // устанавливаем стандартные дескрипторы
    si.hStdInput = hReadPipe;
    si.hStdOutput = hWritePipe;
    si.hStdError = hWritePipe;

    // запускаем новый консольный процесс
    if (!CreateProcess(
        CommandLine,
        // имя процесса
        NULL,
        // командная строка
        NULL,
        // атрибуты защиты процесса по умолчанию
        NULL,
        // атрибуты защиты первичного потока по умолчанию
        TRUE,
        // наследуемые дескрипторы текущего процесса
        // наследуются новым процессом
        CREATE_NEW_CONSOLE,
        // новая консоль
        NULL,
        // используем среду окружения процесса предка
        NULL,
        // текущий диск и каталог, как и в процессе предке
        &si,
        // вид главного окна - по умолчанию
        &pi      
    ))
    {
        _cputs("Create process failed.\n");
        _cputs("Press any key to finish.\n");
        _getch();
        return GetLastError();
    }
    // закрываем дескрипторы нового процесса
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
   
    // читаем из анонимного канала
    WIN32_FIND_DATA FindFileData;
    do
    {
        DWORD dwBytesRead;
        if (!ReadFile(
            hReadPipe,
            &FindFileData.cFileName,
            sizeof(FindFileData),
            &dwBytesRead,
            NULL))
        {
            _cputs("Press any key to finish.\n");
            _getch();
            return GetLastError();
        }
        wcout << FindFileData.cFileName << endl;
    } while (FindFileData.cFileName);
    // закрываем дескриптор канала
    CloseHandle(hReadPipe);
    _cputs("The process finished reading from the pipe.\n");
    _cputs("Press any key to exit.\n");
    _getch();
    return 0;
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!