def DecoderLoopBuilder(self, icache_flush): dec_loop = '' # Select p,s,t and q */ arr = [3, 7] p = random_funcs.randel(arr) if p == 3: s = 7 else: s = 3 t = 6 arr2 = [8, 9] q = random_funcs.randel(arr2) # Add the instructions*/ if icache_flush != 0: dec_loop += ARM_Instructions.swi(MI) rsalnum = alphanum_byte.alphanumeric_get_byte() if icache_flush != 0: #EORMIS rp, r4, #(randomly selected alphanumeric value)*/ dec_loop += ARM_Instructions.dpimm(EOR, MI, 1, p, 4, rsalnum) if icache_flush == 1: dist = 0x2c else: dist = 0x28 offset = alphanum_byte.off_gen(dist + 0x04) #SUBPL rs, r4, #(dist+0x04+offset)*/ dec_loop += ARM_Instructions.dpimm(SUB, PL, 0, s, 4, chr(dist + 0x04 + offset)) #SUBPL rs, pc, rs LSR r4*/ dec_loop += ARM_Instructions.dpshiftreg(SUB, 0, s, 0x0f, s, LSR, 4) #EORPLS rt, r4, rs LSR r4*/ dec_loop += ARM_Instructions.dpshiftreg(EOR, 1, t, 4, s, LSR, 4) #EORMIS rp, r4, #rsalnum*/ rsalnum = alphanum_byte.alphanumeric_get_byte() dec_loop += ARM_Instructions.dpimm(EOR, MI, 1, p, 4, rsalnum) #LDRPLB rp, [rs, #(-offset)]*/ dec_loop += ARM_Instructions.lsbyte(LDR, PL, p, s, offset) #SUBPL rs, rs, r5 LSR r4*/ dec_loop += ARM_Instructions.dpshiftreg(SUB, 0, s, s, 5, LSR, 4) #LDRPLB rq, [rs, #(-offset)]*/ dec_loop += ARM_Instructions.lsbyte(LDR, PL, q, s, offset) #EORPLS rp, rq, rp ROR #28*/ dec_loop += ARM_Instructions.dpshiftimm(EOR, 1, p, q, p, 28) #STRPLB rp, [rt, #(-offset)]*/ dec_loop += ARM_Instructions.lsbyte(STR, PL, p, t, offset) #SUBPL rt, rt, r5 LSR r4*/ dec_loop += ARM_Instructions.dpshiftreg(SUB, 0, t, t, 5, LSR, 4) #SUBPL rs, rs, r5 LSR r4*/ dec_loop += ARM_Instructions.dpshiftreg(SUB, 0, s, s, 5, LSR, 4) #RSBPLS rq, rq, #0x3I*/ dec_loop += ARM_Instructions.dpimm(RSB, PL, 1, q, q, 0x30 | self.I) #BMI 0xfffff4*/ dec_loop += ARM_Instructions.bmi() #STRPLB r4, [rt, #-(offset+1)]*/ dec_loop += ARM_Instructions.lsbyte(STR, PL, 4, t, offset + 1) if icache_flush == 1: #SWIPL 0x9f0002*/ dec_loop += ARM_Instructions.swi(PL) return dec_loop
def buildInit(self, input): if len(input) == 0: return ('', input) output = '' #Select values of v and w*/ total = 0x70 arr1 = [0x30, 0x34, 0x38] v1 = random_funcs.randel(arr1) v2 = random_funcs.randel(arr1) topv = ((total - (v1 + v2))/4) + 1 w1 = random_funcs.randel(arr1) w2 = random_funcs.randel(arr1) topw = ((total - (w1 + w2))/4) + 2 arrop = [EOR, SUB, RSB] arrcond = [PL, MI] arrs = [0, 1] arrd = [3, 5, 7] arrn = [1, 2, 3, 4, 5, 6, 7, 8, 9] p = 1 while p <= ((total-8)/4): op = random_funcs.randel(arrop) cond = random_funcs.randel(arrcond) if op == EOR: s = 1 else: s = random_funcs.randel(arrs) d = random_funcs.randel(arrd) n = random_funcs.randel(arrn) if p == topv or p == topw: output += ARM_Instructions.dpimm(op, cond, s, d, n, self.x) else: output += ARM_Instructions.dpimm(op, cond, s, d, n, alphanum_byte.alphanumeric_get_byte()) p += 1 #SUBPL ri, pc, #v1*/ output += ARM_Instructions.dpimm(SUB, PL, 0, self.i, 15, v1) #SUBMI ri, pc, #w1*/ output += ARM_Instructions.dpimm(SUB, MI, 0, self.i, 15, w1) #LDRPLB ri, [ri, #(-v2)]*/ output += ARM_Instructions.lsbyte(LDR, PL, self.i, self.i, v2) #LDRMIB ri, [ri, #(-w2)]*/ output += ARM_Instructions.lsbyte(LDR, MI, self.i, self.i, w2) output += self.algo2() #SUBPL rj, ri, #(x+1)*/ output += ARM_Instructions.dpimm(SUB, PL, 0, self.j, self.i, self.x + 1) #Initializer built!!*/ #Replace 0x91s in decoder with addr_offset*/ input_new = '' for p in input: if p == "\x91": input_new += chr(self.addr_offset) else: input_new += p return (output, input_new)
def algo1(self, input, begin_inp, iter): if len(input) == 0: return '' output = '' offset = 0x91 for p in range(begin_inp, begin_inp + iter): y = ord(input[p]) if alphanum_byte.alphanumeric_check(y): #SUBPL raddr, raddr, rj ROR rk*/ output += ARM_Instructions.dpshiftreg(SUB, 0, self.addr, self.addr, self.j, ROR, self.k) self.size += 4 continue if y >= 0x80: if alphanum_byte.alphanumeric_check(~y): #EORPLS rk, rj, #~y*/ output += ARM_Instructions.dpimm(EOR, PL, 1, self.k, self.j, ~y) #STRMIB rk, [raddr, #(-offset)]*/ output += ARM_Instructions.lsbyte(STR, MI, self.k, self.addr, offset) #SUBMIS rk, ri, #x*/ output += ARM_Instructions.dpimm(SUB, MI, 1, self.k, self.i, self.x) #SUBPL raddr, raddr, rj ROR rk*/ output += ARM_Instructions.dpshiftreg(SUB, 0, self.addr, self.addr, self.j, ROR, self.k) self.size += 4 * 4 continue a = alphanum_byte.alphanumeric_get_complement(~y) b = (a ^ ~y) & 0xff #EORPLS rk, rj, #a*/ output += ARM_Instructions.dpimm(EOR, PL, 1, self.k, self.j, a) #EORMIS rk, rk, #b*/ output += ARM_Instructions.dpimm(EOR, MI, 1, self.k, self.k, b) #STRMIB rk, [raddr, #(-offset)]*/ output += ARM_Instructions.lsbyte(STR, MI, self.k, self.addr, offset) #SUBMIS rk, ri, #x*/ output += ARM_Instructions.dpimm(SUB, MI, 1, self.k, self.i, self.x) #SUBPL raddr, raddr, rj ROR rk*/ output += ARM_Instructions.dpshiftreg(SUB, 0, self.addr, self.addr, self.j, ROR, self.k) self.size += 4 * 5 continue if self.x > y: z1 = self.x - y if alphanum_byte.alphanumeric_check(z1): #SUBPL rk, ri, #z*/ output += ARM_Instructions.dpimm(SUB, PL, 0, self.k, self.i, z1) #STRPLB rk, [raddr, #(-offset)]*/ output += ARM_Instructions.lsbyte(STR, PL, self.k, self.addr, offset) #SUBPL raddr, raddr, rj ROR rk*/ output += ARM_Instructions.dpshiftreg(SUB, 0, self.addr, self.addr, self.j, ROR, self.k) self.size += 4 * 3 continue z2 = self.x + y if alphanum_byte.alphanumeric_check(z2): #RSBPL rk, ri, #z*/ output += ARM_Instructions.dpimm(RSB, PL, 0, self.k, self.i, z2) #STRPLB rk, [raddr, #(-offset)]*/ output += ARM_Instructions.lsbyte(STR, PL, self.k, self.addr, offset) #SUBPL raddr, raddr, rj ROR rk*/ output += ARM_Instructions.dpshiftreg(SUB, 0, self.addr, self.addr, self.j, ROR, self.k) self.size += 4 * 3 continue z3 = self.x ^ y if alphanum_byte.alphanumeric_check(z3): #EORPLS rk, ri, #z*/ output += ARM_Instructions.dpimm(EOR, PL, 1, self.k, self.i, z3) #STRPLB rk, [raddr, #(-offset)]*/ output += ARM_Instructions.lsbyte(STR, PL, self.k, self.addr, offset) #SUBPL raddr, raddr, rj ROR rk*/ output += ARM_Instructions.dpshiftreg(SUB, 0, self.addr, self.addr, self.j, ROR, self.k) self.size += 4 * 3 continue a2 = alphanum_byte.alphanumeric_get_complement(z3) b2 = a2 ^ z3 #EORPLS rk, ri, #a*/ output += ARM_Instructions.dpimm(EOR, PL, 1, self.k, self.i, a2) #EORPLS rk, rk, #b*/ output += ARM_Instructions.dpimm(EOR, PL, 1, self.k, self.k, b2) #STRPLB rk, [raddr, #(-offset)]*/ output += ARM_Instructions.lsbyte(STR, PL, self.k, self.addr, offset) #SUBPL raddr, raddr, rj ROR rk*/ output += ARM_Instructions.dpshiftreg(SUB, 0, self.addr, self.addr, self.j, ROR, self.k) self.size += 4 * 4 return output