Guest User

packer

a guest
Jun 21st, 2018
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.04 KB | None | 0 0
  1. from Crypto.Cipher import AES
  2. from Crypto.Util import Counter
  3. import struct
  4.  
  5. import hashlib
  6. from binascii import hexlify, unhexlify
  7.  
  8. """
  9. typedef struct boot_dat_hdr
  10. {
  11.     unsigned char ident[0x10];
  12.     unsigned char sha2_s2[0x20];
  13.     unsigned int s2_dst;
  14.     unsigned int s2_size;
  15.     unsigned int s2_enc;
  16.     unsigned char pad[0x10];
  17.     unsigned int s3_size;
  18.     unsigned char pad2[0x90];
  19.     unsigned char sha2_hdr[0x20];
  20. } boot_dat_hdr_t;
  21. """
  22.  
  23. def aes_ctr_dec(buf, key, iv):
  24.     ctr = Counter.new(128, initial_value=int(hexlify(iv), 16))
  25.     return AES.new(key, AES.MODE_CTR, counter=ctr).encrypt(buf)
  26.  
  27. def aes_ctr_enc(buf, key, iv):
  28.     ctr = Counter.new(128, initial_value=int(hexlify(iv), 16))
  29.     return AES.new(key, AES.MODE_CTR, counter=ctr).decrypt(buf)
  30.  
  31. boot = open('boot_recompiled.dat', 'wb')
  32. e0sHashBytes = b""
  33.  
  34. # Get rights keys
  35. f = open("boot.dat", "rb")
  36. b = f.read()
  37. f.close()
  38.  
  39. boot_ver = struct.unpack("I", b[0x0C:0x10])[0]
  40. print(hex(boot_ver))
  41. s2_base, s2_size = struct.unpack("II", b[0x30:0x38])
  42.  
  43. stage2 = open("stage2_{0:08X}.bin".format(s2_base), 'rb').read()
  44.  
  45. if boot_ver == 0x302E3156:
  46.     s2_key = unhexlify("47E6BFB05965ABCD00E2EE4DDF540261")
  47.     s2_ctr = unhexlify("8E4C7889CBAE4A3D64797DDA84BDB086")
  48.    
  49.     arm64_key = unhexlify("35D8FFC4AA1BAB9514825EB0658FB493")
  50.     arm64_ctr = unhexlify("C38EA26FF3CCE98FD8D5ED431D9D5B94")
  51.     arm64_off = 0x53BAB0
  52.     arm64_size = 0x36370
  53.     arm64_base = 0x80FFFE00
  54.    
  55.     fb_key = unhexlify("E2AC05206A701C9AA514D2B2B7C9F395")
  56.     fb_ctr = unhexlify("46FAB59AF0E469EF116614DEC366D15F")
  57.     fb_off = 0x17BAB0
  58.     fb_size = 0x3C0000
  59.     fb_base = 0xF0000000
  60.    
  61.     data_key = unhexlify("030D865B7E458B10AD5706F6E227F4EB")
  62.     data_ctr = unhexlify("AFFC93692EBD2E3D252339F01E03416B")
  63.     data_off = 0x5F40
  64.     data_size = 0x175B70
  65.     data_base = 0x80000000
  66. elif boot_ver == 0x312E3156:
  67.     s2_key = unhexlify("47E6BFB05965ABCD00E2EE4DDF540261")
  68.     s2_ctr = unhexlify("8E4C7889CBAE4A3D64797DDA84BDB086")
  69.    
  70.     arm64_key = unhexlify("51A39F0B46BAE4691AD39A698146E865")
  71.     arm64_ctr = unhexlify("7A307ED7F1ECC792F0E821ECD6999853")
  72.     arm64_off = 0x53BAE0
  73.     arm64_size = 0x36370
  74.     arm64_base = 0x80FFFE00
  75.    
  76.     fb_key = unhexlify("27BABEE3DCFEF100C744A2388B57E957")
  77.     fb_ctr = unhexlify("0B88AC25AFAF9B92D81372331AD66E24")
  78.     fb_off = 0x17BAE0
  79.     fb_size = 0x3C0000
  80.     fb_base = 0xF0000000
  81.    
  82.     data_key = unhexlify("8D6FEABE0F3936145A474D3F05D33679")
  83.     data_ctr = unhexlify("2846EFA9DACB065C51C71C154F0E9EA2")
  84.     data_off = 0x5F50
  85.     data_size = 0x175B90
  86.     data_base = 0x80000000
  87. else:
  88.     exit()
  89.  
  90. #ident
  91. e0sHashBytes += b'\x54\x58\x20\x42\x4F\x4F\x54\x00\x00\x00\x00\x00'
  92. e0sHashBytes += b[0x0C:0x10]
  93. #sha-256 of stage2_40020000.bin
  94. sha256 = hashlib.new('sha256')
  95. sha256.update(stage2)
  96. e0sHashBytes += sha256.digest()
  97. # todo: write s2_dst, hardcoded :\
  98. e0sHashBytes += b'\x00\x00\x02\x40'
  99. # write s2_size
  100. e0sHashBytes += struct.pack('I', len(stage2))
  101. # write s2_enc
  102. e0sHashBytes += struct.pack('I', 1)
  103. # 0x10 size padding
  104. e0sHashBytes += b'\x00' * 0x10
  105. # s3_size?
  106. if boot_ver == 0x302E3156:
  107.     e0sHashBytes += b'\x50\x2B\xED\x00'
  108. elif boot_ver == 0x312E3156:
  109.     e0sHashBytes += b'\x20\x2F\xED\x00'
  110. # 0x90 size padding
  111. e0sHashBytes += b'\x00' * 0x90
  112. # write all that data
  113. boot.write(e0sHashBytes)
  114. # calculate e0ssha256
  115. sha256 = hashlib.new('sha256')
  116. sha256.update(e0sHashBytes)
  117. boot.write(sha256.digest())
  118. # stage2
  119. boot.write(aes_ctr_enc(stage2, s2_key, s2_ctr))
  120. # data
  121. print("Data offset : " + hex(boot.tell()))
  122. boot.write(aes_ctr_enc(open("data_{0:08X}.bin".format(data_base), 'rb').read(), data_key, data_ctr))
  123. # fb
  124. print("fb offset : " + hex(boot.tell()))
  125. boot.write(aes_ctr_enc(open("fb_{0:08X}.bin".format(fb_base), 'rb').read(), fb_key, fb_ctr))
  126. # arm64
  127. print("arm64 offset : " + hex(boot.tell()))
  128. boot.write(aes_ctr_enc(open("arm64_{0:08X}.bin".format(arm64_base), 'rb').read(), arm64_key, arm64_ctr))
  129.  
  130. # write rest of boot.dat
  131. with open('boot.dat', 'rb') as fh:
  132.     fh.seek(boot.tell(), 0)
  133.     boot.write(fh.read())
  134.  
  135. boot.close()
Advertisement
Add Comment
Please, Sign In to add comment