mirror of
https://github.com/HyperDbg/HyperDbg.git
synced 2026-07-14 11:39:32 +00:00
575 lines
No EOL
9.6 KiB
Python
575 lines
No EOL
9.6 KiB
Python
from os import write
|
|
import random
|
|
|
|
depth = 0
|
|
MAX_DEPTH = 20
|
|
|
|
def S():
|
|
r = random.randrange(2)
|
|
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = STATEMENT() + ' ' + S()
|
|
depth -= 1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth -= 1
|
|
return res
|
|
|
|
def STATEMENT():
|
|
r = random.randrange(8)
|
|
|
|
global depth
|
|
depth += 1
|
|
|
|
if r==0:
|
|
res = IF_STATEMENT()
|
|
depth -= 1
|
|
return res
|
|
elif r==1:
|
|
res = WHILE_STATEMENT()
|
|
depth -= 1
|
|
return res
|
|
elif r==2:
|
|
res = DO_WHILE_STATEMENT()
|
|
depth-=1
|
|
return res
|
|
elif r==3:
|
|
res = FOR_STATEMENT()
|
|
depth-=1
|
|
return res
|
|
elif r== 4:
|
|
res = ASSIGN_STATEMENT() + ";"
|
|
depth-=1
|
|
return res
|
|
elif r== 5:
|
|
res = CALL_FUNC_STATEMENT() + ";"
|
|
depth-=1
|
|
return res
|
|
elif r== 6:
|
|
res = "break ;"
|
|
depth-=1
|
|
return res
|
|
elif r== 7:
|
|
res = "continue ;"
|
|
depth-=1
|
|
return res
|
|
|
|
def CALL_FUNC_STATEMENT():
|
|
res = ''
|
|
return res
|
|
|
|
def ASSIGN_STATEMENT():
|
|
global depth
|
|
depth+=1
|
|
res = L_VALUE() + ' = ' + EXPRESSION() + ' ' + NULL()
|
|
depth-=1
|
|
return res
|
|
|
|
|
|
def IF_STATEMENT():
|
|
global depth
|
|
depth+=1
|
|
res = 'if (' + BOOLEAN_EXPRESSION() +') {' + S() + '}' + ELSIF_STATEMENT() + ELSE_STATEMENT() + END_OF_IF()
|
|
depth-=1
|
|
return res
|
|
|
|
def ELSIF_STATEMENT():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = 'elsif (' + BOOLEAN_EXPRESSION() + ') {' + S() + '}' + ELSIF_STATEMENT()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ELSIF_STATEMENTP()
|
|
depth-=1
|
|
return res
|
|
|
|
def ELSIF_STATEMENTP():
|
|
res = ''
|
|
return res
|
|
|
|
def ELSE_STATEMENT():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = 'else {' + S() + '}'
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def END_OF_IF():
|
|
res = ''
|
|
return res
|
|
|
|
def WHILE_STATEMENT():
|
|
global depth
|
|
depth+=1
|
|
res = 'while (' + BOOLEAN_EXPRESSION() + ') { ' + S() + ' }'
|
|
depth-=1
|
|
return res
|
|
|
|
def DO_WHILE_STATEMENT():
|
|
global depth
|
|
depth+=1
|
|
res = 'do {' + S() + '} while ( ' + BOOLEAN_EXPRESSION() + ') ;'
|
|
depth-=1
|
|
return res
|
|
|
|
def FOR_STATEMENT():
|
|
global depth
|
|
depth+=1
|
|
res = 'for (' + SIMPLE_ASSIGNMENT() + '; ' + BOOLEAN_EXPRESSION() + ';' + INC_DEC() + ') { ' + S() + '}'
|
|
depth-=1
|
|
return res
|
|
|
|
def SIMPLE_ASSIGNMENT():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = L_VALUE() + '= ' + EXPRESSION() + SIMPLE_ASSIGNMENTP()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def SIMPLE_ASSIGNMENTP():
|
|
res = ''
|
|
return res
|
|
|
|
def INC_DEC():
|
|
global depth
|
|
depth+=1
|
|
res = L_VALUE() + INC_DECP()
|
|
depth-=1
|
|
return res
|
|
|
|
def INC_DECP():
|
|
global depth
|
|
depth+=1
|
|
res = '++' + INCP()
|
|
depth-=1
|
|
return res
|
|
|
|
def INC_DECP():
|
|
global depth
|
|
depth+=1
|
|
res = '--' + DECP()
|
|
depth-=1
|
|
return res
|
|
|
|
def INCP():
|
|
res = ''
|
|
return res
|
|
|
|
def DECP():
|
|
res = ''
|
|
return res
|
|
|
|
def INC_DECP():
|
|
res = ''
|
|
return res
|
|
|
|
def BOOLEAN_EXPRESSION():
|
|
res = ''
|
|
return res
|
|
|
|
|
|
def EXPRESSION():
|
|
global depth
|
|
depth+=1
|
|
res = E1() + E0P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E0P():
|
|
r = random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' | ' + E1() + E0P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
|
|
def E1():
|
|
global depth
|
|
depth+=1
|
|
res = E2() + E1P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E1P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' ^ ' + E2() + E1P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def E2():
|
|
global depth
|
|
depth+=1
|
|
res = E3() + E2P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E2P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' & ' + E3() + E2P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def E3():
|
|
global depth
|
|
depth+=1
|
|
res = E4() + E3P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E3P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' >> ' + E4() + E3P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def E4():
|
|
global depth
|
|
depth+=1
|
|
res = E5() + E4P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E4P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' << ' + E5() + E4P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def E5():
|
|
global depth
|
|
depth+=1
|
|
res = E6() + E5P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E5P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' + ' + E6() + E5P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
|
|
def E6():
|
|
global depth
|
|
depth+=1
|
|
res = E7() + E6P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E6P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' - ' + E7() + E6P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def E7():
|
|
global depth
|
|
depth+=1
|
|
res = E8() + E7P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E7P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' * ' + E8() + E7P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
|
|
def E8():
|
|
global depth
|
|
depth+=1
|
|
res = E9() + E8P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E8P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' / ' + E9() + E8P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
|
|
def E9():
|
|
global depth
|
|
depth+=1
|
|
res = E10() + E9P()
|
|
depth-=1
|
|
return res
|
|
|
|
def E9P():
|
|
r=random.randrange(2)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
if r==0:
|
|
res = ' % ' + E10() + E9P()
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
res = ''
|
|
depth-=1
|
|
return res
|
|
|
|
def E10():
|
|
global depth
|
|
depth+=1
|
|
res = E12()
|
|
depth-=1
|
|
return res
|
|
|
|
|
|
|
|
def E12():
|
|
r=random.randrange(0,8)
|
|
|
|
global depth
|
|
depth += 1
|
|
if depth>=MAX_DEPTH:
|
|
r = 1
|
|
|
|
|
|
if r==0:
|
|
res = '(' + EXPRESSION() + ')'
|
|
depth-=1
|
|
return res
|
|
elif r==1:
|
|
ri = random.randrange(0,20)
|
|
res = str(hex(ri)) # hex
|
|
depth-=1
|
|
return res
|
|
elif r==2:
|
|
ri = random.randrange(0,20)
|
|
res = '0n' + str(ri) # decimal
|
|
depth-=1
|
|
return res
|
|
elif r==3:
|
|
ri = random.randrange(0,20)
|
|
res = str(oct(ri)) # octal
|
|
depth-=1
|
|
return res
|
|
elif r==4:
|
|
ri = random.randrange(0,20)
|
|
res = '0y' + str(bin(ri))[2:] # binary
|
|
depth-=1
|
|
return res
|
|
elif r==5:
|
|
res = '-' + E12() + E13()
|
|
depth-=1
|
|
return res
|
|
elif r==6:
|
|
res = '+' + E12() + E13()
|
|
depth-=1
|
|
return res
|
|
elif r==7:
|
|
res = '~' + E12() + E13()
|
|
depth-=1
|
|
return res
|
|
elif r==8:
|
|
res = '@rax' # register
|
|
depth-=1
|
|
return res
|
|
elif r==9:
|
|
res = 'x' # id
|
|
depth-=1
|
|
return res
|
|
elif r==10:
|
|
res = 'pid' # sample pseudo register, can be added more options later
|
|
depth-=1
|
|
return res
|
|
|
|
def E13():
|
|
res = ''
|
|
return res
|
|
|
|
def L_VALUE():
|
|
r = random.randrange(2)
|
|
|
|
if r==0:
|
|
res = 'x' # id
|
|
return res
|
|
elif r==1:
|
|
res = '@rax' # register
|
|
return res
|
|
|
|
def NULL():
|
|
res = ''
|
|
return res
|
|
|
|
def tohex(val, nbits):
|
|
return hex((val + (1 << nbits)) % (1 << nbits))
|
|
|
|
def evaluate(s):
|
|
s2 = s.replace('0n','').replace('0y','0b').replace('/','//')
|
|
v = '$error$'
|
|
|
|
try:
|
|
v = eval(s2)
|
|
v = tohex(v, 64)
|
|
v = v.replace('0x', '')
|
|
except:
|
|
pass
|
|
return v
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# global depth
|
|
|
|
f = open('script-test-cases.txt', 'w')
|
|
counter = 1
|
|
|
|
initCounter = counter
|
|
while counter-initCounter<1000:
|
|
depth = 0
|
|
sentence = EXPRESSION()
|
|
if len(sentence)<=150:
|
|
res = 'x = ' + sentence + '; test_statement(x);'
|
|
val = evaluate(sentence)
|
|
if type(val)=='int' and not(abs(val)<=65536):
|
|
continue
|
|
f.write(str(counter)+'\n')
|
|
f.write(res+'\n')
|
|
f.write(str(val)+'\n')
|
|
f.write('$end$'+'\n')
|
|
print(counter)
|
|
print(res)
|
|
print(val)
|
|
print()
|
|
counter+=1
|
|
|
|
f.close() |