diff --git a/README.md b/README.md index 58d8dea..ee79408 100644 --- a/README.md +++ b/README.md @@ -1,75 +1,47 @@ # Chzzk Bypass -치지직(CHZZK) 시청 환경을 개선하는 Chrome / Edge / Whale 용 확장 프로그램 (Manifest V3). +치지직(CHZZK) 관련 Chrome 계열 확장. **1.2.2 부터 모든 우회 기능이 제거되었습니다.** -## 기능 +## 우회 기능 중단 안내 -### 그리드 우회 (1080p 시청) +이 확장은 더 이상 치지직 페이지에 개입하지 않습니다. -`navigator.userAgent`, `navigator.platform`, `navigator.userAgentData` 를 Mac 으로 -위장해, 치지직이 윈도우에서 1080p 시청 시 요구하는 그리드(Grid) 설치 없이 1080p -화질을 시청할 수 있게 합니다. +- `content_scripts` 제거 +- `declarativeNetRequest` 규칙 / 권한 제거 +- `navigator.userAgent` / `platform` / `userAgentData` 위장 코드 제거 +- HTTP 요청 헤더 (`User-Agent`, `sec-ch-ua*`) 수정 규칙 제거 -위장은 두 레이어를 같은 값으로 맞춥니다. +이전 버전(`1.1.x` ~ `1.2.1`) 의 기능과 제거 사유는 아래와 같습니다. -- **JS 레벨** (`content.js`): `navigator.userAgent`, `navigator.platform`, - `navigator.userAgentData` (메서드 `getHighEntropyValues` / `toJSON` 포함). -- **네트워크 레벨** (`rules.json` + declarativeNetRequest): 실제 HTTP 요청 - 헤더 `User-Agent`, `sec-ch-ua`, `sec-ch-ua-platform`, `sec-ch-ua-mobile` 을 - Mac 값으로 덮어씁니다. +### 타임머신 강제 활성화 (`1.1.x`) -두 레이어 중 하나만 바꾸면 JS 와 서버가 보는 값이 어긋나, 치지직 핑거프린팅이 -**"허용되지 않는 비정상적 접근입니다."** 팝업을 띄울 수 있습니다. -1.2.1 부터 이 두 레이어를 함께 일관되게 위장합니다. +스트리머가 타임머신을 꺼둔 라이브에서도 되감기 바 UI 를 띄우는 기능. `1.2.0` 부터 제거. -`userAgentData` 는 단순히 `brands` / `mobile` / `platform` 만 갈아끼우면 -치지직이 로드하는 `nlog.js` (네이버 핑거프린팅 / 로깅) 가 -`e.getHighEntropyValues is not a function` 으로 Uncaught TypeError 를 던집니다. -이 자체가 비정상 접근 시그널이 될 수 있어서, `getHighEntropyValues` 메서드도 -일관된 Mac 값으로 채워 둡니다. (manifest 의 `world: MAIN` + `run_at: document_start` -덕분에 페이지 스크립트보다 먼저 적용됩니다.) +- 치지직의 DVR window 는 스트리머가 타임머신을 켰을 때만 CDN 이 프로비저닝합니다. 클라이언트에서 `timeMachineActive` 플래그만 `true` 로 바꿔도 HLS 매니페스트(`timemachine=false`) 와 어긋나서 실제 되감기는 동작하지 않습니다. +- 이 클라이언트-사이드 상태 불일치가 치지직의 비정상 접근 감지를 트리거해 **"허용되지 않는 비정상적 접근입니다. 반복적인 접근 시 운영 정책에 따라 조치될 수 있습니다."** 팝업을 띄우는 것이 실측으로 확인되었습니다. -구현: `content.js`, `rules.json` +### 그리드 우회 / 1080p Mac 위장 (`1.2.0` ~ `1.2.1`) -## 타임머신 강제 활성화는 지원하지 않습니다 +`navigator.*` 와 HTTP 요청 헤더를 Mac 으로 위장해 그리드 설치 없이 1080p 시청을 시도. `1.2.2` 부터 제거. -이전 버전(`1.1.x`)에는 스트리머가 타임머신을 꺼둔 라이브에서도 되감기 바 UI 를 -띄우는 기능이 있었습니다. **`1.2.0` 부터는 제거되었습니다.** +- JS 레벨만 위장한 `1.2.0`, JS + 저엔트로피 HTTP 헤더까지 위장한 `1.2.1` 모두 동일한 비정상 접근 팝업을 트리거하는 것이 실측으로 확인되었습니다. +- 치지직은 고엔트로피 Client Hints (`sec-ch-ua-platform-version`, `sec-ch-ua-arch`, `sec-ch-ua-bitness`, `sec-ch-ua-full-version-list`), WebGL `UNMASKED_RENDERER_WEBGL`, Canvas / AudioContext, 폰트 목록 등 다수의 핑거프린팅 신호를 추가로 보고 있습니다. 클라이언트 확장만으로는 이 신호를 모두 일관되게 위장할 수 없으며, lockstep 으로 따라가는 것도 의미가 없습니다. +- 반복 접근 시 계정 제재 위험이 명시되어 있어, 우회 시도 자체를 중단했습니다. -이유: +대안: 그리드(Grid) 정식 설치, 또는 720p 시청. -- 치지직의 DVR window 는 스트리머가 타임머신을 켰을 때만 CDN 이 - 프로비저닝합니다. 클라이언트에서 `timeMachineActive` 플래그만 `true` 로 - 바꿔도 HLS 매니페스트(`timemachine=false`) 와 상태가 어긋나서 실제 되감기는 - 동작하지 않습니다 (cosmetic 한 UI 만 뜸). -- 더 심각한 문제는, 이 클라이언트-사이드 상태 불일치가 치지직의 비정상 접근 - 감지 로직을 트리거해 **"허용되지 않는 비정상적 접근입니다. 반복적인 접근 시 - 운영 정책에 따라 조치될 수 있습니다."** 팝업이 뜨는 것이 실측으로 확인되었습니다. - 계정 제재 위험이 있어 기능을 제거했습니다. +## 설치 / 제거 -스트리머가 끈 타임머신은 클라이언트 확장만으로는 안전하게 우회할 수 없습니다. -되감기가 필요하면 스트리머에게 타임머신을 켜달라고 요청하거나 다시보기 -업로드를 기다려 주세요. - -## 설치 - -1. 이 저장소를 `git clone` 또는 ZIP 다운로드해 임의의 폴더에 둡니다. -2. Chrome 계열 브라우저에서 `chrome://extensions` 접속. -3. 우상단 **개발자 모드** 활성화. -4. **압축해제된 확장 프로그램을 로드합니다** 클릭 → 위 폴더 선택. -5. 치지직(`https://chzzk.naver.com`) 새로고침. +설치 의미가 없습니다. 이미 설치되어 있다면 `chrome://extensions` 에서 제거하시는 걸 권장합니다. ## 파일 구조 ``` -manifest.json 확장 정의 (MV3) -content.js 그리드 우회 JS 레벨 (UA / platform / UA-CH 위장 + getHighEntropyValues) -rules.json 그리드 우회 네트워크 레벨 (UA / sec-ch-ua* 헤더 modifyHeaders) -popup.html/css/js 툴바 팝업 +manifest.json 확장 정의 (MV3, 권한 없음, content_scripts 없음) +popup.html/css/js 툴바 팝업 (상태 안내만 표시) icons/ 확장 아이콘 ``` ## 면책 -본 확장은 학습 및 개인 사용 목적의 우회 도구입니다. 사용에 따른 모든 책임은 -사용자에게 있으며, 치지직 약관 및 관련 법령을 준수하여 사용하시기 바랍니다. +본 확장은 학습 및 개인 사용 목적의 우회 도구였습니다. `1.2.2` 부터 우회 기능을 제공하지 않습니다. 사용에 따른 모든 책임은 사용자에게 있으며, 치지직 약관 및 관련 법령을 준수하여 사용하시기 바랍니다. diff --git a/content.js b/content.js deleted file mode 100644 index 202b611..0000000 --- a/content.js +++ /dev/null @@ -1,89 +0,0 @@ -// 치지직이 윈도우에서 1080p 시청 시 그리드 설치를 요구하는 것을 우회하기 위해 -// navigator 의 OS/브라우저 식별 값들을 Mac 으로 위장한다. -// -// 이 파일은 JS 레벨 (navigator.*) 만 다룬다. 실제 HTTP 요청 헤더 -// (User-Agent / sec-ch-ua / sec-ch-ua-platform / sec-ch-ua-mobile) 는 -// rules.json 의 declarativeNetRequest modifyHeaders 규칙이 똑같이 Mac 으로 -// 덮어쓴다. JS 와 네트워크 레벨 값이 어긋나면 치지직 핑거프린팅이 -// "비정상 접근" 으로 보고 팝업을 띄우므로 두 레이어가 반드시 같은 값을 -// 가져야 한다. -// -// userAgentData 의 getHighEntropyValues 까지 구현해 두지 않으면 -// 치지직이 로드하는 nlog.js (네이버 핑거프린팅 / 로깅) 가 -// `e.getHighEntropyValues is not a function` 으로 Uncaught TypeError 를 던지고, -// 그 자체가 비정상 접근 시그널이 될 수 있다. 그래서 객체 형태와 메서드까지 -// 일관된 Mac 값으로 채워 둔다. (manifest 의 world: MAIN + run_at: document_start -// 덕분에 페이지 스크립트보다 먼저 적용된다.) - -Object.defineProperty(navigator, 'userAgent', { - get: function () { - return 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'; - } -}); - -Object.defineProperty(navigator, 'platform', { - get: function () { - return 'MacIntel'; - } -}); - -const __chzzkBypassBrands = [ - { brand: 'Chromium', version: '122' }, - { brand: 'Google Chrome', version: '122' }, - { brand: 'Not-A.Brand', version: '24' } -]; - -const __chzzkBypassFullVersionList = [ - { brand: 'Chromium', version: '122.0.0.0' }, - { brand: 'Google Chrome', version: '122.0.0.0' }, - { brand: 'Not-A.Brand', version: '24.0.0.0' } -]; - -const __chzzkBypassHighEntropy = { - brands: __chzzkBypassBrands, - mobile: false, - platform: 'macOS', - platformVersion: '10.15.7', - architecture: 'x86', - bitness: '64', - model: '', - uaFullVersion: '122.0.0.0', - fullVersionList: __chzzkBypassFullVersionList, - wow64: false, - formFactors: [] -}; - -const __chzzkBypassUAData = { - brands: __chzzkBypassBrands, - mobile: false, - platform: 'macOS', - getHighEntropyValues: function (hints) { - // 항상 brands / mobile / platform 은 포함하고, 요청된 hints 만 추가로 채운다. - const out = { - brands: __chzzkBypassBrands, - mobile: false, - platform: 'macOS' - }; - if (Array.isArray(hints)) { - for (const h of hints) { - if (Object.prototype.hasOwnProperty.call(__chzzkBypassHighEntropy, h)) { - out[h] = __chzzkBypassHighEntropy[h]; - } - } - } - return Promise.resolve(out); - }, - toJSON: function () { - return { - brands: __chzzkBypassBrands, - mobile: false, - platform: 'macOS' - }; - } -}; - -Object.defineProperty(navigator, 'userAgentData', { - get: function () { - return __chzzkBypassUAData; - } -}); diff --git a/manifest.json b/manifest.json index 5970822..9eb309e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,8 @@ { "name": "Chzzk Bypass", - "version": "1.2.1", + "version": "1.2.2", "manifest_version": 3, - "description": "치지직(CHZZK) 시청 환경 개선: Mac 위장으로 그리드 없이 1080p 시청.", + "description": "치지직(CHZZK) 우회 기능은 비정상 접근 팝업 위험으로 인해 중단되었습니다. 확장은 더 이상 페이지에 개입하지 않습니다.", "icons": { "16": "icons/icon16.png", "48": "icons/icon48.png", @@ -10,36 +10,6 @@ }, "action": { "default_popup": "popup.html", - "default_title": "Chzzk Bypass Status" - }, - "permissions": [ - "declarativeNetRequest", - "declarativeNetRequestWithHostAccess" - ], - "host_permissions": [ - "*://*.naver.com/*", - "*://*.ncloud.com/*", - "*://*.pstatic.net/*" - ], - "declarative_net_request": { - "rule_resources": [ - { - "id": "rules", - "enabled": true, - "path": "rules.json" - } - ] - }, - "content_scripts": [ - { - "matches": [ - "*://chzzk.naver.com/*" - ], - "js": [ - "content.js" - ], - "run_at": "document_start", - "world": "MAIN" - } - ] + "default_title": "Chzzk Bypass (비활성)" + } } diff --git a/popup.html b/popup.html index ab58e47..a9d6479 100644 --- a/popup.html +++ b/popup.html @@ -1,32 +1,32 @@ - - - - - - - -
-
-

