Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified Assets/sshot-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Assets/sshot-15.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions Client GUI/ClientGUIGroup.groupproj.local
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<Transactions>
<Transaction>2025/08/15 09:04:51.000.443,C:\Users\jples\Documents\Embarcadero\Studio\Projects\ProjectGroup1.groupproj=C:\Users\jples\Desktop\OptixGate\Client GUI\ClientGUIGroup.groupproj</Transaction>
<Transaction>2025/08/15 09:04:51.000.443,C:\Users\jples\Desktop\OptixGate\Client GUI\ClientGUIGroup.groupproj=C:\Users\jples\Documents\Embarcadero\Studio\Projects\ProjectGroup1.groupproj</Transaction>
</Transactions>
<Default.Personality>
<Projects ActiveProject="C:\Users\jples\Desktop\OptixGate\Client GUI\Client_GUI_OpenSSL.dproj"/>
<Projects ActiveProject="C:\Users\jples\Desktop\OptixGate\Client GUI\Client_GUI.dproj"/>
</Default.Personality>
</BorlandProject>
5 changes: 4 additions & 1 deletion Client GUI/Client_GUI.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,10 @@ uses
Optix.Func.Commands.Process in '..\Shared\Functions\Optix.Func.Commands.Process.pas',
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas',
Optix.FileSystem.Enum in '..\Shared\Optix.FileSystem.Enum.pas',
Optix.Process.Enum in '..\Shared\Optix.Process.Enum.pas';
Optix.Process.Enum in '..\Shared\Optix.Process.Enum.pas',
Optix.Func.Commands.Registry in '..\Shared\Functions\Optix.Func.Commands.Registry.pas',
Optix.Registry.Helper in '..\Shared\Optix.Registry.Helper.pas',
Optix.Registry.Enum in '..\Shared\Optix.Registry.Enum.pas';

{$R *.res}
{$R ..\Server\data.res}
Expand Down
3 changes: 3 additions & 0 deletions Client GUI/Client_GUI.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,9 @@
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Shell.pas"/>
<DCCReference Include="..\Shared\Optix.FileSystem.Enum.pas"/>
<DCCReference Include="..\Shared\Optix.Process.Enum.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Registry.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Helper.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Enum.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
Expand Down
Binary file modified Client GUI/Client_GUI.res
Binary file not shown.
5 changes: 4 additions & 1 deletion Client GUI/Client_GUI_OpenSSL.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,10 @@ uses
Optix.Func.Commands.Process in '..\Shared\Functions\Optix.Func.Commands.Process.pas',
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas',
Optix.FileSystem.Enum in '..\Shared\Optix.FileSystem.Enum.pas',
Optix.Process.Enum in '..\Shared\Optix.Process.Enum.pas';
Optix.Process.Enum in '..\Shared\Optix.Process.Enum.pas',
Optix.Func.Commands.Registry in '..\Shared\Functions\Optix.Func.Commands.Registry.pas',
Optix.Registry.Helper in '..\Shared\Optix.Registry.Helper.pas',
Optix.Registry.Enum in '..\Shared\Optix.Registry.Enum.pas';

{$R *.res}
{$R ..\Server\data.res}
Expand Down
3 changes: 3 additions & 0 deletions Client GUI/Client_GUI_OpenSSL.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,9 @@
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Shell.pas"/>
<DCCReference Include="..\Shared\Optix.FileSystem.Enum.pas"/>
<DCCReference Include="..\Shared\Optix.Process.Enum.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Registry.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Helper.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Enum.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
Expand Down
5 changes: 4 additions & 1 deletion Client/Client.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,10 @@ uses
Optix.ClassesRegistry in '..\Shared\Optix.ClassesRegistry.pas',
Optix.Func.Commands.FileSystem in '..\Shared\Functions\Optix.Func.Commands.FileSystem.pas',
Optix.Func.Commands.Process in '..\Shared\Functions\Optix.Func.Commands.Process.pas',
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas';
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas',
Optix.Func.Commands.Registry in '..\Shared\Functions\Optix.Func.Commands.Registry.pas',
Optix.Registry.Helper in '..\Shared\Optix.Registry.Helper.pas',
Optix.Registry.Enum in '..\Shared\Optix.Registry.Enum.pas';

