62 lines
2.1 KiB
Nim
62 lines
2.1 KiB
Nim
import ../common/[types, utils]
|
|
|
|
# Define function prototype
|
|
proc executeExit(ctx: AgentCtx, task: Task): TaskResult
|
|
proc executeSelfDestroy(ctx: AgentCtx, task: Task): TaskResult
|
|
|
|
# Module definition
|
|
let commands* = @[
|
|
Command(
|
|
name: protect("exit"),
|
|
commandType: CMD_EXIT,
|
|
description: protect("Exit the agent."),
|
|
example: protect("exit process"),
|
|
arguments: @[
|
|
Argument(name: protect("type"), description: protect("Available options: PROCESS/THREAD. Default: PROCESS."), argumentType: STRING, isRequired: false),
|
|
],
|
|
execute: executeExit
|
|
),
|
|
Command(
|
|
name: protect("self-destruct"),
|
|
commandType: CMD_SELF_DESTRUCT,
|
|
description: protect("Exit the agent and delete the executable from disk."),
|
|
example: protect("self-destruct"),
|
|
arguments: @[
|
|
],
|
|
execute: executeSelfDestroy
|
|
)
|
|
]
|
|
|
|
# Implement execution functions
|
|
when not defined(agent):
|
|
proc executeExit(ctx: AgentCtx, task: Task): TaskResult = nil
|
|
proc executeSelfDestroy(ctx: AgentCtx, task: Task): TaskResult = nil
|
|
|
|
when defined(agent):
|
|
|
|
import strutils
|
|
import ../agent/utils/io
|
|
import ../agent/core/exit
|
|
import ../agent/protocol/result
|
|
|
|
proc executeExit(ctx: AgentCtx, task: Task): TaskResult =
|
|
try:
|
|
print " [>] Exiting."
|
|
|
|
if task.argCount == 0:
|
|
exit()
|
|
else:
|
|
let exitType = parseEnum[ExitType](Bytes.toString(task.args[0].data))
|
|
exit(exitType)
|
|
|
|
except CatchableError as err:
|
|
return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))
|
|
|
|
proc executeSelfDestroy(ctx: AgentCtx, task: Task): TaskResult =
|
|
try:
|
|
print " [>] Self-destructing."
|
|
exit(EXIT_PROCESS, true)
|
|
|
|
except CatchableError as err:
|
|
return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))
|
|
|