From 77c8a321deb8de08f8534b9663418260cd85d9d4 Mon Sep 17 00:00:00 2001 From: Jakob Friedl <71284620+jakobfriedl@users.noreply.github.com> Date: Fri, 31 Oct 2025 16:59:10 +0100 Subject: [PATCH] Removed warnings and unused imports. --- README.md | 2 +- src/agent/core/clr.nim | 4 +- src/agent/core/coff.nim | 8 ++-- src/agent/core/context.nim | 2 +- src/agent/core/exit.nim | 2 +- src/agent/core/http.nim | 2 +- src/agent/core/sleepmask.nim | 2 +- src/agent/main.nim | 3 +- src/agent/protocol/heartbeat.nim | 2 +- src/agent/protocol/registration.nim | 4 +- src/agent/protocol/task.nim | 3 +- src/agent/utils/hwbp.nim | 1 - src/agent/utils/io.nim | 2 +- src/client/core/task.nim | 2 +- src/client/core/websocket.nim | 5 +-- src/client/main.nim | 2 +- src/client/utils/appImGui.nim | 4 +- src/client/utils/colors.nim | 2 +- src/client/utils/opengl/zoomglass.nim | 40 ------------------ src/client/views/console.nim | 12 ++---- src/client/views/dockspace.nim | 4 +- src/client/views/eventlog.nim | 8 ++-- src/client/views/listeners.nim | 17 ++++---- src/client/views/loot/downloads.nim | 19 ++++----- src/client/views/loot/screenshots.nim | 13 +++--- src/client/views/modals/configureKillDate.nim | 8 ++-- .../views/modals/configureWorkingHours.nim | 5 +-- src/client/views/modals/generatePayload.nim | 12 +++--- src/client/views/modals/startListener.nim | 12 +++--- src/client/views/sessions.nim | 42 +++++++++++-------- .../views/widgets/dualListSelection.nim | 19 ++++----- src/client/views/widgets/textarea.nim | 26 ++++++------ src/modules/bof.nim | 4 +- src/modules/dotnet.nim | 4 +- src/modules/exit.nim | 3 +- src/modules/filesystem.nim | 5 +-- src/modules/filetransfer.nim | 8 ++-- src/modules/screenshot.nim | 4 +- src/modules/shell.nim | 3 +- src/modules/sleep.nim | 3 +- src/modules/systeminfo.nim | 3 +- src/modules/token.nim | 1 - src/server/core/listener.nim | 2 +- src/server/db/dbAgent.nim | 2 +- 44 files changed, 138 insertions(+), 193 deletions(-) delete mode 100644 src/client/utils/opengl/zoomglass.nim diff --git a/README.md b/README.md index ae44310..7b581c4 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ The following projects and people have significantly inspired and/or helped with - [Cobalt Strike](https://www.cobaltstrike.com) - [AdaptixC2](https://github.com/Adaptix-Framework/AdaptixC2/) - Development: - - [imguin](https://github.com/dinau/imguin) by [dinau](github.com/dinau/) (ImGui Wrapper for Nim) + - [imguin](https://github.com/dinau/imguin) by [dinau](https://github.com/dinau/) (ImGui Wrapper for Nim) - [MalDev Academy](https://maldevacademy.com/) - [Creds](https://github.com/S3cur3Th1sSh1t/Creds) by [S3cur3Th1sSh1t](https://github.com/S3cur3Th1sSh1t/) - [malware](https://github.com/m4ul3r/malware/) by [m4ul3r](https://github.com/m4ul3r/) diff --git a/src/agent/core/clr.nim b/src/agent/core/clr.nim index a28b7a4..8f1646b 100644 --- a/src/agent/core/clr.nim +++ b/src/agent/core/clr.nim @@ -1,7 +1,7 @@ import winim/[lean, clr] -import os, strformat, strutils, sequtils +import os import ../utils/[hwbp, io] -import ../../common/[types, utils] +import ../../common/utils #[ Executing .NET assemblies in memory diff --git a/src/agent/core/coff.nim b/src/agent/core/coff.nim index 6f1bb60..5b5d054 100644 --- a/src/agent/core/coff.nim +++ b/src/agent/core/coff.nim @@ -449,7 +449,7 @@ proc generateCoffArguments*(args: seq[TaskArg]): seq[byte] = prefix = Bytes.toString(arg.data)[0..3] value = Bytes.toString(arg.data)[4..^1] - # Check the first two characters for a type specification + # Check the prefix for a type specification case prefix: of protect("[i]:"): # Handle argument as integer @@ -465,8 +465,7 @@ proc generateCoffArguments*(args: seq[TaskArg]): seq[byte] = # Handle argument as wide string # Add terminating NULL byte to the end of string arguments let wStrData = cast[seq[byte]](+$value) # +$ converts a string to a wstring - packer.add(uint32(wStrData.len())) - packer.addData(wStrData) + packer.addDataWithLengthPrefix(wStrData) else: # In case no prefix is specified, handle the argument as a regular string @@ -476,8 +475,7 @@ proc generateCoffArguments*(args: seq[TaskArg]): seq[byte] = # Handle argument as regular string # Add terminating NULL byte to the end of string arguments let data = arg.data & @[uint8(0)] - packer.add(uint32(data.len())) - packer.addData(data) + packer.addDataWithLengthPrefix(data) else: # Argument is not passed as a string, but instead directly as a int or short diff --git a/src/agent/core/context.nim b/src/agent/core/context.nim index 4046914..ca6d969 100644 --- a/src/agent/core/context.nim +++ b/src/agent/core/context.nim @@ -1,4 +1,4 @@ -import parsetoml, base64, system +import parsetoml, system import ../utils/io import ../../common/[types, utils, crypto, serialize] diff --git a/src/agent/core/exit.nim b/src/agent/core/exit.nim index bbd740b..2164e43 100644 --- a/src/agent/core/exit.nim +++ b/src/agent/core/exit.nim @@ -27,7 +27,7 @@ const - https://maldevacademy.com/modules/72 ]# proc deleteSelfFromDisk*() = - let newStream = newWString(fmt":{uint(rand(RAND_MAX)):x}{uint(rand(RAND_MAX)):x}") + let newStream = +$(fmt":{uint(rand(RAND_MAX)):x}{uint(rand(RAND_MAX)):x}") # Convert to wString var szFileName: array[MAX_PATH * 2, WCHAR] fileRenameInfo2: FILE_RENAME_INFO2 diff --git a/src/agent/core/http.nim b/src/agent/core/http.nim index c1222ed..03216ad 100644 --- a/src/agent/core/http.nim +++ b/src/agent/core/http.nim @@ -1,4 +1,4 @@ -import httpclient, json, strformat, strutils, asyncdispatch, base64, tables, parsetoml, random +import httpclient, strformat, strutils, asyncdispatch, base64, tables, parsetoml, random import ../utils/io import ../../common/[types, utils, profile] diff --git a/src/agent/core/sleepmask.nim b/src/agent/core/sleepmask.nim index a53c5cc..2dfd7c3 100644 --- a/src/agent/core/sleepmask.nim +++ b/src/agent/core/sleepmask.nim @@ -1,6 +1,6 @@ import winim/lean import winim/inc/tlhelp32 -import os, system, strformat, random +import os, system, random, strformat import ../utils/[cfg, io] import ../../common/[types, utils, crypto] diff --git a/src/agent/main.nim b/src/agent/main.nim index 10f5ee9..1c06344 100644 --- a/src/agent/main.nim +++ b/src/agent/main.nim @@ -1,5 +1,4 @@ -import strformat, os, times, system, base64, random - +import times, system, random, strformat import core/[http, context, sleepmask, exit] import utils/io import protocol/[task, result, heartbeat, registration] diff --git a/src/agent/protocol/heartbeat.nim b/src/agent/protocol/heartbeat.nim index 51928c4..0e03248 100644 --- a/src/agent/protocol/heartbeat.nim +++ b/src/agent/protocol/heartbeat.nim @@ -1,5 +1,5 @@ import times, zippy -import ../../common/[types, serialize, sequence, utils, crypto] +import ../../common/[types, serialize, utils, crypto] proc createHeartbeat*(ctx: AgentCtx): Heartbeat = return Heartbeat( diff --git a/src/agent/protocol/registration.nim b/src/agent/protocol/registration.nim index 7a817e7..c9db43b 100644 --- a/src/agent/protocol/registration.nim +++ b/src/agent/protocol/registration.nim @@ -1,4 +1,4 @@ -import winim, os, net, strformat, strutils, registry, zippy +import winim, os, net, strutils, registry, zippy import ../../common/[types, serialize, sequence, crypto, utils] import ../../modules/manager @@ -51,7 +51,7 @@ proc getProcessExe(): string = if GetModuleFileNameExW(hProcess, 0, buffer, MAX_PATH): # .extractFilename() from the 'os' module gets the name of the executable from the full process path # We replace trailing NULL bytes to prevent them from being sent as JSON data - return string($buffer).extractFilename().replace("\u0000", "") + return ($buffer).extractFilename().replace("\u0000", "") finally: CloseHandle(hProcess) diff --git a/src/agent/protocol/task.nim b/src/agent/protocol/task.nim index ff441fb..506146d 100644 --- a/src/agent/protocol/task.nim +++ b/src/agent/protocol/task.nim @@ -1,5 +1,4 @@ -import strutils, tables, json, strformat, zippy - +import zippy, strformat import ./result import ../utils/io import ../../modules/manager diff --git a/src/agent/utils/hwbp.nim b/src/agent/utils/hwbp.nim index f22ddc5..bc94d40 100644 --- a/src/agent/utils/hwbp.nim +++ b/src/agent/utils/hwbp.nim @@ -1,6 +1,5 @@ import winim/lean import ./io -import ../../common/utils # From: https://github.com/m4ul3r/malware/blob/main/nim/hardware_breakpoints/hardwarebreakpoints.nim diff --git a/src/agent/utils/io.nim b/src/agent/utils/io.nim index ed39fa0..20c01f4 100644 --- a/src/agent/utils/io.nim +++ b/src/agent/utils/io.nim @@ -1,7 +1,7 @@ import winim/lean import macros import strutils, strformat -import ../../common/[types, utils] +import ../../common/utils const VERBOSE* {.booldefine.} = false diff --git a/src/client/core/task.nim b/src/client/core/task.nim index c8f11bb..36451e2 100644 --- a/src/client/core/task.nim +++ b/src/client/core/task.nim @@ -1,5 +1,5 @@ import std/paths -import strutils, sequtils, times, tables +import strutils, sequtils, times import ../../common/[types, sequence, crypto, utils, serialize] proc parseInput*(input: string): seq[string] = diff --git a/src/client/core/websocket.nim b/src/client/core/websocket.nim index b2421a1..21336ef 100644 --- a/src/client/core/websocket.nim +++ b/src/client/core/websocket.nim @@ -1,6 +1,5 @@ -import whisky -import times, tables, json, base64 -import ../../common/[types, utils, serialize, event] +import times, json, base64 +import ../../common/[types, utils, event] export sendHeartbeat, recvEvent #[ diff --git a/src/client/main.nim b/src/client/main.nim index 3f34466..76cd4f8 100644 --- a/src/client/main.nim +++ b/src/client/main.nim @@ -1,5 +1,5 @@ import whisky -import tables, times, strutils, strformat, json, parsetoml, base64, os, native_dialogs +import tables, times, strutils, strformat, json, parsetoml, base64, native_dialogs import ./utils/[appImGui, globals] import ./views/[dockspace, sessions, listeners, eventlog, console] import ./views/loot/[screenshots, downloads] diff --git a/src/client/utils/appImGui.nim b/src/client/utils/appImGui.nim index eccbc12..dff19b0 100644 --- a/src/client/utils/appImGui.nim +++ b/src/client/utils/appImGui.nim @@ -6,8 +6,8 @@ import imguin/[cimgui, glfw_opengl, simple] export cimgui, glfw_opengl, simple import ./globals -import ./opengl/[zoomglass, loadImage] -export zoomglass, loadImage +import ./opengl/loadImage +export loadImage import ./[saveImage, setupFonts, utils, vecs] export saveImage, setupFonts, utils, vecs diff --git a/src/client/utils/colors.nim b/src/client/utils/colors.nim index 174eb83..c4642eb 100644 --- a/src/client/utils/colors.nim +++ b/src/client/utils/colors.nim @@ -1,4 +1,4 @@ -import imguin/[cimgui, glfw_opengl, simple] +import imguin/cimgui import ../utils/appImGui # https://rgbcolorpicker.com/0-1 diff --git a/src/client/utils/opengl/zoomglass.nim b/src/client/utils/opengl/zoomglass.nim deleted file mode 100644 index bd1aa6c..0000000 --- a/src/client/utils/opengl/zoomglass.nim +++ /dev/null @@ -1,40 +0,0 @@ -import imguin/[cimgui,simple] -import loadImage -import ../fonticon/IconsFontAwesome6 - -#-------------- -#--- zoomGlass -#-------------- -proc zoomGlass*(textureID: var uint32, itemWidth:int, itemPosTop, itemPosEnd:ImVec2 , capture = false, zoom: float = 4.0f) = - # itemPosTop and itemPosEnd are absolute position in main window. - if igBeginItemTooltip(): - defer: igEndTooltip() - let itemHeight = itemPosEnd.y.int - itemPosTop.y.int - let my_tex_w = itemWidth.float - let my_tex_h = itemHeight.float - let wkSize = igGetMainViewport().Worksize - if capture: - loadTextureFromBuffer(textureID # TextureID - , itemPosTop.x.int # x start pos - , wkSize.y.int - itemPosEnd.y.int # y start pos - , itemWidth ,itemHeight) # Image width and height must be 2^n. - #igText("lbp: (%.2f, %.2f)", pio.MousePos.x, pio.MousePos.y) - let pio = igGetIO() - let region_sz = 32.0f - var region_x = pio.MousePos.x - itemPosTop.x - region_sz * 0.5f - var region_y = pio.MousePos.y - itemPosTop.y - region_sz * 0.5f - if region_x < 0.0f: - region_x = 0.0f - elif region_x > (my_tex_w - region_sz): - region_x = my_tex_w - region_sz - if region_y < 0.0f: - region_y = 0.0f - elif region_y > my_tex_h - region_sz: - region_y = my_tex_h - region_sz - let uv0 = ImVec2(x: (region_x) / my_tex_w, y: (region_y) / my_tex_h) - let uv1 = ImVec2(x: (region_x + region_sz) / my_tex_w, y: (region_y + region_sz) / my_tex_h) - let tint_col = ImVec4(x: 1.0f, y: 1.0f, z: 1.0f, w: 1.0f) #// No tint - let border_col = ImVec4(x: 0.22f, y: 0.56f, z: 0.22f, w: 1.0f) # Green - igText(ICON_FA_MAGNIFYING_GLASS & " 4 x") - let texRef = ImTextureRef(internal_TexData: nil, internal_TexID: textureID) - igImage(texRef, ImVec2(x: region_sz * zoom, y: region_sz * zoom), uv0, uv1) #, tint_col, border_col) diff --git a/src/client/views/console.nim b/src/client/views/console.nim index ef93aaa..8dca3df 100644 --- a/src/client/views/console.nim +++ b/src/client/views/console.nim @@ -1,5 +1,4 @@ -import whisky -import strformat, strutils, times, json, tables, sequtils +import strformat, strutils, sequtils import imguin/[cimgui, glfw_opengl, simple] import ../utils/[appImGui, colors] import ../../common/[types, utils] @@ -34,9 +33,6 @@ proc Console*(agent: UIAgent): ConsoleComponent = #[ Text input callback function for managing console history and autocompletion ]# -var currentCompletionIndex: int = -1 -var lastMatches: seq[string] = @[] - proc callback(data: ptr ImGuiInputTextCallbackData): cint {.cdecl.} = let component = cast[ConsoleComponent](data.UserData) @@ -282,7 +278,7 @@ proc draw*(component: ConsoleComponent, connection: WsConnection) = #[ Input field with prompt indicator ]# - igText(fmt"[{component.agent.agentId}]") + igText(fmt"[{component.agent.agentId}]".cstring) igSameLine(0.0f, textSpacing) # Calculate available width for input @@ -290,9 +286,9 @@ proc draw*(component: ConsoleComponent, connection: WsConnection) = igSetNextItemWidth(availableSize.x) let inputFlags = ImGuiInputTextFlags_EnterReturnsTrue.int32 or ImGuiInputTextFlags_EscapeClearsAll.int32 or ImGuiInputTextFlags_CallbackHistory.int32 or ImGuiInputTextFlags_CallbackCompletion.int32 - if igInputText("##Input", addr component.inputBuffer[0], MAX_INPUT_LENGTH, inputFlags, callback, cast[pointer](component)): + if igInputText("##Input", cast[cstring](addr component.inputBuffer[0]), MAX_INPUT_LENGTH, inputFlags, callback, cast[pointer](component)): - let command = ($(addr component.inputBuffer[0])).strip() + let command = ($cast[cstring]((addr component.inputBuffer[0]))).strip() if not command.isEmptyOrWhitespace(): # Send command to team server component.handleAgentCommand(connection, command) diff --git a/src/client/views/dockspace.nim b/src/client/views/dockspace.nim index cfd608c..1710bba 100644 --- a/src/client/views/dockspace.nim +++ b/src/client/views/dockspace.nim @@ -77,14 +77,14 @@ proc draw*(component: DockspaceComponent, showComponent: ptr bool, views: Table[ # Create a menu item to toggle each of the main views of the application for view, showView in views: if not view.startsWith("Loot:"): - if igMenuItem(view, nil, showView[], showView != nil): + if igMenuItem(view.cstring, nil, showView[], showView != nil): showView[] = not showView[] if igBeginMenu("Loot", true): for view, showView in views: if view.startsWith("Loot:"): let itemName = view.split(":")[1] - if igMenuItem(itemName, nil, showView[], showView != nil): + if igMenuItem(itemName.cstring, nil, showView[], showView != nil): showView[] = not showView[] igEndMenu() diff --git a/src/client/views/eventlog.nim b/src/client/views/eventlog.nim index 3b15892..cfb7377 100644 --- a/src/client/views/eventlog.nim +++ b/src/client/views/eventlog.nim @@ -1,8 +1,6 @@ -import strformat, strutils, times -import imguin/[cimgui, glfw_opengl, simple] -import ../utils/[appImGui, colors] +import imguin/[cimgui, glfw_opengl] import ./widgets/textarea -import ../../common/types +import ../utils/appImGui export addItem type @@ -16,7 +14,7 @@ proc Eventlog*(title: string): EventlogComponent = result.textarea = Textarea(showTimestamps = false) proc draw*(component: EventlogComponent, showComponent: ptr bool) = - igBegin(component.title, showComponent, 0) + igBegin(component.title.cstring, showComponent, 0) defer: igEnd() component.textarea.draw(vec2(-1.0f, -1.0f)) \ No newline at end of file diff --git a/src/client/views/listeners.nim b/src/client/views/listeners.nim index 425363c..b509030 100644 --- a/src/client/views/listeners.nim +++ b/src/client/views/listeners.nim @@ -1,10 +1,9 @@ -import whisky import strutils import imguin/[cimgui, glfw_opengl, simple] -import ../utils/appImGui -import ../../common/[types, utils] import ./modals/[startListener, generatePayload] +import ../utils/appImGui import ../core/websocket +import ../../common/types type ListenersTableComponent* = ref object of RootObj @@ -23,7 +22,7 @@ proc ListenersTable*(title: string): ListenersTableComponent = result.generatePayloadModal = AgentModal() proc draw*(component: ListenersTableComponent, showComponent: ptr bool, connection: WsConnection) = - igBegin(component.title, showComponent, 0) + igBegin(component.title.cstring, showComponent, 0) defer: igEnd() let textSpacing = igGetStyle().ItemSpacing.x @@ -87,17 +86,17 @@ proc draw*(component: ListenersTableComponent, showComponent: ptr bool, connecti # Enable multi-select functionality igSetNextItemSelectionUserData(i) var isSelected = ImGuiSelectionBasicStorage_Contains(component.selection, cast[ImGuiID](i)) - discard igSelectable_Bool(listener.listenerId, isSelected, ImGuiSelectableFlags_SpanAllColumns.int32, vec2(0.0f, 0.0f)) + discard igSelectable_Bool(listener.listenerId.cstring, isSelected, ImGuiSelectableFlags_SpanAllColumns.int32, vec2(0.0f, 0.0f)) if igTableSetColumnIndex(1): - igText(listener.address) + igText(listener.address.cstring) if igTableSetColumnIndex(2): - igText($listener.port) + igText(($listener.port).cstring) if igTableSetColumnIndex(3): for host in listener.hosts.split(";"): - igText(host) + igText(host.cstring) if igTableSetColumnIndex(4): - igText($listener.protocol) + igText(($listener.protocol).cstring) # Handle right-click context menu # Right-clicking the table header to hide/show columns or reset the layout is only possible when no sessions are selected diff --git a/src/client/views/loot/downloads.nim b/src/client/views/loot/downloads.nim index e6c6796..ed6aa4e 100644 --- a/src/client/views/loot/downloads.nim +++ b/src/client/views/loot/downloads.nim @@ -1,7 +1,7 @@ import strformat, strutils, times, os, tables, native_dialogs import imguin/[cimgui, glfw_opengl, simple] -import ../../utils/[appImGui, colors] -import ../../../common/[types, utils] +import ../../utils/appImGui +import ../../../common/types import ../../core/websocket import ../widgets/textarea @@ -23,12 +23,11 @@ proc LootDownloads*(title: string): DownloadsComponent = result.textarea = Textarea(showTimestamps = false, autoScroll = false) proc draw*(component: DownloadsComponent, showComponent: ptr bool, connection: WsConnection) = - igBegin(component.title, showComponent, 0) + igBegin(component.title.cstring, showComponent, 0) defer: igEnd() var availableSize: ImVec2 igGetContentRegionAvail(addr availableSize) - let textSpacing = igGetStyle().ItemSpacing.x # Left panel (file table) let childFlags = ImGui_ChildFlags_ResizeX.int32 or ImGui_ChildFlags_NavFlattened.int32 @@ -75,19 +74,19 @@ proc draw*(component: DownloadsComponent, showComponent: ptr bool, connection: W igPopID() if igTableSetColumnIndex(1): - igText(item.agentId) + igText(item.agentId.cstring) if igTableSetColumnIndex(2): igText(item.host.cstring) if igTableSetColumnIndex(3): - igText(item.path.extractFilename().replace("C_", "C:/").replace("_", "/")) + igText(item.path.extractFilename().replace("C_", "C:/").replace("_", "/").cstring) if igTableSetColumnIndex(4): - igText(item.timestamp.fromUnix().local().format("dd-MM-yyyy HH:mm:ss")) + igText(item.timestamp.fromUnix().local().format("dd-MM-yyyy HH:mm:ss").cstring) if igTableSetColumnIndex(5): - igText($item.size) + igText(($item.size).cstring) # Handle right-click context menu if component.selectedIndex >= 0 and component.selectedIndex < component.items.len and igBeginPopupContextWindow("Downloads", ImGui_PopupFlags_MouseButtonRight.int32): @@ -127,9 +126,9 @@ proc draw*(component: DownloadsComponent, showComponent: ptr bool, connection: W component.contents[item.lootId] = "" # Ensure that the sendGetLoot() function is sent only once by setting a value for the table key else: - igText(fmt("[{item.host}] ")) + igText(fmt"[{item.host}] ".cstring) igSameLine(0.0f, 0.0f) - igText(item.path.extractFilename().replace("C_", "C:/").replace("_", "/")) + igText(item.path.extractFilename().replace("C_", "C:/").replace("_", "/").cstring) igDummy(vec2(0.0f, 5.0f)) igSeparator() diff --git a/src/client/views/loot/screenshots.nim b/src/client/views/loot/screenshots.nim index d91641a..cb60119 100644 --- a/src/client/views/loot/screenshots.nim +++ b/src/client/views/loot/screenshots.nim @@ -1,6 +1,6 @@ -import strformat, strutils, times, os, tables, native_dialogs +import times, tables, native_dialogs import imguin/[cimgui, glfw_opengl, simple] -import ../../utils/[appImGui, colors] +import ../../utils/appImGui import ../../../common/[types, utils] import ../../core/websocket @@ -35,12 +35,11 @@ proc addTexture*(component: ScreenshotsComponent, lootId: string, data: string) ) proc draw*(component: ScreenshotsComponent, showComponent: ptr bool, connection: WsConnection) = - igBegin(component.title, showComponent, 0) + igBegin(component.title.cstring, showComponent, 0) defer: igEnd() var availableSize: ImVec2 igGetContentRegionAvail(addr availableSize) - let textSpacing = igGetStyle().ItemSpacing.x # Left panel (file table) let childFlags = ImGui_ChildFlags_ResizeX.int32 or ImGui_ChildFlags_NavFlattened.int32 @@ -85,16 +84,16 @@ proc draw*(component: ScreenshotsComponent, showComponent: ptr bool, connection: igPopID() if igTableSetColumnIndex(1): - igText(item.agentId) + igText(item.agentId.cstring) if igTableSetColumnIndex(2): igText(item.host.cstring) if igTableSetColumnIndex(3): - igText(item.timestamp.fromUnix().local().format("dd-MM-yyyy HH:mm:ss")) + igText(item.timestamp.fromUnix().local().format("dd-MM-yyyy HH:mm:ss").cstring) if igTableSetColumnIndex(4): - igText($item.size) + igText(($item.size).cstring) # Handle right-click context menu if component.selectedIndex >= 0 and component.selectedIndex < component.items.len and igBeginPopupContextWindow("Downloads", ImGui_PopupFlags_MouseButtonRight.int32): diff --git a/src/client/views/modals/configureKillDate.nim b/src/client/views/modals/configureKillDate.nim index 81a5dad..f3f2f7e 100644 --- a/src/client/views/modals/configureKillDate.nim +++ b/src/client/views/modals/configureKillDate.nim @@ -1,6 +1,6 @@ -import strutils, sequtils, times -import imguin/[cimgui, glfw_opengl, simple] -import ../../utils/[appImGui, colors] +import times +import imguin/[cimgui, glfw_opengl] +import ../../utils/appImGui type KillDateModalComponent* = ref object of RootObj @@ -75,7 +75,7 @@ proc draw*(component: KillDateModalComponent): int64 = let charWidth = charSize.x + 10.0f let dateText = component.killDateTime.S.fromUnix().utc().format("dd. MMMM yyyy") & '\0' - igInputText("##Text", dateText, dateText.len().csize_t, ImGui_InputTextFlags_ReadOnly.int32, nil, nil) + igInputText("##Text", dateText.cstring, dateText.len().csize_t, ImGui_InputTextFlags_ReadOnly.int32, nil, nil) igSameLine(0.0f, textSpacing) igPushItemWidth(charWidth) diff --git a/src/client/views/modals/configureWorkingHours.nim b/src/client/views/modals/configureWorkingHours.nim index 1e38325..9c0c085 100644 --- a/src/client/views/modals/configureWorkingHours.nim +++ b/src/client/views/modals/configureWorkingHours.nim @@ -1,6 +1,5 @@ -import strutils, sequtils, times -import imguin/[cimgui, glfw_opengl, simple] -import ../../utils/[appImGui, colors] +import imguin/[cimgui, glfw_opengl] +import ../../utils/appImGui import ../../../common/types type diff --git a/src/client/views/modals/generatePayload.nim b/src/client/views/modals/generatePayload.nim index b9a51be..4716aa7 100644 --- a/src/client/views/modals/generatePayload.nim +++ b/src/client/views/modals/generatePayload.nim @@ -1,10 +1,10 @@ import strutils, strformat, sequtils, times -import imguin/[cimgui, glfw_opengl, simple] -import ../../utils/[appImGui, colors] -import ../../../common/[types, profile, utils] -import ../../../modules/manager +import imguin/[cimgui, glfw_opengl] import ../widgets/[dualListSelection, textarea] import ./[configureKillDate, configureWorkingHours] +import ../../utils/appImGui +import ../../../common/types +import ../../../modules/manager export addItem type @@ -160,7 +160,7 @@ proc draw*(component: AgentModalComponent, listeners: seq[UIListener]): AgentBui igBeginDisabled(not component.killDateEnabled) igGetContentRegionAvail(addr availableSize) igSetNextItemWidth(availableSize.x) - if igButton(if component.killDate != 0: component.killDate.fromUnix().utc().format("dd. MMMM yyyy HH:mm:ss") & " UTC" else: "Configure##KillDate", vec2(-1.0f, 0.0f)): + if igButton((if component.killDate != 0: component.killDate.fromUnix().utc().format("dd. MMMM yyyy HH:mm:ss") & " UTC" else: "Configure##KillDate").cstring, vec2(-1.0f, 0.0f)): igOpenPopup_str("Configure Kill Date", ImGui_PopupFlags_None.int32) igEndDisabled() @@ -179,7 +179,7 @@ proc draw*(component: AgentModalComponent, listeners: seq[UIListener]): AgentBui igSetNextItemWidth(availableSize.x) let workingHoursLabel = fmt"{component.workingHours.startHour:02}:{component.workingHours.startMinute:02} - {component.workingHours.endHour:02}:{component.workingHours.endMinute:02}" - if igButton(if component.workingHours.enabled: workingHoursLabel else: "Configure##WorkingHours", vec2(-1.0f, 0.0f)): + if igButton((if component.workingHours.enabled: workingHoursLabel else: "Configure##WorkingHours").cstring, vec2(-1.0f, 0.0f)): igOpenPopup_str("Configure Working Hours", ImGui_PopupFlags_None.int32) igEndDisabled() diff --git a/src/client/views/modals/startListener.nim b/src/client/views/modals/startListener.nim index 8caefe4..92dbf73 100644 --- a/src/client/views/modals/startListener.nim +++ b/src/client/views/modals/startListener.nim @@ -1,5 +1,5 @@ import strutils -import imguin/[cimgui, glfw_opengl, simple] +import imguin/[cimgui, glfw_opengl] import ../../utils/appImGui import ../../../common/[types, utils] @@ -65,7 +65,7 @@ proc draw*(component: ListenerModalComponent): UIListener = igSameLine(0.0f, textSpacing) igGetContentRegionAvail(addr availableSize) igSetNextItemWidth(availableSize.x) - igInputTextWithHint("##InputAddressBind", "0.0.0.0", addr component.bindAddress[0], 256, ImGui_InputTextFlags_CharsNoBlank.int32, nil, nil) + igInputTextWithHint("##InputAddressBind", "0.0.0.0", cast[cstring](addr component.bindAddress[0]), 256, ImGui_InputTextFlags_CharsNoBlank.int32, nil, nil) # Listener bindPort let step: uint16 = 1 @@ -79,7 +79,7 @@ proc draw*(component: ListenerModalComponent): UIListener = igSameLine(0.0f, textSpacing) igGetContentRegionAvail(addr availableSize) igSetNextItemWidth(availableSize.x) - igInputTextMultiline("##InputCallbackHosts", addr component.callbackHosts[0], 256 * 32, vec2(0.0f, 3.0f * igGetTextLineHeightWithSpacing()), ImGui_InputTextFlags_CharsNoBlank.int32, nil, nil) + igInputTextMultiline("##InputCallbackHosts", cast[cstring](addr component.callbackHosts[0]), 256 * 32, vec2(0.0f, 3.0f * igGetTextLineHeightWithSpacing()), ImGui_InputTextFlags_CharsNoBlank.int32, nil, nil) igGetContentRegionAvail(addr availableSize) @@ -88,15 +88,15 @@ proc draw*(component: ListenerModalComponent): UIListener = igDummy(vec2(0.0f, 10.0f)) # Only enabled the start button when valid values have been entered - igBeginDisabled(($(addr component.bindAddress[0]) == "") or (component.bindPort <= 0)) + igBeginDisabled(($cast[cstring]((addr component.bindAddress[0])) == "") or (component.bindPort <= 0)) if igButton("Start", vec2(availableSize.x * 0.5 - textSpacing * 0.5, 0.0f)): # Process input values var hosts: string = "" let - callbackHosts = $(addr component.callbackHosts[0]) - bindAddress = $(addr component.bindAddress[0]) + callbackHosts = $cast[cstring]((addr component.callbackHosts[0])) + bindAddress = $cast[cstring]((addr component.bindAddress[0])) bindPort = int(component.bindPort) if callbackHosts.isEmptyOrWhitespace(): diff --git a/src/client/views/sessions.nim b/src/client/views/sessions.nim index ae0a82c..dae6d65 100644 --- a/src/client/views/sessions.nim +++ b/src/client/views/sessions.nim @@ -5,7 +5,7 @@ import ./console import ../core/[task, websocket] import ../utils/[appImGui, colors] import ../../modules/manager -import ../../common/[types, utils] +import ../../common/types type SessionsTableComponent* = ref object of RootObj @@ -41,12 +41,12 @@ proc interact(component: SessionsTableComponent) = # Focus the existing console window else: - igSetWindowFocus_Str(fmt"[{agent.agentId}] {agent.username}@{agent.hostname}") + igSetWindowFocus_Str(fmt"[{agent.agentId}] {agent.username}@{agent.hostname}".cstring) component.selection.ImGuiSelectionBasicStorage_Clear() proc draw*(component: SessionsTableComponent, showComponent: ptr bool, connection: WsConnection) = - igBegin(component.title, showComponent, 0) + igBegin(component.title.cstring, showComponent, 0) let textSpacing = igGetStyle().ItemSpacing.x @@ -95,35 +95,43 @@ proc draw*(component: SessionsTableComponent, showComponent: ptr bool, connectio # Enable multi-select functionality igSetNextItemSelectionUserData(row) var isSelected = ImGuiSelectionBasicStorage_Contains(component.selection, cast[ImGuiID](row)) - discard igSelectable_Bool(agent.agentId, isSelected, ImGuiSelectableFlags_SpanAllColumns.int32, vec2(0.0f, 0.0f)) + # Highlight high integrity sessions in red + if agent.elevated: + igPushStyleColor_Vec4(ImGui_Col_Text.cint, CONSOLE_ERROR) + + discard igSelectable_Bool(agent.agentId.cstring, isSelected, ImGuiSelectableFlags_SpanAllColumns.int32, vec2(0.0f, 0.0f)) + + if agent.elevated: + igPopStyleColor(1) + # Interact with session on double-click if igIsMouseDoubleClicked_Nil(ImGui_MouseButton_Left.int32): component.interact() if igTableSetColumnIndex(1): - igText(agent.listenerId) + igText(agent.listenerId.cstring) if igTableSetColumnIndex(2): - igText(agent.ipInternal) + igText(agent.ipInternal.cstring) if igTableSetColumnIndex(3): - igText(agent.ipExternal) + igText(agent.ipExternal.cstring) if igTableSetColumnIndex(4): - igText(agent.username) + igText(agent.username.cstring) if component.agentImpersonation.hasKey(agent.agentId): igSameLine(0.0f, textSpacing) - igText(fmt"[{component.agentImpersonation[agent.agentId]}]") + igText(fmt"[{component.agentImpersonation[agent.agentId]}]".cstring) if igTableSetColumnIndex(5): - igText(agent.hostname) + igText(agent.hostname.cstring) if igTableSetColumnIndex(6): - igText(agent.domain) + igText(agent.domain.cstring) if igTableSetColumnIndex(7): - igText(agent.os) + igText(agent.os.cstring) if igTableSetColumnIndex(8): - igText(agent.process) + igText(agent.process.cstring) if igTableSetColumnIndex(9): - igText($agent.pid) + igText(($agent.pid).cstring) if igTableSetColumnIndex(10): let duration = now() - agent.firstCheckin.fromUnix().local() let totalSeconds = duration.inSeconds @@ -132,7 +140,7 @@ proc draw*(component: SessionsTableComponent, showComponent: ptr bool, connectio let minutes = (totalSeconds mod 3600) div 60 let seconds = totalSeconds mod 60 - igText(fmt"{hours:02d}:{minutes:02d}:{seconds:02d} ago") + igText(fmt"{hours:02d}:{minutes:02d}:{seconds:02d} ago".cstring) if igTableSetColumnIndex(11): let duration = now() - component.agentActivity[agent.agentId].fromUnix().local() @@ -144,9 +152,9 @@ proc draw*(component: SessionsTableComponent, showComponent: ptr bool, connectio let timeText = fmt"{hours:02d}:{minutes:02d}:{seconds:02d} ago" if totalSeconds > agent.sleep: - igTextColored(GRAY, timeText) + igTextColored(GRAY, timeText.cstring) else: - igText(timeText) + igText(timeText.cstring) # Handle right-click context menu # Right-clicking the table header to hide/show columns or reset the layout is only possible when no sessions are selected diff --git a/src/client/views/widgets/dualListSelection.nim b/src/client/views/widgets/dualListSelection.nim index c34442d..5116c3b 100644 --- a/src/client/views/widgets/dualListSelection.nim +++ b/src/client/views/widgets/dualListSelection.nim @@ -1,7 +1,6 @@ -import strutils, sequtils, algorithm -import imguin/[cimgui, glfw_opengl, simple] -import ../../utils/[appImGui, colors, utils] -import ../../../common/[types, utils] +import sequtils, algorithm +import imguin/[cimgui, glfw_opengl] +import ../../utils/[appImGui, colors] type DualListSelectionWidget*[T] = ref object of RootObj @@ -70,9 +69,9 @@ proc draw*[T](component: DualListSelectionWidget[T]) = # Header var text = "Available" var textSize: ImVec2 - igCalcTextSize(addr textSize, text, nil, false, 0.0f) + igCalcTextSize(addr textSize, text.cstring, nil, false, 0.0f) igSetCursorPosX(igGetCursorPosX() + (igGetColumnWidth(0) - textSize.x) * 0.5f) - igTextColored(GRAY, text) + igTextColored(GRAY, text.cstring) # Set the size of selection box to fit all modules igSetNextWindowContentSize(vec2(0.0f, float(modules.len()) * igGetTextLineHeightWithSpacing())) @@ -86,7 +85,7 @@ proc draw*[T](component: DualListSelectionWidget[T]) = for row in 0 ..< modules.len().int32: var isSelected = ImGuiSelectionBasicStorage_Contains(selection, cast[ImGuiID](row)) igSetNextItemSelectionUserData(row) - discard igSelectable_Bool(component.display(modules[row]), isSelected, ImGuiSelectableFlags_AllowDoubleClick.int32, vec2(0.0f, 0.0f)) + discard igSelectable_Bool(component.display(modules[row]).cstring, isSelected, ImGuiSelectableFlags_AllowDoubleClick.int32, vec2(0.0f, 0.0f)) if not component.tooltip.isNil(): setTooltip(component.tooltip(modules[row])) @@ -125,9 +124,9 @@ proc draw*[T](component: DualListSelectionWidget[T]) = # Header text = "Selected" - igCalcTextSize(addr textSize, text, nil, false, 0.0f) + igCalcTextSize(addr textSize, text.cstring, nil, false, 0.0f) igSetCursorPosX(igGetCursorPosX() + (igGetColumnWidth(2) - textSize.x) * 0.5f) - igTextColored(GRAY, text) + igTextColored(GRAY, text.cstring) # Set the size of selection box to fit all modules igSetNextWindowContentSize(vec2(0.0f, float(modules.len()) * igGetTextLineHeightWithSpacing())) @@ -139,7 +138,7 @@ proc draw*[T](component: DualListSelectionWidget[T]) = for row in 0 ..< modules.len().int32: var isSelected = ImGuiSelectionBasicStorage_Contains(selection, cast[ImGuiID](row)) igSetNextItemSelectionUserData(row) - discard igSelectable_Bool(component.display(modules[row]), isSelected, ImGuiSelectableFlags_AllowDoubleClick.int32, vec2(0.0f, 0.0f)) + discard igSelectable_Bool(component.display(modules[row]).cstring, isSelected, ImGuiSelectableFlags_AllowDoubleClick.int32, vec2(0.0f, 0.0f)) if not component.tooltip.isNil(): setTooltip(component.tooltip(modules[row])) diff --git a/src/client/views/widgets/textarea.nim b/src/client/views/widgets/textarea.nim index d4d5178..b0128d2 100644 --- a/src/client/views/widgets/textarea.nim +++ b/src/client/views/widgets/textarea.nim @@ -1,7 +1,7 @@ -import strutils, sequtils, algorithm, times -import imguin/[cimgui, glfw_opengl, simple] -import ../../utils/[appImGui, colors, utils] -import ../../../common/[types, utils] +import strutils, times +import imguin/[cimgui, glfw_opengl] +import ../../utils/[appImGui, colors] +import ../../../common/types type TextareaWidget* = ref object of RootObj @@ -14,9 +14,9 @@ type # Text highlighting proc getText(item: ConsoleItem): cstring = if item.itemType != LOG_OUTPUT: - return "[" & item.timestamp & "]" & $item.itemType & item.text + return ("[" & item.timestamp & "]" & $item.itemType & item.text).cstring else: - return $item.itemType & item.text + return ($item.itemType & item.text).cstring proc getNumLines(data: pointer): csize_t {.cdecl.} = if data.isNil: @@ -63,22 +63,22 @@ proc isEmpty*(component: TextareaWidget): bool = # Drawing proc print(component: TextareaWidget, item: ConsoleItem) = if item.itemType != LOG_OUTPUT and component.showTimestamps: - igTextColored(GRAY, "[" & item.timestamp & "]", nil) + igTextColored(GRAY, ("[" & item.timestamp & "]").cstring, nil) igSameLine(0.0f, 0.0f) case item.itemType: of LOG_INFO, LOG_INFO_SHORT: - igTextColored(CONSOLE_INFO, $item.itemType) + igTextColored(CONSOLE_INFO, ($item.itemType).cstring) of LOG_ERROR, LOG_ERROR_SHORT: - igTextColored(CONSOLE_ERROR, $item.itemType) + igTextColored(CONSOLE_ERROR, ($item.itemType).cstring) of LOG_SUCCESS, LOG_SUCCESS_SHORT: - igTextColored(CONSOLE_SUCCESS, $item.itemType) + igTextColored(CONSOLE_SUCCESS, ($item.itemType).cstring) of LOG_WARNING, LOG_WARNING_SHORT: - igTextColored(CONSOLE_WARNING, $item.itemType) + igTextColored(CONSOLE_WARNING, ($item.itemType).cstring) of LOG_COMMAND: - igTextColored(CONSOLE_COMMAND, $item.itemType) + igTextColored(CONSOLE_COMMAND, ($item.itemType).cstring) of LOG_OUTPUT: - igTextColored(vec4(0.0f, 0.0f, 0.0f, 0.0f), $item.itemType) + igTextColored(vec4(0.0f, 0.0f, 0.0f, 0.0f), ($item.itemType).cstring) igSameLine(0.0f, 0.0f) igTextUnformatted(item.text.cstring, nil) diff --git a/src/modules/bof.nim b/src/modules/bof.nim index 82e4b74..968e2a7 100644 --- a/src/modules/bof.nim +++ b/src/modules/bof.nim @@ -29,11 +29,11 @@ when not defined(agent): when defined(agent): - import osproc, strutils, strformat + import strformat import ../agent/core/coff import ../agent/utils/io import ../agent/protocol/result - import ../common/[utils, serialize] + import ../common/serialize proc executeBof(ctx: AgentCtx, task: Task): TaskResult = try: diff --git a/src/modules/dotnet.nim b/src/modules/dotnet.nim index 5bc33f3..73c918d 100644 --- a/src/modules/dotnet.nim +++ b/src/modules/dotnet.nim @@ -29,11 +29,11 @@ when not defined(agent): when defined(agent): - import strutils, strformat + import strformat import ../agent/core/clr import ../agent/utils/io import ../agent/protocol/result - import ../common/[utils, serialize] + import ../common/serialize proc executeAssembly(ctx: AgentCtx, task: Task): TaskResult = try: diff --git a/src/modules/exit.nim b/src/modules/exit.nim index 9c1c831..de7e6a9 100644 --- a/src/modules/exit.nim +++ b/src/modules/exit.nim @@ -34,11 +34,10 @@ when not defined(agent): when defined(agent): - import strutils, strformat + import strutils import ../agent/utils/io import ../agent/core/exit import ../agent/protocol/result - import ../common/[utils, serialize] proc executeExit(ctx: AgentCtx, task: Task): TaskResult = try: diff --git a/src/modules/filesystem.nim b/src/modules/filesystem.nim index 286e987..7065689 100644 --- a/src/modules/filesystem.nim +++ b/src/modules/filesystem.nim @@ -100,10 +100,9 @@ when not defined(agent): when defined(agent): - import os, strutils, strformat, times, algorithm, winim + import strutils, strformat, algorithm, winim import ../agent/utils/io import ../agent/protocol/result - import ../common/utils # Retrieve current working directory proc executePwd(ctx: AgentCtx, task: Task): TaskResult = @@ -173,7 +172,7 @@ when defined(agent): # Prepare search pattern (target directory + \*) let searchPattern = targetDirectory & "\\*" - let searchPatternW = newWString(searchPattern) + let searchPatternW = +$searchPattern var findData: WIN32_FIND_DATAW diff --git a/src/modules/filetransfer.nim b/src/modules/filetransfer.nim index 6ba38c9..c80cc9e 100644 --- a/src/modules/filetransfer.nim +++ b/src/modules/filetransfer.nim @@ -40,10 +40,10 @@ when not defined(agent): when defined(agent): - import os, std/paths, strutils, strformat + import os, std/paths, strformat import ../agent/utils/io import ../agent/protocol/result - import ../common/[utils, serialize] + import ../common/serialize proc executeDownload(ctx: AgentCtx, task: Task): TaskResult = try: @@ -60,9 +60,9 @@ when defined(agent): packer.addDataWithLengthPrefix(string.toBytes(filePath)) packer.addDataWithLengthPrefix(string.toBytes(fileBytes)) - let result = packer.pack() + let data = packer.pack() - return createTaskResult(task, STATUS_COMPLETED, RESULT_BINARY, result) + return createTaskResult(task, STATUS_COMPLETED, RESULT_BINARY, data) except CatchableError as err: return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg)) diff --git a/src/modules/screenshot.nim b/src/modules/screenshot.nim index c69e5c8..d4ccdd1 100644 --- a/src/modules/screenshot.nim +++ b/src/modules/screenshot.nim @@ -28,11 +28,11 @@ when defined(agent): import winim/lean import winim/inc/wingdi - import strutils, strformat, times, pixie + import strformat, times, pixie import stb_image/write as stbiw import ../agent/utils/io import ../agent/protocol/result - import ../common/[utils, serialize] + import ../common/serialize proc bmpToJpeg(data: seq[byte], quality: int = 80): seq[byte] = let img: Image = decodeImage(Bytes.toString(data)) diff --git a/src/modules/shell.nim b/src/modules/shell.nim index 9612474..c486fcd 100644 --- a/src/modules/shell.nim +++ b/src/modules/shell.nim @@ -29,10 +29,9 @@ when not defined(agent): when defined(agent): - import osproc, strutils, strformat + import osproc, strformat import ../agent/utils/io import ../agent/protocol/result - import ../common/utils proc executeShell(ctx: AgentCtx, task: Task): TaskResult = try: diff --git a/src/modules/sleep.nim b/src/modules/sleep.nim index 7c6f347..f876800 100644 --- a/src/modules/sleep.nim +++ b/src/modules/sleep.nim @@ -41,10 +41,9 @@ when not defined(agent): when defined(agent): - import os, strutils, strformat + import strutils, strformat import ../agent/utils/io import ../agent/protocol/result - import ../common/utils proc executeSleep(ctx: AgentCtx, task: Task): TaskResult = diff --git a/src/modules/systeminfo.nim b/src/modules/systeminfo.nim index 3e9e99c..8106e66 100644 --- a/src/modules/systeminfo.nim +++ b/src/modules/systeminfo.nim @@ -37,10 +37,9 @@ when not defined(agent): when defined(agent): import winim - import os, strutils, sequtils, strformat, tables, algorithm + import os, strutils, strformat, tables, algorithm import ../agent/utils/io import ../agent/protocol/result - import ../common/utils # TODO: Add user context to process information type diff --git a/src/modules/token.nim b/src/modules/token.nim index b0eedca..11d91d8 100644 --- a/src/modules/token.nim +++ b/src/modules/token.nim @@ -91,7 +91,6 @@ when defined(agent): import ../agent/core/token import ../agent/utils/io import ../agent/protocol/result - import ../common/utils proc executeMakeToken(ctx: AgentCtx, task: Task): TaskResult = try: diff --git a/src/server/core/listener.nim b/src/server/core/listener.nim index 10608de..4239bd7 100644 --- a/src/server/core/listener.nim +++ b/src/server/core/listener.nim @@ -10,7 +10,7 @@ import ../../common/[types, profile] proc serve(listener: Listener) {.thread.} = try: listener.server.serve(Port(listener.port), listener.address) - except Exception as err: + except Exception: discard proc listenerStart*(cq: Conquest, listenerId: string, hosts: string, address: string, port: int, protocol: Protocol) = diff --git a/src/server/db/dbAgent.nim b/src/server/db/dbAgent.nim index 77d5f24..37ea8aa 100644 --- a/src/server/db/dbAgent.nim +++ b/src/server/db/dbAgent.nim @@ -58,7 +58,7 @@ proc dbGetAllAgents*(cq: Conquest): seq[Agent] = os: os, elevated: elevated, firstCheckin: cast[int64](firstCheckin), - latestCheckin: cast[int64](firstCheckin), + latestCheckin: cast[int64](latestCheckin), process: process, modules: cast[uint32](modules), sessionKey: sessionKey,