linux c++ 双向交互管道及冲突解决

在linux上,不改变目标进程源码的场景下,一般交互通过popen。但熟悉popen的人应该知道,它的说明写的是,仅能以只读或只写的方式调用。那么如果目标进程是交互式的,显然不能满足要求,那么就需要再往底层走一点,自己创建双向管道,去做交互。主要通过dup2重定向标准输入输出来完成,这在很多文章中都有介绍,在这就不做过多阐述。

如:https://blog.csdn.net/hejinjing_tom_com/article/details/72568758

这引出一个非常棘手的问题,仔细阅读dup2的说明可以发现,dup2在以指定的文件描述符进行重定向后,会关闭原本的文件描述符。那么如果目标进程,有使用fdopen(STDIN_FILENO,"r"),就会导致报错,恰巧我就遇上了这种情况

linux c++ 双向交互管道及冲突解决_第1张图片

 

通过ida反汇编调试,发现这地方会去fdopen(0,"a"),如果在外部重定向管道,这地方就没法过去。那如果不重定向管道,进程间就没法交互,甚至考虑过通过劫持去空控制标准IO,结论就是都不行。目前找到唯一的方式,就是dup2,那么dup2无法绕过的话,就只有从其他地方入手。

换个思路,那么如果我去fdopen一个指定fd,就可以通过这句,首先修改目标进程变量dword_8082A28的值,确保在此处为7。然后在自己的进程中中,execl前,先执行:

for (size_t i = 0; i < 10; i++)
        {
            FILE* fp1 = fopen((std::string("a") + std::to_string(i)).c_str(), "a");
            if (fileno(fp1) == 7) {
                perror("has 7");
                break;
            }
        }

 这时,v50就指向了我创建好的外面fd,使其目标进程执行的逻辑不变。

你可能感兴趣的:(C/C++,服务器,运维)