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,stringdef info(type, value, tb):
print "############# Erreur #############"
import traceback, pdb
traceback.print_exception(type, value, tb)
print "##################################"
sys.excepthook = infodef 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 lenghtdef 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 IndexErrorADDR_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()