进程的标准输出未通过dll注入正确重定向

时间:2015-09-16 20:03:56

标签: c winapi stdout dll-injection

我将C dll(作为线程)注入正在运行的控制台进程,并尝试将其stdout重定向到文件。我的dll还会通过wprintf写入控制台。

作为一个简单的重定向测试,我在开始时调用了TestRedirect

FILE *file = NULL;
BOOL WINAPI Test1(void *param);

void TestRedirect()
{
    file = freopen("C:\\temp\\test1.txt", "w", stdout);
    _beginthreadex(NULL, 0, Test1, (void*)file, NULL, 0, NULL);
}

BOOL WINAPI Test1(void *param)
{
    FILE *file = (FILE*)param;
    while (1)
    {
        wprintf(L"Test1\n");
        fflush(file);
        Sleep(200);
    }
}

每当我的dll通过wprintf写入stdout时,无论线程如何,文本都会出现在文件中。但是,我的测试控制台程序(也是一个C程序)不会写入该文件。所有控制台程序都会每秒调用wprintf来打印一些东西。当我的dll被注入进程时,exe文本停止出现在控制台窗口中,但是没有写入文件。如果我在其他程序上尝试它,例如, PING.EXE。

但是,如果我将相同的代码直接放入我的测试控制台程序并使该程序调用{​​{1}},则程序的输出将写入该文件(不会注入dll)。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我能够通过使注入的dll调用FreeConsole然后AttachConsole来执行此操作,使用控制台传递进程的PID,我希望将输出重定向到。

(我知道这个问题提到了将它重定向到一个文件,但这只是为了测试目的而作为一个表面上容易做的事情;最终,我希望它被重定向到一个控制台。在一天结束时,我可以让我自己的控制台将其stdout(它从"远程"进程接收)重定向到一个文件,如果我想的话,它应该仍然满足实际问题。)