2015-09-16 40 views
1

我正在注入一個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)。

我在做什麼錯?

+1

一個模塊中的CRT不知道任何東西關於另一個模塊中的CRT,所以重定向DLL中的CRT文件句柄不會產生您正在尋找的效果。 'SetStdHandle'可能會讓你得到你想要的。 –

+0

我應該提到,我試過'SetStdHandle',它沒有任何效果(即使函數沒有失敗) - 程序和dll一直寫入控制檯。 – eurotrash

+0

它絕對不能工作,除非完全相同的CRT動態鏈接到兩個模塊; Process Explorer可以顯示您是否加載了單個CRT或兩個CRT。但我不知道freopen和printf是如何與線程交互的。如果將'freopen'調用放入主應用程序,但是在程序的其餘部分已經啓動並運行後,它會以不同的線程運行,會發生什麼? –

回答

0

我能夠做到這一點,使注入的DLL呼籲FreeConsole,然後AttachConsole,傳遞進程的PID與控制檯,我希望輸出被重定向到。我知道提到的問題重定向到一個文件,但這只是爲了測試的目的,表面上更容易做;最終,我希望它被重定向到控制檯。在一天結束時,我可以讓自己的控制檯將它的標準輸出(它從「遠程」進程接收的文件)重定向到一個文件,如果我想要的話,它應該仍然能夠滿足實際問題。)

相關問題