Как одним процессом писать в поток входных данных другого процесса(Или как узнать дескриптор потока вывода прцесса)
Пусть есть скомпилированная программа 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 шт):
Дескрипторы у каждого процесса одинаковые. 0 - stdin, 1 - stdout, 2 - stderr.
Вам надо в своем процессе, который будет подбирать пароли:
- подготовить 2 pipe для связи с другим процессом
- породить дочерний процесс с помощью fork()
- в полученном дочернем процессе с помощью dup2() переназначить ввод вывод со стандартных дескрипторов на свои pipe
- в нем же запустить вместо себя (exec()) требуемую программу
Часто этот процесс называют popen2, пример функции
Второй вариант, выполнить то же самое с помощью shell, подготовить именованный pipe, который будет читать ваша программа, запустить свою программу с перенаправлением ее вывода на стандартный ввод испытуемой программы, при этом перенаправив ее вывод в pipe, который читает ваша программа. Выходит что то вроде: ваша_программа | целевая_программа >>fifo_file
Дескриптор процесса можно получить в /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