GPL:extract fi2 keys.py
Talk0
539pages on
this wiki
this wiki
#!/usr/bin/env python # FI2 key extraction from disassembled files produced with disassemble.pl from http://chdk.wikia.com/wiki/GPL:disassemble.pl' # Copyright (C) 2012 Stefan Talpalaru <stefantalpalaru@yahoo.com> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import sys import re from pprint import pprint def extract_key(f, addr): f.seek(0) processed = 0 start = False mem = [] for line in f: if line.startswith(addr): start = True if start: processed += 1 line_data = re.split(r'\s*', line) mem.append(line_data[1]) if processed == 4: break key = [] for data in mem: tmp = [] for i in xrange(len(data) / 2): tmp.append(data[i * 2 : i * 2 + 2]) key.append(''.join(reversed(tmp))) return ''.join(key) def main(dis_file): f = open(dis_file) # FI2 key for line in f: if line.startswith('ffff0004'): line_data = re.split(r'\s*', line) key_addr = line_data[8][1:-1] break fi2key = extract_key(f, key_addr) print 'FI2KEY=%s' % fi2key # FI2 iv f.seek(0) for line in f: if line.endswith('rsbne\tr1, r1, #16\n'): while not line.endswith(') \n'): line = f.next() line_data = re.split(r'\s*', line) iv_addr = line_data[8][1:-1] break fi2iv = extract_key(f, iv_addr) print 'FI2IV=%s' % fi2iv def usage(): print 'usage: %s file.dis' % sys.argv[0] print ' where file.dis is produced with disassemble.pl from http://chdk.wikia.com/wiki/GPL:disassemble.pl' if __name__ == '__main__': if len(sys.argv) != 2: usage() exit(1) main(*sys.argv[1:])