Estava querendo pegar o kernel e o rootfs (initrd) da imagem do SkatOS para dar uma estudada nela.
Procurei na internet para ver se alguém já tinha feito isso antes, não encontrei nada. Então dei uma olhada nos bytes iniciais de um kernel 2.2.26 que é o usado pelo SkatOS, este kernel começa com os seguintes bytes:
b8 c0 07 8e d8 b8 00 90
Então abri o skatos.img com o hte (editor de binário) e mandei procurar a sequencia em hex, procurei apenas os 3 primeiros bytes, encontrei a sequencia na posição 0x6600 e lá estavam os demais bytes. Então converti a posição pra decimal, 0x6600 = 26112, agora é só usar o dd para fazer o trabalho sujo. Mas antes vamos dividir este valor por 16 para podermos usar blocos de 16 bytes, pois copiar byte a byte demora mais. 26112/16 = 1632:
dd if=skatos.img of=kernel_initrd bs=16 skip=1632
Agora só precisamos pegar o initrd, para isso abri o arquivo criado (kernel_initrd) e procurei a string “initrd”, pronto descobri que o initrd começa na posição 0x59600 = 366080, vamos dividir 366080/16 = 22880 :
dd if=kernel_initrd of=initrd bs=16 skip=22880
Agora vamos descompactar o initrd:
mv initrd initrd.gz
gunzip initrd.gz
$ file initrd
initrd: Minix filesystem, 30 char names