widevine-l3-guesser/log_parsing/prfnd.py

122 lines
3.5 KiB
Python

# use on the appropriate log file produced by ghidra
import sys
fl=sys.argv[1]
def modInverse(a, m):
m0 = m
y = 0
x = 1
if (m == 1):
return 0
while (a > 1):
q = a // m
t = m
m = a % m
a = t
t = y
y = x - q * y
x = t
if (x < 0):
x = x + m0
return x
n=0xBCA83D793F493C49DF558612E74C773198AB4901F20369BFAF1598D71E362EF13AB9BE3B4D4D73C63378542D23BEBA56AD4D589C1E7F151E25CF6F7A38F8FF1FF491D5D2DFC971617B6D9559406E3A5127B2AEBDDEA965E0DFCF4C50AE241CAF9E87BFE33B0DB619B5C395E3986E310A3278F990B4139A421AF74B3E4E1548250DEC8F1755B038E61069E2547983ED93878549B4A9F5FAA1BEF72A75A9929FA7240FB1E46B9587170EF993C29C35F1F145E55BFEC0DE85D2B9409D6599B1C348BF76DD441ABD53033475E3267F91647C2584D974D3AD7B8C0C33711556D6C2CF23BF7905B17A68C622A0580A623C1AF9F446294D5F2DE50721D85EB5F49B7013
rt=0x79bad423a3b14693488f32a3f32ca9cf96dbdfc5b45c7d4bba04af8958f008e3b7468b33f0f868eccc0b5b0fac5c60d131c2491b43dda75af695cfc303086204cb656f24b02024adef05c5e3be2f4918b67f7c75d3b9150b78ba70f4785515bd64e2905517559033e69a4a36501604c371a37137f56d64444b269538b87152169bf581d560bab993e4a6010f39f41fc97396f57eaecef874a469d5159ab5a71f6c9c5e1e4e7e5de2a7436604f47c695572b7b8916116044ba223c95eccaad9c3747dcdc56e966b1978a17282d9911d9bf314f1ef52971d4c4f59c1fcde5c4deeeb8ce02816aa24b79091d81e70c11c3f12dafad70b74eee3aa4a902a2d76b2bc
r=(1<<2048)
ri=modInverse(r,n)
rii=modInverse(ri,n)
accs=["Collected as HasMulAdd ,a : ",
"Collected as SubN ,a : ",
"Collected as Plus ,b : " ,
"Collected as Plum? ,b : ",
"Collected as Plum res ,b : ",
"Collected as Plus ,a : ",
"Collected as YetAnother ,a : ",
"Collected as MbSubtr ,a : ",
"Collected as Upper ,a : ",
"Collected as MbSubtr ,b : ",
"Grabbed "
]
priors=[]
mults={}
pluses={}
minuses={}
sqms={}
sqms2={}
relations={}
def checkPriorRelation(nm):
global priors
if nm in priors: return
rel=False
if nm in mults:
relations[nm]=["mul",mults[nm]]
del mults[nm]
rel=True
if nm in pluses and not rel:
print("Sum")
relations[nm]=["sum",pluses[nm]]
del pluses[nm]
rel=True
if nm in minuses and not rel:
print("Neg")
relations[nm]=["neg",minuses[nm]]
del minuses[nm]
rel=True
if rel is False:
if nm in sqms:
relations[nm]=["sqm",sqms[nm]]
if rel is False:
if nm in sqms2:
print("Squam2")
relations[nm]=["sqm2",sqms2[nm]]
priors.append(nm)
for k in range(len(priors)):
p=priors[k]
mi=(p*nm*ri)%n
sqm=(p*mi*ri)%n
sqm2=(nm*mi*ri)%n
mp=(p+nm)%n
mn=(p-nm+n)%n
mn2=(nm-p+n)%n
if nm<0: mn+=n
if not mi in mults:
mults[mi]=[k,len(priors)-1]
if not mp in pluses:
pluses[mp]=[k,len(priors)-1]
if not mn in minuses:
minuses[mn]=[k,len(priors)-1]
if not mn2 in minuses:
minuses[mn2]=[len(priors)-1,k]
lnm=0
def save():
import json
st=json.dumps({"priors":priors, "relations":relations})
fl=open("exp_values.json","w")
fl.write(st)
fl.close()
cnt=0
prev=None
with open(fl,"r",encoding="utf-8") as fl:
for ln in fl:
for acc in accs:
if acc in ln:
if "Grabbed " in ln:
nm=int(ln.split(":")[1].strip(),16)%n
else:
nm=int(ln[len(acc):],16)%n
lnm=nm
if nm in priors:
print("Prior")
else:
pass
checkPriorRelation(nm)
prev=nm
cnt=cnt+1
if cnt>100:
cnt=0
save()
break
save()