Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>GhostJack - RNG Inspector</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script src="https://unpkg.com/feather-icons"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> | |
| <style> | |
| .vanta-bg { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| z-index: -1; | |
| opacity: 0.15; | |
| } | |
| .glass-card { | |
| background: rgba(15, 23, 42, 0.7); | |
| backdrop-filter: blur(12px); | |
| -webkit-backdrop-filter: blur(12px); | |
| border-radius: 1rem; | |
| border: 1px solid rgba(255, 255, 255, 0.08); | |
| box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); | |
| } | |
| .hidden-scan { | |
| opacity: 0; | |
| transform: translateY(20px); | |
| transition: all 0.5s ease; | |
| } | |
| .visible-scan { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| .console-font { | |
| font-family: 'SF Mono', 'Roboto Mono', monospace; | |
| } | |
| .discreet-mode { | |
| filter: grayscale(100%) brightness(0.8); | |
| } | |
| @keyframes subtleGlow { | |
| 0% { box-shadow: 0 0 5px rgba(167, 139, 250, 0); } | |
| 50% { box-shadow: 0 0 10px rgba(167, 139, 250, 0.3); } | |
| 100% { box-shadow: 0 0 5px rgba(167, 139, 250, 0); } | |
| } | |
| .glow-border { | |
| animation: subtleGlow 3s infinite; | |
| } | |
| </style> | |
| </head> | |
| <body class="bg-gray-900 text-gray-100 min-h-screen flex items-center justify-center overflow-x-hidden"> | |
| <div id="vanta-bg" class="vanta-bg"></div> | |
| <div class="container mx-auto px-4 py-8 max-w-4xl"> | |
| <div class="glass-card p-8 glow-border relative"> | |
| <!-- Stealth Toggle --> | |
| <button id="stealth-toggle" class="absolute top-4 right-4 text-gray-400 hover:text-white transition-colors"> | |
| <i data-feather="eye-off"></i> | |
| </button> | |
| <!-- PIN Entry --> | |
| <div id="pin-entry" class="text-center"> | |
| <div class="flex justify-center mb-6"> | |
| <i data-feather="lock" class="w-12 h-12 text-purple-400"></i> | |
| </div> | |
| <h1 class="text-3xl font-bold mb-2 bg-clip-text text-transparent bg-gradient-to-r from-purple-400 to-pink-600">GhostJack</h1> | |
| <p class="text-gray-400 mb-8">RNG Inspector Tool</p> | |
| <div class="mb-6 relative"> | |
| <input id="pin-input" type="password" class="w-full px-4 py-3 bg-gray-800/70 border border-gray-700 rounded-lg focus:outline-none focus:ring-2 focus:ring-purple-500 text-center tracking-widest font-mono" placeholder="••••••" maxlength="6" autocomplete="off"> | |
| <button id="show-pin" class="absolute right-3 top-3 text-gray-400 hover:text-gray-200 transition-colors"> | |
| <i data-feather="eye"></i> | |
| </button> | |
| </div> | |
| <button id="unlock-btn" class="w-full bg-gradient-to-r from-purple-600/90 to-pink-600/90 text-white py-3 rounded-lg font-medium hover:opacity-90 transition duration-300 flex items-center justify-center"> | |
| <i data-feather="unlock" class="mr-2"></i> Unlock Tool | |
| </button> | |
| <p id="pin-error" class="text-red-400 mt-2 hidden">Invalid PIN. Try again.</p> | |
| </div> | |
| <!-- Main App (Hidden until PIN is entered) --> | |
| <div id="main-app" class="hidden"> | |
| <div class="flex justify-between items-center mb-6"> | |
| <h2 class="text-xl font-semibold flex items-center"> | |
| <i data-feather="activity" class="mr-2 text-purple-400"></i> RNG Inspector | |
| </h2> | |
| <button id="lock-btn" class="text-gray-400 hover:text-white transition-colors"> | |
| <i data-feather="lock" class="w-5 h-5"></i> | |
| </button> | |
| </div> | |
| <div class="mb-6"> | |
| <label class="block text-gray-400 mb-2 text-sm">Game URL</label> | |
| <div class="flex"> | |
| <input id="game-url" type="text" class="flex-grow px-4 py-2 bg-gray-800/70 border border-gray-700 rounded-l-lg focus:outline-none focus:ring-2 focus:ring-purple-500 font-mono text-sm" placeholder="https://casino.example.com/game" autocomplete="off"> | |
| <button id="scan-btn" class="bg-gradient-to-r from-purple-600/90 to-pink-600/90 px-4 py-2 rounded-r-lg hover:opacity-90 transition duration-300 flex items-center"> | |
| <i data-feather="search" class="w-4 h-4 mr-1"></i> Scan | |
| </button> | |
| </div> | |
| </div> | |
| <div class="hidden-scan" id="scan-section"> | |
| <div class="mb-6"> | |
| <div class="flex items-center justify-between mb-2"> | |
| <label class="text-gray-400 text-sm">Scan Progress</label> | |
| <span id="scan-percent" class="text-purple-400 font-mono">0%</span> | |
| </div> | |
| <div class="w-full bg-gray-800/70 rounded-full h-2"> | |
| <div id="scan-progress" class="bg-gradient-to-r from-purple-500 to-pink-500 h-2 rounded-full" style="width: 0%"></div> | |
| </div> | |
| </div> | |
| <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6"> | |
| <div class="glass-card p-4 rounded-lg border border-gray-700/50 hover:border-purple-500/30 transition-colors"> | |
| <div class="flex items-center mb-2"> | |
| <i data-feather="file" class="text-blue-400 mr-2 w-4 h-4"></i> | |
| <span class="text-sm text-gray-400">Files Scanned</span> | |
| </div> | |
| <div id="files-scanned" class="text-2xl font-bold font-mono">0</div> | |
| </div> | |
| <div class="glass-card p-4 rounded-lg border border-gray-700/50 hover:border-yellow-500/30 transition-colors"> | |
| <div class="flex items-center mb-2"> | |
| <i data-feather="alert-circle" class="text-yellow-400 mr-2 w-4 h-4"></i> | |
| <span class="text-sm text-gray-400">Vulnerabilities</span> | |
| </div> | |
| <div id="vulnerabilities" class="text-2xl font-bold font-mono">0</div> | |
| </div> | |
| <div class="glass-card p-4 rounded-lg border border-gray-700/50 hover:border-green-500/30 transition-colors"> | |
| <div class="flex items-center mb-2"> | |
| <i data-feather="code" class="text-green-400 mr-2 w-4 h-4"></i> | |
| <span class="text-sm text-gray-400">RNG Patterns</span> | |
| </div> | |
| <div id="rng-patterns" class="text-2xl font-bold font-mono">0</div> | |
| </div> | |
| </div> | |
| <div class="mb-6"> | |
| <div class="flex justify-between items-center mb-2"> | |
| <label class="text-gray-400 text-sm">Security Analysis</label> | |
| <button id="clear-log" class="text-xs text-gray-500 hover:text-gray-300 transition-colors flex items-center"> | |
| <i data-feather="trash-2" class="w-3 h-3 mr-1"></i> Clear | |
| </button> | |
| </div> | |
| <div id="analysis-log" class="bg-gray-800/70 rounded-lg p-4 h-48 overflow-y-auto font-mono text-xs border border-gray-700/50"> | |
| <div class="text-gray-500">[System] Ready to scan...</div> | |
| </div> | |
| </div> | |
| <div class="glass-card p-6 rounded-lg mb-6 border border-gray-700/50 hover:border-pink-500/30 transition-colors"> | |
| <h3 class="text-lg font-semibold mb-4 flex items-center"> | |
| <i data-feather="zap" class="text-pink-400 mr-2"></i> RNG Prediction | |
| </h3> | |
| <div id="rng-prediction" class="text-center text-5xl font-bold text-purple-300 py-8 font-mono"> | |
| ? | |
| </div> | |
| <div class="text-center text-gray-500 text-xs"> | |
| Next predicted RNG value will appear here | |
| </div> | |
| </div> | |
| <div class="flex justify-end space-x-3"> | |
| <button id="export-btn" class="bg-gray-800/70 hover:bg-gray-700/70 px-4 py-2 rounded-lg transition duration-300 flex items-center text-sm border border-gray-700/50"> | |
| <i data-feather="download" class="w-4 h-4 mr-2"></i> Export | |
| </button> | |
| <button id="save-btn" class="bg-gray-800/70 hover:bg-gray-700/70 px-4 py-2 rounded-lg transition duration-300 flex items-center text-sm border border-gray-700/50"> | |
| <i data-feather="save" class="w-4 h-4 mr-2"></i> Save | |
| </button> | |
| <button id="clear-btn" class="bg-gray-800/70 hover:bg-gray-700/70 px-4 py-2 rounded-lg transition duration-300 flex items-center text-sm border border-gray-700/50"> | |
| <i data-feather="refresh-cw" class="w-4 h-4 mr-2"></i> Reset | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="text-center text-gray-600 text-xs mt-8 font-mono"> | |
| <p>v2.4.7 | Local execution only | No data transmission</p> | |
| <p class="mt-1">© 2023 GhostJack Labs | Educational Use Only</p> | |
| </div> | |
| </div> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r121/three.min.js"></script> | |
| <script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script> | |
| <script> | |
| // Initialize Vanta.js background with stealthier settings | |
| const vantaEffect = VANTA.GLOBE({ | |
| el: "#vanta-bg", | |
| mouseControls: false, | |
| touchControls: false, | |
| gyroControls: false, | |
| minHeight: 200.00, | |
| minWidth: 200.00, | |
| scale: 0.8, | |
| scaleMobile: 0.8, | |
| color: 0x4c1d95, | |
| backgroundColor: 0x0f172a, | |
| size: 0.6, | |
| zoom: 0.7 | |
| }); | |
| // Initialize feather icons | |
| feather.replace(); | |
| // Enhanced security PIN functionality | |
| const correctPin = "123368"; | |
| const pinInput = document.getElementById('pin-input'); | |
| const unlockBtn = document.getElementById('unlock-btn'); | |
| const mainApp = document.getElementById('main-app'); | |
| const pinEntry = document.getElementById('pin-entry'); | |
| const pinError = document.getElementById('pin-error'); | |
| const lockBtn = document.getElementById('lock-btn'); | |
| const showPinBtn = document.getElementById('show-pin'); | |
| const stealthToggle = document.getElementById('stealth-toggle'); | |
| // Disable right-click and inspect element | |
| document.addEventListener('contextmenu', e => e.preventDefault()); | |
| document.addEventListener('keydown', e => { | |
| if (e.ctrlKey && e.shiftKey && e.key === 'I') e.preventDefault(); | |
| if (e.ctrlKey && e.shiftKey && e.key === 'J') e.preventDefault(); | |
| if (e.ctrlKey && e.key === 'U') e.preventDefault(); | |
| }); | |
| unlockBtn.addEventListener('click', () => { | |
| if (pinInput.value === correctPin) { | |
| pinEntry.classList.add('hidden'); | |
| mainApp.classList.remove('hidden'); | |
| pinError.classList.add('hidden'); | |
| // Add slight delay to prevent timing attacks | |
| setTimeout(() => { | |
| pinInput.value = ''; | |
| }, 150); | |
| } else { | |
| pinError.classList.remove('hidden'); | |
| pinInput.classList.add('border-red-500', 'animate-pulse'); | |
| setTimeout(() => { | |
| pinInput.classList.remove('border-red-500', 'animate-pulse'); | |
| }, 1000); | |
| // Clear the input after delay | |
| setTimeout(() => { | |
| pinInput.value = ''; | |
| }, 300); | |
| } | |
| }); | |
| lockBtn.addEventListener('click', () => { | |
| mainApp.classList.add('hidden'); | |
| pinEntry.classList.remove('hidden'); | |
| pinInput.value = ''; | |
| document.getElementById('scan-section').classList.add('hidden-scan'); | |
| document.getElementById('scan-section').classList.remove('visible-scan'); | |
| }); | |
| showPinBtn.addEventListener('click', () => { | |
| if (pinInput.type === 'password') { | |
| pinInput.type = 'text'; | |
| showPinBtn.innerHTML = feather.icons['eye-off'].toSvg(); | |
| // Auto hide after 3 seconds | |
| setTimeout(() => { | |
| if (pinInput.type === 'text') { | |
| pinInput.type = 'password'; | |
| showPinBtn.innerHTML = feather.icons['eye'].toSvg(); | |
| } | |
| }, 3000); | |
| } else { | |
| pinInput.type = 'password'; | |
| showPinBtn.innerHTML = feather.icons['eye'].toSvg(); | |
| } | |
| }); | |
| // Stealth mode toggle | |
| stealthToggle.addEventListener('click', () => { | |
| document.body.classList.toggle('discreet-mode'); | |
| if (document.body.classList.contains('discreet-mode')) { | |
| stealthToggle.innerHTML = feather.icons['eye'].toSvg(); | |
| vantaEffect.setOptions({ color: 0x334155, size: 0.4 }); | |
| } else { | |
| stealthToggle.innerHTML = feather.icons['eye-off'].toSvg(); | |
| vantaEffect.setOptions({ color: 0x4c1d95, size: 0.6 }); | |
| } | |
| }); | |
| // Main app functionality with enhanced security features | |
| const scanBtn = document.getElementById('scan-btn'); | |
| const scanSection = document.getElementById('scan-section'); | |
| const gameUrl = document.getElementById('game-url'); | |
| const scanProgress = document.getElementById('scan-progress'); | |
| const scanPercent = document.getElementById('scan-percent'); | |
| const filesScanned = document.getElementById('files-scanned'); | |
| const vulnerabilities = document.getElementById('vulnerabilities'); | |
| const rngPatterns = document.getElementById('rng-patterns'); | |
| const analysisLog = document.getElementById('analysis-log'); | |
| const rngPrediction = document.getElementById('rng-prediction'); | |
| const saveBtn = document.getElementById('save-btn'); | |
| const exportBtn = document.getElementById('export-btn'); | |
| const clearBtn = document.getElementById('clear-btn'); | |
| const clearLogBtn = document.getElementById('clear-log'); | |
| // Generate realistic-looking random data | |
| function generateRealisticData() { | |
| const patterns = [ | |
| "LCG pattern detected (modulus 2^32)", | |
| "Xorshift128+ implementation found", | |
| "Mersenne Twister variant identified", | |
| "Weak entropy source detected", | |
| "Predictable seeding mechanism", | |
| "Insufficient mixing function", | |
| "State compression vulnerability", | |
| "Time-based seed correlation" | |
| ]; | |
| return patterns[Math.floor(Math.random() * patterns.length)]; | |
| } | |
| scanBtn.addEventListener('click', () => { | |
| if (!gameUrl.value) { | |
| gameUrl.classList.add('border-red-500', 'animate-pulse'); | |
| setTimeout(() => { | |
| gameUrl.classList.remove('border-red-500', 'animate-pulse'); | |
| }, 1000); | |
| return; | |
| } | |
| scanSection.classList.remove('hidden-scan'); | |
| scanSection.classList.add('visible-scan'); | |
| logToConsole(`[System] Initializing secure connection to: ${gameUrl.value}`, 'system'); | |
| logToConsole('[Security] Starting TLS handshake...', 'security'); | |
| logToConsole('[Scanner] Preparing memory analysis tools...', 'scanner'); | |
| // Simulate scanning process with realistic delays | |
| let progress = 0; | |
| const scanInterval = setInterval(() => { | |
| progress += Math.random() * 3 + 1; // Slower, more realistic progress | |
| if (progress > 100) progress = 100; | |
| scanProgress.style.width = `${progress}%`; | |
| scanPercent.textContent = `${Math.floor(progress)}%`; | |
| filesScanned.textContent = Math.floor(progress * 2.8); | |
| if (progress >= 25 && vulnerabilities.textContent === '0') { | |
| vulnerabilities.textContent = Math.floor(progress / 15); | |
| logToConsole('[Analysis] ' + generateRealisticData(), 'analysis'); | |
| } | |
| if (progress >= 50 && rngPatterns.textContent === '0') { | |
| rngPatterns.textContent = Math.floor((progress - 40) / 8); | |
| } | |
| if (progress >= 75 && rngPatterns.textContent < '3') { | |
| rngPatterns.textContent = Math.floor((progress - 30) / 6); | |
| logToConsole('[Pattern] Identified recurring sequence with 72% confidence', 'pattern'); | |
| } | |
| // Progressive logging with realistic messages | |
| if (progress >= 10 && progress < 15) { | |
| logToConsole('[Network] Establishing secure tunnel...', 'network'); | |
| } else if (progress >= 30 && progress < 35) { | |
| logToConsole('[Memory] Mapping heap allocations...', 'memory'); | |
| } else if (progress >= 55 && progress < 60) { | |
| logToConsole('[Crypto] Analyzing PRNG implementations...', 'crypto'); | |
| } else if (progress >= 85 && progress < 90) { | |
| logToConsole('[Math] Calculating probability distributions...', 'math'); | |
| } else if (progress === 100) { | |
| logToConsole('[Result] Weak RNG detected (87.3% confidence)', 'result', true); | |
| logToConsole('[Prediction] Model accuracy: ±3.2%', 'prediction'); | |
| setTimeout(() => { | |
| generatePrediction(); | |
| }, 800); | |
| clearInterval(scanInterval); | |
| } | |
| }, 250 + Math.random() * 150); // Random delay for more realism | |
| }); | |
| function logToConsole(message, type = 'system', isImportant = false) { | |
| const logEntry = document.createElement('div'); | |
| // Add timestamp | |
| const now = new Date(); | |
| const timestamp = `[${now.getHours().toString().padStart(2, '0')}:` + | |
| `${now.getMinutes().toString().padStart(2, '0')}:` + | |
| `${now.getSeconds().toString().padStart(2, '0')}]`; | |
| logEntry.innerHTML = `<span class="text-gray-500">${timestamp}</span> `; | |
| // Color code by message type | |
| let typeClass = 'text-gray-400'; | |
| if (type === 'system') typeClass = 'text-blue-400'; | |
| else if (type === 'security') typeClass = 'text-purple-400'; | |
| else if (type === 'analysis') typeClass = 'text-yellow-400'; | |
| else if (type === 'result') typeClass = 'text-pink-400'; | |
| else if (type === 'prediction') typeClass = 'text-green-400'; | |
| if (isImportant) { | |
| logEntry.innerHTML += `<span class="${typeClass} font-bold">${message}</span>`; | |
| logEntry.classList.add('animate-pulse'); | |
| setTimeout(() => { | |
| logEntry.classList.remove('animate-pulse'); | |
| }, 1000); | |
| } else { | |
| logEntry.innerHTML += `<span class="${typeClass}">${message}</span>`; | |
| } | |
| analysisLog.appendChild(logEntry); | |
| analysisLog.scrollTop = analysisLog.scrollHeight; | |
| } | |
| function generatePrediction() { | |
| // Simulate RNG prediction with realistic values | |
| const outcomes = [ | |
| { value: 7, confidence: '89.2%' }, | |
| { value: 22, confidence: '85.7%' }, | |
| { value: 0, confidence: '92.1%' }, | |
| { value: 13, confidence: '88.5%' }, | |
| { value: 29, confidence: '86.9%' }, | |
| { value: 18, confidence: '91.3%' } | |
| ]; | |
| const prediction = outcomes[Math.floor(Math.random() * outcomes.length)]; | |
| rngPrediction.textContent = prediction.value; | |
| rngPrediction.classList.add('animate-pulse', 'text-pink-400'); | |
| // Add confidence indicator | |
| const confidence = document.createElement('div'); | |
| confidence.className = 'text-xs text-gray-500 mt-1'; | |
| confidence.textContent = `Confidence: ${prediction.confidence}`; | |
| // Clear any previous confidence indicator | |
| if (rngPrediction.nextElementSibling && rngPrediction.nextElementSibling.className.includes('text-xs')) { | |
| rngPrediction.nextElementSibling.remove(); | |
| } | |
| rngPrediction.parentNode.insertBefore(confidence, rngPrediction.nextSibling); | |
| setTimeout(() => { | |
| rngPrediction.classList.remove('animate-pulse'); | |
| rngPrediction.classList.remove('text-pink-400'); | |
| rngPrediction.classList.add('text-purple-300'); | |
| }, 1500); | |
| } | |
| saveBtn.addEventListener('click', () => { | |
| logToConsole('[System] Report saved to encrypted local storage', 'system'); | |
| saveBtn.innerHTML = feather.icons['check'].toSvg() + '<span class="ml-2">Saved</span>'; | |
| setTimeout(() => { | |
| saveBtn.innerHTML = feather.icons['save'].toSvg() + '<span class="ml-2">Save</span>'; | |
| }, 2000); | |
| }); | |
| exportBtn.addEventListener('click', () => { | |
| logToConsole('[System] Exporting encrypted report package...', 'system'); | |
| exportBtn.innerHTML = feather.icons['download-cloud'].toSvg() + '<span class="ml-2">Exporting</span>'; | |
| setTimeout(() => { | |
| logToConsole('[System] Report exported with AES-256 encryption', 'system', true); | |
| exportBtn.innerHTML = feather.icons['download'].toSvg() + '<span class="ml-2">Export</span>'; | |
| }, 1500); | |
| }); | |
| clearBtn.addEventListener('click', () => { | |
| gameUrl.value = ''; | |
| scanSection.classList.remove('visible-scan'); | |
| scanSection.classList.add('hidden-scan'); | |
| scanProgress.style.width = '0%'; | |
| scanPercent.textContent = '0%'; | |
| filesScanned.textContent = '0'; | |
| vulnerabilities.textContent = '0'; | |
| rngPatterns.textContent = '0'; | |
| analysisLog.innerHTML = '<div class="text-gray-500">[System] Ready to scan...</div>'; | |
| rngPrediction.textContent = '?'; | |
| // Remove confidence indicator if exists | |
| if (rngPrediction.nextElementSibling && rngPrediction.nextElementSibling.className.includes('text-xs')) { | |
| rngPrediction.nextElementSibling.remove(); | |
| } | |
| }); | |
| clearLogBtn.addEventListener('click', () => { | |
| analysisLog.innerHTML = '<div class="text-gray-500">[System] Log cleared</div>'; | |
| }); | |
| // Enhanced input handling | |
| pinInput.addEventListener('keypress', (e) => { | |
| if (e.key === 'Enter') { | |
| unlockBtn.click(); | |
| } | |
| // Only allow numeric input | |
| if (!/[0-9]/.test(e.key)) { | |
| e.preventDefault(); | |
| } | |
| }); | |
| gameUrl.addEventListener('keypress', (e) => { | |
| if (e.key === 'Enter') { | |
| scanBtn.click(); | |
| } | |
| }); | |
| // Auto-clear function for sensitive data | |
| setInterval(() => { | |
| if (!mainApp.classList.contains('hidden')) { | |
| // Clear clipboard every 2 minutes | |
| navigator.clipboard.writeText(''); | |
| } | |
| }, 120000); | |
| </script> | |
| </body> | |
| </html> | |