mirror of
https://github.com/HyperDbg/HyperDbg.git
synced 2026-08-31 01:56:24 +00:00
add test-case generator for script-engine
This commit is contained in:
parent
8dcdf9d048
commit
ed10290568
4 changed files with 5623 additions and 0 deletions
5000
hyperdbg/script-engine/python/script-test-cases.txt
Normal file
5000
hyperdbg/script-engine/python/script-test-cases.txt
Normal file
File diff suppressed because it is too large
Load diff
572
hyperdbg/script-engine/python/test-case-generator.py
Normal file
572
hyperdbg/script-engine/python/test-case-generator.py
Normal file
|
|
@ -0,0 +1,572 @@
|
|||
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 evaluate(s):
|
||||
s2 = s.replace('0n','').replace('0y','0b').replace('/','//')
|
||||
v = '$error$'
|
||||
|
||||
try:
|
||||
v = eval(s2)
|
||||
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 + '; printf("%d\\n", 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')
|
||||
f.write('\n')
|
||||
print(counter)
|
||||
print(res)
|
||||
print(val)
|
||||
print()
|
||||
counter+=1
|
||||
|
||||
f.close()
|
||||
Loading…
Add table
Add a link
Reference in a new issue