Bastardized extension, but might work better on some sites

This commit is contained in:
Satsuoni 2021-08-02 20:32:56 +09:00
parent 8423929019
commit 4ceaf59db2
7 changed files with 150 additions and 83 deletions

View File

@ -0,0 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script type="module" src="background.js"></script>
</head>
</html>

96
background/background.js Normal file
View File

@ -0,0 +1,96 @@
import WasmDsp from "../wasm/wasm_gsr.js";
var Wdsp=null;
var _freeStr, stringToUTF8, writeArrayToMemory, UTF8ToString, stackSave, stackRestore, stackAlloc;
function getCFunc(ident) {
return Wdsp[`_${ident}`]; // closure exported function
}
function scall (ident, returnType, argTypes, args, opts) {
const toC = {
string (str) {
let ret = 0;
if (str !== null && str !== undefined && str !== 0) {
const len = (str.length << 2) + 1;
ret = stackAlloc(len);
stringToUTF8(str, ret, len);
}
return ret;
},
array (arr) {
const ret = stackAlloc(arr.length);
writeArrayToMemory(arr, ret);
return ret;
}
};
function convertReturnValue (ret) {
if (returnType === 'string') return UTF8ToString(ret);
if (returnType === 'boolean') return Boolean(ret);
return ret;
}
const func = getCFunc(ident);
const cArgs = [];
let stack = 0;
if (args) {
for (let i = 0; i < args.length; i++) {
const converter = toC[argTypes[i]];
if (converter) {
if (stack === 0) stack = stackSave();
cArgs[i] = converter(args[i]);
} else {
cArgs[i] = args[i];
}
}
}
const _ret = func.apply(null, cArgs);
const ret = convertReturnValue(_ret);
_freeStr(_ret);
if (stack !== 0) stackRestore(stack);
return ret;
}
function swrap (ident, returnType, argTypes, opts) {
argTypes = argTypes || [];
const numericArgs = argTypes.every((type) => type === 'number');
const numericRet = returnType !== 'string';
if (numericRet && numericArgs && !opts) {
return getCFunc(ident);
}
return function () {
return scall(ident, returnType, argTypes, arguments, opts);
};
}
async function init() {
Wdsp=await WasmDsp();
await Wdsp.ready;
_freeStr=Wdsp._freeStr;
stringToUTF8=Wdsp.stringToUTF8;
writeArrayToMemory=Wdsp.writeArrayToMemory;
UTF8ToString=Wdsp.UTF8ToString;
stackSave=Wdsp.stackSave;
stackRestore=Wdsp.stackRestore;
stackAlloc=Wdsp.stackAlloc;
chrome.runtime.onMessage.addListener(onRuntimeMessage);
}
function decode(val,sendResponse)
{
var tryUsingDecoder = swrap('tryUsingDecoder', 'string', ['string']);
var res=tryUsingDecoder(val);
sendResponse({value:res});
}
function onRuntimeMessage(message, _sender, sendResponse) {
if (message.name !== "dec") return;
if(!message.value) return;
if(Wdsp==null)
{
init().then(()=>{decode(message.value,sendResponse)});
}
else
{
decode(message.value,sendResponse);
}
}
init();

View File

@ -1 +1 @@
emcc wasm_src/allocate.cpp wasm_src/misc.cpp wasm_src/integer.cpp wasm_src/algebra.cpp wasm_src/codelift.cpp -Os -s TOTAL_MEMORY=18743296 -Wno-implicitly-unsigned-literal -I "./wasm_src" -s WASM=1 -s LLD_REPORT_UNDEFINED -s "MODULARIZE=1" -s "EXPORT_NAME='WasmDsp'" -s "BINARYEN_METHOD='native-wasm'" -s "EXPORTED_FUNCTIONS=['_freeStr','_tryUsingDecoder']" -s "EXPORTED_RUNTIME_METHODS=['stringToUTF8','UTF8ToString','stackSave','writeArrayToMemory','stackAlloc','stackRestore']" -o wasm/wasm_gsr.js
emcc wasm_src/allocate.cpp wasm_src/misc.cpp wasm_src/integer.cpp wasm_src/algebra.cpp wasm_src/codelift.cpp -Os -s TOTAL_MEMORY=18743296 -Wno-implicitly-unsigned-literal -I "./wasm_src" -s WASM=1 -s LLD_REPORT_UNDEFINED -s EXPORT_ES6=1 -s "MODULARIZE=1" -s "EXPORT_NAME='WasmDsp'" -s "BINARYEN_METHOD='native-wasm'" -s DYNAMIC_EXECUTION=0 -s "EXPORTED_FUNCTIONS=['_freeStr','_tryUsingDecoder']" -s "EXPORTED_RUNTIME_METHODS=['stringToUTF8','UTF8ToString','stackSave','writeArrayToMemory','stackAlloc','stackRestore']" -o wasm/wasm_gsr.js

View File

