我将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)。
我做错了什么?
答案 0 :(得分:0)
我能够通过使注入的dll调用FreeConsole
然后AttachConsole
来执行此操作,使用控制台传递进程的PID,我希望将输出重定向到。
(我知道这个问题提到了将它重定向到一个文件,但这只是为了测试目的而作为一个表面上容易做的事情;最终,我希望它被重定向到一个控制台。在一天结束时,我可以让我自己的控制台将其stdout(它从"远程"进程接收)重定向到一个文件,如果我想的话,它应该仍然满足实际问题。)