Sujet : Outil pour Compression/Decompression kernel

Voici un petit outil que j'avais fais tantôt pour bidouiller avec des kernel alternatifs ( ne pouvant pas utiliser les lkm broadcom )
Déja avec votre toolchain préferé compilez votre kernel pour mips BE
Ensuite épurer les headers du kernel avec un

mips-linux-objcopy -O binary kernel flatimage.bin

J'ai admis que le kernel_start commence toujours à 0x80010000 sinon changer la variable ADDR_BASE dans le script.
Récuperer son entrypoint en greppant kernel_entry dans le System.map géneré pendant la compil
Ensuite la syntaxe :

./krnfbx compress flatimage.bin Ckern 0x80212040 # avec 0x80212040 en EP
./krnfbx decompress kern flatbin # pour decompresser kern dumpé du jtag

Et pour finir ce script tout laid

#!/usr/bin/env python
import sys,os,pylzma,string

def info(type, value, tb):
        print "############# Erreur #############"
        import traceback, pdb
        traceback.print_exception(type, value, tb)
        print "##################################"
sys.excepthook = info

def usage():
        print "%s compress|decompress kernel newkernel <EP 0x80212040>"%sys.argv[0]
        sys.exit(-1)


def getHex(val):
        lenght=""
        for char in val:
                char = str(ord(char).__hex__())[2:]
                if char.__len__()==1:char ="0"+char
                lenght+=char
        return lenght

def getChar(EP):
        if EP.__len__()==10:
                off1 = chr(string.atoi(EP[2:4],16))
                off2 = chr(string.atoi(EP[4:6],16))
                off3 = chr(string.atoi(EP[6:8],16))
                off4 = chr(string.atoi(EP[8:10],16))
                return off1+off2+off3+off4
        else:
                raise IndexError


ADDR_BASE="\x80\x01\x00\x00"
if sys.argv.__len__() > 3:
        if sys.argv[1]=="compress":
                try:
                        print "[+] Compress kernel in progress"
                        Ckern = pylzma.compress(open(sys.argv[2],"r").read(),22)
                        print "[+] Compress kernel OK"
                        conv= "%s"%len(Ckern).__hex__()[2:]
                        while len(conv)<8:conv="0"+conv
                        print "[+] Using EP\t\t%s"%sys.argv[4]
                        print "[+] Using lenght\t0x%s(%i)"%(conv,len(Ckern))
                        data=ADDR_BASE + getChar(sys.argv[4]) + getChar("0x"+conv) + Ckern
                        print "[+] Assembling Data OK writing to %s"%sys.argv[3]
                        open(sys.argv[3],"w").write(data)

                except IndexError:
                        print "[-] Invalid or no entry point :-("
                        sys.exit()

        elif sys.argv[1]=="decompress":
                loadaddr = getHex(open(sys.argv[2]).read()[:4])
                print "[+] LoadAddress\t0x%s"%loadaddr
                EP = getHex(open(sys.argv[2]).read()[4:8])
                print "[+] EntryPoint\t0x%s"%EP
                longueur= getHex(open(sys.argv[2]).read()[8:12])
                hexval = string.atoi(longueur,16)
                print "[+] Lenght\t0x%s (%i)"%(longueur,hexval)
                open(sys.argv[3],"w").write(pylzma.decompress_compat(open(sys.argv[2]).read()[12:],hexval))
                print "[+] OK! %s (%i) ==> %s (%i)"%(sys.argv[2],hexval,sys.argv[3],len(open(sys.argv[3]).read()))

else:
        usage()

Re : Outil pour Compression/Decompression kernel

pas encore testé, mais si ca fonctionne comme prevu je sens que c'est partie pour de nombreuse nuits blanches...

Big merci Savi !!!!

3

Re : Outil pour Compression/Decompression kernel

Savi ->  est-ce qu'il y aurait moyen d'avoir quelques petits commentaires sur le script ?
Disons que ça n'est pas hyper lisible wink

Re : Outil pour Compression/Decompression kernel

ZoZ a écrit:

Savi ->  est-ce qu'il y aurait moyen d'avoir quelques petits commentaires sur le script ?
Disons que ça n'est pas hyper lisible wink

http://skaya.enix.org/wiki/CfeKernel devrait t'aider à comprendre smile

5

Re : Outil pour Compression/Decompression kernel

Merci, c'est beaucoup plus clair comme ça wink

6

Re : Outil pour Compression/Decompression kernel

Petit problème :

############# Erreur #############
Traceback (most recent call last):
  File "./krnfbx", line 62, in ?
    open(sys.argv[3],"w").write(pylzma.decompress_compat(open(sys.argv[2]).read()[12:],hexval))
AttributeError: 'module' object has no attribute 'decompress_compat'
##################################

Je ne vois pas le problème :  l'attribut  'decompress_compat' existe bien ??

Re : Outil pour Compression/Decompression kernel

ZoZ a écrit:

Petit problème :

############# Erreur #############
Traceback (most recent call last):
  File "./krnfbx", line 62, in ?
    open(sys.argv[3],"w").write(pylzma.decompress_compat(open(sys.argv[2]).read()[12:],hexval))
AttributeError: 'module' object has no attribute 'decompress_compat'
##################################

Je ne vois pas le problème :  l'attribut  'decompress_compat' existe bien ??

Télécharger et installer pylzma -> http://www.joachim-bauch.de/projects/python/pylzma/