@ -4,7 +4,6 @@ This is where the magic happens
var WidevineCrypto = {};
var _freeStr, stringToUTF8, writeArrayToMemory, UTF8ToString, stackSave, stackRestore, stackAlloc;
// Convert a hex string to a byte array
@ -24,6 +23,19 @@ function bytesToHex(bytes) {
return hex.join("");
}
function sendMessagePromise( item) {
return new Promise((resolve, reject) => {
var event = new CustomEvent("PassToBackground", {detail: item});
window.dispatchEvent(event);
window.addEventListener("BackgroundReply", function(evt) {
if(evt.detail.value) {
resolve(evt.detail.value);
} else {
reject('Something wrong');
}
},{once:true});
});
}
(async function() {
@ -69,76 +81,24 @@ WidevineCrypto.log=function() {
}
}
WidevineCrypto.Module= await WasmDsp();
await WidevineCrypto.Module.ready;
_freeStr=WidevineCrypto.Module._freeStr;
stringToUTF8=WidevineCrypto.Module.stringToUTF8;
writeArrayToMemory=WidevineCrypto.Module.writeArrayToMemory;
UTF8ToString=WidevineCrypto.Module.UTF8ToString;
stackSave=WidevineCrypto.Module.stackSave;
stackRestore=WidevineCrypto.Module.stackRestore;
stackAlloc=WidevineCrypto.Module.stackAlloc;
WidevineCrypto.getCFunc = function (ident) {
return this.Module[`_${ident}`]; // closure exported function
}
WidevineCrypto.scall = function (ident, returnType, argTypes, args, opts) {
const toC = {
string (str) {
let ret = 0;
if (str !== null && str !== undefined && str !== 0) {
const len = (str.length << 2) + 1;
ret = stackAlloc(len);
stringToUTF8(str, ret, len);
}
return ret;
},
array (arr) {
const ret = stackAlloc(arr.length);
writeArrayToMemory(arr, ret);
return ret;
}
};
function convertReturnValue (ret) {
if (returnType === 'string') return UTF8ToString(ret);
if (returnType === 'boolean') return Boolean(ret);
return ret;
}
const func = this.getCFunc(ident);
const cArgs = [];
let stack = 0;
if (args) {
for (let i = 0; i < args.length; i++) {
const converter = toC[argTypes[i]];
if (converter) {
if (stack === 0) stack = stackSave();
cArgs[i] = converter(args[i]);
} else {
cArgs[i] = args[i];
}
}
}
const _ret = func.apply(null, cArgs);
const ret = convertReturnValue(_ret);
_freeStr(_ret);
if (stack !== 0) stackRestore(stack);
return ret;
}
WidevineCrypto.swrap=function (ident, returnType, argTypes, opts) {
argTypes = argTypes || [];
const numericArgs = argTypes.every((type) => type === 'number');
const numericRet = returnType !== 'string';
if (numericRet && numericArgs && !opts) {
return this.getCFunc(ident);
}
return function () {
return this.scall(ident, returnType, argTypes, arguments, opts);
};
}
WidevineCrypto.tryUsingDecoder = WidevineCrypto.swrap('tryUsingDecoder', 'string', ['string']);
//WidevineCrypto.Module= await WasmDsp();
//await WidevineCrypto.Module.ready;
//_freeStr=WidevineCrypto.Module._freeStr;
//stringToUTF8=WidevineCrypto.Module.stringToUTF8;
//writeArrayToMemory=WidevineCrypto.Module.writeArrayToMemory;
//UTF8ToString=WidevineCrypto.Module.UTF8ToString;
//stackSave=WidevineCrypto.Module.stackSave;
//stackRestore=WidevineCrypto.Module.stackRestore;
//stackAlloc=WidevineCrypto.Module.stackAlloc;
//WidevineCrypto.tryUsingDecoder = WidevineCrypto.swrap('tryUsingDecoder', 'string', ['string']);
WidevineCrypto.tryUsingDecoder = async function (data)
{
var res=await sendMessagePromise({name:"dec",value:data});
return res;
}
WidevineCrypto.chromeRSAPublicKey =
`-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvKg9eT9JPEnfVYYS50x3
@ -166,7 +126,7 @@ WidevineCrypto.tryDecodingKey=async function(encKey)
{
let hex=bytesToHex(encKey);
let res=this.tryUsingDecoder(hex);
let res=await this.tryUsingDecoder(hex);
this.log(hex);
this.log("Output");

View File

@ -1,11 +1,16 @@
var Cryplo = {};
window.addEventListener("PassToBackground", function(evt) {
chrome.runtime.sendMessage(evt.detail,response => {
var event = new CustomEvent("BackgroundReply", {detail: response});
window.dispatchEvent(event);});
}, false);
injectScripts();
async function injectScripts()
{
await injectScript('lib/pbf.3.0.5.min.js');
await injectScript('lib/cryptojs-aes_0.2.0.min.js');
await injectScript('protobuf-generated/license_protocol.proto.js');
await injectScript('wasm/wasm_gsr.js');
// await injectScript('wasm/wasm_gsr.js');
await injectScript('content_key_decryption.js');
await injectScript('eme_interception.js');
}

View File

@ -6,15 +6,19 @@
"version": "1.0.0",
"permissions":
[
"webRequest"
],
"icons":
{
},
"background": {
"page": "background/background.html"
},
"browser_action": {
},
"content_scripts":
[
{

File diff suppressed because one or more lines are too long