我正在注入一個C DLL(作爲一個線程)到一個正在運行的控制檯進程,並試圖重定向它的標準輸出到一個文件。我的dll也通過wprintf
寫入控制檯。進程沒有通過dll注入正確重定向
作爲一個簡單的重定向測試,我在一開始進行的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
寫到stdout,無論線程,文本顯示的文件中。但是,我的測試控制檯程序(也是C程序)不寫入文件。所有的控制檯程序都會打電話給每秒wprintf
打印一些東西。當我的DLL注入進程時,exe的文本停止出現在控制檯窗口中,但沒有寫入文件。如果我在其他程序上嘗試,也是如此ping.exe的。
但是,如果我將相同的代碼直接放到我的測試控制檯程序中,並使該程序調用TestRedirect
,那麼程序的輸出寫入文件(不注入dll)。
我在做什麼錯?
一個模塊中的CRT不知道任何東西關於另一個模塊中的CRT,所以重定向DLL中的CRT文件句柄不會產生您正在尋找的效果。 'SetStdHandle'可能會讓你得到你想要的。 –
我應該提到,我試過'SetStdHandle',它沒有任何效果(即使函數沒有失敗) - 程序和dll一直寫入控制檯。 – eurotrash
它絕對不能工作,除非完全相同的CRT動態鏈接到兩個模塊; Process Explorer可以顯示您是否加載了單個CRT或兩個CRT。但我不知道freopen和printf是如何與線程交互的。如果將'freopen'調用放入主應用程序,但是在程序的其餘部分已經啓動並運行後,它會以不同的線程運行,會發生什麼? –