Backup
This commit is contained in:
parent
b4de9c6d61
commit
046d64bbc5
@ -27,6 +27,11 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||
console.log("Storing Decryption Keys:", data);
|
||||
chrome.storage.local.set({ latestKeys: data });
|
||||
break;
|
||||
|
||||
case "LICENSE_URL":
|
||||
console.log("Storling License URL " + data);
|
||||
chrome.storage.local.set({licenseURL: data});
|
||||
break;
|
||||
|
||||
default:
|
||||
console.warn("Unknown message type received:", type);
|
||||
|
20
content.js
20
content.js
@ -1,24 +1,18 @@
|
||||
// Inject `inject.js` into the page context
|
||||
(function injectScript() {
|
||||
function append() {
|
||||
const container = document.head || document.documentElement;
|
||||
if (!container) {
|
||||
return requestAnimationFrame(append); // Wait for DOM to exist
|
||||
}
|
||||
const script = document.createElement('script');
|
||||
script.src = chrome.runtime.getURL('inject.js');
|
||||
script.type = 'text/javascript';
|
||||
script.onload = () => script.remove(); // Clean up after injecting
|
||||
container.appendChild(script);
|
||||
}
|
||||
append();
|
||||
const script = document.createElement('script');
|
||||
script.src = chrome.runtime.getURL('inject.js');
|
||||
script.type = 'text/javascript';
|
||||
script.onload = () => script.remove(); // Clean up
|
||||
// Inject directly into <html> or <head>
|
||||
(document.documentElement || document.head || document.body).appendChild(script);
|
||||
})();
|
||||
|
||||
// Listen for messages from the injected script
|
||||
window.addEventListener("message", function(event) {
|
||||
if (event.source !== window) return;
|
||||
|
||||
if (["__DRM_TYPE__", "__PSSH_DATA__", "__KEYS_DATA__"].includes(event.data?.type)) {
|
||||
if (["__DRM_TYPE__", "__PSSH_DATA__", "__KEYS_DATA__", "__LICENSE_URL__"].includes(event.data?.type)) {
|
||||
chrome.runtime.sendMessage({
|
||||
type: event.data.type.replace("__", "").replace("__", ""),
|
||||
data: event.data.data
|
||||
|
52
frontend/dist/assets/index-BFZJq4X0.js
vendored
52
frontend/dist/assets/index-BFZJq4X0.js
vendored
File diff suppressed because one or more lines are too long
24
frontend/dist/index.html
vendored
24
frontend/dist/index.html
vendored
@ -1,13 +1,13 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>CDRM Decryption Extension</title>
|
||||
<script type="module" crossorigin src="./assets/index-CN3ssfBX.js"></script>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>CDRM Decryption Extension</title>
|
||||
<script type="module" crossorigin src="./assets/index-TiKBTYa_.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-UaipKa9p.css">
|
||||
</head>
|
||||
<body class="min-w-full min-h-full w-full h-full">
|
||||
<div class="min-w-full min-h-full w-full h-full" id="root"></div>
|
||||
</body>
|
||||
</html>
|
||||
</head>
|
||||
<body class="min-w-full min-h-full w-full h-full">
|
||||
<div class="min-w-full min-h-full w-full h-full" id="root"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -4,16 +4,21 @@ function Results() {
|
||||
const [drmType, setDrmType] = useState("");
|
||||
const [pssh, setPssh] = useState("");
|
||||
const [licenseUrl, setLicenseUrl] = useState("");
|
||||
const [keys, setKeys] = useState("");
|
||||
const [keys, setKeys] = useState([]);
|
||||
|
||||
useEffect(() => {
|
||||
chrome.storage.local.get(
|
||||
["drmType", "latestPSSH", "latestLicenseRequest", "latestKeys"],
|
||||
[
|
||||
"drmType",
|
||||
"latestPSSH",
|
||||
"latestLicenseRequest",
|
||||
"latestKeys",
|
||||
"licenseURL",
|
||||
],
|
||||
(result) => {
|
||||
if (result.drmType) setDrmType(result.drmType);
|
||||
if (result.latestPSSH) setPssh(result.latestPSSH);
|
||||
if (result.latestLicenseRequest?.url)
|
||||
setLicenseUrl(result.latestLicenseRequest.url);
|
||||
if (result.licenseURL) setLicenseUrl(result.licenseURL);
|
||||
if (result.latestKeys) {
|
||||
try {
|
||||
const parsed = Array.isArray(result.latestKeys)
|
||||
@ -36,8 +41,8 @@ function Results() {
|
||||
if (changes.latestPSSH) {
|
||||
setPssh(changes.latestPSSH.newValue);
|
||||
}
|
||||
if (changes.latestLicenseRequest) {
|
||||
setLicenseUrl(changes.latestLicenseRequest.newValue.url);
|
||||
if (changes.licenseURL) {
|
||||
setLicenseUrl(changes.licenseURL.newValue);
|
||||
}
|
||||
if (changes.latestKeys) {
|
||||
setKeys(changes.latestKeys.newValue);
|
||||
@ -54,7 +59,7 @@ function Results() {
|
||||
chrome.storage.local.set({
|
||||
drmType: "None",
|
||||
latestPSSH: "None",
|
||||
latestLicenseRequest: { url: "None" },
|
||||
licenseURL: "None",
|
||||
latestKeys: [],
|
||||
});
|
||||
|
||||
|
36
inject.js
36
inject.js
@ -307,11 +307,11 @@ const u8ToHexStr = bytes =>
|
||||
const b64ToHexStr = b64 =>
|
||||
[...atob(b64)].map(c => c.charCodeAt(0).toString(16).padStart(2, '0')).join``;
|
||||
|
||||
function jsonContainsValue(obj, target) {
|
||||
if (typeof obj === "string") return obj === target;
|
||||
if (Array.isArray(obj)) return obj.some(val => jsonContainsValue(val, target));
|
||||
function jsonContainsValue(obj, prefix = "CAES") {
|
||||
if (typeof obj === "string") return obj.startsWith(prefix);
|
||||
if (Array.isArray(obj)) return obj.some(val => jsonContainsValue(val, prefix));
|
||||
if (typeof obj === "object" && obj !== null) {
|
||||
return Object.values(obj).some(val => jsonContainsValue(val, target));
|
||||
return Object.values(obj).some(val => jsonContainsValue(val, prefix));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -418,7 +418,7 @@ MediaKeySession.prototype.generateRequest = function(initDataType, initData) {
|
||||
console.log("[PlayReady PSSH found] " + playReadyPssh)
|
||||
}
|
||||
let wideVinePssh = getWidevinePssh(initData)
|
||||
if (wideVinePssh && !playReadyPssh && drmOverride !== "PLAYREADY") {
|
||||
if (wideVinePssh && drmOverride !== "PLAYREADY") {
|
||||
// Widevine code
|
||||
drmType = "Widevine";
|
||||
window.postMessage({ type: "__DRM_TYPE__", data: "Widevine" }, "*");
|
||||
@ -489,7 +489,6 @@ MediaKeySession.prototype.generateRequest = function(initDataType, initData) {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Message update interceptors
|
||||
const originalUpdate = MediaKeySession.prototype.update;
|
||||
MediaKeySession.prototype.update = function(response) {
|
||||
@ -509,7 +508,7 @@ MediaKeySession.prototype.update = function(response) {
|
||||
licenseResponseCounter++;
|
||||
}
|
||||
const updatePromise = originalUpdate.call(this, response);
|
||||
if (!pssh && interceptType !== "DISABLED") {
|
||||
if (!pssh && (drmOverride !== "WIDEVINE" && drmOverride !== "PLAYREADY")) {
|
||||
updatePromise
|
||||
.then(() => {
|
||||
let clearKeys = getClearkey(response);
|
||||
@ -543,9 +542,17 @@ MediaKeySession.prototype.update = function(response) {
|
||||
const method = (config.method || 'GET').toUpperCase();
|
||||
|
||||
if (method === 'POST') {
|
||||
console.log('Intercepted POST fetch request:');
|
||||
console.log('URL:', resource);
|
||||
console.log('Options:', config);
|
||||
if (config.body) {
|
||||
if (config.body instanceof ArrayBuffer || body instanceof Uint8Array) {
|
||||
const buffer = body instanceof Uint8Array ? body : new Uint8Array(body);
|
||||
const base64Body = window.btoa(String.fromCharCode(...buffer));
|
||||
if (base64Body.startsWith("CAES") && base64Body !== remoteCDM.challenge && interceptType === "EME") {
|
||||
foundChallengeInBody = true;
|
||||
window.postMessage({ type: "__LICENSE_URL__", data: this._url }, "*");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return originalFetch(resource, config);
|
||||
@ -571,16 +578,25 @@ MediaKeySession.prototype.update = function(response) {
|
||||
const base64Body = window.btoa(String.fromCharCode(...buffer));
|
||||
if (base64Body.startsWith("CAES") && base64Body !== remoteCDM.challenge && interceptType === "EME") {
|
||||
foundChallengeInBody = true;
|
||||
window.postMessage({ type: "__LICENSE_URL__", data: this._url }, "*");
|
||||
// Block the request
|
||||
return;
|
||||
}
|
||||
if (base64Body.startsWith("CAES") && interceptType == "LICENSE") {
|
||||
foundChallengeInBody = true;
|
||||
window.postMessage({ type: "__LICENSE_URL__", data: this._url }, "*");
|
||||
remoteCDM.getChallenge(pssh)
|
||||
const injectedBody = base64ToUint8Array(remoteCDM.challenge);
|
||||
return originalSend.call(this, injectedBody);
|
||||
}
|
||||
}
|
||||
if (isJson(body)) {
|
||||
if (jsonContainsValue(body) && !jsonContainsValue(body, remoteCDM.challenge)) {
|
||||
foundChallengeInBody = true;
|
||||
window.postMessage({ type: "__LICENSE_URL__", data: this._url }, "*");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return originalSend.apply(this, arguments);
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,13 +1,13 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>CDRM Decryption Extension</title>
|
||||
<script type="module" crossorigin src="./assets/index-CN3ssfBX.js"></script>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>CDRM Decryption Extension</title>
|
||||
<script type="module" crossorigin src="./assets/index-TiKBTYa_.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-UaipKa9p.css">
|
||||
</head>
|
||||
<body class="min-w-full min-h-full w-full h-full">
|
||||
<div class="min-w-full min-h-full w-full h-full" id="root"></div>
|
||||
</body>
|
||||
</html>
|
||||
</head>
|
||||
<body class="min-w-full min-h-full w-full h-full">
|
||||
<div class="min-w-full min-h-full w-full h-full" id="root"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
x
Reference in New Issue
Block a user