Rollback
This commit is contained in:
		
							parent
							
								
									31fd877bd9
								
							
						
					
					
						commit
						75b5d6e8ef
					
				
							
								
								
									
										108
									
								
								inject.js
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								inject.js
									
									
									
									
									
								
							@ -1,16 +1,7 @@
 | 
			
		||||
let widevineDeviceInfo = null;
 | 
			
		||||
let playreadyDeviceInfo = null;
 | 
			
		||||
let originalChallenge = null
 | 
			
		||||
let serviceCertFound = false;
 | 
			
		||||
let drmType = "NONE";
 | 
			
		||||
let psshFound = false;
 | 
			
		||||
let pssh = null;
 | 
			
		||||
let drmOverride = "DISABLED";
 | 
			
		||||
let interceptType = "DISABLED";
 | 
			
		||||
let remoteCDM = null;
 | 
			
		||||
let generateRequestCalled = false;
 | 
			
		||||
let remoteListenerMounted = false;
 | 
			
		||||
let injectionSuccess = false;
 | 
			
		||||
 | 
			
		||||
// Post message to content.js to get DRM override
 | 
			
		||||
window.postMessage({ type: "__GET_DRM_OVERRIDE__" }, "*");
 | 
			
		||||
@ -102,7 +93,7 @@ class remotePlayReadyCDM {
 | 
			
		||||
        });
 | 
			
		||||
        const jsonData = await response.json();
 | 
			
		||||
        if (response.ok && jsonData.data?.challenge) {
 | 
			
		||||
            this.challenge = jsonData.data.challenge;
 | 
			
		||||
            this.challenge = btoa(jsonData.data.challenge);
 | 
			
		||||
            console.log("PlayReady challenge received:", this.challenge);
 | 
			
		||||
        } else {
 | 
			
		||||
            console.error("Failed to get PlayReady challenge:", jsonData.message);
 | 
			
		||||
@ -111,7 +102,7 @@ class remotePlayReadyCDM {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Parse PlayReady license response
 | 
			
		||||
    async parseLicenseResponse(license_message) {
 | 
			
		||||
    async parseLicense(license_message) {
 | 
			
		||||
        const url = `${this.host}/remotecdm/playready/${this.device_name}/parse_license`;
 | 
			
		||||
        const body = {
 | 
			
		||||
            session_id: this.session_id,
 | 
			
		||||
@ -194,14 +185,12 @@ class remoteWidevineCDM {
 | 
			
		||||
    // Open Widevine session
 | 
			
		||||
    async openSession () {
 | 
			
		||||
        const url = `${this.host}/remotecdm/widevine/${this.device_name}/open`;
 | 
			
		||||
        const response = await fetch(url, {
 | 
			
		||||
            method: 'GET',
 | 
			
		||||
            headers: {
 | 
			
		||||
                'Content-Type': 'application/json',
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        const jsonData = await response.json();
 | 
			
		||||
        if (response.ok && jsonData.data?.session_id) {
 | 
			
		||||
        const xhr = new XMLHttpRequest();
 | 
			
		||||
        xhr.open('GET', url, false);
 | 
			
		||||
        xhr.setRequestHeader('Content-Type', 'application/json');
 | 
			
		||||
        xhr.send();
 | 
			
		||||
        const jsonData = JSON.parse(xhr.responseText);
 | 
			
		||||
        if (jsonData.data?.session_id) {
 | 
			
		||||
            this.session_id = jsonData.data.session_id;
 | 
			
		||||
            console.log("Widevine session opened:", this.session_id);
 | 
			
		||||
        } else {
 | 
			
		||||
@ -426,83 +415,4 @@ function arrayBufferToBase64(uint8array) {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return window.btoa(binary);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const generateRequestFunction = MediaKeySession.prototype.generateRequest;
 | 
			
		||||
 | 
			
		||||
MediaKeySession.prototype.generateRequest = async function(initDataType, initData) {
 | 
			
		||||
    if (!generateRequestCalled) {
 | 
			
		||||
        generateRequestCalled = true;
 | 
			
		||||
        const session = this;
 | 
			
		||||
        let playReadyPssh = getPlayReadyPssh(initData);
 | 
			
		||||
        if (playReadyPssh) {
 | 
			
		||||
            // PlayReady Code
 | 
			
		||||
            drmType = "PlayReady";
 | 
			
		||||
            window.postMessage({ type: "__DRM_TYPE__", data: "PlayReady" }, "*");
 | 
			
		||||
            console.log("[DRM Detected] PlayReady");
 | 
			
		||||
            pssh = playReadyPssh;
 | 
			
		||||
            window.postMessage({ type: "__PSSH_DATA__", data: playReadyPssh }, "*");
 | 
			
		||||
            console.log("[PlayReady PSSH found] " + playReadyPssh)
 | 
			
		||||
        }
 | 
			
		||||
        let wideVinePssh = getWidevinePssh(initData)
 | 
			
		||||
        if (wideVinePssh) {
 | 
			
		||||
            // Widevine code
 | 
			
		||||
            drmType = "Widevine";
 | 
			
		||||
            window.postMessage({ type: "__DRM_TYPE__", data: "Widevine" }, "*");
 | 
			
		||||
            console.log("[DRM Detected] Widevine");
 | 
			
		||||
            pssh = wideVinePssh;
 | 
			
		||||
            window.postMessage({ type: "__PSSH_DATA__", data: wideVinePssh }, "*");
 | 
			
		||||
            console.log("[Widevine PSSH found] " + wideVinePssh)
 | 
			
		||||
        }
 | 
			
		||||
        if (!remoteListenerMounted) {
 | 
			
		||||
            remoteListenerMounted = true;
 | 
			
		||||
            session.addEventListener("message", async function messageInterceptor(event) {
 | 
			
		||||
                event.stopImmediatePropagation();
 | 
			
		||||
                const uint8Array = new Uint8Array(event.message);
 | 
			
		||||
                const base64challenge = arrayBufferToBase64(uint8Array);
 | 
			
		||||
                if (base64challenge === "CAQ=") {
 | 
			
		||||
                    const {
 | 
			
		||||
                        device_type, system_id, security_level, host, secret, device_name
 | 
			
		||||
                    } = widevineDeviceInfo;
 | 
			
		||||
                    remoteCDM = new remoteWidevineCDM(device_type, system_id, security_level, host, secret, device_name);
 | 
			
		||||
                    await remoteCDM.openSession();
 | 
			
		||||
                }
 | 
			
		||||
                if (base64challenge.startsWith("CAES") && !injectionSuccess) {
 | 
			
		||||
                    if (interceptType === "EME") {
 | 
			
		||||
                        injectionSuccess = true;
 | 
			
		||||
                    }
 | 
			
		||||
                    originalChallenge = base64challenge;
 | 
			
		||||
                    if (!remoteCDM) {
 | 
			
		||||
                        const {
 | 
			
		||||
                            device_type, system_id, security_level, host, secret, device_name
 | 
			
		||||
                        } = widevineDeviceInfo;
 | 
			
		||||
                        remoteCDM = new remoteWidevineCDM(device_type, system_id, security_level, host, secret, device_name);
 | 
			
		||||
                        await remoteCDM.openSession();
 | 
			
		||||
                    }
 | 
			
		||||
                    await remoteCDM.getChallenge(pssh);
 | 
			
		||||
                    if (interceptType === "EME") {
 | 
			
		||||
                        const uint8challenge = base64ToUint8Array(remoteCDM.challenge);
 | 
			
		||||
                        const challengeBuffer = uint8challenge.buffer;
 | 
			
		||||
                        const syntheticEvent = new MessageEvent("message", {
 | 
			
		||||
                            data: event.data,
 | 
			
		||||
                            origin: event.origin,
 | 
			
		||||
                            lastEventId: event.lastEventId,
 | 
			
		||||
                            source: event.source,
 | 
			
		||||
                            ports: event.ports
 | 
			
		||||
                        });
 | 
			
		||||
                        Object.defineProperty(syntheticEvent, "message", {
 | 
			
		||||
                            get: () => challengeBuffer
 | 
			
		||||
                        });
 | 
			
		||||
                        session.dispatchEvent(syntheticEvent);
 | 
			
		||||
                        console.log("Intercepted EME Challenge and injected custom one.")
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (injectionSuccess) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            console.log("Message interceptor mounted.");
 | 
			
		||||
        }
 | 
			
		||||
    return generateRequestFunction.call(session, initDataType, initData);
 | 
			
		||||
    }}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user