2012-09-04 38 views
1

我正在教一個類,並試圖展示如何不應該盲目地信任應用程序。創建鏡像有效應用程序的Windows控制檯應用程序(惡意軟件類)

第一個演示是運行netstat並輸出連接的套接字列表。 我已經創建了另一個具有相同名稱的應用程序,但省略了從顯示器傳遞給arg [0]的IP。控制檯輸出是一樣的。目標是您可以擁有一個名爲正確名稱的文件,但不一定是合法的。 (顯然哈希將不匹配)

下一個演示類似於tasklist,但我無法從processes.GetProcesses獲取「會話名稱」。如果我在演示機器(XP)上運行任務列表,我找不到與其關聯的值。此外,有沒有簡單的方法來排序列表,因爲任務列表在PID上排序。我對C#很陌生,所以對我很感興趣。

謝謝!

Process[] procs = Process.GetProcesses(); 

foreach (Process proc in procs) 
{ 
    Console.WriteLine(image.PadRight(17) + pid.PadLeft(5) + sname.PadRight(16) + mem.PadLeft(12)); 
} 

因此我們的目標是複製任務列表(基本功能)或其他Windows命令行應用表明,真正的惡意軟件作者可以複製它的全部。

更新: 所有的學生將在自己的XP虛擬機上運行,​​所以我不能真正讓他們連接到其他地方。在XP上也消除了UAC問題。

+1

也許而不是經歷所有這些只是爲了得到一個演示的假顯示,誰不運行真正的命令對付假電腦?你已經藏在某個地方的筆記本電腦。一些sysinternals工具將會這樣做。顯示屏將顯示一個實時的,正在運行的系統...而不是您正在控制的系統。如果你有Windows 7,那麼聰明地使用XP模式窗口或虛擬機可以在一個盒子上獲得同樣的東西。 –

回答

0

這裏有一個方法,只需使用任何命令行應用程序,並檢查文本(如果你想修改它) :

var exeName = @"tasklist.exe"; 
    var arguments = ""; 

    var process = new Process 
    { 
     EnableRaisingEvents = true, 
     StartInfo = new ProcessStartInfo(exeName) 
     { 
      Arguments = arguments, 
      CreateNoWindow = true, 
      UseShellExecute = false, 
      WindowStyle = ProcessWindowStyle.Hidden, 
      RedirectStandardError = true, 
      RedirectStandardOutput = true, 
     }, 
    }; 

    process.OutputDataReceived += 
     (sender, e) => Console.WriteLine("received output: {0}", e.Data); 

    process.Start(); 
    process.BeginOutputReadLine(); 

    process.WaitForExit(); 
+0

完全符合法案,大部分都適用。我正在做一個string.replace(「csrss.exe」,「good1.exe」)。我得到一個空引用異常,但我可以將其捕獲並仍然顯示輸出。非常感謝! –

0

您可以從Process.Modules列表(第一個元素),Process.Id屬性的pid和Process.Working集的內存中獲取映像名稱;但是,您必須結合WTSQuerySessionInformation獲取會話名稱。例如:

foreach(Process p in Process.GetProcesses()) 
{ 
    IntPtr buffer; 
    uint bytesReturned; 
    WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, (uint) p.SessionId, WTS_INFO_CLASS.WTSWinStationName, out buffer, out bytesReturned); 
    var sessionName = Marshal.PtrToStringAnsi(buffer); 
    WTSFreeMemory(buffer); 
    string moduleName = p.ProcessName; 
    try 
    { 
     moduleName = p.Modules[0].ModuleName; 
    } 
    catch(Exception ex) 
    { 
     ex = ex; 
    } 

    Console.WriteLine(String.Format("{0,-17} {1,5} {2,-16} {3,12} {4,12} K", moduleName, p.Id, sessionName, p.SessionId, (p.WorkingSet64/1024).ToString("n0"))); 
} 

即假設在類被聲明如下:

enum WTS_INFO_CLASS 
{ 
    WTSInitialProgram, 
    WTSApplicationName, 
    WTSWorkingDirectory, 
    WTSOEMId, 
    WTSSessionId, 
    WTSUserName, 
    WTSWinStationName, 
    WTSDomainName, 
    WTSConnectState, 
    WTSClientBuildNumber, 
    WTSClientName, 
    WTSClientDirectory, 
    WTSClientProductId, 
    WTSClientHardwareId, 
    WTSClientAddress, 
    WTSClientDisplay, 
    WTSClientProtocolType, 
    WTSIdleTime, 
    WTSLogonTime, 
    WTSIncomingBytes, 
    WTSOutgoingBytes, 
    WTSIncomingFrames, 
    WTSOutgoingFrames, 
    WTSClientInfo, 
    WTSSessionInfo 
}; 

[DllImport("wtsapi32.dll", ExactSpelling = true, SetLastError = false)] 
public static extern void WTSFreeMemory(IntPtr memory); 
[DllImport("Wtsapi32.dll", SetLastError = true)] 
static extern bool WTSQuerySessionInformation(
    IntPtr hServer, 
    uint sessionId, 
    WTS_INFO_CLASS wtsInfoClass, 
    out IntPtr ppBuffer, 
    out uint pBytesReturned 
); 
相關問題