License Binding Detection
Protection Module: LicenseBinding
Validate application deployment across licensed devices and detect unauthorized installations through hardware fingerprinting and installation frequency monitoring.
Available for: Windows full, Linux partial, macOS partial, Mobile limited
How It Works
The License Binding Detection module validates that the application is running on authorized devices by monitoring hardware fingerprints and tracking installation frequency. It detects hardware changes, MAC address modifications, and excessive installations that indicate license violations or unauthorized redistribution.
Detection Techniques
Hardware Fingerprint Changes:
- CPU cores, primary MAC, BIOS UUID, hostname → SHA-256 hash (0.85 confidence)
- Detects hardware changes that indicate device replacement or spoofing
MAC Address Monitoring:
- Tracks all network interface MACs hashed together
- Detects removed/added network interfaces (0.7 confidence)
- Identifies MAC spoofing attempts
Hostname Changes:
- System hostname monitoring (0.6 confidence)
- Detects device rebranding
Installation Frequency Tracking:
- Count over 30-day rolling window
- Default limit: 5 installations per month (0.8 confidence)
- Prevents license abuse through frequent reinstalls
State Persistence:
- Linux/macOS: ~/.bytehide_license_state
- Windows: %LOCALAPPDATA%.bytehide_license_state
- Permanent cache of installation and hardware data
Default detection interval: 1 minute
Configuration
JSON Configuration
{
"protections": [
{
"type": "LicenseBinding",
"action": "erase",
"intervalMs": 60000
}
]
}{
"protections": [
{
"type": "LicenseBinding",
"action": "erase",
"intervalMs": 60000
}
]
}Kotlin Configuration
import com.bytehide.monitor.Monitor
import com.bytehide.monitor.core.action.ActionType
import com.bytehide.monitor.core.protection.ProtectionModuleType
Monitor.configure { config ->
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
)
}import com.bytehide.monitor.Monitor
import com.bytehide.monitor.core.action.ActionType
import com.bytehide.monitor.core.protection.ProtectionModuleType
Monitor.configure { config ->
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
)
}Java Configuration
import com.bytehide.monitor.Monitor;
import com.bytehide.monitor.core.action.ActionType;
import com.bytehide.monitor.core.protection.ProtectionModuleType;
Monitor.configure(config -> {
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
);
});import com.bytehide.monitor.Monitor;
import com.bytehide.monitor.core.action.ActionType;
import com.bytehide.monitor.core.protection.ProtectionModuleType;
Monitor.configure(config -> {
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
);
});Custom Action Configuration
Monitor.configure { config ->
config.registerCustomAction("my-license-action") { threat ->
val threatType = threat.getThreatType() // String
val description = threat.getDescription() // String
val confidence = threat.getConfidence() // Double (0.0-1.0)
val metadata = threat.getMetadata() // Map<String, Object>
Log.e("License", "Detected: $threatType (Confidence: $confidence)")
}
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
"my-license-action",
60000
)
}Monitor.configure { config ->
config.registerCustomAction("my-license-action") { threat ->
val threatType = threat.getThreatType() // String
val description = threat.getDescription() // String
val confidence = threat.getConfidence() // Double (0.0-1.0)
val metadata = threat.getMetadata() // Map<String, Object>
Log.e("License", "Detected: $threatType (Confidence: $confidence)")
}
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
"my-license-action",
60000
)
}Available Actions
| Action | Behavior | Recommended For |
|---|---|---|
| Close | Terminate application immediately | Production apps with critical IP |
| Log | Record incident and continue | Development, analytics |
| Erase | Securely delete data then terminate | Financial, healthcare apps |
| Custom | Execute custom handler | Enterprise integrations |
| None | Detect only, no action | Testing configurations |
| Block | Block the operation | Not applicable for this module |
See Actions for detailed action documentation.
When to Use
Enable License Binding Detection when:
- Protecting premium software licenses from unauthorized sharing
- Preventing account takeover through device changes
- Enforcing device-locked licensing models
- Limiting installation frequency to prevent redistribution
- Validating hardware consistency for license compliance
- Monitoring for enterprise license violations
Code Examples
Kotlin - Basic Integration
import com.bytehide.monitor.Monitor
import com.bytehide.monitor.core.action.ActionType
import com.bytehide.monitor.core.protection.ProtectionModuleType
class SecurityManager {
fun initializeLicenseBinding() {
Monitor.configure { config ->
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
)
}
}
}import com.bytehide.monitor.Monitor
import com.bytehide.monitor.core.action.ActionType
import com.bytehide.monitor.core.protection.ProtectionModuleType
class SecurityManager {
fun initializeLicenseBinding() {
Monitor.configure { config ->
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
)
}
}
}Kotlin - Hardware and Installation Monitoring
Monitor.configure { config ->
config.registerCustomAction("monitor-license-binding") { threat ->
val threatType = threat.getThreatType()
val confidence = threat.getConfidence()
val metadata = threat.getMetadata()
when (threatType) {
"hardware_fingerprint_mismatch" -> {
Log.e("License", "Hardware fingerprint changed!")
val expectedHash = metadata["expectedFingerprintHash"] as? String
val actualHash = metadata["actualFingerprintHash"] as? String
Log.d("Hashes", "Expected: $expectedHash, Actual: $actualHash")
}
"mac_address_changed" -> {
Log.w("License", "Network MAC address changed (Confidence: $confidence)")
val previousMacs = metadata["previousMacs"] as? String
val currentMacs = metadata["currentMacs"] as? String
Log.d("MACs", "Previous: $previousMacs, Current: $currentMacs")
}
"hostname_changed" -> {
Log.w("License", "System hostname changed")
val previousHostname = metadata["previousHostname"] as? String
val currentHostname = metadata["currentHostname"] as? String
Log.d("Hostnames", "Previous: $previousHostname, Current: $currentHostname")
}
"installation_frequency_exceeded" -> {
Log.e("License", "Installation frequency limit exceeded!")
val installCount = metadata["installCountThisMonth"] as? Number
val limit = metadata["monthlyInstallationLimit"] as? Number
Log.d("Installs", "Current: $installCount, Limit: $limit")
}
}
}
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
"monitor-license-binding",
60000
)
}Monitor.configure { config ->
config.registerCustomAction("monitor-license-binding") { threat ->
val threatType = threat.getThreatType()
val confidence = threat.getConfidence()
val metadata = threat.getMetadata()
when (threatType) {
"hardware_fingerprint_mismatch" -> {
Log.e("License", "Hardware fingerprint changed!")
val expectedHash = metadata["expectedFingerprintHash"] as? String
val actualHash = metadata["actualFingerprintHash"] as? String
Log.d("Hashes", "Expected: $expectedHash, Actual: $actualHash")
}
"mac_address_changed" -> {
Log.w("License", "Network MAC address changed (Confidence: $confidence)")
val previousMacs = metadata["previousMacs"] as? String
val currentMacs = metadata["currentMacs"] as? String
Log.d("MACs", "Previous: $previousMacs, Current: $currentMacs")
}
"hostname_changed" -> {
Log.w("License", "System hostname changed")
val previousHostname = metadata["previousHostname"] as? String
val currentHostname = metadata["currentHostname"] as? String
Log.d("Hostnames", "Previous: $previousHostname, Current: $currentHostname")
}
"installation_frequency_exceeded" -> {
Log.e("License", "Installation frequency limit exceeded!")
val installCount = metadata["installCountThisMonth"] as? Number
val limit = metadata["monthlyInstallationLimit"] as? Number
Log.d("Installs", "Current: $installCount, Limit: $limit")
}
}
}
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
"monitor-license-binding",
60000
)
}Java - Basic Integration
import com.bytehide.monitor.Monitor;
import com.bytehide.monitor.core.action.ActionType;
import com.bytehide.monitor.core.protection.ProtectionModuleType;
public class SecurityManager {
public void initializeLicenseBinding() {
Monitor.configure(config -> {
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
);
});
}
}import com.bytehide.monitor.Monitor;
import com.bytehide.monitor.core.action.ActionType;
import com.bytehide.monitor.core.protection.ProtectionModuleType;
public class SecurityManager {
public void initializeLicenseBinding() {
Monitor.configure(config -> {
config.addProtection(
ProtectionModuleType.LICENSE_BINDING,
ActionType.ERASE,
60000
);
});
}
}Platform Compatibility
| Platform | Status | Notes |
|---|---|---|
| Windows 7+ | ✓ Fully Supported | Full hardware fingerprinting and state persistence |
| Linux | ◐ Partial | Hardware monitoring with filesystem persistence |
| macOS 10.12+ | ◐ Partial | Hardware monitoring with home directory persistence |
| Android 5.0+ | ◐ Limited | Basic device identifier tracking |
| iOS 12+ | ◐ Limited | IDFA-based tracking only |
Performance Impact
- CPU Impact: 1-2% increase during detection cycles
- Memory Overhead: ~400 KB for hardware fingerprint data
- Detection Latency: 100-200 ms per cycle
- Disk I/O: Minimal state file updates (< 1 KB)
Threat Detection Details
{
"detection": {
"threatType": "hardware_fingerprint_mismatch",
"timestamp": "2026-03-03T18:32:15.654Z",
"description": "Device hardware fingerprint changed indicating potential device replacement",
"confidence": 0.85,
"metadata": {
"detectionMethod": "hardware_fingerprint_analysis",
"expectedFingerprintHash": "cpu8_mac00aabbccddee_uuid1234_hostpc1",
"actualFingerprintHash": "cpu4_mac11223344eeff_uuid5678_hostpc2",
"components": {
"cpuCoresChanged": true,
"macAddressChanged": true,
"biosUuidChanged": true,
"hostnameChanged": true
}
}
}
}{
"detection": {
"threatType": "hardware_fingerprint_mismatch",
"timestamp": "2026-03-03T18:32:15.654Z",
"description": "Device hardware fingerprint changed indicating potential device replacement",
"confidence": 0.85,
"metadata": {
"detectionMethod": "hardware_fingerprint_analysis",
"expectedFingerprintHash": "cpu8_mac00aabbccddee_uuid1234_hostpc1",
"actualFingerprintHash": "cpu4_mac11223344eeff_uuid5678_hostpc2",
"components": {
"cpuCoresChanged": true,
"macAddressChanged": true,
"biosUuidChanged": true,
"hostnameChanged": true
}
}
}
}{
"detection": {
"threatType": "mac_address_changed",
"timestamp": "2026-03-03T18:33:42.321Z",
"description": "Network interface MAC address hash changed",
"confidence": 0.7,
"metadata": {
"detectionMethod": "mac_address_monitoring",
"previousMacs": "hashed:a1b2c3d4e5f6",
"currentMacs": "hashed:f6e5d4c3b2a1",
"macAddressesRemoved": ["00:11:22:33:44:55"],
"macAddressesAdded": ["ff:ee:dd:cc:bb:aa"]
}
}
}{
"detection": {
"threatType": "mac_address_changed",
"timestamp": "2026-03-03T18:33:42.321Z",
"description": "Network interface MAC address hash changed",
"confidence": 0.7,
"metadata": {
"detectionMethod": "mac_address_monitoring",
"previousMacs": "hashed:a1b2c3d4e5f6",
"currentMacs": "hashed:f6e5d4c3b2a1",
"macAddressesRemoved": ["00:11:22:33:44:55"],
"macAddressesAdded": ["ff:ee:dd:cc:bb:aa"]
}
}
}{
"detection": {
"threatType": "installation_frequency_exceeded",
"timestamp": "2026-03-03T18:34:58.789Z",
"description": "Installation frequency limit exceeded in rolling 30-day window",
"confidence": 0.8,
"metadata": {
"detectionMethod": "installation_frequency_tracking",
"installCountThisMonth": 7,
"monthlyInstallationLimit": 5,
"rollingWindowDays": 30,
"exceedsLimitBy": 2,
"recentInstallations": [
"2026-03-01T10:15:00Z",
"2026-03-02T14:20:00Z",
"2026-03-02T16:30:00Z",
"2026-03-03T09:45:00Z",
"2026-03-03T18:34:00Z"
]
}
}
}{
"detection": {
"threatType": "installation_frequency_exceeded",
"timestamp": "2026-03-03T18:34:58.789Z",
"description": "Installation frequency limit exceeded in rolling 30-day window",
"confidence": 0.8,
"metadata": {
"detectionMethod": "installation_frequency_tracking",
"installCountThisMonth": 7,
"monthlyInstallationLimit": 5,
"rollingWindowDays": 30,
"exceedsLimitBy": 2,
"recentInstallations": [
"2026-03-01T10:15:00Z",
"2026-03-02T14:20:00Z",
"2026-03-02T16:30:00Z",
"2026-03-03T09:45:00Z",
"2026-03-03T18:34:00Z"
]
}
}
}{
"detection": {
"threatType": "hostname_changed",
"timestamp": "2026-03-03T18:36:10.456Z",
"description": "System hostname changed from baseline",
"confidence": 0.6,
"metadata": {
"detectionMethod": "hostname_monitoring",
"previousHostname": "workstation-alpha",
"currentHostname": "workstation-beta"
}
}
}{
"detection": {
"threatType": "hostname_changed",
"timestamp": "2026-03-03T18:36:10.456Z",
"description": "System hostname changed from baseline",
"confidence": 0.6,
"metadata": {
"detectionMethod": "hostname_monitoring",
"previousHostname": "workstation-alpha",
"currentHostname": "workstation-beta"
}
}
}