initial commit

This commit is contained in:
Dominik Moritz Roth 2020-05-29 00:41:13 +02:00
commit fa58d701f1
28 changed files with 3012 additions and 0 deletions

495
asm.py Normal file
View File

@ -0,0 +1,495 @@
import os
import sys
import pickle
import zlib
import hashlib
import copy
from termcolor import colored
from base64 import *
from colorama import init
init()
OS = "Linux"
#OS = "Windows"
doc = """
0000 NOP
0001 LDA memory > A
0010 ADD A + memspace
0011 SUB A - memspace
0100 STA A > memory
0101 OUT A > OUT
0110 JMP Jump to adress
0111 LDI par > A
1000 JIF Jump if greater
1001 JIE Jump if equal
1010 LDP memory[A] > A
1011 INP IN > A
1100 JMA Jump to A
1101 --- NOP equivalent
1110 STP memory[par] > memory[A]
1111 HLT Halt
"""
asmMap = ["NOP","LDA","ADD","SUB","STA","OUT","JMP","LDI","JIF","JIE","---","INP","JMA","HLO","HST","HLT"]
bits = 12
pointer = 0
registerA = 0
out = 0
color = [["green","on_grey"],["blue","on_grey"],["red","on_grey"],["magenta","on_grey"],["cyan","on_grey"],
["grey","on_white"],["green","on_white"],["blue","on_white"],["red","on_white"],["magenta","on_white"],["cyan","on_white"],
["grey","on_green"],["white","on_green"],["blue","on_green"],["red","on_green"],["magenta","on_green"],["cyan","on_green"],
["grey","on_blue"],["white","on_blue"],["green","on_blue"],["red","on_blue"],["magenta","on_blue"],["cyan","on_blue"],
["grey","on_red"],["white","on_red"],["green","on_red"],["blue","on_red"],["magenta","on_red"],["cyan","on_red"],
["grey","on_magenta"],["white","on_magenta"],["green","on_magenta"],["blue","on_magenta"],["red","on_magenta"],["cyan","on_magenta"],
["grey","on_cyan"],["white","on_cyan"],["green","on_cyan"],["blue","on_cyan"],["red","on_cyan"],["magenta","on_cyan"]]
memory = []
for i in range(2**8):
memory.append(0)
def clear():
if OS=="Windows":
os.system("cls")
elif OS=="Linux":
os.system("clear")
else:
print("Error: Unknown OS")
exit()
def toDec(binary):
try:
return int(binary, 2)
except:
return -1
def toBin(decimal):
try:
return int(bin(decimal)[2:])
except:
print("Error: The dec-number "+decimal+" could not be converted to binary")
return decimal
def padBin(binary,bit=bits):
return str(binary).zfill(bit)[-bit:]
def bin_input(display,bit=bits):
raw = raw_input(display)
if raw=="x":
return -1
raw = raw.replace(" ","")
ret = toDec(raw)
if ret>2**bit:
print("[!] input exceted maximal size for "+str(bit)+"-bit integer!")
return bin_input(display)
if ret==-1:
print("[!] "+raw+" is not a valid binary number!")
return bin_input(display)
return ret
def parse(cmd,par,verbose=False,adress=0):
global registerA
global memory
global out
global pointer
v=verbose
cmd16 = cmd
cmd = cmd[-4:]
if cmd=="0000": #nop
if v: print padBin(toBin(adress),bit=8)+": NOP"
elif cmd=="0001": #lda
registerA = memory[par]
if v: print padBin(toBin(adress),bit=8)+": LDA memory["+padBin(toBin(par),bit=8)+"] > Register A"
elif cmd=="0010": #add
registerA = (registerA + memory[par]) % 2**8
if v: print padBin(toBin(adress),bit=8)+": ADD Register A + memory["+padBin(toBin(par),bit=8)+"]"
elif cmd=="0011": #sub
registerA = (registerA - memory[par]) % 2**8
if registerA<0:
registerA = (2**bits+registerA) % 2**8
if v: print padBin(toBin(adress),bit=8)+": SUB Register A - memory["+padBin(toBin(par),bit=8)+"]"
elif cmd=="0100": #sta
memory[par] = registerA
if v: print padBin(toBin(adress),bit=8)+": STA Register A > memory["+padBin(toBin(par),bit=8)+"]"
elif cmd=="0101": #out
out = registerA
print("[OUT] "+padBin(toBin(out),bit=8))
if v: print padBin(toBin(adress),bit=8)+": OUT Register A > out"
elif cmd=="0110": #jmp
pointer = par - 1
if v: print padBin(toBin(adress),bit=8)+": JMP "+padBin(toBin(par),bit=8)
elif cmd=="0111": #ldi
registerA = par
if v: print padBin(toBin(adress),bit=8)+": LDI "+padBin(toBin(par),bit=8)+" > Register A"
elif cmd=="1000": #jif
if registerA>=(2**8)/2: #10000000
pointer = par - 1
if v: print padBin(toBin(adress),bit=8)+": JIF {TRUE} > "+padBin(toBin(par),bit=8)
else:
if v: print padBin(toBin(adress),bit=8)+": JIF {FALSE} > "+padBin(toBin(par),bit=8)
elif cmd=="1001": #fie
if registerA==(2**8)/2: #10000000
pointer = par - 1
if v: print padBin(toBin(adress),bit=8)+": JIE {TRUE} > "+padBin(toBin(par),bit=8)
else:
if v: print padBin(toBin(adress),bit=8)+": JIE {FALSE} > "+padBin(toBin(par),bit=8)
elif cmd=="1010": #ldp
registerA = memory[registerA]
if v: print padBin(toBin(adress),bit=8)+": LDP memory["+padBin(toBin(registerA),bit=8)+"] > Register A"
elif cmd=="1011": #inp
if v: print padBin(toBin(adress),bit=8)+": INP input > Register A"
registerA = bin_input("[INPUT]> ")
elif cmd=="1100": #jma
pointer = registerA - 1
if v: print padBin(toBin(adress),bit=8)+": JMA Jump to Register A"
elif cmd=="1101": #---
if v: print "Got unimplemented op-code: 1101"
elif cmd=="1110": #STP
memory[par] = memory[registerA]
if v: print padBin(toBin(adress),bit=8)+": STP memory["+padBin(toBin(registerA),bit=8)+"] > memory["+padBin(toBin(par),bit=8)+"]"
elif cmd=="1111": #hlt
return -1
return True
if __name__=="__main__":
print("[asmTron by CyberCodeDragon]")
while True:
x = ""
x=raw_input("#> ")
x = x.split(" ")
for i in range(2):
x.append("")
y = x[1]
z = x[2]
x = x[0]
if x=="help" or x=="h":
print("Avaible Commands:")
print("docs - display avaible operants")
print("write [w] - write value to adress")
print("read [r] - read value from adress")
print("dump [d] - dump from adress with length")
print("run [u] - execute programm")
print("edit [e] - edit from adress til >x<")
print("cls - clear screen")
print("clear / reset - clear memory,register,pointer")
print("highClear [hc] - clear highMem,register,pointer")
print("step [s] - run one command from programm")
print("debug - execute programm with verbose output")
print("pointer - display pointer")
print("setPointer - sets pointer")
print("resetPointer [rp] - sets pointer to zero")
print("register [reg] - displays A register")
print("setRegister - sets A register")
print("save - saves memory to local file")
print("load - loads memory from local file")
print("code / exec - execute one line of shellcode")
print("guiDebug [gd] - graphical debugger")
print("asm - shellcode visualizer (assembly / jump-arrows)")
print("halting - tries to determin, if algorythm will diverge")
elif x=="docs":
print(doc)
elif x=="write" or x=="w":
if y=="" or z=="":
y=bin_input("adress> ")
z=bin_input("value> ")
try:
memory[y] = z
except:
print("[!] Unknown error while writing")
elif x=="read" or x=="r":
if y=="":
y=bin_input("adress> ")
print(padBin(toBin(memory[y])))
elif x=="dump" or x=="d":
if y=="" and z=="":
y=bin_input("adress> ")
z=bin_input("length> ")
elif z=="":
z=toDec(y)
y=0
for m in range(z):
print(padBin(toBin(y+m),bit=8)+": "+padBin(toBin(memory[y+m])))
elif x=="run" or x=="u":
while True:
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
if parse(cmd,par)==-1:
pointer = 0
break
pointer = (pointer + 1) % 2**bits
elif x=="verboseRun" or x=="vu":
while True:
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = 0
break
pointer = (pointer + 1) % 2**bits
elif x=="edit" or x=="e":
adress=bin_input("offset> ",bit=8)
while True:
value=bin_input(padBin(toBin(adress),bit=8)+": "+padBin(toBin(memory[adress]))+" > ")
if value==-1:
break
try:
memory[adress] = value
except:
print("[!] Unknown error while writing")
if adress==len(memory)-1:
adress = -1
print("[*] End of mem")
adress = adress + 1
elif x=="cls":
clear()
elif x=="clear" or x=="reset":
pointer = 0
registerA = 0
out = 0
memory = []
for i in range(2**bits):
memory.append(0)
elif x=="highClear" or x=="highReset" or x=="hr" or x=="hc":
pointer = 0
registerA = 0
out = 0
for i in range((2**bits)/2):
memory[(2**bits)/2+i] = 0
elif x=="step" or x=="s":
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = 0
print("[*] Programm halted")
pointer = (pointer + 1) % (2**bits)
elif x=="debug":
while True:
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = -1
print("[*] Programm halted")
break
pointer = (pointer + 1) % (2**bits)
elif x=="pointer":
print("POINTER: "+padBin(toBin(pointer),bit=8))
elif x=="setPointer":
if y=="":
pointer = bin_input("pointer> ",bit=8)
else:
pointer = y
elif x=="resetPointer" or x=="rp":
pointer = 0
elif x=="register" or x=="reg":
print("REGISTER: "+padBin(toBin(registerA)))
elif x=="setRegister":
if y=="":
registerA = bin_input("register> ")
else:
registerA = y
elif x=="save":
if y=="":
print("[*] Current saves:")
for f in os.listdir("."):
if f[-8:]==".asmTron":
print("> "+f[:-8])
name = raw_input("name> ")
else:
name = y
with open(name+".asmTron", 'wb') as f:
t=pickle.dumps([12,memory])
t=zlib.compress(t)
f.write(t)
elif x=="load" or x=="l":
if y=="":
print("[*] Avaible saves:")
for f in os.listdir("."):
if f[-8:]==".asmTron":
print("> "+f[:-8])
for f in os.listdir("tronScript"):
if f[-8:]==".asmTron":
print("> tronScript/"+f[:-8])
name = raw_input("name> ")
else:
name = y
try:
with open(name+".asmTron", "rb") as f:
t = f.read()
t=zlib.decompress(t)
magicBit,memory = pickle.loads(t)
except Exception as e:
try:
with open("tronScripts/"+name+".asmTron", "rb") as f:
t = f.read()
t=zlib.decompress(t)
magicBit,memory = pickle.loads(t)
except Exception as e:
if b64encode(str(e))[:25]=="W0Vycm5vIDJdIE5vIHN1Y2ggZ":
print(" [!] Error: File '"+name+".asmTron' does not exist")
else:
print(" [!] Error: Unknown Error while reading File '"+name+"' with Errorcode: "+str(b64encode(str(e))))
if not magicBit==12:
print("[!] Error: Invalid Magical Bit: "+str(magicBit))
exit()
print("[*] loaded "+name+".asmTron")
elif x=="code" or x=="exec":
if y=="":
data=bin_input("code> ")
else:
data=y
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
parse(cmd,par,verbose=True,adress=0)
elif x=="guiDebug" or x=="gd":
runtime = 0
tracker = raw_input("trackers> ").split(",")
running = True
lastPointer = 0
while running:
clear()
print(" +"+"-"*34+"+"+"-"*28+"+"+"-"*24+"+")
print(" |"+" "*8+" - Instructions - "+" "*8+"|"+" "*8+" - Hi-mem - "+" "*8+"|"+" "*24+"|")
if pointer <= 20:
starter = 0
else:
starter = pointer - 20
for i in range(36):
m = i + starter
if pointer == m:
outI = "> "+padBin(toBin(m),bit=8)+": "+padBin(toBin(memory[m]))+" ["+doc.split("\n")[toDec(padBin(toBin(memory[m]))[:4])+1][:8][5:]+"]"+" <"
elif lastPointer == m and pointer-1 != lastPointer:
outI = "- "+padBin(toBin(m),bit=8)+": "+padBin(toBin(memory[m]))+" ["+doc.split("\n")[toDec(padBin(toBin(memory[m]))[:4])+1][:8][5:]+"]"+" -"
else:
outI = " "+padBin(toBin(m),bit=8)+": "+padBin(toBin(memory[m]))+" ["+doc.split("\n")[toDec(padBin(toBin(memory[m]))[:4])+1][:8][5:]+"]"+" "
outII = " "+padBin(toBin(128+i),bit=8)+": "+padBin(toBin(memory[128+i]))+" "
if i==1:
outIII = " - Register A - "
elif i==2:
outIII = " "*8+padBin(toBin(registerA),bit=8)+" "*8
elif i==4:
outIII = " - Runtime - "
elif i==5:
outIII = " "+padBin(toBin(runtime),bit=12)+" "
elif i==7:
outIII = " - Command - "
elif i==8:
temp=doc.split("\n")[toDec(padBin(toBin(memory[pointer]))[:4])+1][5:]
outIII = int((24-len(temp))/2-1)*" "+" "+temp+int((24-len(temp))/2)*" "
elif i==10:
outIII = " - Parameter - "
elif i==11:
outIII = " "+padBin(toBin(memory[pointer]))[-8:]+" "
elif i==13:
outIII = " - OUT-Register - "
elif i==14:
outIII = " "+padBin(toBin(out),bit=8)+" "
elif i==16:
outIII = " - Pointer - "
elif i==17:
outIII = " "+padBin(toBin(pointer))+" "
elif i==19:
if len(tracker[0]):
outIII = " - Trackers - "
else:
outIII = " "*24
elif i>19 and i<=19+len(tracker):
if len(tracker[0]):
outIII = " "+str(tracker[i-19-1]) + ": " + padBin(toBin(memory[toDec(tracker[i-19-1])]))+" "
else:
outIII = " "*24
else:
outIII = " "*24
print(" | "+outI+" | "+outII+" |"+outIII+"|")
print(" |"+" "*34+"|"+" "*28+"|"+" "*24+"|")
print(" +"+"-"*34+"+"+"-"*28+"+"+"-"*24+"+")
lastPointer = pointer
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = 0
break
pointer = (pointer + 1) % 2**bits
step=raw_input(" <step> ")
if step=="x":
break
runtime = runtime + 1
elif x=="asm":
end = 0
for m in range(len(memory)):
if padBin(toBin(memory[len(memory)-m-1]))[:4] != "0000":
end = len(memory)-m
break
toPrint = []
for m in range(end):
cmd = doc.split("\n")[toDec(padBin(toBin(memory[m]))[:4])+1][:8][5:]
if toDec(padBin(toBin(memory[m]))[4:]) >= toDec("10000000") and toDec(padBin(toBin(memory[m]))[4:]) <= toDec("10101000"):
toPrint.append(padBin(toBin(m),bit=8)+": "+cmd+" "+colored(padBin(toBin(memory[m]))[4:],color[(toDec(padBin(toBin(memory[m]))[4:])-toDec("10000000"))][0],color[(toDec(padBin(toBin(memory[m]))[4:])-toDec("10000000"))][1]))
else:
toPrint.append(padBin(toBin(m),bit=8)+": "+cmd+" "+padBin(toBin(memory[m]))[4:])
origPrint = copy.copy(toPrint)
for l in range(len(toPrint)):
cmd = origPrint[l][10:][:3]
par = origPrint[l][14:]
if cmd == "JMP" or cmd == "JIF" or cmd == "JIE":
toPrint[toDec(par)] = toPrint[toDec(par)] + " <-+"
toPrint[l] = toPrint[l] + " --+"
if l < toDec(par):
for i in range(len(toPrint)):
if l < i < toDec(par):
toPrint[i] = toPrint[i] + " |"
elif i==toDec(par) or i==l:
t=1
else:
toPrint[i] = toPrint[i] + " "
else:
for i in range(len(toPrint)):
if toDec(par) < i < l:
toPrint[i] = toPrint[i] + " |"
elif i==toDec(par) or i==l:
t=1
else:
toPrint[i] = toPrint[i] + " "
for p in range(len(toPrint)):
print(toPrint[p])
elif x=="halting":
print("[i] Will try to give you information about the divergity of your algorythm")
print("[i] This algorythm may itself not diverge!")
bPointer = pointer
bRegisterA = registerA
bMemory = memory
runtime = 0
stateHashes = []
print("[*] Simulating...")
while True:
runtime+=1
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
if parse(cmd,par)==-1:
pointer = 0
halts = True
print("[*] Algorythm will diverge after "+str(runtime)+" steps")
break
pointer = (pointer + 1) % 2**bits
stateHash = hashlib.sha256(str(pointer)+str(registerA)+str(memory)).digest()
if stateHash in stateHashes:
print("[*] Algorythm will not diverge: State-Collision after "+str(runtime)+" steps")
break
else:
stateHashes.append(stateHash)
pointer = bPointer
registerA = bRegisterA
memory = bMemory
elif x=="exit":
exit()
elif x=="":
_=0
else:
print("[!] Error")

