在cmd.exe下運行rundll32.exe mydll.dll,MyFunc ,本想直接在當前cmd窗口輸出調試信息.
可因rundll32是Win32 GUI程序而非Win32 console,所以cmd.exe標準輸入輸出句柄無法被mydll.dll繼承用來向父進程cmd.exe輸出數據.
這時, 如果用強行用GetStdHandle獲得句柄,然后用WriteConsole來進行輸出,則會發(fā)生無效句柄錯誤.
但是如果在這之前先AllocConsole,則可正常WriteConsole,但是會新建個控制臺窗口來輸出數據,很不爽 :-P
有沒有什么辦法向當前cmd.exe窗口輸出數據呢?
我想通過給進程拍照和遍歷,
可以獲得rundll32的父進程cmd.exe的PID和Handle,但如何進一步下去(建立管道, 寫數據)就沒轍了?
不知道有沒有描述清楚 還是太羅嗦了,麻煩大家看看,謝謝~
答:
如果只是要輸出數據的話 可以向父窗口 發(fā)送鍵盤消息 WM_CHAR 輸出你的數據
代碼
Code:
BOOL APIENTRY DllMain ( HANDLE hModule ,
DWORD ul_reason_for_call ,
LPVOID lpReserved )
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH :
ShowMe ();
case DLL_THREAD_ATTACH :
case DLL_THREAD_DETACH :
case DLL_PROCESS_DETACH :
break;
}
return TRUE ;
}
void ShowMe ()
{
DWORD dwProcID ;
HWND hWnd ;
dwProcID = FindParentProcID ( GetCurrentProcessId ());
sprintf ( buf , "dwProcID:%d\nProcessId:%d " , dwProcID , GetCurrentProcessId ());
可因rundll32是Win32 GUI程序而非Win32 console,所以cmd.exe標準輸入輸出句柄無法被mydll.dll繼承用來向父進程cmd.exe輸出數據.
這時, 如果用強行用GetStdHandle獲得句柄,然后用WriteConsole來進行輸出,則會發(fā)生無效句柄錯誤.
但是如果在這之前先AllocConsole,則可正常WriteConsole,但是會新建個控制臺窗口來輸出數據,很不爽 :-P
有沒有什么辦法向當前cmd.exe窗口輸出數據呢?
我想通過給進程拍照和遍歷,
可以獲得rundll32的父進程cmd.exe的PID和Handle,但如何進一步下去(建立管道, 寫數據)就沒轍了?
不知道有沒有描述清楚 還是太羅嗦了,麻煩大家看看,謝謝~
答:
如果只是要輸出數據的話 可以向父窗口 發(fā)送鍵盤消息 WM_CHAR 輸出你的數據
代碼
Code:
BOOL APIENTRY DllMain ( HANDLE hModule ,
DWORD ul_reason_for_call ,
LPVOID lpReserved )
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH :
ShowMe ();
case DLL_THREAD_ATTACH :
case DLL_THREAD_DETACH :
case DLL_PROCESS_DETACH :
break;
}
return TRUE ;
}
void ShowMe ()
{
DWORD dwProcID ;
HWND hWnd ;
dwProcID = FindParentProcID ( GetCurrentProcessId ());
sprintf ( buf , "dwProcID:%d\nProcessId:%d " , dwProcID , GetCurrentProcessId ());