Fandom

CHDK Wiki

GPL:extract fi2 keys.py

599pages on
this wiki
Add New Page
Talk0 Share
#!/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:])

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Also on Fandom

Random Wiki