Protection Presets

A preset is a protection level that you choose explicitly. Instead of toggling every protection in protections.json by hand, you pick one level and BitMono enables a curated set of protections for you.

Presets are always chosen by you, never auto-detected. BitMono cannot reliably tell which runtime your app targets — Mono runs ordinary .NET assemblies, so a Mono/Unity build looks identical to a .NET Core/Framework one — so the choice of runtime-specific protections stays in your hands. BitMono will still warn you (without blocking) when a preset enables a protection intended for a different runtime than the one your module targets.

Levels

Preset

Protections enabled

Custom (default)

Uses protections.json exactly as configured. Nothing changes for existing setups.

Minimal

FullRenamer, NoNamespaces, BitTimeDateStamp

Balanced

Minimal + StringsEncryption, ObjectReturnType, AntiDe4dot, AntiILdasm, BillionNops

Maximum

Balanced + AntiDebugBreakpoints, AntiDecompiler, UnmanagedString, DotNetHook, CallToCalli, BitMethodDotnet, BitDecompiler, BitDotNet, BitMono

Note

Maximum includes the Mono-only packers (BitDotNet, BitDecompiler), the native UnmanagedString, and the runtime hookers (DotNetHook, CallToCalli). These are the most aggressive and the most runtime-specific — make sure they fit your target before shipping. See Protection Runtime Moniker and Native Code.

How to choose a preset

Command line (wins over the config file):

BitMono.CLI --file MyApp.dll --preset Balanced

Configuration file (obfuscation.json):

{
  "Preset": "Balanced"
}

Precedence

When BitMono decides which protections to run, it uses the first of these that applies:

  1. An explicit protections list on the command line (-p / --protections).

  2. --preset on the command line.

  3. "Preset" in obfuscation.json.

  4. protections.json (used when the preset is Custom or unset).

So a preset overrides protections.json, an explicit -p list still wins over a preset, and the default Custom keeps today’s behaviour.