1. #!/bin/bash
  2. # This is an update version of the script found at
  3. # http://forum.xda-developers.com/wiki/index.php?title=Extract_initramfs_from_zImage
  4. #
  5. # The problem with that script is that the gzip magic number occasionally occur
  6. # naturally, meaning that some non-compressed files get uncompressed.
  7. #GET CURRENT DIR
  8. CURRENT_DIR=`pwd`
  9. TEMP_DIR=$CURRENT_DIR/out
  10. KERNEL_FILE=kernel
  11. KERNEL_GZIP_FILE=kernel.gz
  12. KERNEL_LZMA_FILE=kernel.lzma
  13. KERNEL_XZ_FILE=kernel.xz
  14. KERNEL_LZO_FILE=kernel.lzo
  15. INITRAMFS_FILE=initramfs.cpio
  16. INITRAMFS_DIR=initramfs_root
  17. # DO NOT MODIFY BELOW THIS LINE
  18. [ -z $1 ] && exit 1 || boot_img=$1
  19. [ ! -e $1 ] && exit 1
  20. zImage=$TEMP_DIR/zImage
  21. C_H1="\033[1;36m" # highlight text 1
  22. C_ERR="\033[1;31m"
  23. C_CLEAR="\033[1;0m"
  24. printhl() {
  25. printf "${C_H1}[I] ${1}${C_CLEAR} \n"
  26. }
  27. printerr() {
  28. printf "${C_ERR}[E] ${1}${C_CLEAR} \n"
  29. }
  30. function pre_clean()
  31. {
  32. [ -e $TEMP_DIR ] && rm -rf $TEMP_DIR
  33. mkdir $TEMP_DIR
  34. }
  35. function unpack_kernel()
  36. {
  37. # test Compressed format
  38. pos1=`grep -P -a -b -m 1 --only-matching '\x1F\x8B\x08' $zImage | \
  39. cut -f 1 -d : | awk '(int($0)<50000){print $0;exit}'`
  40. pos2=`grep -P -a -b -m 1 --only-matching '\x{5D}\x{00}\x..\x{FF}\x{FF}\x{FF}\x{FF}\x{FF}\x{FF}' \
  41. $zImage | cut -f 1 -d : | awk '(int($0)<50000){print $0;exit}'`
  42. pos3=`grep -P -a -b -m 1 --only-matching '\xFD\x37\x7A\x58\x5A' $zImage | \
  43. cut -f 1 -d : | tail -1 | awk '(int($0)<50000){print $0;exit}'`
  44. pos4=`grep -P -a -b --only-matching '\211\114\132' $zImage | head -2 | \
  45. tail -1 | cut -f 1 -d : | awk '(int($0)<50000){print $0;exit}'`
  46. zImagesize=$(stat -c "%s" $zImage)
  47. [ -z $pos1 ] && pos1=$zImagesize
  48. [ -z $pos2 ] && pos2=$zImagesize
  49. [ -z $pos3 ] && pos3=$zImagesize
  50. [ -z $pos4 ] && pos4=$zImagesize
  51. minpos=`echo -e "$pos1\n$pos2\n$pos3\n$pos4" | sort -n | head -1`
  52. if [ $minpos -eq $zImagesize ]; then
  53. printerr "not found kernel from $zImage!"
  54. exit 1
  55. elif [ $minpos -eq $pos1 ]; then
  56. ungzip_kernel
  57. elif [ $minpos -eq $pos2 ]; then
  58. unlzma_kernel
  59. elif [ $minpos -eq $pos3 ]; then
  60. unxz_kernel
  61. elif [ $minpos -eq $pos4 ]; then
  62. unlzo_kernel
  63. fi
  64. }
  65. function ungzip_kernel()
  66. {
  67. printhl "Extracting gzip'd kernel image from file: $zImage (start = $pos1)"
  68. dd if=$zImage of=$TEMP_DIR/$KERNEL_GZIP_FILE bs=$pos1 skip=1 2>/dev/null >/dev/null
  69. gunzip -qf $TEMP_DIR/$KERNEL_GZIP_FILE
  70. }
  71. function unlzma_kernel()
  72. {
  73. printhl "Extracting lzma'd kernel image from file: $zImage (start = $pos2)"
  74. dd if=$zImage of=$TEMP_DIR/$KERNEL_LZMA_FILE bs=$pos2 skip=1 2>/dev/null >/dev/null
  75. unlzma -qf $TEMP_DIR/$KERNEL_LZMA_FILE
  76. }
  77. function unxz_kernel()
  78. {
  79. printhl "Extracting xz'd kernel image from file: $zImage (start = $pos3)"
  80. dd status=noxfer if=$zImage bs=$pos3 skip=1 2>/dev/null | unxz -qf > $TEMP_DIR/$KERNEL_FILE 2>/dev/null
  81. }
  82. function unlzo_kernel()
  83. {
  84. printhl "Extracting lzo'd kernel image from file: $zImage (start = $pos4)"
  85. dd if=$zImage of=$TEMP_DIR/$KERNEL_LZO_FILE bs=$pos4 skip=1 2>/dev/null >/dev/null
  86. lzop -d $TEMP_DIR/$KERNEL_LZO_FILE 2>/dev/null >/dev/null
  87. }
  88. function clean_up()
  89. {
  90. #rm -Rf initrd.img
  91. echo end
  92. }
  93. function extract_boot_img()
  94. {
  95. cp $boot_img $TEMP_DIR
  96. cd $TEMP_DIR
  97. abootimg -x $boot_img
  98. cd $CURRENT_DIR
  99. }
  100. pre_clean
  101. extract_boot_img
  102. unpack_kernel
  103. [ -z $3 ] && clean_up

extract_boot_img