Как одним процессом писать в поток входных данных другого процесса(Или как узнать дескриптор потока вывода прцесса)

Пусть есть скомпилированная программа PR1, на языке с++, код которой выглядит так(Но этот код нам неизвестен, имеем только готовый бинарник):

     #include <iostream>

     using namespace std;

     int main(){
         string pass = "qwe123";
         string buf;
         while(buf != pass){
              cin >> buf ;
         }
         cout << "\ndone";

         return 0;
     }

Пусть мы не знаем, что с++ хранит строки внутри бинарника в том виде, в котором они есть и не знаем ничего про реверс инжиниринг. Мы хотим написать программу на с++, которая будет угадывать пароль(пусть просто перебором подставлять туда все комбинации символов, пока в поток выходных данных процесса запущенной программы PR1 не попадет слово done) внутри программы PR1, как и где получить дескриптор потока входных данных программы PR1 на этапе её исполнения?

PS пусть ос Linux, думаю это важно PSS Правильно ли я понимаю, что у каждого процесса свои дескрипторы потока ввода/вывода?


Ответы (2 шт):

Автор решения: Mike

Дескрипторы у каждого процесса одинаковые. 0 - stdin, 1 - stdout, 2 - stderr.

Вам надо в своем процессе, который будет подбирать пароли:

  • подготовить 2 pipe для связи с другим процессом
  • породить дочерний процесс с помощью fork()
  • в полученном дочернем процессе с помощью dup2() переназначить ввод вывод со стандартных дескрипторов на свои pipe
  • в нем же запустить вместо себя (exec()) требуемую программу

Часто этот процесс называют popen2, пример функции

Второй вариант, выполнить то же самое с помощью shell, подготовить именованный pipe, который будет читать ваша программа, запустить свою программу с перенаправлением ее вывода на стандартный ввод испытуемой программы, при этом перенаправив ее вывод в pipe, который читает ваша программа. Выходит что то вроде: ваша_программа | целевая_программа >>fifo_file

→ Ссылка
Автор решения: eri

Дескриптор процесса можно получить в /proc/${pid}/fd/0,1,2

Например запускаю в одном терминале cat, во втором

echo hello > /proc/574679/fd/0

и вижу hello на первом.

Получить ответ обратно сложнее, ведь терминал вычитывает дескриптор. Понадобится gdb чтоб открыть новый дескриптор - метод описан тут https://stackoverflow.com/a/1323999/2101808 и какая-то интересная програмка в другом ответе https://stackoverflow.com/a/26363421/2101808

→ Ссылка