Ejemplo n.º 1
0
    def __open_bin(self, bin_location):
        """
        Opens a bin and makes it 540 bytes if it wasn't

        :param bin_location: file location of bin you want to open
        :return: opened bin
        """
        bin_fp = open(bin_location, 'rb')

        bin_dump = bytes()
        for line in bin_fp:
            bin_dump += line
        bin_fp.close()

        if len(bin_dump) == 540:
            with open(bin_location, 'rb') as fp:
                dump = AmiiboDump(self.master_keys, fp.read())
                return dump
        elif 532 <= len(bin_dump) <= 572:
            while len(bin_dump) < 540:
                bin_dump += b'\x00'
            if len(bin_dump) > 540:
                bin_dump = bin_dump[:-(len(bin_dump) - 540)]
            b = open(bin_location, 'wb')
            b.write(bin_dump)
            b.close()

            with open(bin_location, 'rb') as fp:
                dump = AmiiboDump(self.master_keys, fp.read())
                return dump
        else:
            return None
Ejemplo n.º 2
0
def Decrypt():
    global file
    fName = filedialog.askopenfilename(filetypes=(("Amiibo", "*.bin"),
                                                  ("Amiibo", "*.bin")))
    if fName:
        with open(fName, 'rb') as fp:
            dump = AmiiboDump(master_keys, fp.read(), is_locked=True)
        dump.unlock()
        data = dump.data
        data = dump_to_amiitools(data)
        with open(fName + "d", 'wb') as fp:
            fp.write(data)
        file = open(fName + "d", "rb+")
        handaleFile()
Ejemplo n.º 3
0
def make_new_amiibo(unfixed_info, locked_key, amiibo_data, uid):
    try:
        master_keys = AmiiboMasterKey.from_separate_bin(
            unfixed_info.read(), locked_key.read())
    except ValueError as e:
        print_error("Invalid keys: " + str(e))
        sys.exit(EXIT_FAILURE)
    try:
        amiibo = AmiiboDump(master_keys, amiibo_data)
        amiibo.unlock()
    except (AmiiboHMACError, AmiiboHMACTagError, AmiiboDumpSizeError):
        print_error("This amiibo is invalid or corrupt")
        sys.exit(EXIT_FAILURE)
    amiibo.uid_hex = uid_to_hex_format(uid)
    amiibo.lock()
    amiibo.unset_lock_bytes()
    return amiibo
Ejemplo n.º 4
0
def Encrypt():
    global file

    fName = filedialog.asksaveasfilename(filetypes=(("Amiibo", "*.bin"),
                                                    ("Amiibo", "*.bin")))
    if fName:
        SaveCmd()
        curentfile = file.name
        file.close()

        with open(curentfile, 'rb') as fp:
            data = fp.read()
        data = amiitools_to_dump(data)
        dump = AmiiboDump(master_keys, data, is_locked=False)
        dump.lock()
        dump.unset_lock_bytes()
        with open(fName, 'wb') as fp:
            fp.write(dump.data)

        file = open(curentfile, "rb+")
        handaleFile()
Ejemplo n.º 5
0
from easy_nfc import nfc_parser
from amiibo import AmiiboDump, AmiiboMasterKey, crypto

lock_data = [  #page, #byteoffset, #bytedata
    ('82h', 3, [0x01, 0x00, 0x0F, 0xBD]),  #dynamic lockpages
    ('02h', 2, [0x0F, 0x48, 0x0F, 0xE0]),  #static lockpages
]

ni = nfc_parser()

with open('unfixed-info.bin', 'rb') as fp_d, open('locked-secret.bin',
                                                  'rb') as fp_t:
    master_keys = AmiiboMasterKey.from_separate_bin(fp_d.read(), fp_t.read())

with open('orig.bin', 'rb') as fp:
    dump = AmiiboDump(master_keys, fp.read())

try:
    dump.unlock()
except amiibo.crypto.AmiiboHMACDataError:
    print('AmiiboHMACDataError error thrown (corrupt bin?)')
    quit(1)
else:
    print(ni)
    dump.uid_hex = ni.spaced_hex(ni.uid)
    dump.lock()
    dump.unset_lock_bytes()

    with open('dump.bin', 'wb') as fp:
        fp.write(dump.data)