Aller au contenu

[TOOLS] MTKIMG : Outils unpack/repack boot.img, recovery.img et logo.bin CPU Mediatek


rom1nux

Recommended Posts

mtkimg.png

Salut,

Pour un projet personnel j'ai eu besoin de bricoler un outils de unpack/repack d'image de boot.img de mon Wiko basé sur un CPU Mediatek.
Mediatek ajoute une entête "non-standard" aux images du kernel et du ramdisk à l'intérieur du boot.img et les outils existant que j'ai trouvé ne sont soit pas portable, soit ils utilisent des dépendances (mkbootimg,etc..) soit ils ne correspondent pas à mon besoin (Suppression ou non des entêtes Mediatek, conservation de la taille de l'image, taux de compression du ramdisk, etc...)

J'ai donc écrit MTKIMG, un outils console, dont voici les caractéristiques :

  • Écrit en C, open-source (GPL3)
  • Portable : Linux, Cygwin, Windows (OXS en cours de portage)
  • Un seul exécutable pour le unpack/repack
  • Unpack/Repack boot.img, recovery.img et logo.bin
  • Conserve la taille de l'image d'origine lors du repack
  • Décompresse automatique le ramdisk
  • Possibilité de conserver ou non les entêtes MTK
  • Gère  les kernels et ramidsk avec ou sans entête MTK
  • Support les ramdisk ROOTFS et le RECOVERY
  • Vérification de l'entête du kernel "ARM Linux zImage"
  • Vérification de l'entête du ramdisk "gzip"
  • Vérification de l'overflow (kernel et/ou ramdisk trop gros)
  • Possibilité de spécifier le taux de compression du ramdisk
  • Livré avec un "test-suite" (Linux et Cygwin seulement pour le moment)
  • Simple d'utilisation, tous les paramétrés sont défaultés
  • Compilation facile
  • Documenté

Version Linux

post-410328-0-91466600-1436582357_thumb.

Version Cygwin

post-410328-0-92993700-1436582361_thumb.

Version Windows

post-410328-0-86984300-1436582366_thumb.

 

Version :

Version : Bêta 0.44

Mise à jour : 20/07/2015

 

Code sources :

https://github.com/rom1nux/mtkimg

 

Releases (Linux, Cygwin, Windows) :

https://github.com/rom1nux/mtkimg/tree/master/releases

 

La version OSX est en cours de portage

 

En espérant que ça aide, n'hésitez pas à me faire un retour constructif

 

post-410328-0-09122500-1437178576_thumb.

Modifié par rom1nux
  • Like 3
Lien vers le commentaire
Partager sur d’autres sites

Salut,

Je voudrais intéger l'extraction des images du logo.bin à MTKIMG mais j'ai un peu de mal trouver de l'information sur le format de l'entête de la partition, en particulier la taille des logos (en pixels) si quelqu'un a de l'info la dessus je serais très interessé.

Merci de votre aide

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Je viens de mettre en ligne la version Bêta 0.41 avec le unpack du logo.bin et la correction d'un problème lors du repack sur la version Windows.

La version OSX est en cours de portage, et voici le liens vers la discution sur XDA :

http://forum.xda-developers.com/android/development/tools-unpack-repack-boot-img-utility-t3154621

Si il y'a des francophone pour m'aider à tester, n'hésitez pas.

Merci d'avance pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

salut,

Je viens de tester ton programme, quand je depack j'ai pas de problème voir ici : https://forum.frandroid.com/topic/223592-compilation-du-kernel-wiko-rainbow-4g/?p=3415597 , par contre quand je repack sa sans rien changer j'ai une erreur :

➜  test git:(master) ✗ ./mtkimg --debug repack -v myboot.img
MTKIMG V0.41(linux64) by rom1nux
Execute command 'repack'...
Parsing arguments...
verbose              : yes
debug                : yes
overwrite            : no
output               : myboot.img
kernel               : kernel.img
ramdisk              : ramdisk.d
config               : image.cfg
no-compress          : no
compress-rate        : 6
Removing file 'ramdisk-tmp.cpio.gz'...
Repacking image to 'myboot.img'...
Packing ramdisk content from 'ramdisk.d'...
Changing directory 'ramdisk.d'...
Packing ramdisk content (compression rate : 6)...
find . | cpio -o -H newc --quiet | gzip -6 -n > ../ramdisk-tmp.cpio.gz
Changing directory '/home/midiland/android/unpackmtk/build/test'...
Reading mtk header from 'kernel.img' (4 bytes)...
Reading kernel zimage header from 'kernel.img' (4 bytes)...
File 'kernel.img' is ARM Linux zImage file !
Reading mtk header from 'ramdisk-tmp.cpio.gz' (4 bytes)...
Reading gzip header from 'ramdisk-tmp.cpio.gz' (2 bytes)...
File 'ramdisk-tmp.cpio.gz' is GZIP file !
Loading image configuration file 'image.cfg'...
total_size =  5947392, img_cfg = 5945344

Image header :

 Signature                      : ANDROID!

 Kernel size                    : 5104624 bytes
 Kernel load address            : 0x10008000

 Ramdisk size                   : 839163 bytes
 Ramdisk load address           : 0x11000000

 Second stage size              : 0 bytes
 Second stage load address      : 0x10F00000

 Tags address                   : 0x10000100
 Page size                      : 2048 bytes
 Product name                   : 'WIKO'
 Command line                   : ''
 ID                             : 5A32127F0C1A56A823348C8CBF4963BD3EFE10EB

Image layout :

 Image size                     : 5945344 bytes
 Header offset                  : 0x00000000
 Header pages                   : 1                    (2048 bytes)
 Kernel offset                  : 0x00000800
 Kernel pages                   : 2493                 (5105664 bytes)
 Ramdisk offset                 : 0x004DF000
 Ramdisk pages                  : 410                  (839680 bytes)
 Total pages                    : 2904                 (5947392 bytes)

ERROR : Kernel and/or ramdisk are too big to fit into image (2048 bytes exceed) !

j'ai la même quand je veux remplacer le kernel.img par mon zImage :

./mtkimg --debug repack -v myboot.img -k zImage -r ramdisk.d
MTKIMG V0.41(linux64) by rom1nux
Execute command 'repack'...
Parsing arguments...
verbose              : yes
debug                : yes
overwrite            : no
output               : myboot.img
kernel               : zImage
ramdisk              : ramdisk.d
config               : image.cfg
no-compress          : no
compress-rate        : 6
Removing file 'ramdisk-tmp.cpio.gz'...
Repacking image to 'myboot.img'...
Packing ramdisk content from 'ramdisk.d'...
Changing directory 'ramdisk.d'...
Packing ramdisk content (compression rate : 6)...
find . | cpio -o -H newc --quiet | gzip -6 -n > ../ramdisk-tmp.cpio.gz
Changing directory '/home/midiland/android/unpackmtk/build/test'...
Reading mtk header from 'zImage' (4 bytes)...
Reading kernel zimage header from 'zImage' (4 bytes)...
File 'zImage' is ARM Linux zImage file !
Reading mtk header from 'ramdisk-tmp.cpio.gz' (4 bytes)...
Reading gzip header from 'ramdisk-tmp.cpio.gz' (2 bytes)...
File 'ramdisk-tmp.cpio.gz' is GZIP file !
Loading image configuration file 'image.cfg'...
total_size =  5957632, img_cfg = 5945344

Image header :

 Signature                      : ANDROID!

 Kernel size                    : 5114112 bytes
 Kernel load address            : 0x10008000

 Ramdisk size                   : 839163 bytes
 Ramdisk load address           : 0x11000000

 Second stage size              : 0 bytes
 Second stage load address      : 0x10F00000

 Tags address                   : 0x10000100
 Page size                      : 2048 bytes
 Product name                   : 'WIKO'
 Command line                   : ''
 ID                             : 5A32127F0C1A56A823348C8CBF4963BD3EFE10EB

Image layout :

 Image size                     : 5945344 bytes
 Header offset                  : 0x00000000
 Header pages                   : 1                    (2048 bytes)
 Kernel offset                  : 0x00000800
 Kernel pages                   : 2498                 (5115904 bytes)
 Ramdisk offset                 : 0x004E1800
 Ramdisk pages                  : 410                  (839680 bytes)
 Total pages                    : 2909                 (5957632 bytes)

ERROR : Kernel and/or ramdisk are too big to fit into image (12288 bytes exceed) !

j'ai regardé un peu ton code, mais je me perd un peu.

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Salut Midiland,

Un autre merci pour ton coup de main, c'est bien sympathique.

Le message indique que le noyau et/ou le ramdisk sont trop gros pour être repacké dans ton image d'origine.

 

Pour information, les blocs dans le boot.img doivent être aligné "à la page" prêt, ici c'est 2048.

 

Pour ton noyau de 5105664 octets

5104624 / 2048 = 2492,49 donc 2493 pages

Ton image d'origine fait 5945344 soit 2903 pages

L'entête fait 1 pages

Il ne reste donc que 2903-2493-1 = 409 pages (837632 octets) pour le ramdisk

 

Pour ton noyau de 5114112 octets

5114112 / 2048 = 2497,12 donc 2498 pages

Ton image d'origine fait 5945344 soit 2903 pages

L'entête fait 1 pages

Il ne reste donc que 2903-2498-1 = 404 pages (827392 octets) pour le ramdisk

 

Ton noyau recompilé fait 9488 octets de plus que ton noyau d'origine.

 

Dans le premier cas (noyau de 5105664 octets):

----------------------------------------------------
             |  Taille  |  Nb.Page  |  Taille Aligné
----------------------------------------------------
Entête       |     596  |        1  |           2048 
Kernel       | 5105664  |     2493  |        5105664
Ramdisk      |  839163  |      410  |         839680
----------------------------------------------------
Total        |          |     2904  |        5947392
Taille image |          |           |        5945344
----------------------------------------------------
Différence   |          |           |          +2048 < en trop
----------------------------------------------------

Dans le second cas (noyau de 5114112 octets)

----------------------------------------------------
             |  Taille  |  Nb.Page  |  Taille Aligné
----------------------------------------------------
Entête       |     596  |        1  |           2048
Kernel       | 5114112  |     2498  |        5115904 
Ramdisk      |  839163  |      410  |         839680
----------------------------------------------------
Total        |          |     2909  |        5957632 
Taille image |          |           |        5945344
----------------------------------------------------
Différence   |          |           |         +12288 < en trop
----------------------------------------------------

Tu compresses le ramdisk avec le taux de compression par defaut (6) essaye avec le taux de compression maximum (9) (--compress-rate 9). Gzip n'est pas prédictible, c'est difficile d'obtenir exactement la même taille que le ramdisk d'origine à cause des timestamps, nom de fichier, etc... mais tu peux t'en approcher en jouant sur le taux de compression.

 

Peux tu me poster le resultat d'un "./mtkimg info boot.img" pour avoir les tailles de blocs d'origine de ta ROM.

Il semble que tu sois ric-rac niveau place dans ton boot.img.

 

Tu peux utiliser l'option --no-decompress / --no-compress pour unpacker/repacker le ramdisk d'origine de ton image d'origine dans le  decompresser/recompresser.

Modifié par rom1nux
  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse, du coups j'ai réussi a repacké boot.img de base, avec le taux de compression 9.

 

Par contre pour le noyau que je compile des source de wiko je n'arrive pas a la même taille que celui d'origine du coups je n’arrive pas a le repacké.

Je suppose de tu calcule la taille max par rapport a la taille de basse du boot.img ?

 

Ensuit je me suis dit que j'allai unpacker mon monboot.img que j'ai repaker grâce a mtk-tools et du coups j'ai une erreur durant l'unpack

➜  test git:(master) ✗ ./mtkimg unpack --debug monboot.img -v
MTKIMG V0.41(linux64) by rom1nux
Execute command 'unpack'...
Parsing arguments...
verbose              : yes
debug                : yes
type                 : boot
input                : monboot.img
overwrite            : no
kernel               : kernel.img
ramdisk              : ramdisk.d
config               : image.cfg
no-decompress        : no
keep-mtk-header      : no
Unpacking boot image 'monboot.img'...
Reading image header (596 bytes)...

Image header :

 Signature                      : ANDROID!

 Kernel size                    : 5114112 bytes
 Kernel load address            : 0x10008000

 Ramdisk size                   : 839165 bytes
 Ramdisk load address           : 0x11000000

 Second stage size              : 0 bytes
 Second stage load address      : 0x10F00000

 Tags address                   : 0x10000100
 Page size                      : 2048 bytes
 Product name                   : ''
 Command line                   : ''
 ID                             : AF20DFFB15996E4A136252CB01363969BB9139A3

Image layout :

 Image size                     : 5957632 bytes
 Header offset                  : 0x00000000
 Header pages                   : 1                    (2048 bytes)
 Kernel offset                  : 0x00000800
 Kernel pages                   : 2498                 (5115904 bytes)
 Ramdisk offset                 : 0x004E1800
 Ramdisk pages                  : 410                  (839680 bytes)
 Total pages                    : 2909                 (5957632 bytes)

Seeking to start of kernel (0x00000800)...
Reading MTK header (512 bytes)...

 Magic                          : 0x88 0x16 0x88 0x58
 Size (bytes)                   : 5104112
 Type                           : KERNEL

ERROR : Kernel header size not consistent with image header size !

D’après ce que j'ai compris, je suppose que le tools que j'ai utiliser n a pas aligné le kernel.

 

Par contre le monboot.img tourne sur mon android.

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

...du coups j'ai réussi a repacké boot.img de base, avec le taux de compression 9....

Cool

 

Par contre pour le noyau que je compile des source de wiko je n'arrive pas a la même taille que celui d'origine du coups je n’arrive pas a le repacké.

Oui tu est juste-juste niveau place sur la taille de ton image d'origine.

 

Je suppose de tu calcule la taille max par rapport a la taille de basse du boot.img ?

Oui, lors du unpack, toutes les infos de l'image d'origine sont stockées dans le fichier image.cfg par défaut, ce fichier est lu lors du repack. C'est la taille de la partition BOOTIMG dans SPFlashTool, il vaut mieux ne pas dépasser, de toute facon SPFlashTool ne te le permettra pas.

 

Ensuit je me suis dit que j'allai unpacker mon monboot.img que j'ai repaker grâce a mtk-tools et du coups j'ai une erreur durant l'unpack

Effectivement :

Dans l'entête Android (HKSIZE) on à la taille du zImage + Entête MTK (512 octets)

Dans l'entête MTK on à la taille du zImage (KZSIZE)

Donc HKSIZE=KZSIZE+512

MTKIMG vérifie la cohérence de ces deux valeur.

Dans ton cas :

HKSIZE        = 5114112
KZSIZE        = 5104112
-----------------------
Différence    =   10000   => Différent de 512 !!!

Quand tu as ajouté l'entête MTK à la main sur ton noyau tu n'as pas mis la bonne taille du zImage

 

MTKIMG à détecté l’incohérence :lol: .

 

Pour information, voici le format de l'entête MTK devant chaque bloc (Kernel et Ramdisk) dans le boot.img/recovery.img ajouté par Mediatek (Ce bloc de 512 octets est aussi appelé entête MTK) .:

----------------------------------------------------------------------------------------------------
Champ  | Taille (Octets) | Description
----------------------------------------------------------------------------------------------------
Magic  |       4         | 0x88 0x16 0x88 0x58
Size   |       4         | Taille du bloc
Type   |      32         | Type du bloc (Ex: KERNEL, ROOTFS, RECOVERY, etc...) complété avec 0x00
Padd   |     472         | Non utilisé (Rempli avec 0xFF)
----------------------------------------------------------------------------------------------------
Total  |     512         |
----------------------------------------------------------------------------------------------------

Le champ "Size" de l’entête de chaque bloc doit être cohérent avec les champs "Size" l'entête principale ANDROID!

Modifié par rom1nux
Lien vers le commentaire
Partager sur d’autres sites

  • 3 months later...

Salut et merci beaucoup pour cet outil.

Toutefois, je rencontre un problème pour unpacker le boot.img de mon Rainbow UP 4G (Mediatek MT6735):

$ ./mtkimg.exe unpack boot.img -v
MTKIMG V0.44(win64) by rom1nux
Unpacking boot image 'boot.img'...
Reading image header (596 bytes)...

Image header :

 Signature                      : ANDROID!

 Kernel size                    : 6413754 bytes
 Kernel load address            : 0x40080000

 Ramdisk size                   : 1148853 bytes
 Ramdisk load address           : 0x44000000

 Second stage size              : 0 bytes
 Second stage load address      : 0x40F00000

 Tags address                   : 0x4E000000
 Page size                      : 2048 bytes
 Product name                   : 'WIKO'
 Command line                   : 'bootopt=64S3,32N2,64N2'
 ID                             : 3D46CCF0561AAE720D674F80EA23D32CF9352B47

Image layout :

 Bloc           Offset      Pages    Size (bytes)
 ------------------------------------------------
 Header     0x00000000          1            2048
 Kernel     0x00000800       3132         6414336
 Ramdisk    0x0061E800        561         1148928
 Free       0x00737000          0               0
 ------------------------------------------------
 Total                       3694         7565312
 ------------------------------------------------

Seeking to start of kernel (0x00000800)...
Reading MTK header (512 bytes)...

 Magic                          : 0x1F 0x8B 0x08 0x00
 Size (bytes)                   : 0
PTW▒>▒▒▒▒QP▒t7▒Đ▒IV▒            : ▒[

ERROR : Kernel header magic is not valid !

Edit: il semblerait que sur le ramdisk de ce boot.img, il n'y ai pas de header,

Modifié par Bixent
Lien vers le commentaire
Partager sur d’autres sites

  • 3 months later...

salut

j'ai aussi un souci en unpackant le boot.img sur windows :

Il me raconte que le fichier kernel.img n'est pas  une zImage ARM linux valide alors que j'utilise un boot.img officiel ...

 

Une petite idée de ce que cela peut être, j'ai probablement mal fait quelque chose mais j'ai suivi ce qui était marqué dans le readme

Modifié par Hackira
Lien vers le commentaire
Partager sur d’autres sites

  • 1 year later...

Hello rom1nux,

I am using your mtkimg tool for AMAZON Fire TV with MTK-8173 chipset. 

I am facing some problem during repacking. Can you help.

 

I did the unpack, using the following command:

# ./mtkimg unpack -m

It created 3 files:

-rw-rw-r- 1 pintu pintu 349 Jul 31 18:15 image.cfg
-rw-rw-r- 1 pintu pintu 14M Jul 31 18:15 kernel.img.mtk

-rw-rw-r- 1 pintu pintu 761K Jul 31 18:15 ramdisk.cpio.gz.mtk

 

After that, I just tried to repack the same image again.

# ./mtkimg repack newboot.img -n -k kernel.img.mtk -r ramdisk.cpio.gz.mtk
MTKIMG V0.44 (linux64) by rom1nux
Repacking image to 'newboot.img' ...
ERROR: Configuration file 'Image.cfg' is not a valid 'ROOTFS' or 'RECOVERY' image descriptor!

 

But it gives the above error.

Can you help me, what is the problem. And how to fix it.

 

If possible, CC me in this mail id: pintu_agarwal@yahoo.com 

 

 

Thanks,

Pintu

Modifié par Pintu
wrong name
Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...