rom1nux Posté(e) 10 juillet 2015 Share Posté(e) 10 juillet 2015 (modifié) 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 Version Cygwin Version Windows 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 Modifié 20 juillet 2015 par rom1nux 3 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 11 juillet 2015 Auteur Share Posté(e) 11 juillet 2015 Salut, Pour information je viens de passer le source de MTKIMG sous licence GPL3 et j'ai créer un dépot GitHub dédié : https://github.com/rom1nux/mtkimg Si quelqu'un veut participer, n'hésitez pas Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 14 juillet 2015 Auteur Share Posté(e) 14 juillet 2015 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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 17 juillet 2015 Auteur Share Posté(e) 17 juillet 2015 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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Midiland Posté(e) 18 juillet 2015 Share Posté(e) 18 juillet 2015 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. 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 18 juillet 2015 Auteur Share Posté(e) 18 juillet 2015 (modifié) 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é 18 juillet 2015 par rom1nux 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Midiland Posté(e) 18 juillet 2015 Share Posté(e) 18 juillet 2015 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. 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 18 juillet 2015 Auteur Share Posté(e) 18 juillet 2015 (modifié) 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é 18 juillet 2015 par rom1nux Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 19 juillet 2015 Auteur Share Posté(e) 19 juillet 2015 Salut, Je viens de mettre en ligne la Bêta V0.42 qui corrige un bug lors du repack d'un kernel qui possède déjà une entête MTK. (Bug trouvé par Biasi : http://forum.xda-developers.com/android/help/problem-wiko-wunset-flashing-kernel-t3160327) Cette mise à jour est fortement recommandée. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 19 juillet 2015 Auteur Share Posté(e) 19 juillet 2015 Salut, Je viens de mettre en ligne la bêta V0.43 avec le support du Unpack/Repack de l'image logo.bin Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
rom1nux Posté(e) 20 juillet 2015 Auteur Share Posté(e) 20 juillet 2015 Salut, Je viens de mettre en ligne la version V0.44 avec le support des OS 32 bits, j'ai compilé les release : Cygwin32/64, Win32/64 et Linux64. Si quelqu'un veut m'aider à compiler la version OSX, le plus gros est fait théoriquement. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Bixent Posté(e) 3 novembre 2015 Share Posté(e) 3 novembre 2015 (modifié) 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é 4 novembre 2015 par Bixent Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Hackira Posté(e) 15 février 2016 Share Posté(e) 15 février 2016 (modifié) 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é 15 février 2016 par Hackira Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pintu Posté(e) 31 juillet 2017 Share Posté(e) 31 juillet 2017 (modifié) 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é 31 juillet 2017 par Pintu wrong name Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.