|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Adware Defense Game</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.js"></script> |
|
<style> |
|
body { |
|
font-family: 'Inter', sans-serif; |
|
overscroll-behavior: none; |
|
} |
|
.chat-bubble { |
|
max-width: 70%; |
|
padding: 10px 15px; |
|
border-radius: 20px; |
|
margin-bottom: 10px; |
|
word-wrap: break-word; |
|
} |
|
.user-bubble { |
|
background-color: #DCF8C6; |
|
align-self: flex-end; |
|
margin-left: auto; |
|
} |
|
.friend-bubble { |
|
background-color: #E5E7EB; |
|
align-self: flex-start; |
|
} |
|
.ad-bubble { |
|
background-color: #FECACA; |
|
border: 2px dashed #F87171; |
|
align-self: center; |
|
width: 80%; |
|
text-align: center; |
|
animation: fadeIn 0.5s ease-out; |
|
} |
|
@keyframes fadeIn { |
|
from { opacity: 0; transform: translateY(10px); } |
|
to { opacity: 1; transform: translateY(0); } |
|
} |
|
.device-icon { |
|
font-size: 3rem; |
|
margin-bottom: 0.5rem; |
|
} |
|
.control-button { |
|
padding: 0.75rem 1.5rem; |
|
border-radius: 0.5rem; |
|
font-weight: 600; |
|
transition: all 0.2s ease-in-out; |
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
|
} |
|
.control-button:hover { |
|
transform: translateY(-2px); |
|
box-shadow: 0 4px 8px rgba(0,0,0,0.15); |
|
} |
|
.control-button:active { |
|
transform: translateY(0px); |
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1); |
|
} |
|
.info-panel { |
|
background-color: rgba(0,0,0,0.75); |
|
color: white; |
|
padding: 2rem; |
|
border-radius: 1rem; |
|
position: fixed; |
|
top: 50%; |
|
left: 50%; |
|
transform: translate(-50%, -50%); |
|
z-index: 100; |
|
width: 90%; |
|
max-width: 600px; |
|
text-align: center; |
|
box-shadow: 0 10px 25px rgba(0,0,0,0.3); |
|
} |
|
.info-panel h2 { |
|
font-size: 2rem; |
|
margin-bottom: 1rem; |
|
} |
|
.info-panel p, .info-panel li { |
|
font-size: 1.1rem; |
|
line-height: 1.6; |
|
} |
|
.game-title { |
|
font-size: 2.5rem; |
|
font-weight: bold; |
|
margin-bottom: 1rem; |
|
color: #1E40AF; |
|
} |
|
.step-title { |
|
font-size: 1.5rem; |
|
font-weight: 600; |
|
margin-bottom: 1rem; |
|
color: #1D4ED8; |
|
} |
|
.highlight-box { |
|
border: 3px dashed #F59E0B; |
|
padding: 1rem; |
|
border-radius: 0.5rem; |
|
margin-top: 1rem; |
|
background-color: #FFFBEB; |
|
} |
|
.mermaid-diagram-container { |
|
background-color: white; |
|
padding: 1rem; |
|
border-radius: 0.5rem; |
|
box-shadow: 0 4px 6px rgba(0,0,0,0.1); |
|
margin: 1rem 0; |
|
overflow-x: auto; |
|
} |
|
|
|
.mermaid svg text { |
|
fill: #111827 !important; |
|
stroke: none !important; |
|
font-size: 16px !important; |
|
} |
|
.mermaid svg .label { |
|
font-size: 16px !important; |
|
} |
|
.mermaid svg .actor { |
|
fill: #BFDBFE !important; |
|
stroke: #3B82F6 !important; |
|
} |
|
.mermaid svg .messageText, .mermaid svg .noteText { |
|
font-size: 14px !important; |
|
} |
|
|
|
</style> |
|
</head> |
|
<body class="bg-gradient-to-br from-blue-100 via-indigo-50 to-purple-100 min-h-screen flex flex-col items-center justify-center p-4 overflow-hidden"> |
|
|
|
<div id="gameContainer" class="w-full max-w-4xl bg-white p-6 rounded-xl shadow-2xl"> |
|
<h1 class="game-title text-center">π‘οΈ Adware Defense Sim π‘οΈ</h1> |
|
<p class="text-center text-gray-600 mb-6 text-lg">Experience how adware can inject ads and how to stay vigilant!</p> |
|
|
|
<div id="stepIndicator" class="text-center mb-4"> |
|
<span id="currentStep" class="text-xl font-bold text-indigo-600">Step 1</span> / 10 |
|
</div> |
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6"> |
|
|
|
<div class="border p-4 rounded-lg bg-gray-50 shadow-md"> |
|
<h2 class="step-title text-center">π» Your PC (Chrome Browser)</h2> |
|
<div class="device-icon text-center">π₯οΈ</div> |
|
<div id="pcChatArea" class="h-64 overflow-y-auto p-2 border rounded bg-white flex flex-col space-y-2"> |
|
|
|
</div> |
|
<input type="text" id="pcMessageInput" placeholder="Type a message..." class="w-full mt-2 p-2 border rounded focus:ring-2 focus:ring-blue-500 focus:border-transparent"> |
|
<div id="pcInfo" class="text-sm text-gray-500 mt-2"></div> |
|
</div> |
|
|
|
|
|
<div class="border p-4 rounded-lg bg-gray-50 shadow-md"> |
|
<h2 class="step-title text-center">π± Your Android Phone (Fold2)</h2> |
|
<div class="device-icon text-center">π±</div> |
|
<div id="phoneChatArea" class="h-64 overflow-y-auto p-2 border rounded bg-white flex flex-col space-y-2"> |
|
|
|
</div> |
|
<div id="phoneInfo" class="text-sm text-gray-500 mt-2"></div> |
|
</div> |
|
</div> |
|
|
|
<div id="gameMessage" class="text-center text-lg font-semibold my-4 p-3 bg-yellow-100 border border-yellow-300 rounded-lg text-yellow-800"> |
|
Welcome! Click "Next Step" to begin the simulation. |
|
</div> |
|
|
|
<div class="text-center mt-6"> |
|
<button id="nextStepButton" class="control-button bg-blue-600 hover:bg-blue-700 text-white"> |
|
Next Step π |
|
</button> |
|
</div> |
|
|
|
<div id="mermaidContainer" class="mermaid-diagram-container hidden mt-8"> |
|
<h3 class="text-xl font-semibold text-center mb-2">Attack Flow Visualization</h3> |
|
<pre class="mermaid" id="mermaidDiagram"> |
|
// Diagram will be populated by JS |
|
</pre> |
|
</div> |
|
</div> |
|
|
|
|
|
<div id="infoPanel" class="info-panel hidden"> |
|
<h2 id="infoPanelTitle">Information</h2> |
|
<div id="infoPanelContent" class="text-left"></div> |
|
<button id="infoPanelCloseButton" class="control-button bg-green-500 hover:bg-green-600 text-white mt-6">Got it!</button> |
|
</div> |
|
|
|
|
|
<script> |
|
|
|
mermaid.initialize({ startOnLoad: false, theme: 'base', securityLevel: 'loose', |
|
fontFamily: 'Inter, sans-serif', |
|
themeVariables: { |
|
primaryColor: '#EFF6FF', |
|
primaryTextColor: '#111827', |
|
primaryBorderColor: '#60A5FA', |
|
lineColor: '#3B82F6', |
|
secondaryColor: '#DBEAFE', |
|
tertiaryColor: '#BFDBFE' |
|
} |
|
}); |
|
|
|
const pcChatArea = document.getElementById('pcChatArea'); |
|
const phoneChatArea = document.getElementById('phoneChatArea'); |
|
const pcMessageInput = document.getElementById('pcMessageInput'); |
|
const nextStepButton = document.getElementById('nextStepButton'); |
|
const gameMessage = document.getElementById('gameMessage'); |
|
const currentStepEl = document.getElementById('currentStep'); |
|
const pcInfo = document.getElementById('pcInfo'); |
|
const phoneInfo = document.getElementById('phoneInfo'); |
|
|
|
const mermaidContainer = document.getElementById('mermaidContainer'); |
|
const mermaidDiagramEl = document.getElementById('mermaidDiagram'); |
|
|
|
const infoPanel = document.getElementById('infoPanel'); |
|
const infoPanelTitle = document.getElementById('infoPanelTitle'); |
|
const infoPanelContent = document.getElementById('infoPanelContent'); |
|
const infoPanelCloseButton = document.getElementById('infoPanelCloseButton'); |
|
|
|
let step = 0; |
|
const totalSteps = 10; |
|
|
|
const steps = [ |
|
|
|
() => { |
|
gameMessage.textContent = "STEP 1: You're on your PC using Google Messages for web. Type a friendly message to your contact (e.g., 'Hello!') and imagine pressing Enter."; |
|
pcMessageInput.value = "Hello from my PC! π"; |
|
pcMessageInput.focus(); |
|
pcInfo.innerHTML = "π‘ Google Messages for web syncs with your phone."; |
|
}, |
|
|
|
() => { |
|
const msgText = pcMessageInput.value || "Hello from my PC! π"; |
|
addChatMessage(pcChatArea, msgText, 'user'); |
|
gameMessage.textContent = "STEP 2: Message 'sent'! It appears on your PC and syncs to your Android phone via Google's servers (simulated Wi-Fi sync)."; |
|
setTimeout(() => { |
|
addChatMessage(phoneChatArea, msgText, 'user'); |
|
phoneInfo.innerHTML = "π± Message received from PC via sync!"; |
|
}, 500); |
|
pcMessageInput.value = ""; |
|
}, |
|
|
|
() => { |
|
gameMessage.textContent = "STEP 3: Now, you paste a link into the chat on your PC. Let's say it's a link to a cool Hugging Face Space that shows an HTML component (e.g., from a YAML config)."; |
|
pcMessageInput.value = "https://huggingface.co/spaces/cool-project/app"; |
|
pcInfo.innerHTML = "π Pasting a link often generates a preview."; |
|
}, |
|
|
|
() => { |
|
const linkText = pcMessageInput.value || "https://huggingface.co/spaces/cool-project/app"; |
|
addChatMessage(pcChatArea, `Pasted Link: ${linkText}`, 'user'); |
|
|
|
const previewBubble = document.createElement('div'); |
|
previewBubble.className = 'chat-bubble user-bubble'; |
|
previewBubble.innerHTML = ` |
|
<p class="font-semibold">Preview: Cool Project App</p> |
|
<p class="text-xs text-gray-600">${linkText}</p> |
|
<div class="mt-1 p-2 border border-gray-300 rounded bg-gray-100">β¨ Interactive HTML Component β¨</div> |
|
`; |
|
pcChatArea.appendChild(previewBubble); |
|
pcChatArea.scrollTop = pcChatArea.scrollHeight; |
|
|
|
gameMessage.textContent = "STEP 4: The link preview for the Hugging Face Space appears normally in your PC chat. So far, so good..."; |
|
setTimeout(() => { |
|
addChatMessage(phoneChatArea, `Link: ${linkText}`, 'user'); |
|
const phonePreviewBubble = document.createElement('div'); |
|
phonePreviewBubble.className = 'chat-bubble user-bubble'; |
|
phonePreviewBubble.innerHTML = ` |
|
<p class="font-semibold">Preview: Cool Project App</p> |
|
<p class="text-xs text-gray-600">${linkText}</p> |
|
`; |
|
phoneChatArea.appendChild(phonePreviewBubble); |
|
phoneChatArea.scrollTop = phoneChatArea.scrollHeight; |
|
|
|
}, 500); |
|
pcMessageInput.value = ""; |
|
}, |
|
|
|
() => { |
|
gameMessage.innerHTML = ` |
|
<span class="text-red-600 font-bold text-xl">π¨ STEP 5: ATTACK! π¨</span><br> |
|
Unknown to you, adware on your PC (e.g., a malicious browser extension) has been monitoring your web activity. |
|
Pasting the link and the page updating to show a preview triggered it! |
|
`; |
|
pcInfo.innerHTML = "<strong class='text-red-500'>π΄ Adware Activated!</strong> It's preparing to inject an ad by manipulating the webpage's code (DOM)."; |
|
pcChatArea.classList.add('border-red-500', 'border-2'); |
|
phoneChatArea.classList.remove('border-red-500', 'border-2'); |
|
}, |
|
|
|
async () => { |
|
gameMessage.textContent = "STEP 6: Let's visualize how this ad injection happens with a diagram."; |
|
mermaidContainer.classList.remove('hidden'); |
|
const diagramDefinition = ` |
|
sequenceDiagram |
|
actor UserPC as π» User on PC |
|
participant Browser asπ Chrome Browser (PC) |
|
participant AdwareExt as π Adware Extension (PC) |
|
participant GoogleMessagesWeb as π¬ Google Messages Web UI |
|
participant AdServer as π° Ad Server (e.g., AdFox) |
|
|
|
UserPC->>Browser: Pastes link (e.g., HF Space) |
|
Browser->>GoogleMessagesWeb: Updates UI with link/preview |
|
Note over AdwareExt,GoogleMessagesWeb: Adware monitors DOM changes or network activity |
|
AdwareExt-->>GoogleMessagesWeb: π Detects UI update (trigger!) |
|
AdwareExt->>Browser: π Injects malicious script into page |
|
Browser->>AdServer: Script requests ad content |
|
AdServer-->>Browser: Delivers ad πΌοΈ (e.g., dealsbe.com) |
|
Browser->>GoogleMessagesWeb: Script manipulates DOM to display ad |
|
Note over GoogleMessagesWeb: Ad appears in chat flow, looking like part of it! |
|
UserPC-->>GoogleMessagesWeb: Sees unexpected ad π‘ |
|
`; |
|
mermaidDiagramEl.textContent = diagramDefinition; |
|
try { |
|
const { svg } = await mermaid.render('mermaid-graph', diagramDefinition); |
|
mermaidDiagramEl.innerHTML = svg; |
|
|
|
const svgElement = mermaidDiagramEl.querySelector('svg'); |
|
if (svgElement) { |
|
svgElement.setAttribute('height', '100%'); |
|
svgElement.setAttribute('width', '100%'); |
|
|
|
|
|
|
|
} |
|
} catch (error) { |
|
console.error("Mermaid rendering error:", error); |
|
mermaidDiagramEl.textContent = "Error rendering diagram. Please see console."; |
|
} |
|
pcInfo.innerHTML = "π Diagram shows the ad injection process."; |
|
}, |
|
|
|
() => { |
|
mermaidContainer.classList.add('hidden'); |
|
gameMessage.textContent = "STEP 7: The adware successfully injects an ad directly into your Google Messages chat flow on your PC!"; |
|
const adBubble = document.createElement('div'); |
|
adBubble.className = 'chat-bubble ad-bubble'; |
|
adBubble.innerHTML = ` |
|
<p class="font-bold text-lg">π Special Offer from DealsBe.com! π</p> |
|
<img src="https://placehold.co/300x150/FFDDDD/CC0000?text=Fake+AdFox+Ad!" alt="Fake Ad" class="mx-auto my-2 rounded shadow-sm"> |
|
<p class="text-sm">Click here for UNBEATABLE DEALS! (Don't actually click! π)</p> |
|
<p class="text-xs text-gray-700 mt-1">Powered by π¦ AdFox (Simulated)</p> |
|
`; |
|
pcChatArea.appendChild(adBubble); |
|
pcChatArea.scrollTop = pcChatArea.scrollHeight; |
|
pcInfo.innerHTML = "<strong class='text-red-500'>β οΈ Injected Ad Displayed!</strong> This is NOT from Google Messages."; |
|
phoneInfo.innerHTML = "π± Your phone chat remains clean... for now. The attack is on your PC's browser."; |
|
}, |
|
|
|
() => { |
|
gameMessage.textContent = "STEP 8: Your PC has a conceptual 'AI-Powered Security Sandbox' that monitors browser behavior for anomalies."; |
|
pcInfo.innerHTML = ` |
|
<div class="highlight-box"> |
|
<p class="text-lg font-semibold">π€ AI Sandbox Activated! π€</p> |
|
<p>Scanning browser activity for unauthorized DOM manipulations and suspicious network requests...</p> |
|
<div class="w-full bg-gray-200 rounded-full h-2.5 dark:bg-gray-700 mt-2"> |
|
<div id="aiScanProgress" class="bg-blue-600 h-2.5 rounded-full" style="width: 0%"></div> |
|
</div> |
|
</div> |
|
`; |
|
let progress = 0; |
|
const interval = setInterval(() => { |
|
progress += 10; |
|
document.getElementById('aiScanProgress').style.width = progress + '%'; |
|
if (progress >= 100) clearInterval(interval); |
|
}, 100); |
|
}, |
|
|
|
() => { |
|
gameMessage.innerHTML = ` |
|
<span class="text-green-600 font-bold text-xl">π‘οΈ STEP 9: THREAT DETECTED! π‘οΈ</span><br> |
|
The AI Sandbox identifies the unauthorized ad injection! |
|
`; |
|
pcInfo.innerHTML = ` |
|
<div class="highlight-box border-green-500 bg-green-50"> |
|
<p class="text-lg font-semibold text-green-700">β
Anomaly Found!</p> |
|
<p>Detected: Unauthorized script modified chat interface.</p> |
|
<p>Source: Suspected adware browser extension.</p> |
|
<p>Action: Flagged suspicious activity.</p> |
|
</div> |
|
`; |
|
pcChatArea.classList.remove('border-red-500'); |
|
pcChatArea.classList.add('border-green-500'); |
|
}, |
|
|
|
() => { |
|
gameMessage.textContent = "STEP 10: Understanding the Threat & Solution."; |
|
showInfoPanel( |
|
"π‘ Understanding & Defense π‘", |
|
` |
|
<p class="mb-3">You've seen how adware can sneakily inject ads. This wasn't Google's fault, but a malicious program on <em>your PC</em>.</p> |
|
<p class="mb-3"><strong>Key Takeaways:</strong></p> |
|
<ul class="list-disc list-inside mb-3 text-left space-y-1"> |
|
<li>Adware often comes from unsafe downloads or deceptive browser extensions.</li> |
|
<li>It manipulates website code (DOM) locally in <em>your browser</em>.</li> |
|
<li>Your actual message content is usually not the primary target for simple ad-injectors, but your browsing data might be.</li> |
|
<li>Google Messages' Privacy Policy covers their service, not third-party malware on your device. Always check extension permissions!</li> |
|
</ul> |
|
<div class="p-4 bg-blue-800 rounded-lg mt-4"> |
|
<h3 class="text-xl font-semibold mb-2">β¨ Introducing 'Guardian AI Shield' (Conceptual) β¨</h3> |
|
<p>Imagine an advanced AI agent, like the one that detected this, constantly protecting you!</p> |
|
<p class="mt-2"><strong>Guardian AI Shield could:</strong></p> |
|
<ul class="list-disc list-inside text-left space-y-1"> |
|
<li>Proactively block known adware sources.</li> |
|
<li>Detect and neutralize new ad injection techniques in real-time.</li> |
|
<li>Analyze browser extension behavior for risks.</li> |
|
<li>Offer one-click cleanup of detected threats.</li> |
|
</ul> |
|
<p class="mt-3 font-semibold">Stay safe by being vigilant and using robust security tools!</p> |
|
</div> |
|
` |
|
); |
|
nextStepButton.textContent = "Restart Simulation π"; |
|
nextStepButton.classList.remove('bg-blue-600', 'hover:bg-blue-700'); |
|
nextStepButton.classList.add('bg-green-600', 'hover:bg-green-700'); |
|
} |
|
]; |
|
|
|
function addChatMessage(area, message, type) { |
|
const bubble = document.createElement('div'); |
|
bubble.className = `chat-bubble ${type === 'user' ? 'user-bubble' : (type === 'friend' ? 'friend-bubble' : 'ad-bubble')}`; |
|
bubble.textContent = message; |
|
area.appendChild(bubble); |
|
area.scrollTop = area.scrollHeight; |
|
} |
|
|
|
function showInfoPanel(title, content) { |
|
infoPanelTitle.textContent = title; |
|
infoPanelContent.innerHTML = content; |
|
infoPanel.classList.remove('hidden'); |
|
} |
|
|
|
infoPanelCloseButton.addEventListener('click', () => { |
|
infoPanel.classList.add('hidden'); |
|
}); |
|
|
|
function resetSimulation() { |
|
step = 0; |
|
pcChatArea.innerHTML = ''; |
|
phoneChatArea.innerHTML = ''; |
|
pcMessageInput.value = ''; |
|
pcInfo.innerHTML = ''; |
|
phoneInfo.innerHTML = ''; |
|
mermaidContainer.classList.add('hidden'); |
|
mermaidDiagramEl.innerHTML = ''; |
|
pcChatArea.classList.remove('border-red-500', 'border-green-500', 'border-2'); |
|
nextStepButton.textContent = "Next Step π"; |
|
nextStepButton.classList.remove('bg-green-600', 'hover:bg-green-700'); |
|
nextStepButton.classList.add('bg-blue-600', 'hover:bg-blue-700'); |
|
updateStepIndicator(); |
|
steps[step](); |
|
} |
|
|
|
function updateStepIndicator() { |
|
currentStepEl.textContent = `Step ${step + 1}`; |
|
} |
|
|
|
nextStepButton.addEventListener('click', () => { |
|
if (step < totalSteps -1) { |
|
step++; |
|
updateStepIndicator(); |
|
steps[step](); |
|
} else if (step === totalSteps -1 && nextStepButton.textContent.includes("Restart")) { |
|
resetSimulation(); |
|
} else { |
|
steps[step](); |
|
} |
|
}); |
|
|
|
|
|
updateStepIndicator(); |
|
steps[step](); |
|
|
|
</script> |
|
</body> |
|
</html> |
|
|