begin
IsMultiThread := True;
Expand Down
3 changes: 3 additions & 0 deletions Client/Client.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,9 @@
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.FileSystem.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Process.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Shell.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Registry.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Helper.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Enum.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
Expand Down
5 changes: 4 additions & 1 deletion Client/Client_OpenSSL.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,10 @@ uses
Optix.ClassesRegistry in '..\Shared\Optix.ClassesRegistry.pas',
Optix.Func.Commands.FileSystem in '..\Shared\Functions\Optix.Func.Commands.FileSystem.pas',
Optix.Func.Commands.Process in '..\Shared\Functions\Optix.Func.Commands.Process.pas',
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas';
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas',
Optix.Func.Commands.Registry in '..\Shared\Functions\Optix.Func.Commands.Registry.pas',
Optix.Registry.Helper in '..\Shared\Optix.Registry.Helper.pas',
Optix.Registry.Enum in '..\Shared\Optix.Registry.Enum.pas';

begin
IsMultiThread := True;
Expand Down
15 changes: 15 additions & 0 deletions Client/Client_OpenSSL.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,9 @@
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.FileSystem.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Process.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Shell.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Registry.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Helper.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Enum.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
Expand Down Expand Up @@ -220,7 +223,19 @@
</DeployFile>
<DeployFile LocalName="bins\OpenSSL\Win32\Debug\Client_OpenSSL.exe" Configuration="Debug" Class="ProjectOutput"/>
<DeployFile LocalName="bins\OpenSSL\Win64\Debug\Client_OpenSSL.exe" Configuration="Debug" Class="ProjectOutput"/>
<DeployFile LocalName="bins\OpenSSL\Win64\Debug\Client_OpenSSL.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win64">
<RemoteName>Client_OpenSSL.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="bins\OpenSSL\Win64\Debug\Client_OpenSSL.rsm" Configuration="Debug" Class="DebugSymbols"/>
<DeployFile LocalName="bins\OpenSSL\Win64\Debug\Client_OpenSSL.rsm" Configuration="Debug" Class="DebugSymbols">
<Platform Name="Win64">
<RemoteName>Client_OpenSSL.rsm</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
Expand Down
63 changes: 44 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ The project is developed in Delphi. In recent years, Embarcadero has made a sign
* Remote shell with multiplexing
* Remote file manager
* Remote process manager
* Remote registry manager
* 100% free, 100% open-source, forever

…and much more to do, much more to come.
Expand Down Expand Up @@ -155,16 +156,16 @@ It is possible to generate multiple certificates and register several trusted ce

The Process Manager allows retrieving the list of currently running processes on a remote system. For each process, detailed information is provided, including (but not limited to):

- Process ID
- Name
- Parent ID
- Image Path
- Session ID
- Thread Count
- Start Time
- Command Line
- Architecture
- Elevation Status
* Process ID
* Name
* Parent ID
* Image Path
* Session ID
* Thread Count
* Start Time
* Command Line
* Architecture
* Elevation Status

Elevated processes are highlighted in a distinct color, as are the current client process and those running under NT AUTHORITY/SYSTEM. This visual differentiation makes it easy to quickly identify the processes of interest. Color highlighting can be disabled if preferred. Additionally, depending on the architecture of the client and the enumerated processes, certain actions may not be available.

