let devToolsDetected = false; // 메시지 수신 self.addEventListener('message', (event) => { if (event.data.type === 'devtools_detected') { devToolsDetected = true; console.log('DevTools detected - switching to fake sources'); } else if (event.data.type === 'init') { devToolsDetected = event.data.devToolsDetected; } }); // 네트워크 요청 가로채기 self.addEventListener('fetch', (event) => { const url = new URL(event.request.url); // JS 파일 요청인지 확인 if (url.pathname.endsWith('.js') && devToolsDetected) { // main, login, index 폴더의 JS 파일들 const protectedPaths = ['/main/', '/login/', '/index/']; const shouldProtect = protectedPaths.some(path => url.pathname.includes(path)); if (shouldProtect) { console.log('Intercepting JS request:', url.pathname); // 가짜 코드 반환 event.respondWith( new Response(generateFakeCode(url.pathname), { headers: { 'Content-Type': 'application/javascript; charset=utf-8', 'Cache-Control': 'no-cache' } }) ); return; } } // localStorage 체크 if (url.pathname.endsWith('.js')) { event.respondWith( (async () => { // 일반적인 fetch 실행 const response = await fetch(event.request); // DevTools 감지 상태 확인을 위한 추가 로직 return response; })() ); return; } // 일반 요청은 그대로 통과 event.respondWith(fetch(event.request)); }); function generateFakeCode(pathname) { return ` // ============================================ // FILE: ${pathname} // STATUS: PROTECTED - SOURCE ENCRYPTED // ============================================ // This is not the actual source code // Original implementation has been secured // ============================================ (function() { 'use strict'; console.warn('Attempting to access protected source: ${pathname}'); // Fake implementation const _obfuscated_${Math.random().toString(36).substr(2, 8)} = { ${generateFakeProperties()} }; // Anti-debugging setInterval(function() { debugger; }, 100); // Prevent inspection (function infiniteDebugger() { try { debugger; setTimeout(infiniteDebugger, 50); } catch(e) {} })(); console.error('Source code access denied'); })(); // ============================================ // Additional protection layers // ============================================ ${generateGarbageCode(50)} `; } function generateFakeProperties() { let props = ''; for (let i = 0; i < 20; i++) { props += `\n prop_${i}: "${Math.random().toString(36).substr(2)}",`; } return props; } function generateGarbageCode(lines) { let code = ''; for (let i = 0; i < lines; i++) { code += `var _0x${Math.random().toString(36).substr(2, 6)} = ${Math.random()};\n`; } return code; } // Service Worker 설치 self.addEventListener('install', (event) => { console.log('Anti-Debug Service Worker installed'); self.skipWaiting(); }); // Service Worker 활성화 self.addEventListener('activate', (event) => { console.log('Anti-Debug Service Worker activated'); event.waitUntil(clients.claim()); });