AdaptixC2-Mod0/Headers/UI/Widgets/AdaptixWidget.h
2026-04-06 00:20:51 -05:00

258 lines
9.5 KiB
C++

#ifndef ADAPTIXCLIENT_ADAPTIXWIDGET_H
#define ADAPTIXCLIENT_ADAPTIXWIDGET_H
#include <Agent/Commander.h>
#include <main.h>
#include <kddockwidgets/qtwidgets/views/DockWidget.h>
#include <kddockwidgets/qtwidgets/views/MainWindow.h>
#include <QJSValue>
#include <QQueue>
#include <QReadWriteLock>
#include <QElapsedTimer>
#include <QListWidget>
#include <QDialog>
#include <functional>
class Task;
class Agent;
class LastTickWorker;
class WebSocketWorker;
class SessionsTableWidget;
class SessionsGraph;
class AxConsoleWidget;
class LogsWidget;
class ChatWidget;
class ListenersWidget;
class DownloadsWidget;
class ScreenshotsWidget;
class CredentialsWidget;
class TargetsWidget;
class TasksWidget;
class TunnelsWidget;
class TunnelEndpoint;
class DialogSyncPacket;
class AuthProfile;
class AxScriptManager;
struct ServerScriptGroup;
typedef struct RegListenerConfig {
QString name;
QString protocol;
QString type;
} RegListenerConfig;
typedef struct RegAgentConfig {
QString name;
QString listenerType;
int os;
Commander* commander;
bool valid;
} RegAgentConfig;
typedef struct AgentTypeInfo {
bool multiListeners;
QStringList listenerTypes;
} AgentTypeInfo;
struct ServerScriptInfo {
QString name;
QString description;
bool enabled;
};
class AdaptixWidget : public QWidget
{
Q_OBJECT
QGridLayout* mainGridLayout = nullptr;
QHBoxLayout* topHLayout = nullptr;
QPushButton* listenersButton = nullptr;
QPushButton* logsButton = nullptr;
QPushButton* chatButton = nullptr;
QPushButton* sessionsButton = nullptr;
QPushButton* graphButton = nullptr;
QPushButton* tasksButton = nullptr;
QPushButton* targetsButton = nullptr;
QPushButton* tunnelButton = nullptr;
QPushButton* downloadsButton = nullptr;
QPushButton* credsButton = nullptr;
QPushButton* screensButton = nullptr;
QPushButton* keysButton = nullptr;
QPushButton* reconnectButton = nullptr;
QPushButton* extDocksButton = nullptr;
QSpacerItem* horizontalSpacer1 = nullptr;
QFrame* line_1 = nullptr;
QFrame* line_2 = nullptr;
QFrame* line_3 = nullptr;
QFrame* line_4 = nullptr;
QDialog* extDocksPopup = nullptr;
QListWidget* extDocksListWidget = nullptr;
QLabel* extDocksEmptyLabel = nullptr;
KDDockWidgets::QtWidgets::MainWindow* mainDockWidget;
KDDockWidgets::QtWidgets::DockWidget* dockTop;
KDDockWidgets::QtWidgets::DockWidget* dockBottom;
bool synchronized = false;
bool sync = false;
bool syncFinishReceived = false;
int syncTotalBatches = 0;
int syncProcessingBatchIndex = 0;
int syncProcessingBatchTotal = 0;
int syncProcessingBatchProcessed = 0;
QElapsedTimer syncProcessingUiTimer;
AuthProfile* profile = nullptr;
DialogSyncPacket* dialogSyncPacket = nullptr;
QQueue<QJsonObject> pendingPackets;
QTimer* pendingPacketsTimer = nullptr;
void createUI();
static bool isValidSyncPacket(QJsonObject jsonObj);
void enqueueSyncPacket(const QJsonObject &jsonObj);
void processPendingSyncPackets();
void processSyncPacket(QJsonObject jsonObj);
void finalizeSyncIfReady();
void setSyncUpdateUI(bool enabled);
public:
QThread* ChannelThread = nullptr;
WebSocketWorker* ChannelWsWorker = nullptr;
QThread* TickThread = nullptr;
LastTickWorker* TickWorker = nullptr;
AxScriptManager* ScriptManager = nullptr;
AxConsoleWidget* AxConsoleDock = nullptr;
LogsWidget* LogsDock = nullptr;
ChatWidget* ChatDock = nullptr;
ListenersWidget* ListenersDock = nullptr;
SessionsTableWidget* SessionsTableDock = nullptr;
SessionsGraph* SessionsGraphDock = nullptr;
TunnelsWidget* TunnelsDock = nullptr;
DownloadsWidget* DownloadsDock = nullptr;
ScreenshotsWidget* ScreenshotsDock = nullptr;
CredentialsWidget* CredentialsDock = nullptr;
TasksWidget* TasksDock = nullptr;
TargetsWidget* TargetsDock = nullptr;
QVector<RegListenerConfig> RegisterListeners;
QVector<RegAgentConfig> RegisterAgents;
QMap<QString, AgentTypeInfo> AgentTypes;
QVector<ListenerData> Listeners;
QVector<TunnelData> Tunnels;
QMap<QString, DownloadData> Downloads;
QMap<QString, ScreenData> Screenshots;
QVector<CredentialData> Credentials;
QVector<TargetData> Targets;
QMap<QString, PivotData> Pivots;
QMap<QString, TaskData> TasksMap;
QMap<QString, Agent*> AgentsMap;
mutable QReadWriteLock AgentsMapLock;
mutable QReadWriteLock TasksMapLock;
mutable QReadWriteLock CredentialsLock;
mutable QReadWriteLock DownloadsLock;
mutable QReadWriteLock ScreenshotsLock;
mutable QReadWriteLock TargetsLock;
mutable QReadWriteLock TunnelsLock;
QMap<QString, AxExecutor> PostHooksJS;
QMap<QString, AxExecutor> PostHandlersJS;
QMap<QString, TunnelEndpoint*> ClientTunnels;
QStringList addresses;
struct ExtDockEntry {
QString id;
QString title;
std::function<void()> showCallback;
};
QMap<QString, ExtDockEntry> extDocksMap;
explicit AdaptixWidget(AuthProfile* authProfile, QThread* channelThread, WebSocketWorker* channelWsWorker);
~AdaptixWidget() override;
AuthProfile* GetProfile() const;
void PlaceDock(KDDockWidgets::QtWidgets::DockWidget* parentDock, KDDockWidgets::QtWidgets::DockWidget* dock) const;
KDDockWidgets::QtWidgets::DockWidget* get_dockTop() {return dockTop;}
KDDockWidgets::QtWidgets::DockWidget* get_dockBottom() {return dockBottom;}
bool AddExtension(ExtensionFile* ext);
void RemoveExtension(const ExtensionFile &ext);
bool IsSynchronized();
void Close();
void ClearAdaptix();
void ClearChatStream();
void ClearConsoleStreams();
void ClearNotificationsStream();
void RegisterListenerConfig(const QString &name, const QString &protocol, const QString &type, const QString &ax_script);
void RegisterAgentConfig(const QString &agentName, const QString &ax_script, const QStringList &listenersconst, const bool &multiListeners, const QJsonArray &groups);
void RegisterServiceConfig(const QString &serviceName, const QString &ax_script);
void ProcessAxScriptPacket(const QString &name, const QString &content, const QJsonArray &groups);
void registerServerCommandGroups(const QString &scriptName, const QList<ServerScriptGroup> &groups, QJSEngine* engine);
void EnableServerScript(const QString &name);
void DisableServerScript(const QString &name);
QList<ServerScriptInfo> GetServerScripts() const;
RegListenerConfig GetRegListener(const QString &listenerName);
QList<QString> GetAgentNames(const QString &listenerType) const;
RegAgentConfig GetRegAgent(const QString &agentName, const QString &listenerName, int os);
AgentTypeInfo GetAgentTypeInfo(const QString &agentName) const;
QList<Commander*> GetCommanders(const QStringList &listeners, const QStringList &agents, const QList<int> &os) const;
QList<Commander*> GetCommandersAll() const;
void AddCommandsToCommanders(const CommandsGroup &group, const QStringList &listeners, const QStringList &agents, const QList<int> &os);
void PostHookProcess(QJsonObject jsonHookObj);
void PostHandlerProcess(const QString &handlerId, const TaskData &taskData);
void AddExtDock(const QString &id, const QString &title, const std::function<void()> &showCallback);
void RemoveExtDock(const QString &id);
void ShowExtDocksPopup();
void LoadConsoleUI(const QString &AgentId);
void LoadTasksOutput() const;
void LoadFileBrowserUI(const QString &AgentId);
void LoadProcessBrowserUI(const QString &AgentId);
void LoadTerminalUI(const QString &AgentId);
void LoadShellUI(const QString &AgentId);
void ShowTunnelCreator(const QString &AgentId, bool socks4, bool socks5, bool lportfwd, bool rportfwd);
Q_SIGNALS:
void SyncedSignal();
void SyncedOnReloadSignal(QString project);
void LoadGlobalScriptSignal(QString path);
void UnloadGlobalScriptSignal(QString path);
void eventNewAgent(QString agentId);
void eventFileBrowserDisks(QString agentId);
void eventFileBrowserList(QString agentId, QString path);
void eventFileBrowserUpload(QString agentId, QString path, QString localFilename);
void eventProcessBrowserList(QString agentId);
public Q_SLOTS:
void ChannelClose() const;
void DataHandler(const QByteArray& data);
void DataHandlerJson(const QJsonObject& jsonObj);
void OnWebSocketConnected();
void OnSynced();
void SetSessionsTableUI() const;
void SetGraphUI() const;
void SetTasksUI() const;
void LoadAxConsoleUI() const;
void LoadLogsUI() const;
void LoadChatUI() const;
void LoadListenersUI() const;
void LoadTunnelsUI() const;
void LoadDownloadsUI() const;
void LoadScreenshotsUI() const;
void LoadCredentialsUI() const;
void LoadTargetsUI() const;
void OnReconnect();
};
#endif