Expand All @@ -178,23 +179,24 @@ Optix currently provides an initial technique for dumping processes using the `M

![File Manger](Assets/sshot-8.png)

The File Manager allows browsing the remote file system. At present, the available actions are limited to:
Currently Implemented Features:

- Uploading a file to the current folder (if permitted).
- Uploading a file to a selected folder (if permitted).
- Downloading a selected file (if permitted).
* Browsing the remote file system
* Uploading a file to the current folder (if permitted).
* Uploading a file to a selected folder (if permitted).
* Downloading a selected file (if permitted).

Additional file management actions will be introduced in future versions.

A noteworthy aspect of the File Manager, which will also be extended to future features such as the Remote Registry Editor or Services Manager, is its Access Control List (ACL) analysis. For each file, ACLs are evaluated to determine read, write, or execute permissions. This makes it possible to immediately understand what actions can be performed in the current path.

For folders, access rights are visually represented with color codes (which can be disabled) to quickly identify permissions:

- Red: No Access
- Yellow: Read and Execute
- Orange: Execute Only
- Blue: Read Only
- Green: Full Access
* Red: No Access
* Yellow: Read and Execute
* Orange: Execute Only
* Blue: Read Only
* Green: Full Access

This approach reflects the ambition to provide users with clear, actionable insights at a glance, helping them both to solve challenges and to improve the overall security posture of certain elements.

Expand All @@ -204,6 +206,19 @@ This approach reflects the ambition to provide users with clear, actionable insi

As extensively discussed in the protocol section, this is a core feature for remote system management. It supports unlimited parallel sessions as well as interrupts to terminate long-running commands.

### Registry Manager

![Registry Manager](Assets/sshot-15.png)

Registry Manager allows you to browse registry data remotely with an interface closely aligned to the native Microsoft Windows Registry application. It enables easy navigation and efficient management of keys and values.

Currently Implemented Features:

* Browse the Windows Registry remotely
* View key and value, data types, including String, Multi-String, Binary, DWORD, and QWORD
* Navigate directly to a specific key path (supports hive short names)
* Option to hide keys that are inaccessible due to insufficient permissions

### What will you learn?

* Windows APIs and system internals
Expand All @@ -222,6 +237,15 @@ Stability is my top priority; new features come second.

## Changelogs

### 1.2.0 (Oct 2025)

* Registry Manager has been introduced, currently available for browsing only. Users can browse registry hives and keys and view values (e.g., DWORD, QWORD, String, Binary, etc.). *Creation, deletion, and modification of keys or values will be implemented in a future update.*
* A bug in the File Manager Folder Tree related to the 'Go To Path' function has been fixed. The complete destination path, including parent and child hierarchy, is now correctly built with proper permission resolution. This fix required a significant structural change.
* File Manager now supports relative paths. Using `..` will resolve correctly, and the path format has been standardized to prevent potential errors.
* Various other minor improvements and optimizations have been implemented.

ⓘ The Registry Manager and File Manager Folder Tree showcase another valuable concept: generic programming using the Delphi programming language.

### 1.1.0 (Sept 2025)

* **Folder Tree View Added to File Manager:** The browsed folder tree is now optionally available in the file manager (default: enabled).
Expand Down Expand Up @@ -298,6 +322,7 @@ zRt12rJmulmCvpFscq8G

I would like to thank the following people for their support, extensive testing, and early feedback

- [Embarcadero](https://www.embarcadero.com)
- [Mr.NOODLE](https://x.com/bragames2)
- [Euz](https://x.com/_Euzebius)
- [Mudpak](https://x.com/_mudpak)
Expand Down
6 changes: 5 additions & 1 deletion Server/OptixGate.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,11 @@ uses
Optix.ClassesRegistry in '..\Shared\Optix.ClassesRegistry.pas',
Optix.Func.Commands.FileSystem in '..\Shared\Functions\Optix.Func.Commands.FileSystem.pas',
Optix.Func.Commands.Process in '..\Shared\Functions\Optix.Func.Commands.Process.pas',
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas';
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas',
Optix.Func.Commands.Registry in '..\Shared\Functions\Optix.Func.Commands.Registry.pas',
Optix.Registry.Helper in '..\Shared\Optix.Registry.Helper.pas',
Optix.Registry.Enum in '..\Shared\Optix.Registry.Enum.pas',
uControlFormRegistryManager in 'Units\Forms\Control\uControlFormRegistryManager.pas' {ControlFormRegistryManager};

{$R *.res}
{$R data.res}
Expand Down
6 changes: 6 additions & 0 deletions Server/OptixGate.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,12 @@
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.FileSystem.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Process.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Shell.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Registry.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Helper.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Enum.pas"/>
<DCCReference Include="Units\Forms\Control\uControlFormRegistryManager.pas">
<Form>ControlFormRegistryManager</Form>
</DCCReference>
<None Include="..\Shared\XSuperObject.inc"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
Expand Down
6 changes: 5 additions & 1 deletion Server/OptixGate_OpenSSL.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,11 @@ uses
Optix.ClassesRegistry in '..\Shared\Optix.ClassesRegistry.pas',
Optix.Func.Commands.FileSystem in '..\Shared\Functions\Optix.Func.Commands.FileSystem.pas',
Optix.Func.Commands.Process in '..\Shared\Functions\Optix.Func.Commands.Process.pas',
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas';
Optix.Func.Commands.Shell in '..\Shared\Functions\Optix.Func.Commands.Shell.pas',
uControlFormRegistryManager in 'Units\Forms\Control\uControlFormRegistryManager.pas' {ControlFormRegistryManager},
Optix.Func.Commands.Registry in '..\Shared\Functions\Optix.Func.Commands.Registry.pas',
Optix.Registry.Helper in '..\Shared\Optix.Registry.Helper.pas',
Optix.Registry.Enum in '..\Shared\Optix.Registry.Enum.pas';

{$R *.res}
{$R data.res}
Expand Down
21 changes: 19 additions & 2 deletions Server/OptixGate_OpenSSL.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,13 @@
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.FileSystem.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Process.pas"/>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Shell.pas"/>
<DCCReference Include="Units\Forms\Control\uControlFormRegistryManager.pas">
<Form>ControlFormRegistryManager</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="..\Shared\Functions\Optix.Func.Commands.Registry.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Helper.pas"/>
<DCCReference Include="..\Shared\Optix.Registry.Enum.pas"/>
<None Include="..\Shared\XSuperObject.inc"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
Expand Down Expand Up @@ -279,10 +286,20 @@
</Delphi.Personality>
<Deployment Version="5">
<DeployFile LocalName="..\Shared\XSuperObject.inc" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="..\Shared\XSuperObject.inc" Configuration="Debug" Class="ProjectFile"/>
<DeployFile LocalName="..\Shared\XSuperObject.inc" Configuration="Release" Class="ProjectFile"/>
<DeployFile LocalName="..\Shared\XSuperObject.inc" Configuration="Debug" Class="ProjectFile">
<Platform Name="Win32">
<RemoteDir>.\</RemoteDir>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="..\Shared\XSuperObject.inc" Configuration="Release" Class="ProjectFile"/>
<DeployFile LocalName="bins\OpenSSL\Win32\Debug\OptixGate_OpenSSL.exe" Configuration="Debug" Class="ProjectOutput"/>
<DeployFile LocalName="bins\OpenSSL\Win32\Debug\OptixGate_OpenSSL.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>OptixGate_OpenSSL.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="bins\OpenSSL\Win32\Release\OptixGate_OpenSSL.exe" Configuration="Release" Class="ProjectOutput"/>
<DeployFile LocalName="bins\OpenSSL\Win64\Debug\OptixGate_OpenSSL.exe" Configuration="Debug" Class="ProjectOutput"/>
<DeployFile LocalName="bins\OpenSSL\Win64\Release\OptixGate_OpenSSL.exe" Configuration="Release" Class="ProjectOutput"/>
Expand Down
2 changes: 1 addition & 1 deletion Server/Units/Forms/Control/uControlFormControlForms.pas
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ procedure TControlFormControlForms.VSTCompareNodes(Sender: TBaseVirtualTree; Nod
Result := 0
else begin
if (Column in [2..4, 6]) and (not Assigned(pData1^.FormInformation) or not Assigned(pData2^.FormInformation)) then
Result := CompareObjectAssigmenet(pData1^.FormInformation, pData2^.FormInformation)
Result := CompareObjectAssignement(pData1^.FormInformation, pData2^.FormInformation)
else begin
case Column of
0 : Result := CompareText(pData1^.Title, pData2^.Title);
Expand Down
14 changes: 7 additions & 7 deletions Server/Units/Forms/Control/uControlFormFileManager.dfm
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ object ControlFormFileManager: TControlFormFileManager
Align = alTop
ReadOnly = True
TabOrder = 0
ExplicitWidth = 638
end
object PanelActions: TPanel
AlignWithMargins = True
Expand All @@ -40,6 +41,7 @@ object ControlFormFileManager: TControlFormFileManager
Align = alTop
BevelOuter = bvNone
TabOrder = 1
ExplicitWidth = 638
object ButtonHome: TSpeedButton
AlignWithMargins = True
Left = 0
Expand Down Expand Up @@ -117,7 +119,7 @@ object ControlFormFileManager: TControlFormFileManager
Left = 619
Top = 10
Width = 21
Height = 15
Height = 20
Margins.Left = 8
Margins.Top = 10
Margins.Right = 8
Expand All @@ -131,6 +133,7 @@ object ControlFormFileManager: TControlFormFileManager
Font.Style = []
ParentFont = False
Visible = False
ExplicitHeight = 15
end
object ButtonBack: TSpeedButton
AlignWithMargins = True
Expand Down Expand Up @@ -204,7 +207,8 @@ object ControlFormFileManager: TControlFormFileManager
MinPosition = 0.020000000000000000
Align = alClient
TabOrder = 2
ExplicitWidth = 666
ExplicitWidth = 646
ExplicitHeight = 348
DesignSize = (
656
380)
Expand Down Expand Up @@ -315,6 +319,7 @@ object ControlFormFileManager: TControlFormFileManager
OnCompareNodes = VSTFoldersCompareNodes
OnDblClick = VSTFoldersDblClick
OnFocusChanged = VSTFoldersFocusChanged
OnFreeNode = VSTFoldersFreeNode
OnGetText = VSTFoldersGetText
OnGetImageIndex = VSTFoldersGetImageIndex
OnGetNodeDataSize = VSTFoldersGetNodeDataSize
Expand Down Expand Up @@ -358,11 +363,6 @@ object ControlFormFileManager: TControlFormFileManager
Checked = True
OnClick = ShowFolderTree1Click
end
object AutoExpandFolderTree1: TMenuItem
AutoCheck = True
Caption = 'Auto Expand Folder Tree'
Checked = True
end
end
object PopupFoldersTree: TPopupMenu
Left = 256
Expand Down
Loading