cross_device_integrity 1.0.4 copy "cross_device_integrity: ^1.0.4" to clipboard
cross_device_integrity: ^1.0.4 copied to clipboard

Unified cross-platform device integrity and security detection for Flutter (Root, Jailbreak, Emulator, Frida, Magisk, Developer Mode, Mock Location, VPN, Proxy, Screen Recording).

example/lib/main.dart

import 'dart:async';

import 'package:cross_device_integrity/cross_device_integrity.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const DeviceIntegrityExampleApp());
}

class DeviceIntegrityExampleApp extends StatelessWidget {
  const DeviceIntegrityExampleApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Device Integrity Security Dashboard',
      debugShowCheckedModeBanner: false,
      themeMode: ThemeMode.dark,
      darkTheme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: const Color(0xFF0F172A),
        colorScheme: const ColorScheme.dark(
          primary: Color(0xFF38BDF8),
          surface: Color(0xFF1E293B),
          error: Color(0xFFF43F5E),
        ),
        cardTheme: CardThemeData(
          color: const Color(0xFF1E293B),
          elevation: 4,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(16),
          ),
        ),
      ),
      home: const SecurityDashboardScreen(),
    );
  }
}

class SecurityDashboardScreen extends StatefulWidget {
  const SecurityDashboardScreen({super.key});

  @override
  State<SecurityDashboardScreen> createState() =>
      _SecurityDashboardScreenState();
}

class _SecurityDashboardScreenState extends State<SecurityDashboardScreen> {
  IntegrityResult? _result;
  bool _isLoading = true;
  StreamSubscription<IntegrityResult>? _monitoringSubscription;
  bool _isMonitoring = false;
  bool _isWindowSecure = false;
  bool _useStrictConfig = true;

  @override
  void initState() {
    super.initState();
    _runIntegrityChecks();
  }

  @override
  void dispose() {
    _monitoringSubscription?.cancel();
    super.dispose();
  }

  DeviceIntegrityConfig get _currentConfig => _useStrictConfig
      ? DeviceIntegrityConfig.strict()
      : DeviceIntegrityConfig.development();

  Future<void> _runIntegrityChecks() async {
    setState(() {
      _isLoading = true;
    });

    try {
      final res = await DeviceIntegrityChecker.checkAll(_currentConfig);
      if (!mounted) return;
      setState(() {
        _result = res;
        _isLoading = false;
      });
    } catch (_) {
      if (!mounted) return;
      setState(() {
        _isLoading = false;
      });
    }
  }

  void _toggleMonitoring() {
    if (_isMonitoring) {
      _monitoringSubscription?.cancel();
      setState(() {
        _isMonitoring = false;
      });
    } else {
      setState(() {
        _isMonitoring = true;
      });
      _monitoringSubscription =
          DeviceIntegrityChecker.monitorIntegrity(
            interval: const Duration(seconds: 5),
            config: _currentConfig,
          ).listen((res) {
            if (!mounted) return;
            setState(() {
              _result = res;
            });
          });
    }
  }

