1

我正在教一堂课,并试图展示你不应该盲目地信任系统上的应用程序。

第一个演示是运行 netstat 并输出连接的套接字列表。我创建了另一个具有相同名称的应用程序,但它忽略了从显示器传递到 arg[0] 的 IP。控制台输出是一样的。目标是您可以拥有一个名为正确名称的文件,但不一定是合法的。(显然哈希不匹配)

下一个演示类似于任务列表,尽管我无法从 processes.GetProcesses 获取“会话名称”。如果我在演示机 (XP) 上运行 tasklist,我找不到与之关联的值。此外,是否有一种简单的方法来对列表进行排序,因为 tasklist 按 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 VM 上运行,所以我无法让他们真正连接到其他地方。在 XP 上也消除了 UAC 问题。

4

2 回答 2

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
);
于 2012-09-04T19:27:09.807 回答
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();
于 2012-09-04T19:33:42.947 回答