Chzzk Bypass

- 작동 중 -
-
-

치지직 시청 환경을 개선합니다.

-
-
- 대상 사이트 - chzzk.naver.com -
-
- 그리드 우회 - Mac 위장 (1080p) -
-
-
- -
- - - \ No newline at end of file + + + + + + + +
+
+

Chzzk Bypass

+ 비활성 +
+
+

우회 기능은 중단되었습니다.

+
+
+ 상태 + 페이지에 개입하지 않음 +
+
+ 사유 + 치지직 비정상 접근 팝업 위험 +
+
+
+ +
+ + + diff --git a/popup.js b/popup.js index e48a1c8..5085174 100644 --- a/popup.js +++ b/popup.js @@ -1,5 +1,2 @@ -// 팝업이 로드될 때 실행됩니다. -document.addEventListener('DOMContentLoaded', function () { - console.log("Chzzk Bypass 팝업 UI 로드 완료"); - // 향후 우회 On/Off 토글 버튼 등을 구현할 공간입니다. -}); \ No newline at end of file +// 팝업 UI 로드만 처리합니다. 페이지 개입 기능은 1.2.2 에서 제거되었습니다. +document.addEventListener('DOMContentLoaded', function () {}); diff --git a/rules.json b/rules.json deleted file mode 100644 index 86da734..0000000 --- a/rules.json +++ /dev/null @@ -1,46 +0,0 @@ -[ - { - "id": 1, - "priority": 1, - "action": { - "type": "modifyHeaders", - "requestHeaders": [ - { - "header": "User-Agent", - "operation": "set", - "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" - }, - { - "header": "sec-ch-ua", - "operation": "set", - "value": "\"Chromium\";v=\"122\", \"Google Chrome\";v=\"122\", \"Not-A.Brand\";v=\"24\"" - }, - { - "header": "sec-ch-ua-mobile", - "operation": "set", - "value": "?0" - }, - { - "header": "sec-ch-ua-platform", - "operation": "set", - "value": "\"macOS\"" - } - ] - }, - "condition": { - "resourceTypes": [ - "main_frame", - "sub_frame", - "xmlhttprequest", - "script", - "stylesheet", - "image", - "media", - "font", - "websocket", - "ping", - "other" - ] - } - } -]