add cryptable mode to the UI

This commit is contained in:
KingKDot
2026-04-14 15:44:16 -05:00
parent ac876794c6
commit e94fe65dbf
2 changed files with 122 additions and 0 deletions
+106
View File
@@ -121,6 +121,7 @@ function saveFormSettings() {
assemblyVersion: document.getElementById("assembly-version")?.value ?? "",
assemblyCopyright: document.getElementById("assembly-copyright")?.value ?? "",
outputExtension: document.getElementById("output-extension")?.value ?? ".exe",
cryptableMode: document.getElementById("cryptable-mode")?.checked ?? false,
};
localStorage.setItem(BUILD_SETTINGS_KEY, JSON.stringify(settings));
} catch (err) {
@@ -176,6 +177,7 @@ function restoreFormSettings() {
if (s.assemblyVersion !== undefined) setVal("assembly-version", s.assemblyVersion);
if (s.assemblyCopyright !== undefined) setVal("assembly-copyright", s.assemblyCopyright);
if (s.outputExtension !== undefined) setVal("output-extension", s.outputExtension);
if (s.cryptableMode !== undefined) setCb("#cryptable-mode", s.cryptableMode);
const restoredObfuscate = document.querySelector('input[name="obfuscate"]');
const garbleContainer = document.getElementById("garble-settings-container");
@@ -192,6 +194,100 @@ function restoreFormSettings() {
}
}
const CRYPTABLE_DISABLE_TARGETS = [
'input[name="enable-persistence"]',
'input[name="enable-upx"]',
'input[name="upx-strip-headers"]',
'input[name="hide-console"]',
'input[name="require-admin"]',
'input[name="critical-process"]',
];
const CRYPTABLE_DISABLE_INPUTS = [
"#assembly-title",
"#assembly-product",
"#assembly-company",
"#assembly-version",
"#assembly-copyright",
"#output-extension",
"#sleep-seconds",
];
const CRYPTABLE_HIDE_SECTIONS = [4, 5, 6];
function applyCryptableMode(enabled) {
const badge = document.getElementById("cryptable-badge");
if (badge) badge.classList.toggle("hidden", !enabled);
CRYPTABLE_DISABLE_TARGETS.forEach((sel) => {
const el = document.querySelector(sel);
if (!el) return;
if (enabled) {
el.checked = false;
el.disabled = true;
el.closest("label")?.classList.add("opacity-40", "pointer-events-none");
} else {
el.disabled = false;
el.closest("label")?.classList.remove("opacity-40", "pointer-events-none");
}
});
CRYPTABLE_DISABLE_INPUTS.forEach((sel) => {
const el = document.querySelector(sel);
if (!el) return;
if (enabled) {
el.dataset.preCryptableValue = el.value;
el.value = el.type === "number" ? "0" : "";
el.disabled = true;
el.classList.add("opacity-40");
} else {
if (el.dataset.preCryptableValue !== undefined) {
el.value = el.dataset.preCryptableValue;
delete el.dataset.preCryptableValue;
}
el.disabled = false;
el.classList.remove("opacity-40");
}
});
const iconUploadEl = document.getElementById("icon-upload");
const iconLabelEl = document.getElementById("icon-label");
if (iconUploadEl) iconUploadEl.disabled = enabled;
if (iconLabelEl && enabled) iconLabelEl.closest("label")?.classList.toggle("opacity-40", enabled);
if (iconLabelEl && !enabled) iconLabelEl.closest("label")?.classList.remove("opacity-40");
const cloneExeUploadEl = document.getElementById("clone-exe-upload");
if (cloneExeUploadEl) cloneExeUploadEl.disabled = enabled;
if (cloneExeUploadEl) cloneExeUploadEl.closest("label")?.classList.toggle("opacity-40", enabled);
const bindAddLabelEl = document.getElementById("bind-add-label");
if (bindAddLabelEl) {
bindAddLabelEl.classList.toggle("opacity-40", enabled);
bindAddLabelEl.classList.toggle("pointer-events-none", enabled);
}
const sections = document.querySelectorAll(".accordion-section");
CRYPTABLE_HIDE_SECTIONS.forEach((idx) => {
const sec = sections[idx - 1];
if (!sec) return;
if (enabled) {
sec.classList.add("opacity-30", "pointer-events-none");
sec.dataset.cryptableDisabled = "true";
} else {
sec.classList.remove("opacity-30", "pointer-events-none");
delete sec.dataset.cryptableDisabled;
}
});
if (enabled) {
updatePersistenceSettingsVisibility();
const upxC = document.getElementById("upx-settings-container");
if (upxC) upxC.classList.add("hidden");
}
saveFormSettings();
}
restoreFormSettings();
initAccordions();
updateWindowsSectionVisibility();
@@ -376,6 +472,16 @@ if (upxCheckbox && upxSettingsContainer) {
});
}
const cryptableCheckbox = document.getElementById("cryptable-mode");
if (cryptableCheckbox) {
cryptableCheckbox.addEventListener("change", () => {
applyCryptableMode(cryptableCheckbox.checked);
});
if (cryptableCheckbox.checked) {
applyCryptableMode(true);
}
}
let pendingIconBase64 = null;
const iconUpload = document.getElementById("icon-upload");
const iconLabel = document.getElementById("icon-label");
+16
View File
@@ -302,6 +302,22 @@
<p class="text-xs text-slate-500">Sleep N seconds before connecting (anti-sandbox). Set to 0 to disable.</p>
</div>
<label class="flex items-center gap-2 p-3 bg-purple-900/30 border border-purple-500/40 rounded-lg cursor-pointer hover:border-purple-400 transition-colors">
<input type="checkbox" id="cryptable-mode" name="cryptable-mode" class="w-4 h-4" />
<div class="flex flex-col">
<span class="flex items-center gap-2">
<i class="fa-solid fa-microchip text-purple-400"></i> Cryptable Mode
</span>
<span class="text-xs text-slate-500">Disables persistence, UPX, PE metadata, UAC, bound files &amp; other disk-dependent settings for in-memory / shellcode use</span>
</div>
</label>
<div id="cryptable-badge" class="hidden pl-3 border-l-2 border-purple-500/40">
<div class="flex items-center gap-2 px-3 py-1.5 rounded bg-purple-800/40 border border-purple-600/40 text-xs text-purple-300">
<i class="fa-solid fa-circle-check"></i>
<span>Cryptable mode active — incompatible settings have been disabled</span>
</div>
</div>
</div>
</div>
</div>