进程的标准输出未通过 dll 注入正确重定向
Stdout of process not redirected properly via dll injection
我正在将 C dll(作为线程)注入 运行 控制台进程,并尝试将其标准输出重定向到文件。我的 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 被注入到进程中时,exe 的文本停止出现在控制台中 window 但不会写入文件。如果我在其他程序上尝试也一样,例如ping.exe.
但是,如果我将相同的代码直接放入我的测试控制台程序并调用该程序 TestRedirect
,那么程序的输出将写入文件(不注入 dll)。
我做错了什么?
我能够通过使注入的 dll 调用 FreeConsole
然后 AttachConsole
来做到这一点,在我希望将输出重定向到的控制台中传递进程的 PID。
(我知道这个问题提到将它重定向到一个文件,但这实际上只是为了测试目的,因为表面上更容易做;最终,我希望它被重定向到一个控制台。在结束时那天,如果我愿意,我可以让自己的控制台将其标准输出(它从 "remote" 进程接收)重定向到一个文件,这仍然可以满足实际问题。)
我正在将 C dll(作为线程)注入 运行 控制台进程,并尝试将其标准输出重定向到文件。我的 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 被注入到进程中时,exe 的文本停止出现在控制台中 window 但不会写入文件。如果我在其他程序上尝试也一样,例如ping.exe.
但是,如果我将相同的代码直接放入我的测试控制台程序并调用该程序 TestRedirect
,那么程序的输出将写入文件(不注入 dll)。
我做错了什么?
我能够通过使注入的 dll 调用 FreeConsole
然后 AttachConsole
来做到这一点,在我希望将输出重定向到的控制台中传递进程的 PID。
(我知道这个问题提到将它重定向到一个文件,但这实际上只是为了测试目的,因为表面上更容易做;最终,我希望它被重定向到一个控制台。在结束时那天,如果我愿意,我可以让自己的控制台将其标准输出(它从 "remote" 进程接收)重定向到一个文件,这仍然可以满足实际问题。)