From c2dfbd5d2f90c01dbc896a52d54d3e082fb4c7a3 Mon Sep 17 00:00:00 2001 From: FoxRefire <155989196+FoxRefire@users.noreply.github.com> Date: Sun, 25 Aug 2024 12:02:58 +0900 Subject: [PATCH] Heuristic scheme #Not enabled by default, see commit note This is not enabled by default. If you wish to use it, add following snippet to popup.html. ``` ``` --- python/schemes/Heuristic.py | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 python/schemes/Heuristic.py diff --git a/python/schemes/Heuristic.py b/python/schemes/Heuristic.py new file mode 100644 index 0000000..af0c906 --- /dev/null +++ b/python/schemes/Heuristic.py @@ -0,0 +1,59 @@ +import re +def replaceRequest(payload): + challengeB64 = base64.b64encode(challenge).decode() + challengeArr = str(list(challenge)) + + # Trying decode payload, challenge might be raw bytes if it failed + try: + decodedPayload = payload.decode() + except: + return challenge + + # Challenge might be JSON/XML stored B64-encoded string + replaced = decodedPayload.replace(r"(?<=(\"|\'|>))CAES.*?(?=(\"|\'|<))", challengeB64).replace(r"(?<=(\"|\'|>))CAQ=(?=(\"|\'|<))", challengeB64) + if(decodedPayload != replaced): + return replaced + + # Challenge might be raw B64-encoded string + replaced = decodedPayload.replace(r"^CAES.*?=$", challengeB64).replace(r"^CAQ=$", challengeB64) + if(decodedPayload != replaced): + return replaced + + # Challenge might be Uint8Array + replaced = decodedPayload.replace(r"\[0?8 ?, ?0?1 ?, ?[0-9 ,]*?\]", challengeArr).replace(r"\[0?8 ?, ?0?4]", challengeArr) + if(decodedPayload != replaced): + return replaced + + +def findLicense(response): + # Trying decode response, license might be raw bytes if it failed + try: + decodedResponse = response.decode() + except: + return response + + # License might be JSON/XML stored B64-encoded string + try: + return re.search(r"(?<=(\"|\'|>))CAIS.*?(?=(\"|\'|<))", decodedResponse).group() + except: + pass + + # License might be raw B64-encoded string + try: + return re.search(r"^CAIS.*?=$", decodedResponse).group() + except: + pass + + # License might be Uint8Array + try: + foundStr = re.search(r"\[0?8 ?, ?0?2 ?, ?[0-9 ,]*?\]", decodedResponse).group() + return bytes(json.loads(foundStr)) + except: + pass + + +payload = loadBody("blob") +payload = replaceRequest(payload) + +response = await corsFetch(licUrl, "POST", licHeaders, payload, "blob") +licence = findLicense(response)