1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| def gen(pc, ins_text): return "_0x%x: %s" % (pc, ins_text)
def decompiler(data): pc = 0 while pc < len(data): opcode = data[pc] op1 = data[pc + 1] op2 = data[pc + 2] op3 = data[pc + 3] asm_text = gen(pc, "Undefine") if opcode == 0: asm_text = gen(pc, "nop") pc += 1 elif opcode == 1: asm_text = gen(pc, "putchar(mem[mem[0x%x]]);" % op1) pc += 2 elif opcode == 2: asm_text = gen(pc, "mem[mem[0x%x]] = getchar();" % op1) pc += 2 elif opcode == 3: asm_text = gen(pc, "mem[0x%x] = 0x%x;" % (op1, op2)) pc += 3 elif opcode == 4: asm_text = gen(pc, "if(mem[0x%x] == mem[0x%x]) goto _0x%x" % (op1, op2, pc + ctypes.c_int8(op3).value + 4)) pc += 4 elif opcode == 5: asm_text = gen(pc, "mem[0x%x] += 0x%x" % (op1, op2)) pc += 3 elif opcode == 6: asm_text = gen(pc, "mem2[0x%x] = ror(mem2[0x%x], 0x%x)" % (op1, op1, op2)) pc += 3 elif opcode == 7: asm_text = gen(pc, "mem2[0x%x] = mem[mem[0x%x]]" % (op1, op2)) pc += 3 elif opcode == 8: asm_text = gen(pc, "mem2[0x%x] += mem2[0x%x]" % (op1, op2)) pc += 3 elif opcode == 9: asm_text = gen(pc, "mem[0x%x] = mem[0x%x]" % (op1, op2)) pc += 3 elif opcode == 10: asm_text = gen(pc, "mem[0x%x] *= 0x%x" % (op1, op2)) pc += 3 elif opcode == 11: asm_text = gen(pc, "mem2[0x%x] -= mem2[0x%x]" % (op1, op2)) pc += 3 elif opcode == 12: if ctypes.c_int8(op2).value < 0: asm_text = gen(pc, "mem2[0x%x] << 0x%x" % (op1, 0x100 - op2)) else: asm_text = gen(pc, "mem2[0x%x] >> 0x%x" % (op1, op2)) pc += 3 elif opcode == 13: asm_text = gen(pc, "mem2[0x%x] ^= 0x%x" % (op1, op2)) pc += 3 elif opcode == 14: asm_text = gen(pc, "mem2[0x%x] *= 0x%x" % (op1, op2)) pc += 3 elif opcode == 15: asm_text = gen(pc, "mem2[mem[0x%x]] = mem2[0x%x]" % (op1, op2)) pc += 3 elif opcode == 16: asm_text = gen(pc, "mem[0x%x] = mem[mem[0x%x]]" % (op1, op2)) pc += 3 elif opcode == 0xff: return else: print("Undefine: 0x%x opcode:%d" % (pc, opcode)) raise print(asm_text)
decompiler(data_code[2: ]) print("data offset:", hex(data_code[0] + 2)) mem = data_code[data_code[0] + 2: ]
print(binascii.b2a_hex(mem[126:126 + 2])) print(binascii.b2a_hex(mem[128:])) print(binascii.b2a_hex(mem[128:128 + 42])) print(mem[128:]) data_cmp = mem[128:128 + 42] cmp_list = [] for i in range(21): gg = (data_cmp[i * 2] << 8) | data_cmp[2 * i + 1] cmp_list.append(gg) print(cmp_list)
|