Files
conquest/src/client/views/modals/generatePayload.nim

116 lines
4.2 KiB
Nim
Raw Normal View History

import strutils, sequtils
import imguin/[cimgui, glfw_opengl, simple]
import ../../utils/[appImGui, colors]
import ../../../common/[types, utils]
import ../widgets/dualListSelection
type
AgentModalComponent* = ref object of RootObj
listener: int32
sleepDelay: uint32
sleepMask: int32
spoofStack: bool
listeners: seq[string]
sleepMaskTechniques: seq[string]
moduleSelection: DualListSelectionComponent
proc AgentModal*(listeners: seq[Listener]): AgentModalComponent =
result = new AgentModalComponent
result.listener = 0
result.sleepDelay = 5
result.sleepMask = 0
result.spoofStack = false
for l in listeners:
result.listeners.add(l.listenerId)
for technique in SleepObfuscationTechnique.low .. SleepObfuscationTechnique.high:
result.sleepMaskTechniques.add($technique)
var modules: seq[string]
for module in ModuleType:
# Magic to convert MODULE_SITUATIONAL_AWARENESS into SituationalAwareness, etc.
var name = ($module).split("_")[1..^1].mapIt(it.toLowerAscii().capitalizeAscii()).join("")
modules.add(name)
result.moduleSelection = DualListSelection(modules)
proc resetModalValues(component: AgentModalComponent) =
discard
proc draw*(component: AgentModalComponent) =
let textSpacing = igGetStyle().ItemSpacing.x
# Center modal
let vp = igGetMainViewport()
var center: ImVec2
ImGuiViewport_GetCenter(addr center, vp)
igSetNextWindowPos(center, ImGuiCond_Appearing.int32, vec2(0.5f, 0.5f))
let modalWidth = max(500.0f, vp.Size.x * 0.25)
igSetNextWindowSize(vec2(modalWidth, 0.0f), ImGuiCond_Always.int32)
var show = true
let windowFlags = ImGuiWindowFlags_None.int32 # or ImGuiWindowFlags_NoMove.int32
if igBeginPopupModal("Generate Payload", addr show, windowFlags):
defer: igEndPopup()
var availableSize: ImVec2
igGetContentRegionAvail(addr availableSize)
# Listener selection
igText("Listener: ")
igSameLine(0.0f, textSpacing)
igGetContentRegionAvail(addr availableSize)
igSetNextItemWidth(availableSize.x)
igCombo_Str("##InputListener", addr component.listener, (component.listeners.join("\0") & "\0").cstring , component.listeners.len().int32)
# Sleep delay
let step: uint32 = 1
igText("Sleep delay: ")
igSameLine(0.0f, textSpacing)
igSetNextItemWidth(availableSize.x)
igInputScalar("##InputSleepDelay", ImGuiDataType_U32.int32, addr component.sleepDelay, addr step, nil, "%hu", ImGui_InputTextFlags_CharsDecimal.int32)
# Agent sleep obfuscation technique dropdown selection
igText("Sleep mask: ")
igSameLine(0.0f, textSpacing)
igSetNextItemWidth(availableSize.x)
igCombo_Str("##InputSleepMask", addr component.sleepMask, (component.sleepMaskTechniques.join("\0") & "\0").cstring , component.sleepMaskTechniques.len().int32)
# Stack spoofing checkbox (only for EKKO/ZILEAN)
igText("Stack spoofing: ")
igSameLine(0.0f, textSpacing)
igSetNextItemWidth(availableSize.x)
igBeginDisabled((component.sleepMaskTechniques[component.sleepMask] != $EKKO and component.sleepMaskTechniques[component.sleepMask] != $ZILEAN))
if (component.sleepMaskTechniques[component.sleepMask] != $EKKO and component.sleepMaskTechniques[component.sleepMask] != $ZILEAN):
component.spoofStack = false
igCheckbox("##InputSpoofStack", addr component.spoofStack)
igEndDisabled()
igDummy(vec2(0.0f, 10.0f))
igSeparator()
igDummy(vec2(0.0f, 10.0f))
igText("Modules: ")
component.moduleSelection.draw()
igGetContentRegionAvail(addr availableSize)
igDummy(vec2(0.0f, 10.0f))
igSeparator()
igDummy(vec2(0.0f, 10.0f))
if igButton("Build", vec2(availableSize.x * 0.5 - textSpacing * 0.5, 0.0f)):
component.resetModalValues()
igCloseCurrentPopup()
igSameLine(0.0f, textSpacing)
if igButton("Close", vec2(availableSize.x * 0.5 - textSpacing * 0.5, 0.0f)):
component.resetModalValues()
igCloseCurrentPopup()