перехват console i/o

Тема в разделе "WASM.BEGINNERS", создана пользователем red_mould, 12 авг 2011.

  1. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Из пеба ты вытяниш либог хендлый консоли либо линдлы пайпа (это если был редирект).
    После того как создал пайп на стороне драйвера нужно к нему присоединится, создать новый хендел, либо же в текущем процессе либо же в драйвере.(CreateFile) и вот его и подсунуть в PEB./
     
  2. red_mould

    red_mould New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2010
    Сообщения:
    34
    Ну вот в этом и проблема. Я создаю пайп (хендел возвращается ну и возвращается STATUS_PENDING ), и когда пытаюсь присоединиться к нему, ZwWaitForSingleObject уходит в ожидание и сидит там до второго пришествия. Или же надо полученный хендел попробовать открыть как-то?
     
  3. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Вам надо подсоединется к хендлу по которому вы ожидаете.
    В данном контексте будет равен ZwWaitForSingleObject
    http://msdn.microsoft.com/en-us/library/aa365146%28v=vs.85%29.aspx, и конечно будет ждать очень долго(без конечно) так как к нему не кто не подсоединяется. Вам нужно создать пайп-клинет с этим же именем что и пайп сервер. Пожалуйста почитайте про пайпы. http://msdn.microsoft.com/en-us/library/aa365780%28v=VS.85%29.aspx
     
  4. red_mould

    red_mould New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2010
    Сообщения:
    34
    shchetinin
    мдя, с файлом что-то я этот вопрос протупил... Бывает. Короче говоря. Пайпа создается, привязываю клиентскую часть уже непосредственно в PEB. После чего я в цикле пытаюсь посмотреть есть ли что-то в пайпе. А именно так
    Код (Text):
    1. ntStatus = ZwFsControlFile(hNewStdin, NULL, NULL, NULL, &iostBlock, FSCTL_PIPE_PEEK, NULL, 0, &pBuffer, sizeof(FILE_PIPE_PEEK_BUFFER));
    2.    if (ntStatus == STATUS_PENDING)
    3.    {
    4.      
    5.       if (!NT_SUCCESS(ZwWaitForSingleObject(hNewStdin, FALSE, NULL)))
    6.       {
    7.          DPRINT("ZwWaitForSingleObject was failed\n");
    8.       }
    9.    }
    10.    else if (!NT_SUCCESS(ntStatus))
    11.    {
    12.       DPRINT("ZwFsControlFile was failed\n");
    13.       return ntStatus;
    14.    }
    Но тем не менее в пайпу какого-то ляда ничего не приходит. Дескрипторы подменяю так
    Код (Text):
    1. NTSTATUS GetDescriptors()
    2. {
    3.    NTSTATUS ntStatus = STATUS_SUCCESS;
    4.    PROCESS_BASIC_INFORMATION pi;
    5.    DWORD retLen = 0;  
    6.  
    7.    ntStatus = ZwQueryInformationProcess(NtCurrentProcess(), ProcessBasicInformation, &pi, sizeof(PROCESS_BASIC_INFORMATION), &retLen);
    8.    if (!NT_SUCCESS(ntStatus))
    9.    {
    10.       DPRINT("ZwQueryInformationProcess was failed\n");
    11.       return ntStatus;
    12.    }
    13.  
    14.    hOldStdin = pi.PebBaseAddress->ProcessParameters->StandardInput;
    15.    hOldStdout = pi.PebBaseAddress->ProcessParameters->StandardOutput;
    16.    //pi.PebBaseAddress->ProcessParameters->StandardInput = hNewStdin;
    17.    pi.PebBaseAddress->ProcessParameters->StandardOutput = hClientPipe;
    18.  
    19.    KeSetEvent(&evGetHandle, IO_NO_INCREMENT, FALSE);
    20.    return STATUS_SUCCESS;
    21. }
     
  5. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    red_mould
    Вы не сделали подключение к пайпу.
    И так есть серверная часть(вы её реализовали) теперь пам нужна часть клиента.
    Объсняюсь на пальцах(точнее на Win32)

    Сервер:
    HANDLE hPipe = CreateNamedPipe ("ServerPipeName") ;// Это было создания пайпа. NtCreateNamedPipeFile
    ConnectNamedPipe(hPipe) ;//Сдесь вы ожидаете клиента, у вас это будет функция ZwFsControlFile->ZwWaitForSingleObject
    ReadFile(hPipe) ; //После удачного соединения с клиентом можно получать данные, для это может быть ZwReadFile

    Клиент:
    hPipeToPEB = CreateFile("ServerPipeName") ; //Должна быть выполнена после CreateNamedPipe, иначе не будет существовать ссылка.()
    SetNamedPipeHandleState()
    WriteFile(hPipeToPEB); //Вот этот хендел вам и нужно будет ложить в PEB.


    Только вам придется выполнять код в приложении либо (КЛИЕНТСКУЮ ЧАСТЬ) либо в драйверe.Подумайте где будет лучше.