Protection that lives only in your binary can change only when the binary changes. That means a build, a release, a download, and a wait while customers update. Until the last of them does, your old rules are still running in the wild. When a new analysis tool appears or a key starts being shared, a release cycle is the wrong unit of time to respond in.
This guide is about how to update your software protection remotely, without rebuilding. It covers Remote Settings, server-side variables, Session Token Enforcement and Auto Rules in qPapel Auth, and how each lets you change behaviour from the dashboard while your application is already in customers' hands.
Why shipping a new build is too slow
A release cycle is built for features, not for reacting to threats. By the time a change is coded, built, released and installed, the moment that prompted it has often passed. Four problems follow from protection that can only change at the speed of a release.
- Attackers iterate in hours. A new or renamed tool can appear between your releases, and a build you ship next week does nothing about it today.
- Not everyone updates. Until the last customer installs the new version, the old protection rules are still running in the wild.
- Mistakes are expensive. If a rule is too aggressive and blocks real customers, a rebuild is a slow way to undo it.
- Secrets age. A key or URL baked into the binary can only be rotated by shipping a new one.
None of this is a knock on shipping builds, which is exactly the right tool for features. It is a mismatch of cadence: security needs to move at the speed of the threat, and the threat does not wait for your next release. The fix is to keep the parts that change often out of the binary, where you can reach them without a release at all.
What you can change from Remote Settings
Remote Settings move the protection policy off the client and onto the server. You change a setting in the dashboard, the client picks it up on its next check, and it behaves differently, with no rebuild and no release. Almost all of the detection logic, control behaviour and system flow can be changed this way.
| Setting | What it does |
|---|---|
| Anti-VM | Detects virtual machines commonly used to analyse software |
| Integrity and CRC32 checks | Verifies at runtime that the application has not been modified |
| Debugger ban | Detects an attached debugger and bans the offending license |
| Session system | Ties every run to a server session with rolling session keys |
| HWID lock | Keeps each license bound to the device it activated on |
| Process and window-title blacklists | Blocks known analysis tools by process, window title or class name |
| Custom variables | Changes values your app reads, centrally |
You can also narrow a rule to where it applies, defining targets by app version, country or user group, so a change reaches exactly the builds or regions you mean rather than everyone at once. The score-based blocking engine and interval-based checks are tuned the same way, from the dashboard.
01Change a rule or variable
Saved server-side, no rebuild
02Client checks in
On its next interval-based check
03New settings returned
Scoped to version, country or group
04New behaviour applied
No release, no download
The checks also run on an interval rather than only at startup, so a long-running session does not escape a change simply by staying open. If you tighten a rule in the middle of the day, sessions pick it up at their next check rather than at their next launch, which for always-on software can be the difference between acting now and acting next week.
Server-side variables: change values, not just switches
Remote Settings change behaviour; server-side variables change the values your app works with. Cryptographic keys, API URLs and critical constants can live on the server instead of inside the binary, delivered only to an authenticated session and streamed into memory rather than written to disk. The guide to client-side protection versus server-side secrets explains why that distinction matters.
Because the value lives server-side, you can change it centrally. Rotate a key that may have been exposed, point the app at a new endpoint, or adjust a constant, and every authenticated client picks up the new value on its next session. There is nothing to rebuild and nothing baked into the download to go stale.
This changes how you handle incidents. A leaked constant or an exposed endpoint is normally a fire drill: patch, build, release, then chase everyone to update. When the value lives on the server, the same incident is a field you edit once, and the exposure window closes as clients check in. The thing you were protecting never had to ship inside the binary in the first place.
It is also how you run per-segment behaviour without branching your code. The same variable can return a different value by app version, country or user group, so a beta cohort, a regional build or a single large customer can be configured differently from one place, with no separate build to maintain.
Cap and lock sessions with Session Token Enforcement
Session Token Enforcement is a remote control over how long a session may live and where it may run. From Remote Settings you can set a maximum active session duration and lock sessions to an IP address, so a token cannot be lifted from one machine and reused somewhere else for days.
Short-lived, IP-locked sessions make a captured token far less useful. A session that expires on a timer and refuses to move to a new address is a poor thing to share, and it closes a gap that a one-time license check leaves open.
A worked example: a new tool appears
Put the pieces together and a scenario that would normally cost a release becomes a few minutes in the dashboard. Say a new analysis tool starts showing up next to your software, under a name your blacklist has never seen.
- 01
Spot it
The tool turns up in your qPAnalyzer events or in a cluster of flagged sessions, before it is widespread.
- 02
Add a rule
Add its process or window-title signature to the blacklist, or raise the score its behaviour earns, directly in Remote Settings.
- 03
Scope it
Target the rule by app version, country or user group if you want to try it on a slice first rather than everyone at once.
- 04
Let it apply
Running clients pick up the new rule on their next check. No build, no release, no waiting for customers to update.
If the rule turns out to be too aggressive and catches real customers, the fix is the same loop in reverse: loosen it in the dashboard and the next check undoes it. That reversibility is what makes it safe to respond quickly rather than waiting until you are certain, which with security usually means waiting too long.
Automate responses with Auto Rules and the risk engine
Remote changes are most useful when you do not have to make them by hand. The score-based risk engine turns the signals your app reports into a single number, and you set thresholds on it: warn, restrict, close or ban. Each signal adds to the score, and the action follows automatically.
| Action | When you might use it |
|---|---|
| Warn | A low score worth logging but not acting on yet |
| Restrict | Limit what the session can do while you review |
| Close | End the session when the score crosses your line |
| Ban | Block the license outright for a clear, high-score threat |
Auto Rules take this further: set a rule once and it runs on its own, applying the action you chose whenever its condition is met. Combined with the score-based engine, your protection can respond to a new pattern the moment it appears, without you watching a dashboard. For the detection side of this, see qPAnalyzer and why static blacklists are not enough on their own.
The score-based approach is deliberate about false positives. Instead of banning on a single signal, which punishes the ordinary user whose setup happens to look unusual, it accumulates evidence and acts only when the total crosses a line you set. You choose how cautious that line is, and you can pick a gentler action, warn or restrict, while you watch how a new rule behaves before you ever let it ban.
Manage it from the dashboard or a Discord bot
All of this is managed from the PapelShip dashboard, and the qPapel Discord bot can manage the system too, through a permission-based structure. For teams and communities that already live in Discord, that means changing a rule, checking a license or responding to an alert without leaving the chat. If you also grant roles on purchase, pair it with Discord roles for digital products.
The permission-based structure matters once more than one person is involved. You can let a support colleague check a license or trigger a reset from Discord without handing them control of your protection policy, so the people closest to customers act on the routine cases while the settings that decide how your software defends itself stay with you.
Veelgestelde vragen
Respond at the speed of the threat
The point of remote control is simple: your defences should change as fast as the threats do, not as fast as your release cycle. With Remote Settings, server-side variables, session enforcement and Auto Rules, the protection policy lives on the server, where you can change it in seconds and let it act on its own. For how these pieces fit the wider picture, see the software protection stack for C++ and C#.
Start small if the idea is new to you. Move one blacklist and one variable off the client, confirm a change reaches a running session on its next check, then add session limits and a first Auto Rule once you trust the loop. The aim is not to configure everything at once; it is to stop needing a release every time the threat changes.
A build you shipped last month is fixed in time. A policy you control from the dashboard moves with the problem. Keep the parts that need to change often on the server, and your release cycle is free to be about features again.
qPapel-securityteam
Licenties en softwarebescherming