122 lines
3.5 KiB
Python
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()
|