c - 进程的标准输出未通过 dll 注入(inject)正​​确重定向

标签 c winapi stdout dll-injection

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

作为一个简单的重定向测试,我在开始时调用了 dll 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 写入标准输出时,无论线程如何,文本都会出现在文件中。但是,我的测试控制台程序(也是 C 程序)不会写入文件。控制台程序所做的就是每秒调用 wprintf 来打印一些东西。当我的 dll 被注入(inject)到进程中时,exe 的文本停止出现在控制台窗口中,但不会写入文件。如果我在其他程序上尝试也一样,例如ping.exe.

但是,如果我将相同的代码直接放入我的测试控制台程序并使该程序调用 TestRedirect,则程序的输出将写入文件(无需注入(inject) dll)。

我做错了什么?

最佳答案

我能够通过使注入(inject)的 dll 调用 FreeConsole 然后 AttachConsole 来做到这一点,将进程的 PID 传递到我想要输出的控制台被重定向到。

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

关于c - 进程的标准输出未通过 dll 注入(inject)正​​确重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617695/

相关文章:

c - 为什么指向数组的指针返回地址,而指向整数的指针返回整数本身

c - 这个分配有什么问题?

c - 段错误: 11 when running C program

c++ - 光标样式不保持更新

linux - qt打印到终端

java - 从 java 到 python 的一个标准输出到一个标准输入

python - 如何更改Python IDLE的默认字符编码?

c - 如何在 C 中分配新的字符串值

c++ - DLL 中的 outproc COM 服务器

java - 使用 Java 在没有额外边缘的情况下在 Windows 中截取前台应用程序屏幕截图