1

私はクラスを教えており、システム上のアプリケーションを盲目的に信頼してはならない方法を示しようとしています。

最初のデモは、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 VMで実行されるため、他の場所に実際に接続させることはできません。XPを使用していると、UACの問題も解消されます。

4

2 に答える 2

0

イメージ名はProcess.Modulesリスト(最初の要素)から、pidはProcess.Idプロパティから、メモリは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 に答える