BIN
asm.pyc Normal file

Binary file not shown.

249
asmCust.py Normal file
View File

@ -0,0 +1,249 @@
import os
import pickle
print("[asmTron by CyberCodeDragon]")
doc = {8:"""
0000 NOP
0001 LDA memory > A
0010 ADD A + memspace
0011 SUB A - memspace
0100 STA A > memory
0101 OUT A > OUT
0110 JMP Jump to adress
0111 LDI par > A
1000 JIF Jump if (JC)
1001 HLO H-mem[memspace] > A
1010 HST A > H-mem[memspace]
1011 INP IN > A
1100 JMA Jump to A
1111 HLT Halt
""", 16: """
0000 0000 NOP
0000 0001 LDA memory > A
0000 0010 ADD A + memspace
0000 0011 SUB A - memspace
0000 0100 STA A > memory
0000 0101 OUT A > OUT
0000 0110 JMP Jump to adress
0000 0111 LDI par > A
0000 1000 JIF Jump if (JC)
0000 1001 HLO H-mem[memspace] > A
0000 1010 HST A > H-mem[memspace]
0000 1011 INP IN > A
0000 1111 HLT Halt
"""}
#bits = int(raw_input("arch [8/16]> "))
bits = 8
pointer = 0
registerA = 0
out = 0
memory = []
for i in range(2**bits):
memory.append(0)
def toDec(binary):
try:
return int(binary, 2)
except:
return -1
def toBin(decimal):
return int(bin(decimal)[2:])
def padBin(binary,bit=bits):
return str(binary).zfill(bit)
def bin_input(display,bit=bits):
raw = raw_input(display)
if raw=="x":
return -1
raw = raw.replace(" ","")
ret = toDec(raw)
if ret>2**bit:
print("[!] input exceted maxial size for "+str(bit)+"-bit integer")
return bin_input(display)
if ret==-1:
print("[!] "+raw+" is not a valid binary number!")
return bin_input(display)
return ret
def parse(cmd,par,verbose=False,adress=0):
global registerA
global memory
global out
global pointer
v=verbose
cmd16 = cmd
cmd = cmd[-4:]
if cmd=="0000": #nop
if v: print padBin(toBin(adress),bit=bits/2)+": NOP"
elif cmd=="0001": #lda
registerA = memory[par]
if v: print padBin(toBin(adress),bit=bits/2)+": LDA memory["+padBin(toBin(par),bit=bits/2)+"] > Register A"
elif cmd=="0010": #add
registerA = (registerA + memory[par]) % 2**bits
if v: print padBin(toBin(adress))+": ADD Register A + memory["+padBin(toBin(par),bit=bits/2)+"]"
elif cmd=="0011": #sub
registerA = (registerA - memory[par])
if registerA<0:
registerA = 2**bits+registerA
if v: print padBin(toBin(adress),bit=bits/2)+": SUB Register A - memory["+padBin(toBin(par),bit=bits/2)+"]"
elif cmd=="0100": #sta
memory[par] = registerA
if v: print padBin(toBin(adress),bit=bits/2)+": STA Register A > memory["+padBin(toBin(par),bit=bits/2)+"]"
elif cmd=="0101": #out
out = registerA
print("[OUT] "+padBin(toBin(out)))
if v: print padBin(toBin(adress),bit=bits/2)+": OUT Register A > out"
elif cmd=="0110": #jmp
pointer = par - 1
if v: print padBin(toBin(adress),bit=bits/2)+": JMP "+padBin(toBin(par),bit=bits/2)
elif cmd=="0111": #ldi
registerA = par
if v: print padBin(toBin(adress),bit=bits/2)+": LDI "+padBin(toBin(par),bit=bits/2)+" > Register A"
elif cmd=="1000": #jif
if registerA>=(2**bits)/2:
pointer = par - 1
if v: print padBin(toBin(adress),bit=bits/2)+": JIF {TRUE} > "+padBin(toBin(par),bit=bits/2)
else:
if v: print padBin(toBin(adress),bit=bits/2)+": JIF {FALSE} > "+padBin(toBin(par),bit=bits/2)
elif cmd=="1001": #hlo
registerA = memory[memory[par]]
elif cmd=="1010": #hst
memory[memory[par]] = registerA
elif cmd=="1011": #inp
if v: print padBin(toBin(adress),bit=bits/2)+": INP input > Register A"
registerA = bin_input("[INPUT]> ")
elif cmd=="1100":
pointer = registerA - 1
elif cmd=="1111": #hlt
return -1
return True
if __name__=="__main__":
while True:
x=raw_input("#> ")
if x=="help" or x=="h":
print("Help Screen goes here")
elif x=="docs":
print(doc[bits])
elif x=="write" or x=="w":
adress=bin_input("adress> ")
value=bin_input("value> ")
try:
memory[adress] = value
except:
print("[!] Unknown error while writing")
elif x=="read" or x=="r":
adress=bin_input("adress> ")
print(padBin(toBin(memory[adress])))
elif x=="dump" or x=="d":
for m in range(len(memory)):
print(padBin(toBin(m),bit=bits/2)+": "+padBin(toBin(memory[m])))
elif x=="dump32" or x=="d32":
for m in range(32):
print(padBin(toBin(m),bit=bits/2)+": "+padBin(toBin(memory[m])))
elif x=="dumpSpace" or x=="ds":
begin=bin_input("adress> ")
length=bin_input("length> ")
for m in range(length):
print(padBin(toBin(begin+m),bit=bits/2)+": "+padBin(toBin(memory[begin+m])))
elif x=="run" or x=="u":
while True:
cmd = padBin(toBin(memory[pointer]))[:(bits/2)]
par = int(toDec(padBin(toBin(memory[pointer]))[-1*(bits/2):]))
if parse(cmd,par)==-1:
pointer = 0
break
pointer = (pointer + 1) % bits
elif x=="edit" or x=="e":
adress=bin_input("offset> ",bit=bits/2)
while True:
value=bin_input(padBin(toBin(adress),bit=bits/2)+": "+padBin(toBin(memory[adress]))+" > ")
if value==-1:
break
try:
memory[adress] = value
except:
print("[!] Unknown error while writing")
if adress==len(memory)-1:
adress = -1
print("[*] End of mem")
adress = adress + 1
elif x=="asm":
adress=bin_input("offset> ",bit=bits/2)
while True:
print("[!] Not yet implemented error")
break
toWrite=raw_input(padBin(toBin(adress),bit=bits/2)+" > ")
cmd,par = toWrite.split(" ")
if value==-1:
break
try:
memory[adress] = value
except:
print("[!] Unknown error while writing")
adress = adress + 1
elif x=="cls":
os.system("cls")
elif x=="clear":
pointer = 0
registerA = 0
out = 0
memory = []
for i in range(2**(bits/2)):
memory.append(0)
elif x=="step" or x=="s":
cmd = padBin(toBin(memory[pointer]))[:(bits/2)]
par = int(toDec(padBin(toBin(memory[pointer]))[-1*(bits/2):]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = 0
print("[*] Programm halted")
pointer = (pointer + 1) % bits
elif x=="debug":
while True:
cmd = padBin(toBin(memory[pointer]))[:(bits/2)]
par = int(toDec(padBin(toBin(memory[pointer]))[-1*(bits/2):]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = -1
print("[*] Programm halted")
break
pointer = (pointer + 1) % (2**bits/2)
elif x=="pointer":
print("POINTER: "+padBin(toBin(pointer),bit=bits/2))
elif x=="setPointer":
pointer = bin_input("pointer> ",bit=bits/2)
elif x=="register":
print("REGISTER: "+padBin(toBin(registerA)))
elif x=="setRegister":
registerA = bin_input("register> ")
elif x=="save":
name = raw_input("name> ")
with open(name+".asmTron", 'wb') as f:
pickle.dump([bits,memory],f)
elif x=="load":
print("[*] Avaible saves:")
for f in os.listdir("."):
if f[-8:]==".asmTron":
print("> "+f[:-8])
name = raw_input("name> ")
with open(name+".asmTron", "rb") as f:
newBits,memory = pickle.load(f)
if not newBits==bits:
print("[!] Error: Uncompatible arch: "+str(newBits))
exit()
if not pointer==0:
print("[*] Pointer has been set to "+str(pointer))
elif x=="code":
data=bin_input("code> ")
cmd = padBin(toBin(memory[pointer]))[:(bits/2)]
par = int(toDec(padBin(toBin(memory[pointer]))[-1*(bits/2):]))
parse(cmd,par,verbose=True,adress=0)
else:
print("[!] Error")

605
compiler.py Normal file
View File

@ -0,0 +1,605 @@
import asm
def padBin(number,bit=8):
return asm.padBin(asm.toBin(number),bit=bit)
def toDec(binNumber):
return asm.toDec(binNumber)
doc = """
0000 NOP
0001 LDA memory > A
0010 ADD A + memspace
0011 SUB A - memspace
0100 STA A > memory
0101 OUT A > OUT
0110 JMP Jump to adress
0111 LDI par > A
1000 JIF Jump if greater
1001 JIE Jump if equal
1010 --- nop equivalent
1011 INP IN > A
1100 JMA Jump to A
1101 HLO memspace[memspace[par]] > A
1110 HST A > memspace[memspace[par]]
1111 HLT Halt
"""
def compile(cmd,par,memAddr):
# Every function creates unknown vars, even if it makes no sense in it case,
# because if the function sits inside a user-defined function vars may be
# defined later
try:
if cmd=="newVar": # creates new var and allocates memory-adress for it
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
print("[i] newVar is obsolete in this version of tronScript")
elif cmd=="newArray": # creates new array and allocates memory-adress for it
print("Creating array '"+par[0].upper()+"' at memory-space "+padBin(len(varRec)+(2**8)/2)+" - "+padBin(len(varRec)+int(par[1])+(2**8)/2))
for i in range(int(par[1])):
varRec["array_"par[0].upper()+"["+i+"]"] = len(varRec)+(2**8)/2
elif cmd=="jumpMark": # creates a jumpMark and saves current adress in the DB for later use by the jump-name-replacement
print("Creating jumpMark '"+par[0].upper()+"' at memory-address "+padBin(memAddr))
jumpMark[par[0].upper()] = memAddr
elif cmd=="jump": # creates dummy jump code for later replacement
# we have to do it this way, beacause a jumpMark may be defined after the jump-call
return [
# will be replaced after script-compilation
"Jump_"+par[0].upper()
]
elif cmd=="getVarAddress": # stores the memory-adress of a var into another
# maybe needed, if user want to access vars with
# custom asssembly code
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
return [
## load the Var-Adress into A Register and save it into specified var
# LDI
toDec("0111"+padBin(varRec[par[0].upper()])),
# STA variable to store the current pointer in
toDec("0100"+padBin(varRec[par[1].upper()])),
]
elif cmd=="getArrayAddress": # like getVarAdress, but for arrays
# arrayName Index storeVar
try:
t = varRec["array_"par[0].upper()+"["+par[1]+"]"]
except:
print("Undefined Array")
exit()
try:
_ = int(par[1])
except:
print("Expected array-index (integer)")
exit()
return [
## load the Var-Adress into A Register and save it into specified var
# LDI
toDec("0111"+padBin(varRec["array_"par[0].upper()+"["+par[1]+"]"])),
# STA variable to store the current pointer in
toDec("0100"+padBin(varRec[par[2].upper()])),
]
elif cmd=="exec": # execute a user defined function
try:
t = varRec[par[0].upper()]
except:
print("Creating function-jumpback-var '"+par[0].upper()+"_JUMPBACK' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()+"_JUMPBACK"] = len(varRec)+(2**8)/2
return [
## remember current pointer, so you can jump back here after function execution is done
# LDI
toDec("0111"+padBin(pointer)),
# STA variable to store the current pointer in
toDec("0100"+padBin(varRec[par[0].upper()+"_JUMPBACK"])),
# will be replaced after script-compilation
"Exec_"+par[0].upper()# jumpback function-call-var
]
elif cmd=="setVar": # gives a var a defined value
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
if par[1][0]=="b":
par[1] = toDec(par[1][1:])
return [
## loads desired value into the A register and then stores it at the variables memory adress
# LDI value
toDec("0111" + padBin(int(par[1]))),
# STA var Name
toDec("0100" + padBin(varRec[par[0].upper()]))
]
elif cmd=="copyVar": # gives a var the value of another var
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
return [
## load memory-space of var 1 into register A and the store it into memory-space of var 2
# LDA var 1
toDec("0001" + padBin(varRec[par[0].upper()])),
# STA var 2
toDec("0100" + padBin(varRec[par[1].upper()]))
]
elif cmd=="setArrayIndex": # defines the value of an array (par0) index (par1) to be (par2)
try:
t = varRec["array_"par[0].upper()+"["+par[1]+"]"]
except:
print("Undefined array")
exit()
try:
_=int(par[1])
except:
print("Expected array-index (integer)")
exit()
if par[2][0]=="b":
par[2] = toDec(par[2][1:])
return [
## loads desired value into the A register and then stores it at the variables memory adress
# LDI value
toDec("0111" + padBin(int(par[2]))),
# STA var Name
toDec("0100" + padBin(varRec["array_"par[0].upper()+"["+par[1]+"]"]))
]
elif cmd=="getArrayIndex": # puts the value of an array (par0) index (par1) into var (par2)
try:
t = varRec["array_"par[0].upper()+"["+par[1]+"]"]
except:
print("Undefined Array")
exit()
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
try:
_=int(par[1])
except:
print("Expected array-index (integer)")
exit()
return [
## load memory-space of var 1 into register A and the store it into memory-space of var 2
# LDA var 1
toDec("0001" + padBin(varRec["array_"par[0].upper()+"["+par[1]+"]"])),
# STA var 2
toDec("0100" + padBin(varRec[par[2].upper()]))
]
elif cmd=="write": # writes to the console
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
return [
## load the variable into register A, then print it
# LDA var Name
toDec("0001" + padBin(varRec[par[0].upper()])),
# OUT null
toDec("0101" + "00000000")
]
elif cmd=="read": # reads from the console
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
return [
## input > register A; register A > var
# INP null
toDec("1011" + "00000000"),
# STA var Name
toDec("0100" + padBin(varRec[par[0].upper()]))
]
elif cmd=="add": # adds to numbers and stores the answer in another
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
return [
## load var 1 into register A; add var 2, store in var 3
# LDA var Name in1
toDec("0001" + padBin(varRec[par[0].upper()])),
# ADD var Name in2
toDec("0010" + padBin(varRec[par[1].upper()])),
# STA var Name out
toDec("0100" + padBin(varRec[par[2].upper()]))
]
elif cmd=="subtract": # in1 - in2 = out
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
return [
## laod var 1 into register A; subtract var 2; store in var 3
# LDA var Name in1
toDec("0001" + padBin(varRec[par[0]])),
# SUB var Name in2
toDec("0011" + padBin(varRec[par[1]])),
# STA var Name out
toDec("0100" + padBin(varRec[par[2]]))
]
elif cmd=="if": # if clause
#cmd p0 p1 p2 p3 p4:
#if VAR ?? VAR cmd pars
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
comp1=par[0].upper()
comp2=par[2].upper()
comp=par[1]
shellcode=compile(par[3],par[4:],memAddr+4)
if not shellcode:
return ["Error","I had problems getting the internal shellcode. Sorry :("]
if shellcode[0]=="Error":
return ["Error","Internal shellcode compilation thew an Error:\n"+shellcode[1]]
## binary code that magicaly works:
if comp=="==":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIE
toDec("1001" + padBin(memAddr+7)),
# JMP
toDec("0110" + padBin(memAddr+7+len(shellcode)))
]
elif comp=="!=":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIE
toDec("1001" + padBin(memAddr+6+len(shellcode)))
]
elif comp==">=":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
elif comp==">":
ret = [
# LDI konst
toDec("0111" + "01111111"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
elif comp=="<=":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp2
toDec("0001" + padBin(varRec[comp2])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp1
toDec("0011" + padBin(varRec[comp1])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
elif comp=="<":
ret = [
# LDI konst
toDec("0111" + "01111111"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp2
toDec("0001" + padBin(varRec[comp2])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp1
toDec("0011" + padBin(varRec[comp1])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
for s in shellcode:
ret.append(s)
return ret
elif cmd=="for": # for loop: "for [goal] [counter] [step] [cmd] [pars]"
# == for [counter] in range(0,[goal],[step]):
# [cmd]([pars])
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
goal = par[0].upper()
clock = par[1].upper()
step = par[2].upper()
shellcode=compile(par[3],par[4:],memAddr+12)
ret = [
# LDI konst
toDec("0111" + "00000000"),
# STA temp
toDec("0100" + padBin(varRec[clock])),
# LDI konst <-- jump back to
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA clock
toDec("0001" + padBin(varRec[clock])),
# ADD konst
toDec("0010" + "11111111"),
# SUB goal
toDec("0011" + padBin(varRec[goal])),
# JIE
toDec("1001" + padBin(memAddr+12+len(shellcode)+1)),
# LDA clock
toDec("0001" + padBin(varRec[goal])),
# ADD step
toDec("0010" + padBin(varRec[step])),
# STA clock
toDec("0100" + padBin(varRec[goal]))
]
for s in shellcode:
ret.append(s)
# JMP
ret.append(toDec("0110" + padBin(memAddr+2)))
return ret
elif cmd=="asm" or cmd[0]==":": # compiles assembler to machine-code
if cmd=="asm":
opcode = par[0]
param = par[1]
else:
opcode = cmd[1:]
param = par[0]
if param[:2]=="b#":
param = toDec(param[2:])
elif param[:2]=="d#":
param = param[2:]
elif param[:2]=="v#":
try:
t = varRec[param[2:].upper()]
except:
print("Creating var '"+param[2:].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[param[2:].upper()] = len(varRec)+(2**8)/2
param = varRec[param[2:].upper()]
elif param in ["-","none"]:
param = toDec("00000000")
elif param in ["~","all"]:
param = toDec("11111111")
else:
return ["Error","Invalid param supplied to asm-command (no valid prefix found)"]
for a in range(len(asm.asmMap)):
if asm.asmMap[a]==opcode:
print("Found matching opcode")
return [toDec(padBin(a,bit=4)+padBin(param))]
elif cmd=="shellcode": # insertes raw shellcode into the programm
return [toDec("".join(par))]
elif cmd=="nop": # nothing...
return [toDec("0000" + "00000000")]
elif cmd=="halt": # halts execution of programm
return [toDec("1111" + "11111111")]
else:
return ["Error","Unimplemented Function: "+str(cmd)]
except Exception as e:
return ["Error","Unknown Error: "+str(e)]
bits = 12
varRec = {} # to store VarName -> memory-address
jumpMark = {} # to store jumpMarkName -> jump-address
if __name__ == "__main__":
print("[tronScript-Compiler by CyberCodeDragon]")
memory = []
for i in range(2**bits): #expand memory
memory.append(0)
pointer = 0
funcTable = [] # [[funcName,funcCode],...]
for f in asm.os.listdir("tronScript"): #display all found scripts
if f[-5:]==".tron":
print("> "+"tronScript/"+f)
filePath = raw_input("file to compile> ")
inFile = filePath.split("\\")
inFile = inFile[len(inFile)-1]
tmp = inFile.split(".")
ext = tmp[len(tmp)-1]
name = inFile.split("."+ext)[0]
print("[*] Reading "+inFile)
with open(filePath) as f:
code = f.read().replace(" ","") #read file and remove tabs
c = code.split("\n") #c = lines of code
#detect functions
for l in range(len(c)): #for every line of code
elems = c[l].split(" ") #elems = [cmd,pa1,par2,...,parN]
if elems[0]=="function":
funcName = elems[1]
funcCode = code.split("function "+funcName+" {")[1].split("}")[0].split("\n") #get the function Code
funcName = funcName.upper()
print("detected function '"+funcName+"' in line "+str(l)+":\n"+"\n".join(funcCode))
for i in range(len(funcCode)+0):
c[l+i]="#function-code" #replace function with a comment -> dont mess up later parsing
funcTable.append([funcName,funcCode])
try: #create jumpback-var if not existing (does probably not exist)
t = varRec[funcName+"_JUMPBACK"]
except:
print("Creating function-jumpback-var '"+funcName+"_JUMPBACK' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[funcName+"_JUMPBACK"] = len(varRec)+(2**8)/2
#parse code
for l in range(len(c)): #for every line in code
if c[l] not in ["","\n"]: #if lines is not empty
print("Parsing line "+str(l)+": "+c[l])
cmd = c[l].split(" ")[0]
if not cmd[0]=="#": #dont parse comments
if cmd in ["halt","nop"]: #cmds without params
par = []
else:
par = c[l].split(cmd+" ")[1].split(" ")
r = compile(cmd,par,pointer) #compile
if r:
if r[0]=="Error": #print error
print("Error compiling line "+str(l)+" {"+c[l]+"}: \n"+str(r[1]))
exit()
for ret in r:
veryVerbose = False
if veryVerbose:
try:
print("Compiled to: "+padBin(ret,bit=12))
except:
print("Compiled to: "+str(ret))
memory[pointer] = ret #write code to memory
pointer+=1
try:
if padBin(memory[pointer-1],bit=12)[:4]!="1111": #if the last command is not a HLT command
print("Appending HLT-Command")
# HLT
memory[pointer] = toDec("1111"+"11111111")
print("HLT at "+padBin(pointer)+": "+padBin(memory[pointer],bit=12))
pointer+=1
except: #looks like the last command was a placeholder: not a HLT command
print("Appending HLT-Command")
# HLT
memory[pointer] = toDec("1111"+"11111111")
print("HLT at "+padBin(pointer)+": "+padBin(memory[pointer],bit=12))
pointer+=1
#replace jump-names
for m in range(len(memory)):
try:
if memory[m][:5]=="Jump_": #if at memory-adress is just a jump-dummy
print("Inserting Jump-Adress at "+padBin(m,bit=12))
memory[m]=toDec("0110"+padBin(jumpMark[memory[m][5:]])) #replace with real jump adress
except:
t=1
#append function-shellcode
funcMapper = {} #map funcName to funcCode
for f in range(len(funcTable)):
print("Appending shellcode for function "+str(funcTable[f][0])+" at adress "+padBin(pointer))
funcMapper[funcTable[f][0]] = pointer #remember where you put dat function
for l in range(len(funcTable[f][1])):
if funcTable[f][1][l] not in ["","halt","nop"]:
ret=compile(funcTable[f][1][l].split(" ")[0],funcTable[f][1][l].split(" ")[1:],pointer)
try:
if ret[0]=="Error":
print("An Error occured, when compiling function shellcode for function '"+funcTable[f][0]+"':\n"+str(e))
else:
for r in range(len(ret)):
memory[pointer]=ret[r] #append compiled function memory
pointer+=1
except:
t=1
## jump back after function execution
# LDI konst=3
memory[pointer] = toDec("0111" + "00000011")
pointer+=1
# ADD jumpBackVar
memory[pointer] = toDec("0010" + padBin(varRec[funcTable[f][0]+"_JUMPBACK"]))
pointer+=1
# JMA null
memory[pointer] = toDec("1100" + "00000000")
pointer+=1
print("FuncMapper: "+str(funcMapper))
print("Var Assignment:")
varAss = str(varRec)[1:][:-1].split(", ")
print("#VAR-NAME# #ADDRESS#")
for va in range(len(varAss)): #print all vars with their memory-location
print(varAss[va].split("'")[1]+": "+" "*(12-len(varAss[va].split("'")[1]))+padBin(int(varAss[va].split("': ")[1])))
#replace func-names
for m in range(len(memory)):
try:
if memory[m][:5]=="Exec_": #if there is just a function-call-dummy
print("Inserting Exec-Call-Adress at "+padBin(m,bit=12))
memory[m]=toDec("0110"+padBin(funcMapper[memory[m][5:]])) #replace it with a jump to the function
except Exception as e:
if str(e) != "'int' object has no attribute '__getitem__'":
print "Error while replacing func-name: "+str(e)+"\n (I don't know why, sorry)"
try:
print("Removing old "+name+".asmTron")
os.remove(name+".asmTron")
except:
t=1
print("Saving as "+name+".asmTron")
with open(name+".asmTron", 'wb') as f:
t=asm.pickle.dumps([12,memory])
t=asm.zlib.compress(t)
f.write(t)
print("Done.")

658
compiler_beta.py Normal file
View File

@ -0,0 +1,658 @@
import asm
def padBin(number,bit=8):
return asm.padBin(asm.toBin(number),bit=bit)
def toDec(binNumber):
return asm.toDec(binNumber)
doc = """
0000 NOP
0001 LDA memory > A
0010 ADD A + memspace
0011 SUB A - memspace
0100 STA A > memory
0101 OUT A > OUT
0110 JMP Jump to adress
0111 LDI par > A
1000 JIF Jump if greater
1001 JIE Jump if equal
1010 LDP memory[A] > A
1011 INP IN > A
1100 JMA Jump to A
1101 --- not implemented
1110 STP memory[par] > memory[A]
1111 HLT Halt
"""
def compile(cmd,par,memAddr):
# Every function creates unknown vars, even if it makes no sense in it case,
# because if the function sits inside a user-defined function vars may be
# defined later
#try:
if cmd=="newVar": # creates new var and allocates memory-adress for it
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
print("[i] newVar is obsolete in this version of tronScript")
elif cmd=="newArray": # creates new array and allocates memory-adress for it
print("Creating array '"+par[0].upper()+"' at memory-space "+padBin(len(varRec)+(2**8)/2)+" - "+padBin(len(varRec)+int(par[1])+(2**8)/2))
for i in range(int(par[1])):
varRec["array_"+par[0].upper()+"["+i+"]"] = len(varRec)+(2**8)/2
elif cmd=="jumpMark": # creates a jumpMark and saves current adress in the DB for later use by the jump-name-replacement
print("Creating jumpMark '"+par[0].upper()+"' at memory-address "+padBin(memAddr))
jumpMark[par[0].upper()] = memAddr
elif cmd=="jump": # creates dummy jump code for later replacement
# we have to do it this way, beacause a jumpMark may be defined after the jump-call
return [
# will be replaced after script-compilation
"Jump_"+par[0].upper()
]
elif cmd=="getVarAddress": # stores the memory-adress of a var into another
# maybe needed, if user want to access vars with
# custom asssembly code
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
return [
## load the Var-Adress into A Register and save it into specified var
# LDI
toDec("0111"+padBin(varRec[par[0].upper()])),
# STA variable to store the current pointer in
toDec("0100"+padBin(varRec[par[1].upper()])),
]
elif cmd=="getArrayAddress": # like getVarAdress, but for arrays
# arrayName Index storeVar
try:
t = varRec["array_"+par[0].upper()+"["+par[1]+"]"]
except:
print("Undefined Array")
exit()
try:
_ = int(par[1])
except:
print("Expected array-index (integer)")
exit()
return [
## load the Var-Adress into A Register and save it into specified var
# LDI
toDec("0111"+padBin(varRec["array_"+par[0].upper()+"["+par[1]+"]"])),
# STA variable to store the current pointer in
toDec("0100"+padBin(varRec[par[2].upper()])),
]
elif cmd=="exec": # execute a user defined function
try:
t = varRec[par[0].upper()]
except:
print("Creating function-jumpback-var '"+par[0].upper()+"_JUMPBACK' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()+"_JUMPBACK"] = len(varRec)+(2**8)/2
return [
## remember current pointer, so you can jump back here after function execution is done
# LDI
toDec("0111"+padBin(pointer)),
# STA variable to store the current pointer in
toDec("0100"+padBin(varRec[par[0].upper()+"_JUMPBACK"])),
# will be replaced after script-compilation
"Exec_"+par[0].upper()# jumpback function-call-var
]
elif cmd=="setVar": # gives a var a defined value
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
if par[1][0]=="b":
par[1] = toDec(par[1][1:])
return [
## loads desired value into the A register and then stores it at the variables memory adress
# LDI value
toDec("0111" + padBin(int(par[1]))),
# STA var Name
toDec("0100" + padBin(varRec[par[0].upper()]))
]
elif cmd=="copyVar": # gives a var the value of another var
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
return [
## load memory-space of var 1 into register A and the store it into memory-space of var 2
# LDA var 1
toDec("0001" + padBin(varRec[par[0].upper()])),
# STA var 2
toDec("0100" + padBin(varRec[par[1].upper()]))
]
elif cmd=="setArrayIndex": # defines the value of an array (par0) index (par1) to be (par2)
try:
t = varRec["array_"+par[0].upper()+"["+par[1]+"]"]
except:
print("Undefined array")
exit()
try:
_=int(par[1])
except:
print("Expected array-index (integer)")
exit()
if par[2][0]=="b":
par[2] = toDec(par[2][1:])
return [
## loads desired value into the A register and then stores it at the variables memory adress
# LDI value
toDec("0111" + padBin(int(par[2]))),
# STA var Name
toDec("0100" + padBin(varRec["array_"+par[0].upper()+"["+par[1]+"]"]))
]
elif cmd=="getArrayIndex": # puts the value of an array (par0) index (par1) into var (par2)
try:
t = varRec["array_"+par[0].upper()+"["+par[1]+"]"]
except:
print("Undefined Array")
exit()
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
try:
_=int(par[1])
except:
print("Expected array-index (integer)")
exit()
return [
## load memory-space of var 1 into register A and the store it into memory-space of var 2
# LDA var 1
toDec("0001" + padBin(varRec["array_"+par[0].upper()+"["+par[1]+"]"])),
# STA var 2
toDec("0100" + padBin(varRec[par[2].upper()]))
]
elif cmd=="write": # writes to the console
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
return [
## load the variable into register A, then print it
# LDA var Name
toDec("0001" + padBin(varRec[par[0].upper()])),
# OUT null
toDec("0101" + "00000000")
]
elif cmd=="read": # reads from the console
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
return [
## input > register A; register A > var
# INP null
toDec("1011" + "00000000"),
# STA var Name
toDec("0100" + padBin(varRec[par[0].upper()]))
]
elif cmd=="add": # adds to numbers and stores the answer in another
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
return [
## load var 1 into register A; add var 2, store in var 3
# LDA var Name in1
toDec("0001" + padBin(varRec[par[0].upper()])),
# ADD var Name in2
toDec("0010" + padBin(varRec[par[1].upper()])),
# STA var Name out
toDec("0100" + padBin(varRec[par[2].upper()]))
]
elif cmd=="subtract": # in1 - in2 = out
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
return [
## laod var 1 into register A; subtract var 2; store in var 3
# LDA var Name in1
toDec("0001" + padBin(varRec[par[0]])),
# SUB var Name in2
toDec("0011" + padBin(varRec[par[1]])),
# STA var Name out
toDec("0100" + padBin(varRec[par[2]]))
]
elif cmd=="if": # if clause
#cmd p0 p1 p2 p3 p4:
#if VAR ?? VAR cmd pars
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
comp1=par[0].upper()
comp2=par[2].upper()
comp=par[1]
shellcode=compile(par[3],par[4:],memAddr+4)
if not shellcode:
return ["Error","I had problems getting the internal shellcode. Sorry :("]
if shellcode[0]=="Error":
return ["Error","Internal shellcode compilation thew an Error:\n"+shellcode[1]]
## binary code that magicaly works:
if comp=="==":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIE
toDec("1001" + padBin(memAddr+7)),
# JMP
toDec("0110" + padBin(memAddr+7+len(shellcode)))
]
elif comp=="!=":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIE
toDec("1001" + padBin(memAddr+6+len(shellcode)))
]
elif comp==">=":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
elif comp==">":
ret = [
# LDI konst
toDec("0111" + "01111111"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp1
toDec("0001" + padBin(varRec[comp1])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp2
toDec("0011" + padBin(varRec[comp2])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
elif comp=="<=":
ret = [
# LDI konst
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp2
toDec("0001" + padBin(varRec[comp2])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp1
toDec("0011" + padBin(varRec[comp1])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
elif comp=="<":
ret = [
# LDI konst
toDec("0111" + "01111111"),
# STA temp
toDec("0100" + "11111111"),
# LDA comp2
toDec("0001" + padBin(varRec[comp2])),
# ADD konst
toDec("0010" + "11111111"),
# SUB comp1
toDec("0011" + padBin(varRec[comp1])),
# JIF
toDec("1000" + padBin(memAddr+6+len(shellcode)))
]
for s in shellcode:
ret.append(s)
return ret
elif cmd=="for": # for loop: "for [goal] [counter] [step] [cmd] [pars]"
# == for [counter] in range(0,[goal],[step]):
# [cmd]([pars])
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[1].upper()]
except:
print("Creating var '"+par[1].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[1].upper()] = len(varRec)+(2**8)/2
try:
t = varRec[par[2].upper()]
except:
print("Creating var '"+par[2].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[2].upper()] = len(varRec)+(2**8)/2
goal = par[0].upper()
clock = par[1].upper()
step = par[2].upper()
shellcode=compile(par[3],par[4:],memAddr+12)
ret = [
# LDI konst
toDec("0111" + "00000000"),
# STA temp
toDec("0100" + padBin(varRec[clock])),
# LDI konst <-- jump back to
toDec("0111" + "10000000"),
# STA temp
toDec("0100" + "11111111"),
# LDA clock
toDec("0001" + padBin(varRec[clock])),
# ADD konst
toDec("0010" + "11111111"),
# SUB goal
toDec("0011" + padBin(varRec[goal])),
# JIE
toDec("1001" + padBin(memAddr+12+len(shellcode)+1)),
# LDA clock
toDec("0001" + padBin(varRec[goal])),
# ADD step
toDec("0010" + padBin(varRec[step])),
# STA clock
toDec("0100" + padBin(varRec[goal]))
]
for s in shellcode:
ret.append(s)
# JMP
ret.append(toDec("0110" + padBin(memAddr+2)))
return ret
elif cmd=="asm" or cmd[0]==":": # compiles assembler to machine-code
if cmd=="asm":
opcode = par[0]
param = par[1]
else:
opcode = cmd[1:]
param = par[0]
if param[:2]=="b#":
param = toDec(param[2:])
elif param[:2]=="d#":
param = param[2:]
elif param[:2]=="v#":
try:
t = varRec[param[2:].upper()]
except:
print("Creating var '"+param[2:].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[param[2:].upper()] = len(varRec)+(2**8)/2
param = varRec[param[2:].upper()]
elif param in ["-","none"]:
param = toDec("00000000")
elif param in ["~","all"]:
param = toDec("11111111")
else:
return ["Error","Invalid param supplied to asm-command (no valid prefix found)"]
for a in range(len(asm.asmMap)):
if asm.asmMap[a]==opcode:
print("Found matching opcode")
return [toDec(padBin(a,bit=4)+padBin(param))]
elif cmd=="shellcode": # insertes raw shellcode into the programm
return [toDec("".join(par))]
elif cmd=="push":
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
ret = [
### value to temp
# LDA value
toDec("0001" + padBin(varRec[par[0]])),
# STA temp
toDec("0100" + padBin(varRec["temp"])),
### increment stackpointer
# LDI konst
toDec("0111" + "00000001"), # we are going to use a overflow to subtract (2's-complement)
# ADD stack_pointer
toDec("0010" + padBin(varRec["stack_pointer"])),
# STA stack_pointer
toDec("0100" + padBin(varRec["stack_pointer"])),
### A > write as new element
# STP temp
toDec("1110" + padBin(varRec["temp"]))
]
return ret
elif cmd=="pop":
try:
t = varRec[par[0].upper()]
except:
print("Creating var '"+par[0].upper()+"' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[par[0].upper()] = len(varRec)+(2**8)/2
ret = [
### read the last element > A
# LDI stack-base
toDec("0111" + "11111111"),
# SUB stack_pointer
toDec("0011" + padBin(varRec["stack_pointer"])),
# LDP konst
toDec("1010" + "00000000"),
# STA stack_pointer
toDec("0100" + padBin(varRec[par[0]])),
### decrement stackpointer
# LDI konst
toDec("0111" + "11111111"), # we are going to use a overflow to subtract (2's-complement)
# ADD stack_pointer
toDec("0010" + padBin(varRec["stack_pointer"])),
# STA stack_pointer
toDec("0100" + padBin(varRec["stack_pointer"]))
]
return ret
elif cmd=="nop": # nothing...
return [toDec("0000" + "00000000")]
elif cmd=="halt": # halts execution of programm
return [toDec("1111" + "11111111")]
else:
return ["Error","Unimplemented Function: "+str(cmd)]
#except Exception as e:
# return ["Error","Unknown Error: "+str(e)]
bits = 12
varRec = {"temp": (2**8)/2, "stack_pointer": (2**8)/2 + 1 } # to store VarName -> memory-address
jumpMark = {} # to store jumpMarkName -> jump-address
if __name__ == "__main__":
print("[tronScript-Compiler by CyberCodeDragon]")
print("! Unstable Beta-Version with stack")
memory = []
for i in range(2**bits): #expand memory
memory.append(0)
pointer = 0
funcTable = [] # [[funcName,funcCode],...]
for f in asm.os.listdir("tronScript"): #display all found scripts
if f[-5:]==".tron":
print("> "+"tronScript/"+f)
filePath = raw_input("file to compile> ")
inFile = filePath.split("\\")
inFile = inFile[len(inFile)-1]
tmp = inFile.split(".")
ext = tmp[len(tmp)-1]
name = inFile.split("."+ext)[0]
print("[*] Reading "+inFile)
with open(filePath) as f:
code = f.read().replace(" ","") #read file and remove tabs
c = code.split("\n") #c = lines of code
#detect functions
for l in range(len(c)): #for every line of code
elems = c[l].split(" ") #elems = [cmd,pa1,par2,...,parN]
if elems[0]=="function":
funcName = elems[1]
funcCode = code.split("function "+funcName+" {")[1].split("}")[0].split("\n") #get the function Code
funcName = funcName.upper()
print("detected function '"+funcName+"' in line "+str(l)+":\n"+"\n".join(funcCode))
for i in range(len(funcCode)+0):
c[l+i]="#function-code" #replace function with a comment -> dont mess up later parsing
funcTable.append([funcName,funcCode])
try: #create jumpback-var if not existing (does probably not exist)
t = varRec[funcName+"_JUMPBACK"]
except:
print("Creating function-jumpback-var '"+funcName+"_JUMPBACK' at memory-address "+padBin(len(varRec)+(2**8)/2))
varRec[funcName+"_JUMPBACK"] = len(varRec)+(2**8)/2
#parse code
for l in range(len(c)): #for every line in code
if c[l] not in ["","\n"]: #if lines is not empty
print("Parsing line "+str(l)+": "+c[l])
cmd = c[l].split(" ")[0]
if not cmd[0]=="#": #dont parse comments
if cmd in ["halt","nop"]: #cmds without params
par = []
else:
par = c[l].split(cmd+" ")[1].split(" ")
r = compile(cmd,par,pointer) #compile
if r:
if r[0]=="Error": #print error
print("Error compiling line "+str(l)+" {"+c[l]+"}: \n"+str(r[1]))
exit()
for ret in r:
veryVerbose = False
if veryVerbose:
try:
print("Compiled to: "+padBin(ret,bit=12))
except:
print("Compiled to: "+str(ret))
memory[pointer] = ret #write code to memory
pointer+=1
try:
if padBin(memory[pointer-1],bit=12)[:4]!="1111": #if the last command is not a HLT command
print("Appending HLT-Command")
# HLT
memory[pointer] = toDec("1111"+"11111111")
print("HLT at "+padBin(pointer)+": "+padBin(memory[pointer],bit=12))
pointer+=1
except: #looks like the last command was a placeholder: not a HLT command
print("Appending HLT-Command")
# HLT
memory[pointer] = toDec("1111"+"11111111")
print("HLT at "+padBin(pointer)+": "+padBin(memory[pointer],bit=12))
pointer+=1
#replace jump-names
for m in range(len(memory)):
try:
if memory[m][:5]=="Jump_": #if at memory-adress is just a jump-dummy
print("Inserting Jump-Adress at "+padBin(m,bit=12))
memory[m]=toDec("0110"+padBin(jumpMark[memory[m][5:]])) #replace with real jump adress
except:
t=1
#append function-shellcode
funcMapper = {} #map funcName to funcCode
for f in range(len(funcTable)):
print("Appending shellcode for function "+str(funcTable[f][0])+" at adress "+padBin(pointer))
funcMapper[funcTable[f][0]] = pointer #remember where you put dat function
for l in range(len(funcTable[f][1])):
if funcTable[f][1][l] not in ["","halt","nop"]:
ret=compile(funcTable[f][1][l].split(" ")[0],funcTable[f][1][l].split(" ")[1:],pointer)
try:
if ret[0]=="Error":
print("An Error occured, when compiling function shellcode for function '"+funcTable[f][0]+"':\n"+str(e))
else:
for r in range(len(ret)):
memory[pointer]=ret[r] #append compiled function memory
pointer+=1
except:
t=1
## jump back after function execution
# LDI konst=3
memory[pointer] = toDec("0111" + "00000011")
pointer+=1
# ADD jumpBackVar
memory[pointer] = toDec("0010" + padBin(varRec[funcTable[f][0]+"_JUMPBACK"]))
pointer+=1
# JMA null
memory[pointer] = toDec("1100" + "00000000")
pointer+=1
print("FuncMapper: "+str(funcMapper))
print("Var Assignment:")
varAss = str(varRec)[1:][:-1].split(", ")
print("#VAR-NAME# #ADDRESS#")
for va in range(len(varAss)): #print all vars with their memory-location
print(varAss[va].split("'")[1]+": "+" "*(12-len(varAss[va].split("'")[1]))+padBin(int(varAss[va].split("': ")[1])))
#replace func-names
for m in range(len(memory)):
try:
if memory[m][:5]=="Exec_": #if there is just a function-call-dummy
print("Inserting Exec-Call-Adress at "+padBin(m,bit=12))
memory[m]=toDec("0110"+padBin(funcMapper[memory[m][5:]])) #replace it with a jump to the function
except Exception as e:
if str(e) != "'int' object has no attribute '__getitem__'":
print "Error while replacing func-name: "+str(e)+"\n (I don't know why, sorry)"
try:
print("Removing old "+name+".asmTron")
os.remove(name+".asmTron")
except:
t=1
print("Saving as "+name+".asmTron")
with open(name+".asmTron", 'wb') as f:
t=asm.pickle.dumps([12,memory])
t=asm.zlib.compress(t)
f.write(t)
print("Done.")

214
deCompiler.py Normal file
View File

@ -0,0 +1,214 @@
import asm
import os
import pickle
import zlib
from base64 import *
asmMap = ["NOP","LDA","ADD","SUB","STA","OUT","JMP","LDI","JIF","JIE","---","INP","JMA","HLO","HST","HLT"]
bits = 12
pointer = 0
note="""
newVar [var]
jumpMark [jumpMark name]
jump [jumpMark name]
getVarAddress [var A] [var B]
getArrayAddress [array] [index] [var]
exec [func name]
setVar [var] [value] OK
setVar [var] b[value] OK
setArrayIndex [array] [index] [value]
setArrayIndex [array] [index] b[value]
getArrayIndex [array] [index] [var]
copyVar [var A] [var B]
write [var] OK
read [var] OK
add [var A] [var B] [var OUT] OK
subtract [var A] [var B] [var OUT] OK
if [var A] [??] [var B] [cmd] [pars]
for [goal] [counter] [step] [cmd] [pars]
:[asm] v#[var]
:[asm] d#[par]
:[asm] b#[par]
:[asm] -
:[asm] ~
shellcode [code]
nop OK
halt OK
user defined funtions
"""
def padBin(number,bit=8):
return asm.padBin(asm.toBin(number),bit=bit)
def toDec(binNumber):
return asm.toDec(binNumber)
def load():
print("[*] Avaible saves:")
for f in os.listdir("."):
if f[-8:]==".asmTron":
print("> "+f[:-8])
for f in os.listdir("tronScript"):
if f[-8:]==".asmTron":
print("> tronScript/"+f[:-8])
name = raw_input("name> ")
try:
with open(name+".asmTron", "rb") as f:
t = f.read()
t=zlib.decompress(t)
magicBit,memory = pickle.loads(t)
except Exception as e:
try:
with open("tronScripts/"+name+".asmTron", "rb") as f:
t = f.read()
t=zlib.decompress(t)
magicBit,memory = pickle.loads(t)
except Exception as e:
if b64encode(str(e))[:25]=="W0Vycm5vIDJdIE5vIHN1Y2ggZ":
print(" [!] Error: File '"+name+".asmTron' does not exist")
else:
print(" [!] Error: Unknown Error while reading File '"+name+"' with Errorcode: "+str(b64encode(str(e))))
if not magicBit==12:
print("[!] Error: Invalid Magical Bit: "+str(magicBit))
exit()
lenMem = len(memory)
for i in range(lenMem): #remove end-zeros
if memory[lenMem-i-1]!=0:
endPoint = lenMem-i
break
print("[*] loaded "+name+".asmTron")
return memory[:endPoint]
def main():
pointer = 0
memory = load()
lenMem = len(memory)
deco = []
for i in range(lenMem): #expand deco
deco.append("")
while True:
t = padBin(memory[pointer],bit=12)
cmd = t[:4]
par = t[4:]
#print("["+str(pointer).zfill(3)+"]> "+cmd+" "+par)
if cmd=="0000": #NOP
pointer+=1
elif cmd=="0001": #LDA
if padBin(memory[pointer+1],bit=12)[:4]=="0100": #STA
# LDI STA -> setVar
deco[pointer]="copyVar VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)+" VAR_"+chr(toDec(padBin(memory[pointer+1])[4:])+65)
pointer+=2
elif padBin(memory[pointer+1],bit=12)[:4]=="0101": #OUT
# LDI OUT -> write
deco[pointer]="write VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=2
elif padBin(memory[pointer+1],bit=12)[:4]=="0010": #ADD
if padBin(memory[pointer+2],bit=12)[:4]=="0100": #STA
# LDI ADD STA -> add
deco[pointer]="add VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)+" VAR_"+chr(toDec(padBin(memory[pointer+1])[4:])+65)+" VAR_"+chr(toDec(padBin(memory[pointer+2])[4:])+65)
pointer+=3
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif padBin(memory[pointer+1],bit=12)[:4]=="0011": #SUB
if padBin(memory[pointer+2],bit=12)[:4]=="0100": #STA
# LDI SUB STA -> subtract
deco[pointer]="subtract VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)+" VAR_"+chr(toDec(padBin(memory[pointer+1])[4:])+65)+" VAR_"+chr(toDec(padBin(memory[pointer+2])[4:])+65)
pointer+=3
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="0010": #ADD
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="0011": #SUB
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="0100": #STA
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="0101": #OUT
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="0110": #JMP
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="0111": #LDI
if padBin(memory[pointer+1],bit=12)[:4]=="0100": #STA
if padBin(memory[pointer+2],bit=12)[:4]=="0001": #LDA
if padBin(memory[pointer+3],bit=12)[:4]=="0010": #ADD
if padBin(memory[pointer+4],bit=12)[:4]=="0011": #SUB
if padBin(memory[pointer+5],bit=12)[:4]=="1001": #JIE
if padBin(memory[pointer+6],bit=12)[:4]=="0110": #JMP
# LDI STA LDA ADD SUB JIE JIF -> if ==
deco[pointer]="if VAR_"+chr(toDec(padBin(memory[pointer+2])[4:])+65)+" == VAR_"+chr(toDec(padBin(memory[pointer+4])[4:])+65)+" jump "+str(toDec(padBin(memory[pointer+6])[4:]))
pointer+=6
else:
# LDI STA LDA ADD SUB JIE -> if !=
deco[pointer]="if VAR_"+chr(toDec(padBin(memory[pointer+2])[4:])+65)+" != VAR_"+chr(toDec(padBin(memory[pointer+4])[4:])+65)+" jump "+str(toDec(padBin(memory[pointer+5])[4:]))
pointer+=5
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
else:
# LDI STA -> setVar
deco[pointer]="setVar VAR_"+chr(toDec(padBin(memory[pointer+1])[4:])+65)+" "+str(toDec(par))
pointer+=2
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" d#"+toDec(padBin(memory[pointer])[4:])
pointer+=1
elif cmd=="1000": #JIF
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="1001": #JIE
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="1010": #---
deco[pointer]="#<invalid cmd: 1010>"
pointer+=1
elif cmd=="1011": #INP
if padBin(memory[pointer+1],bit=12)[:4]=="0100": #STA
# INP STA -> read
deco[pointer]="read VAR_"+chr(toDec(padBin(memory[pointer+1])[4:])+65)
pointer+=2
else:
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="1100": #JMA
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="1101": #HLO
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="1110": #HST
deco[pointer]=":"+asmMap[toDec(padBin(memory[pointer],bit=12)[:4])]+" v#VAR_"+chr(toDec(padBin(memory[pointer])[4:])+65)
pointer+=1
elif cmd=="1111": #HLT
deco[pointer]="halt"
pointer+=1
if pointer>=lenMem:
break
for d in range(len(deco)):
#if deco[d]!="":
print("["+str(d).zfill(3)+"]> "+deco[d])
if __name__=="__main__":
main()

544
mima.py Normal file
View File

@ -0,0 +1,544 @@
import os
import sys
import pickle
import zlib
import hashlib
import copy
from termcolor import colored
from base64 import *
from colorama import init
init()
OS = "Linux"
#OS = "Windows"
doc = """
0000 NOP
0001 LDC par > A (max 20bit)
0010 LDV [par] > A
0011 STV A > [par]
0100 ADD A + [par] > A
0101 AND A AND [par] > A
0110 LOR A OR [par] > A
0111 XOR A XOR [par] > A
1000 EQL if A==[par]: -1 else 0 > A
1001 JMP Jump to [par]
1010 JMN if A<0: Jump to [par]
1011 NOT NOT A > A
1100 RAR A >> 1 > A
1101 LDI [[par]] > A
1110 STI A > [[par]]
1111 HLT Halt
"""
asmMap = ["NOP","LDC","LDV","STV","ADD","AND","LOR","XOR","EQL","JMP","JMN","NOT","RAR","LDI","STI","HLT"]
bits = 24
opBits = 4
parBits = 20
pointer = 0
registerA = 0
out = 0
color = [["green","on_grey"],["blue","on_grey"],["red","on_grey"],["magenta","on_grey"],["cyan","on_grey"],
["grey","on_white"],["green","on_white"],["blue","on_white"],["red","on_white"],["magenta","on_white"],["cyan","on_white"],
["grey","on_green"],["white","on_green"],["blue","on_green"],["red","on_green"],["magenta","on_green"],["cyan","on_green"],
["grey","on_blue"],["white","on_blue"],["green","on_blue"],["red","on_blue"],["magenta","on_blue"],["cyan","on_blue"],
["grey","on_red"],["white","on_red"],["green","on_red"],["blue","on_red"],["magenta","on_red"],["cyan","on_red"],
["grey","on_magenta"],["white","on_magenta"],["green","on_magenta"],["blue","on_magenta"],["red","on_magenta"],["cyan","on_magenta"],
["grey","on_cyan"],["white","on_cyan"],["green","on_cyan"],["blue","on_cyan"],["red","on_cyan"],["magenta","on_cyan"]]
memory = []
for i in range(2**parBits):
memory.append(0)
def clear():
if OS=="Windows":
os.system("cls")
elif OS=="Linux":
os.system("clear")
else:
print("Error: Unknown OS")
exit()
def toDec(binary):
try:
return int(binary, 2)
except:
return -1
def toBin(decimal):
try:
return int(bin(decimal)[2:])
except:
print("Error: The dec-number "+decimal+" could not be converted to binary")
return decimal
def padBin(binary,bit=bits):
return str(binary).zfill(bit)[-bit:]
def bin_input(display,bit=bits,allowAsm=False):
raw = input(display)
if raw=="x":
return -1
if allowAsm:
for i in range(len(asmMap)):
if raw.find(asmMap[i])!=-1:
raw = raw.replace(asmMap[i],"")
raw = raw.replace(" ","")
if raw.find("_")!=-1:
raw = raw.replace("_","0"*(bit-(len(raw)-1)-4))
raw = str(toBin(i)).zfill(opBits)+raw.zfill(bits-opBits)
break
else:
raw = raw.replace(" ","")
if raw.find("_")!=-1:
raw = raw.replace("_","0"*(bit-(len(raw)-1)))
else:
raw = raw.replace(" ","")
if raw.find("_")!=-1:
raw = raw.replace("_","0"*(bit-(len(raw)-1)))
if raw.find("_")!=-1:
print("[!] input contains multiple spread-zero characters ( _ )")
return bin_input(display)
ret = toDec(raw)
if ret>2**bits:
print("[!] input exceted maximal size for "+str(bit)+"-bit integer!")
return bin_input(display,allowAsm=allowAsm)
if ret==-1:
print("[!] "+raw+" is not a valid binary number!")
return bin_input(display,allowAsm=allowAsm)
return ret
def parse(cmd,par,verbose=False,adress=0):
global registerA
global memory
global out
global pointer
v=verbose
cmd = cmd[-1*opBits:]
if cmd=="0000": #nop
if v: print(padBin(toBin(adress),bit=parBits)+": NOP")
elif cmd=="0001": #ldc
registerA = par
if v: print(padBin(toBin(adress),bit=parBits)+": LDC "+padBin(toBin(par),bit=parBits)+" > Akku")
elif cmd=="0010": #ldv
registerA = memory[par]
if v: print(padBin(toBin(adress),bit=parBits)+": LDV ["+padBin(toBin(par),bit=parBits)+"] > Akku")
elif cmd=="0011": #stv
memory[par] = registerA
if v: print(padBin(toBin(adress),bit=parBits)+": STA Akku > ["+padBin(toBin(par),bit=parBits)+"]")
elif cmd=="0100": #add
registerA = (registerA + memory[par]) % 2**parBits
if v: print(padBin(toBin(adress),bit=parBits)+": ADD Akku + ["+padBin(toBin(par),bit=parBits)+"]")
elif cmd=="0101": #and
newRegA = ""
for b in range(len(padBin(toBin(registerA)))):
if padBin(toBin(int(registerA)))[b]=="1" and padBin(toBin(int(memory[par])))[b]=="1":
newRegA+="1"
else:
newRegA+="0"
registerA = toDec(newRegA)
if v: print(padBin(toBin(adress),bit=parBits)+": AND Akku, ["+padBin(toBin(par),bit=parBits)+"]")
elif cmd=="0110": #lor
newRegA = ""
for b in range(len(str(registerA))):
newRegA+=str(int( int(padBin(toBin(int(registerA)))[b]) or int(padBin(toBin(int(memory[par])))[b]) ))
registerA = toDec(newRegA)
if v: print(padBin(toBin(adress),bit=parBits)+": OR Akku, ["+padBin(toBin(par),bit=parBits)+"]")
elif cmd=="0111": #XOR
newRegA = ""
for b in range(len(padBin(toBin(registerA)))):
if padBin(toBin(registerA))[b] == padBin(toBin(memory[par]))[b]:
newRegA+="0"
else:
newRegA+="1"
registerA = toDec(newRegA)
if v: print(padBin(toBin(adress),bit=parBits)+": XOR Akku, ["+padBin(toBin(par),bit=parBits)+"]")
elif cmd=="1000": #EQL
if registerA==memory[par]:
registerA = toDec("1"*bits)
if v: print(padBin(toBin(adress),bit=8)+": EQL {TRUE} Akku ?= "+padBin(toBin(par),bit=parBits))
else:
registerA = 0
if v: print(padBin(toBin(adress),bit=8)+": EQL {FALSE} Akku ?= "+padBin(toBin(par),bit=parBits))
elif cmd=="1001": #jmp
pointer = par - 1
if v: print(padBin(toBin(adress),bit=8)+": JMP "+padBin(toBin(par),bit=parBits))
elif cmd=="1010": #jmn
if registerA>=int("1"+"0"*(bits-1)):
pointer = par - 1
if v: print(padBin(toBin(adress),bit=8)+": JMN {TRUE} > "+padBin(toBin(par),bit=8))
else:
if v: print(padBin(toBin(adress),bit=8)+": JMN {FALSE} > "+padBin(toBin(par),bit=8))
elif cmd=="1011": #not
newRegA = ""
for b in range(len(padBin(toBin(registerA)))):
if padBin(toBin(registerA))[b]=="1":
newRegA+="0"
elif padBin(toBin(registerA))[b]=="0":
newRegA+="1"
else:
print("FUUUUUUUUUU")
exit()
registerA = toDec(newRegA)
if v: print(padBin(toBin(adress),bit=parBits)+": NOT Akku > Akku")
elif cmd=="1100": #rar
newRegA = padBin(toBin(registerA))
newRegA = newRegA[-1]+newRegA[:-1]
registerA = toDec(newRegA)
if v: print(padBin(toBin(adress),bit=parBits)+": RAR Akku > Akku")
elif cmd=="1101": #LDI
mid = memory[par]
registerA = memory[mid % parBits]
if v: print(padBin(toBin(adress),bit=parBits)+": LDI [["+padBin(toBin(par),bit=parBits)+"]] > Akku")
elif cmd=="1110": #STI
mid = memory[par]
memory[mid] = registerA
if v: print(padBin(toBin(adress),bit=parBits)+": STI Akku > [["+padBin(toBin(par),bit=parBits)+"]]")
elif cmd=="1111": #hlt
return -1
return True
if __name__=="__main__":
print("[asmTron by CyberCodeDragon]")
while True:
x = ""
x=input("#> ")
x = x.split(" ")
for i in range(2):
x.append("")
y = x[1]
z = x[2]
x = x[0]
if x=="help" or x=="h":
print("Avaible Commands:")
print("docs - display avaible operants")
print("write [w] - write value to adress")
print("read [r] - read value from adress")
print("dump [d] - dump from adress with length")
print("run [u] - execute programm")
print("edit [e] - edit from adress til >x<")
print("cls - clear screen")
print("clear / reset - clear memory,register,pointer")
print("step [s] - run one command from programm")
print("debug - execute programm with verbose output")
print("pointer - display pointer")
print("setPointer - sets pointer")
print("resetPointer [rp] - sets pointer to zero")
print("register [reg] - displays A register")
print("setRegister - sets A register")
print("save - saves memory to local file")
print("load - loads memory from local file")
print("code / exec - execute one line of shellcode")
print("guiDebug [gd] - graphical debugger <not yet implemented for mima-arch!>")
print("asm - shellcode visualizer (assembly / jump-arrows) <not yet implemented for mima-arch!>")
print("halting - tries to determin, if algorythm will diverge")
elif x=="docs":
print(doc)
elif x=="write" or x=="w":
if y=="" or z=="":
y=bin_input("adress> ")
z=bin_input("value> ")
try:
memory[y] = z
except:
print("[!] Unknown error while writing")
elif x=="read" or x=="r":
if y=="":
y=bin_input("adress> ")
print(padBin(toBin(memory[y])))
elif x=="dump" or x=="d":
if y=="" and z=="":
y=bin_input("adress> ")
z=bin_input("length> ")
elif z=="":
z=toDec(y)
y=0
for m in range(z):
print(padBin(toBin(y+m),bit=parBits)+": "+padBin(toBin(memory[y+m])))
elif x=="run" or x=="u":
while True:
cmd = padBin(toBin(memory[pointer]))[:opBits]
par = int(toDec(padBin(toBin(memory[pointer]))[-parBits:]))
if parse(cmd,par)==-1:
pointer = 0
break
pointer = (pointer + 1) % 2**parBits
elif x=="verboseRun" or x=="vu":
while True:
cmd = padBin(toBin(memory[pointer]))[:opBits]
par = int(toDec(padBin(toBin(memory[pointer]))[-parBits:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = 0
break
pointer = (pointer + 1) % 2**parBits
elif x=="edit" or x=="e":
adress=bin_input("offset> ",bit=parBits)
while True:
value=bin_input(padBin(toBin(adress),bit=parBits)+": "+padBin(toBin(memory[adress]))+" > ",allowAsm=True)
if value==-1:
break
try:
memory[adress] = value
except:
print("[!] Unknown error while writing")
if adress==len(memory)-1:
adress = -1
print("[*] End of mem")
adress = adress + 1
elif x=="cls":
clear()
elif x=="clear" or x=="reset":
pointer = 0
registerA = 0
out = 0
memory = []
for i in range(2**parBits):
memory.append(0)
elif x=="varClear" or x=="vc":
pointer = 0
registerA = 0
out = 0
for i in range((2**parBits)/2):
memory[(2**parBits)/2+i] = 0
elif x=="step" or x=="s":
cmd = padBin(toBin(memory[pointer]))[:opBits]
par = int(toDec(padBin(toBin(memory[pointer]))[-parBits:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = 0
print("[*] Programm halted")
pointer = (pointer + 1) % (2**parBits)
elif x=="debug":
while True:
cmd = padBin(toBin(memory[pointer]))[:opBits]
par = int(toDec(padBin(toBin(memory[pointer]))[-parBits:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = -1
print("[*] Programm halted")
break
pointer = (pointer + 1) % (2**parBits)
elif x=="pointer":
print("POINTER: "+padBin(toBin(pointer),bit=parBits))
elif x=="setPointer":
if y=="":
pointer = bin_input("pointer> ",bit=parBits)
else:
pointer = y
elif x=="resetPointer" or x=="rp":
pointer = 0
elif x=="register" or x=="reg":
print("REGISTER: "+padBin(toBin(registerA)))
elif x=="setRegister":
if y=="":
registerA = bin_input("register> ")
else:
registerA = y
elif x=="save":
if y=="":
print("[*] Current saves:")
for f in os.listdir("saves"):
if f[-8:]==".asmTron":
print("> "+f[:-8])
name = input("name> ")
else:
name = y
with open("saves/"+name+".asmTron", 'wb') as f:
t=pickle.dumps(["mima24_1",memory])
t=zlib.compress(t)
f.write(t)
elif x=="load" or x=="l":
if y=="":
print("[*] Avaible saves:")
for f in os.listdir("saves"):
if f[-8:]==".asmTron":
print("> "+f[:-8])
for f in os.listdir("tronScript"):
if f[-8:]==".asmTron":
print("> tronScript/"+f[:-8])
name = input("name> ")
else:
name = y
try:
with open("saves/"+name+".asmTron", "rb") as f:
t = f.read()
t=zlib.decompress(t)
magicBit,memory = pickle.loads(t)
except Exception as e:
try:
with open("tronScripts/"+name+".asmTron", "rb") as f:
t = f.read()
t=zlib.decompress(t)
magicBit,memory = pickle.loads(t)
except Exception as e:
if b64encode(str(e))[:25]=="W0Vycm5vIDJdIE5vIHN1Y2ggZ":
print(" [!] Error: File '"+name+".asmTron' does not exist")
else:
print(" [!] Error: Unknown Error while reading File '"+name+"' with Errorcode: "+str(b64encode(str(e))))
if not magicBit=="mima24_1":
print("[!] Error: Invalid Magical Bit: "+str(magicBit))
exit()
print("[*] loaded "+name+".asmTron")
elif x=="code" or x=="exec":
if y=="":
data=bin_input("code> ",allowAsm=True)
else:
data=y
cmd = padBin(toBin(memory[pointer]))[:opBits]
par = int(toDec(padBin(toBin(memory[pointer]))[-parBits:]))
parse(cmd,par,verbose=True,adress=0)
elif x=="guiDebug" or x=="gd":
if y=="":
hiOffset = 2**(parBits-1)
else:
hiOffset = 2**(int(y)-1)
runtime = 0
tracker = input("trackers> ").split(",")
running = True
lastPointer = 0
while running:
clear()
print(" +"+"-"*58+"+"+"-"*52+"+"+"-"*36+"+")
print(" |"+" "*20+" - Instructions - "+" "*20+"|"+" "*20+" - Hi-mem - "+" "*20+"|"+" "*36+"|")
if pointer <= 20:
starter = 0
else:
starter = pointer - 20
for i in range(36):
m = i + starter
if pointer == m:
outI = "> "+padBin(toBin(m),bit=parBits)+": "+padBin(toBin(memory[m]))+" ["+doc.split("\n")[toDec(padBin(toBin(memory[m]))[:opBits])+1][:parBits][5:][:3]+"]"+" <"
elif lastPointer == m and pointer-1 != lastPointer:
outI = "- "+padBin(toBin(m),bit=parBits)+": "+padBin(toBin(memory[m]))+" ["+doc.split("\n")[toDec(padBin(toBin(memory[m]))[:opBits])+1][:parBits][5:][:3]+"]"+" -"
else:
outI = " "+padBin(toBin(m),bit=parBits)+": "+padBin(toBin(memory[m]))+" ["+doc.split("\n")[toDec(padBin(toBin(memory[m]))[:opBits])+1][:parBits][5:][:3]+"]"+" "
outII = " "+padBin(toBin(hiOffset+i),bit=parBits)+": "+padBin(toBin(memory[hiOffset+i]))+" "
if i==1:
outIII = " - Akku - "
elif i==2:
outIII = " "*8+padBin(toBin(registerA),bit=parBits)+" "*8
elif i==4:
outIII = " - Runtime - "
elif i==5:
outIII = " "+padBin(toBin(runtime),bit=bits)+" "
elif i==7:
outIII = " - Command - "
elif i==8:
temp=doc.split("\n")[toDec(padBin(toBin(memory[pointer]))[:opBits])+1][5:]
outIII = int((36-len(temp)-1)/2)*" "+" "+temp+int((36-len(temp))/2)*" "
elif i==10:
outIII = " - Parameter - "
elif i==11:
outIII = " "+padBin(toBin(memory[pointer]))[-parBits:]+" "
elif i==13:
outIII = " - Pointer - "
elif i==14:
outIII = " "+padBin(toBin(pointer))+" "
elif i==16:
if len(tracker[0]):
outIII = " - Trackers - "
else:
outIII = " "*36
elif i>16 and i<=16+len(tracker):
if len(tracker[0]):
outIII = " "+str(tracker[i-16-1]) + ": " + padBin(toBin(memory[toDec(tracker[i-16-1])]))+" "
else:
outIII = " "*36
else:
outIII = " "*36
print(" | "+outI+" | "+outII+" |"+outIII+"|")
print(" |"+" "*58+"|"+" "*52+"|"+" "*36+"|")
print(" +"+"-"*58+"+"+"-"*52+"+"+"-"*36+"+")
lastPointer = pointer
cmd = padBin(toBin(memory[pointer]))[:4]
par = int(toDec(padBin(toBin(memory[pointer]))[-8:]))
if parse(cmd,par,verbose=True,adress=pointer)==-1:
pointer = 0
break
pointer = (pointer + 1) % 2**bits
step=input(" <step> ")
if step=="x":
break
runtime = runtime + 1
elif x=="asm":
end = 0
for m in range(len(memory)):
if padBin(toBin(memory[len(memory)-m-1]))[:opBits] != "0"*opBits:
end = len(memory)-m
break
toPrint = []
for m in range(end):
cmd = doc.split("\n")[toDec(padBin(toBin(memory[m]))[:opBits])+1][:parBits][5:]
if toDec(padBin(toBin(memory[m]))[opBits:]) >= toDec("1"+"0"*(parBits-1)) and toDec(padBin(toBin(memory[m]))[opBits:]) <= toDec("1"+"0"*(parBits-7)+"101000"):
toPrint.append(padBin(toBin(m),bit=parBits)+": "+cmd+" "+colored(padBin(toBin(memory[m]))[opBits:],color[(toDec(padBin(toBin(memory[m]))[opBits:])-toDec("1"+"0"*(parBits-1)))][0],color[(toDec(padBin(toBin(memory[m]))[opBits:])-toDec("1"+"0"*(parBits-1)))][1]))
else:
toPrint.append(padBin(toBin(m),bit=parBits)+": "+cmd+" "+padBin(toBin(memory[m]))[opBits:])
origPrint = copy.copy(toPrint)
for l in range(len(toPrint)):
cmd = origPrint[l][10:][:3]
par = origPrint[l][14:]
if cmd == "JMP" or cmd == "JMN":
toPrint[toDec(par)] = toPrint[toDec(par)] + " <-+"
if cmd=="JMP":
toPrint[l] = toPrint[l] + " --+"
else:
toPrint[l] = toPrint[l] + " --?"
if l < toDec(par):
for i in range(len(toPrint)):
if l < i < toDec(par):
toPrint[i] = toPrint[i] + " |"
elif i==toDec(par) or i==l:
t=1
else:
toPrint[i] = toPrint[i] + " "
else:
for i in range(len(toPrint)):
if toDec(par) < i < l:
toPrint[i] = toPrint[i] + " |"
elif i==toDec(par) or i==l:
t=1
else:
toPrint[i] = toPrint[i] + " "
for p in range(len(toPrint)):
print(toPrint[p])
elif x=="halting":
print("[i] Will try to give you information about the divergity of your algorythm")
print("[i] This algorythm may itself not diverge!")
bPointer = pointer
bRegisterA = registerA
bMemory = memory
runtime = 0
stateHashes = []
print("[*] Simulating...")
while True:
runtime+=1
cmd = padBin(toBin(memory[pointer]))[:opBits]
par = int(toDec(padBin(toBin(memory[pointer]))[-parBits:]))
if parse(cmd,par)==-1:
pointer = 0
halts = True
print("[*] Algorythm will diverge after "+str(runtime)+" steps")
break
pointer = (pointer + 1) % 2**parBits
stateHash = hashlib.sha256(str(pointer)+str(registerA)+str(memory)).digest()
if stateHash in stateHashes:
print("[*] Algorythm will not diverge: State-Collision after "+str(runtime)+" steps")
break
else:
stateHashes.append(stateHash)
pointer = bPointer
registerA = bRegisterA
memory = bMemory
elif x=="exit":
exit()
elif x=="":
_=0
else:
print("[!] Error")

80
multiply_test.txt Normal file
View File

@ -0,0 +1,80 @@
Multiplier V.1:
Inputs:
INP
STA 10000000 #Input 1
INP
STA 10000001 #Input 2
Counter-Setup: 00000100
LDI 01111111 #konst
SUB 10000001 #Input 2
STA 10000010 #Round-Pointer
Add: 00001000
LDA 10000011 #Out
ADD 10000000 #Input 1
STA 10000011
Count: 00001100
LDI 00000001
ADD 10000010
STA 10000010
Jump back: 00010001
LDA 10000010
JIF to Add
Outputs: 00010011
LDA 10000011
OUT
HLT
##########
Multiplier V.2:
Inputs:
INP
STA 10000000 #Input 1
INP
STA 10000001 #Input 2
Counter-Setup: 00000100
LDI 10000000 #konst
ADD 10000001 #Input 2
STA 10000010 #Round-Pointer
Add: 00001000
LDA 10000011 #Out
ADD 10000000 #Input 1
STA 10000011
Count: 00001100
LDI 00000001
STA 10000100 #temp1
LDA 10000010 #Round-Pointer
SUB 10000100 #temp1
STA 10000010 #Round-Pointer
Jump back: 00010001
LDA 10000010
JIF to Add
Outputs: 00010011
LDA 10000011
OUT
HLT

57
pow_test.txt Normal file
View File

@ -0,0 +1,57 @@
0000 NOP
0001 LDA memory > A
0010 ADD A + memspace
0011 SUB A - memspace
0100 STA A > memory
0101 OUT A > OUT
0110 JMP Jump to adress
0111 LDI par > A
1000 JIF Jump if (JC)
1001 HLO H-mem[memspace] > A
1010 HST A > H-mem[memspace]
1011 INP IN > A
1100 JMA Jump to A
1101 JRF Jump forward by par
1110 JRB Jump bachward by par
1111 HLT Halt
#####################
Start - Inputs #00011000
INP
STA 10001000 # Base
STA 10001011 # MultiplyRet
INP
STA 10001001 # Pow
Pow Counter #00011101
LDI 01111111
ADD 10001001
STA 10001010 # Pow counter
Call Multiply #00100001
LDA 10001000
STA 10000000 # Multiply Inp 1
LDA 10001011
STA 10000001 # Mutliply Inp 2
JMP 00000001
Loop # 00100111
STA 10001011
LDA 10001010
SUB NopAtEnd # Pow Counter
STA 10001010
JIF to Call Mutliply
Out
LDA 10001011
OUT
HLT 11111111
NOP 00000001

BIN
saves/bug_find.asmTron Normal file

Binary file not shown.

1
saves/color.asmTron Normal file
View File

@ -0,0 +1 @@
xœí˹ƒ@QŸH°T Ì!BPøäoIÛY¨ª<C2A8>÷gœ^ïg,Ÿm_®õ~¶ù½—ë·çÜc°»³l²Å6K{ÐmÐ&mÒ&mÒ&mÒ&mÒ&mÒmÑ6mÓ6mÓ6mÏ6Æ9Ï<39>$I$I$I$I$I$I$I$é¿]¯/¤Y~

BIN
saves/gbi_test.asmTron Normal file

Binary file not shown.

Binary file not shown.

BIN
saves/multiply.asmTron Normal file

Binary file not shown.

BIN
saves/pow.asmTron Normal file

Binary file not shown.

BIN
saves/powPerf.asmTron Normal file

Binary file not shown.

BIN
test.asmTron Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,6 @@
:INP b#00000000
:STA v#A
:INP b#00000000
:ADD v#A
:OUT -
:HLT ~

BIN
tronScript/forTest.asmTron Normal file

Binary file not shown.

7
tronScript/forTest.tron Normal file
View File

@ -0,0 +1,7 @@
read A
read B
setVar STEP 1
for A CLOCK STEP write B

BIN
tronScript/henrik.asmTron Normal file

Binary file not shown.

4
tronScript/henrik.tron Normal file
View File

@ -0,0 +1,4 @@
setVar A 5
setVar B 7
add A B C
write C

Binary file not shown.

View File

@ -0,0 +1,33 @@
#inputs
read BASE
read EXPONENT
setVar ONE 1
setVar ZERO 0
#newVar mulCOUNTER
#newVar mulOUT
copyVar BASE powOUT
jumpMark powLoop
copyVar powOUT IN_A
copyVar BASE IN_B
copyVar ZERO mulOUT
copyVar ZERO mulCOUNTER
jump mulLoop
jumpMark next
add powCOUNTER ONE powCOUNTER
if powCOUNTER != EXPONENT jump powLoop
write mulOUT
halt
jumpMark mulLoop
add mulOUT IN_A mulOUT
add mulCOUNTER ONE mulCOUNTER
if IN_B != mulCOUNTER jump mulLoop
jump next
halt

Binary file not shown.

View File

@ -0,0 +1,14 @@
setVar STEP 1
setVar A 5
push A
setVar A 3
push A
setVar A 7
push A
pop A
write A
pop A
write A
pop A
write A

View File

@ -0,0 +1,45 @@
tronScript is a stupid pretty assembly-like low level language for my asmTron emulator
Available Commands:
newVar [var] - Initializes new var; not needed most of the time:
Compiler automatically initializes new vars when used
jumpMark [jumpMark name] - Sets an JumpMark to jump to using the "jump" command
jump [jumpMark name] - Jumps to an JumpMark
getVarAddress [var A] [var B] - Saves [var A]'s memory-address into [var B]
getArrayAddress [array] [index] [var] - Saves [array][[index]]'s memory-adress into [var]
exec [func name] - Executes function with name [func name]
setVar [var] [value] - Sets var [var] to [value] (decimal)
setVar [var] b[value] - Sets var [var] to [value] (binary)
setArrayIndex [array] [index] [value] - Sets [array][[index]] to [value] (decimal)
setArrayIndex [array] [index] b[value] - Sets [array][[index]] to [value] (binary)
getArrayIndex [array] [index] [var] - Stores the content of [array][[index]] into var [var]
copyVar [var A] [var B] - Copies to value of [var A] to [var B] (B=A)
write [var] - Writes value of [var] to console
read [var] - Reads input from console into [var]
add [var A] [var B] [var OUT] - Adds [var A] + [var B] = [var OUT]
subtract [var A] [var B] [var OUT] - Subtracts [var A] - [var B] = [var OUT]
if [var A] [??] [var B] [cmd] [pars] - ?? = [==,!=,>,<,>=,<=] if clause is true,
executes [cmd] with [pars]
for [goal] [counter] [step] [cmd] [pars]- Sets [counter] = 0; Executes [cmd] with [pars] and
adds [step] to [counter], until [goal]==[counter]
:[asm] v#[var] - Executes [asm]-assembler command with par [var]
:[asm] d#[par] - Executes [asm]-assembler command with par [par] (decimal)
:[asm] b#[par] - Executes [asm]-assembler command with par [par] (binary)
:[asm] - - Executes [asm]-assembler command with par b#00000000 / d#0
:[asm] ~ - Executes [asm]-assembler command with par b#11111111 / d#255
shellcode [code] - Executes binary code [code]
nop - Nothing; sleep one cycle
halt - Stops execution of program; automatically added to the end of
your program if not present
function [funcName] { - Defines function [funcName] with code [funcCode]
[funcCode line 1] ! Every function can only have one instance at a time:
[funcCode line 2] ! A function shall not call itself and a sub function shall
[funcCode line 3] ! not call any of its root functions !!!
. ! If you need this functionality, implement it in assembly...
.
. Why is that so? This is a stupid compiler, which does not use
[funcCode line n] a stack to return from functions, but a function-specific variable
} to store the jump-back-address... :P