  Future<void> _toggleWindowSecurity(bool enable) async {
    final ok = await DeviceIntegrityChecker.setWindowSecure(enable);
    if (!mounted) return;
    if (ok) {
      setState(() {
        _isWindowSecure = enable;
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(
            enable
                ? '🔒 Screen protection enabled (FLAG_SECURE)'
                : '🔓 Screen protection disabled',
          ),
          backgroundColor: enable ? const Color(0xFF10B981) : Colors.orange,
        ),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    final result = _result;

    return Scaffold(
      appBar: AppBar(
        backgroundColor: const Color(0xFF0F172A),
        elevation: 0,
        title: const Row(
          children: [
            Icon(Icons.shield_outlined, color: Color(0xFF38BDF8)),
            SizedBox(width: 10),
            Text(
              'Device Integrity',
              style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
            ),
          ],
        ),
        actions: [
          IconButton(
            icon: Icon(
              _isWindowSecure ? Icons.lock : Icons.lock_open,
              color: _isWindowSecure ? const Color(0xFF10B981) : Colors.white54,
            ),
            tooltip: _isWindowSecure
                ? 'FLAG_SECURE Active'
                : 'Enable FLAG_SECURE',
            onPressed: () => _toggleWindowSecurity(!_isWindowSecure),
          ),
          IconButton(
            icon: Icon(
              _isMonitoring ? Icons.sensors : Icons.radar_outlined,
              color: _isMonitoring ? const Color(0xFF10B981) : Colors.white70,
            ),
            tooltip: _isMonitoring
                ? 'Monitoring Active'
                : 'Start Live Monitoring',
            onPressed: _toggleMonitoring,
          ),
          IconButton(
            icon: const Icon(Icons.refresh),
            tooltip: 'Run Checks',
            onPressed: _runIntegrityChecks,
          ),
        ],
      ),
      body: _isLoading
          ? const Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  CircularProgressIndicator(color: Color(0xFF38BDF8)),
                  SizedBox(height: 16),
                  Text('Analyzing Device Security Signals...'),
                ],
              ),
            )
          : RefreshIndicator(
              onRefresh: _runIntegrityChecks,
              child: ListView(
                padding: const EdgeInsets.all(16),
                children: [
                  _buildConfigSelectorCard(),
                  const SizedBox(height: 16),
                  if (result != null) ...[
                    _buildOverallStatusCard(result),
                    const SizedBox(height: 20),
                    const Text(
                      'SECURITY SIGNALS (10 CHECKS)',
                      style: TextStyle(
                        fontSize: 12,
                        fontWeight: FontWeight.bold,
                        letterSpacing: 1.2,
                        color: Colors.white54,
                      ),
                    ),
                    const SizedBox(height: 12),
                    _buildCheckCard(
                      title: 'Root Detection',
                      subtitle: 'Android su binaries, test-keys, mount options',
                      icon: Icons.developer_mode,
                      status: result.rootStatus,
                      detail: result.details['root'],
                    ),
                    _buildCheckCard(
                      title: 'Jailbreak Detection',
                      subtitle: 'iOS Cydia, sandbox write, dyld hooks, fork',
                      icon: Icons.phonelink_lock,
                      status: result.jailbreakStatus,
                      detail: result.details['jailbreak'],
                    ),
                    _buildCheckCard(
                      title: 'Emulator Detection',
                      subtitle: 'QEMU, Genymotion, BlueStacks, build props',
                      icon: Icons.devices_other,
                      status: result.emulatorStatus,
                      detail: result.details['emulator'],
                    ),
                    _buildCheckCard(
                      title: 'Developer Mode',
                      subtitle: 'ADB debugging, USB dev mode enabled',
                      icon: Icons.code,
                      status: result.developerModeStatus,
                      detail: result.details['developerMode'],
                    ),
                    _buildCheckCard(
                      title: 'Mock Location',
                      subtitle: 'GPS spoofing, AppOps, fake providers',
                      icon: Icons.location_off_outlined,
                      status: result.mockLocationStatus,
                      detail: result.details['mockLocation'],
                    ),
                    _buildCheckCard(
                      title: 'VPN Detection',
                      subtitle: 'Active TUN/TAP/PPP network interfaces',
                      icon: Icons.vpn_key_outlined,
                      status: result.vpnStatus,
                      detail: result.details['vpn'],
                    ),
                    _buildCheckCard(
                      title: 'Proxy Detection',
                      subtitle: 'HTTP/HTTPS system proxy configurations',
                      icon: Icons.router_outlined,
                      status: result.proxyStatus,
                      detail: result.details['proxy'],
                    ),
                    _buildCheckCard(
                      title: 'Frida Detection',
                      subtitle:
                          'Dynamic instrumentation, D-Bus ports 27042-27045',
                      icon: Icons.bug_report_outlined,
                      status: result.fridaStatus,
                      detail: result.details['frida'],
                    ),
                    _buildCheckCard(
                      title: 'Magisk Detection',
                      subtitle: 'Systemless root framework & overlay mounts',
                      icon: Icons.auto_awesome,
                      status: result.magiskStatus,
                      detail: result.details['magisk'],
                    ),
                    _buildCheckCard(
                      title: 'Screen Recording',
                      subtitle: 'Screen capture, mirroring, recording active',
                      icon: Icons.videocam_outlined,
                      status: result.screenRecordingStatus,
                      detail: result.details['screenRecording'],
                    ),
                  ],
                ],
              ),
            ),
    );
  }

  Widget _buildConfigSelectorCard() {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
      decoration: BoxDecoration(
        color: const Color(0xFF1E293B),
        borderRadius: BorderRadius.circular(16),
        border: Border.all(color: Colors.white12),
      ),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Row(
            children: [
              Icon(
                _useStrictConfig
                    ? Icons.verified_user
                    : Icons.build_circle_outlined,
                color: _useStrictConfig
                    ? const Color(0xFF38BDF8)
                    : Colors.orange,
              ),
              const SizedBox(width: 10),
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    _useStrictConfig
                        ? 'Strict Production Profile'
                        : 'Development Profile',
                    style: const TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 14,
                    ),
                  ),
                  Text(
                    _useStrictConfig
                        ? 'All checks strictly enforced'
                        : 'Dev Mode & VPN allowed',
                    style: const TextStyle(fontSize: 12, color: Colors.white54),
                  ),
                ],
              ),
            ],
          ),
          Switch(
            value: _useStrictConfig,
            activeTrackColor: const Color(0xFF38BDF8),
            onChanged: (val) {
              setState(() {
                _useStrictConfig = val;
              });
              _runIntegrityChecks();
            },
          ),
        ],
      ),
    );
  }

  Widget _buildOverallStatusCard(IntegrityResult result) {
    final isSecure = result.isFullySecure;
    final color = isSecure ? const Color(0xFF10B981) : const Color(0xFFF43F5E);

    return Container(
      padding: const EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: color.withValues(alpha: 0.15),
        borderRadius: BorderRadius.circular(20),
        border: Border.all(color: color.withValues(alpha: 0.4), width: 1.5),
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Row(
            children: [
              Icon(
                isSecure
                    ? Icons.check_circle_outline
                    : Icons.warning_amber_rounded,
                color: color,
                size: 32,
              ),
              const SizedBox(width: 12),
              Expanded(
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text(
                      isSecure ? 'ENVIRONMENT SECURE' : 'THREATS DETECTED',
                      style: TextStyle(
                        fontSize: 18,
                        fontWeight: FontWeight.bold,
                        color: color,
                        letterSpacing: 0.5,
                      ),
                    ),
                    Text(
                      isSecure
                          ? 'No suspicious flags or modifications found.'
                          : '${result.threats.length} threat signal(s) flagged.',
                      style: const TextStyle(
                        color: Colors.white70,
                        fontSize: 13,
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
          if (result.threats.isNotEmpty) ...[
            const SizedBox(height: 16),
            const Divider(color: Colors.white24),
            const SizedBox(height: 8),
            Wrap(
              spacing: 8,
              runSpacing: 8,
              children: result.threats
                  .map(
                    (threat) => Chip(
                      backgroundColor: color.withValues(alpha: 0.25),
                      side: BorderSide(color: color),
                      avatar: Icon(Icons.security, size: 16, color: color),
                      label: Text(
                        threat,
                        style: TextStyle(
                          color: color,
                          fontWeight: FontWeight.bold,
                          fontSize: 12,
                        ),
                      ),
                    ),
                  )
                  .toList(),
            ),
          ],
        ],
      ),
    );
  }

  Widget _buildCheckCard({
    required String title,
    required String subtitle,
    required IconData icon,
    required IntegrityStatus status,
    String? detail,
  }) {
    Color statusColor;
    String statusText;
    IconData statusIcon;

    switch (status) {
      case IntegrityStatus.secure:
        statusColor = const Color(0xFF10B981);
        statusText = 'SECURE';
        statusIcon = Icons.check_circle;
        break;
      case IntegrityStatus.compromised:
        statusColor = const Color(0xFFF43F5E);
        statusText = 'DETECTED';
        statusIcon = Icons.cancel;
        break;
      case IntegrityStatus.unsupported:
        statusColor = Colors.grey;
        statusText = 'N/A';
        statusIcon = Icons.remove_circle_outline;
        break;
      case IntegrityStatus.error:
        statusColor = Colors.orange;
        statusText = 'ERROR';
        statusIcon = Icons.error_outline;
        break;
    }

    return Card(
      margin: const EdgeInsets.only(bottom: 10),
      child: ExpansionTile(
        tilePadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
        leading: Container(
          padding: const EdgeInsets.all(10),
          decoration: BoxDecoration(
            color: statusColor.withValues(alpha: 0.15),
            borderRadius: BorderRadius.circular(12),
          ),
          child: Icon(icon, color: statusColor, size: 22),
        ),
        title: Text(
          title,
          style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
        ),
        subtitle: Text(
          subtitle,
          style: const TextStyle(fontSize: 12, color: Colors.white54),
        ),
        trailing: Container(
          padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
          decoration: BoxDecoration(
            color: statusColor.withValues(alpha: 0.2),
            borderRadius: BorderRadius.circular(8),
            border: Border.all(color: statusColor.withValues(alpha: 0.5)),
          ),
          child: Row(
            mainAxisSize: MainAxisSize.min,
            children: [
              Icon(statusIcon, color: statusColor, size: 14),
              const SizedBox(width: 4),
              Text(
                statusText,
                style: TextStyle(
                  color: statusColor,
                  fontWeight: FontWeight.bold,
                  fontSize: 11,
                ),
              ),
            ],
          ),
        ),
        children: [
          Padding(
            padding: const EdgeInsets.all(16),
            child: Row(
              children: [
                const Icon(Icons.info_outline, size: 16, color: Colors.white54),
                const SizedBox(width: 8),
                Expanded(
                  child: Text(
                    detail ?? 'No anomaly details recorded for this signal.',
                    style: const TextStyle(fontSize: 12, color: Colors.white70),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}
1
likes
0
points
296
downloads

Publisher

unverified uploader

Weekly Downloads

Unified cross-platform device integrity and security detection for Flutter (Root, Jailbreak, Emulator, Frida, Magisk, Developer Mode, Mock Location, VPN, Proxy, Screen Recording).

Repository

License

unknown (license)

Dependencies

flutter, flutter_web_plugins, plugin_platform_interface, web

More

Packages that depend on cross_device_integrity

Packages that implement cross_device_integrity