From 536ff8961cfdd87052e4b4f1fd6f3f369d3957be Mon Sep 17 00:00:00 2001 From: ant Date: Fri, 1 Nov 2024 16:21:45 +0100 Subject: [PATCH] chore: rework messages handling on boot images extraction * While we are at it, resolve inconsistencies regarding 'init_boot.img' where the section presented the creation of folder not needed for the partition. * Also, for the formerly said partition, replace the nested 'if' into a simple double condition, considering that 'dumpyara' from Python would already do the necessary for it. --- extract_and_push.sh | 152 ++++++++++++++++++-------------------------- 1 file changed, 63 insertions(+), 89 deletions(-) diff --git a/extract_and_push.sh b/extract_and_push.sh index a38bda6..adf48bd 100755 --- a/extract_and_push.sh +++ b/extract_and_push.sh @@ -327,7 +327,7 @@ UNPACKBOOTIMG="${HOME}/Firmware_extractor/tools/unpackbootimg" # Extract 'boot.img' if [[ -f "${PWD}/boot.img" ]]; then - echo "[INFO] Extracting 'boot.img' content" + # Set a variable for each path ## Image IMAGE=${PWD}/boot.img @@ -338,18 +338,24 @@ if [[ -f "${PWD}/boot.img" ]]; then # Create necessary directories mkdir -p "${OUTPUT}/dts" "${OUTPUT}/dtb" - # Extract device-tree blobs from 'boot.img' - echo "[INFO] Extracting device-tree blobs..." - extract-dtb "${IMAGE}" -o "${OUTPUT}/dtb" > /dev/null || echo "[INFO] No device-tree blobs found." - rm -rf "${OUTPUT}/dtb/00_kernel" + # Python rewrite automatically extracts such partitions + if [[ "${USE_ALT_DUMPER}" == "true" ]]; then + mkdir -p "${OUTPUT}/ramdisk" - # Do not run 'dtc' if no DTB was found - if [ "$(find "${OUTPUT}/dtb" -name "*.dtb")" ]; then - echo "[INFO] Decompiling device-tree blobs..." - # Decompile '.dtb' to '.dts' - for dtb in $(find "${PWD}/boot/dtb" -type f); do - dtc -q -I dtb -O dts "${dtb}" >> "${OUTPUT}/dts/$(basename "${dtb}" | sed 's/\.dtb/.dts/')" || echo "[ERROR] Failed to decompile." - done + # Unpack 'boot.img' through 'unpackbootimg' + echo "[INFO] Extracting 'boot.img' content..." + ${UNPACKBOOTIMG} -i "${IMAGE}" -o "${OUTPUT}" > /dev/null || echo "[ERROR] Extraction unsuccessful." + + # Decrompress 'boot.img-ramdisk' + ## Run only if 'boot.img-ramdisk' is not empty + if file boot.img-ramdisk | grep -q LZ4 || file boot.img-ramdisk | grep -q gzip; then + echo "[INFO] Extracting ramdisk..." + unlz4 "${OUTPUT}/boot.img-ramdisk" "${OUTPUT}/ramdisk.lz4" > /dev/null + 7zz -snld x "${OUTPUT}/ramdisk.lz4" -o"${OUTPUT}/ramdisk" > /dev/null || echo "[ERROR] Failed to extract ramdisk." + + ## Clean-up + rm -rf "${OUTPUT}/ramdisk.lz4" + fi fi # Extract 'ikconfig' @@ -360,42 +366,38 @@ if [[ -f "${PWD}/boot.img" ]]; then } fi - # Kallsyms + # Generate non-stack symbols echo "[INFO] Generating 'kallsyms.txt'..." uvx --from git+https://github.com/marin-m/vmlinux-to-elf@da14e789596d493f305688e221e9e34ebf63cbb8 kallsyms-finder "${IMAGE}" > kallsyms.txt || { echo "[ERROR] Failed to generate 'kallsyms.txt'" } - # ELF + # Generate analyzable '.elf' echo "[INFO] Extracting 'boot.elf'..." uvx --from git+https://github.com/marin-m/vmlinux-to-elf@da14e789596d493f305688e221e9e34ebf63cbb8 vmlinux-to-elf "${IMAGE}" boot.elf > /dev/null || { echo "[ERROR] Failed to generate 'boot.elf'" } - # Python rewrite automatically extracts such partitions - if [[ "${USE_ALT_DUMPER}" == "true" ]]; then - mkdir -p "${OUTPUT}/ramdisk" - - # Unpack 'boot.img' through 'unpackbootimg' - echo "[INFO] Extracting 'boot.img' to 'boot/'..." - ${UNPACKBOOTIMG} -i "${IMAGE}" -o "${OUTPUT}" > /dev/null || echo "[ERROR] Extraction unsuccessful." + # Create necessary directories + mkdir -p "${OUTPUT}/dts" "${OUTPUT}/dtb" - # Decrompress 'boot.img-ramdisk' - ## Run only if 'boot.img-ramdisk' is not empty - if file boot.img-ramdisk | grep -q LZ4 || file boot.img-ramdisk | grep -q gzip; then - echo "[INFO] Extracting ramdisk..." - unlz4 "${OUTPUT}/boot.img-ramdisk" "${OUTPUT}/ramdisk.lz4" > /dev/null - 7zz -snld x "${OUTPUT}/ramdisk.lz4" -o"${OUTPUT}/ramdisk" > /dev/null || echo "[ERROR] Failed to extract ramdisk." + # Extract device-tree blobs from 'boot.img' + echo "[INFO] boot.img: Extracting device-tree blobs..." + extract-dtb "${IMAGE}" -o "${OUTPUT}/dtb" > /dev/null || echo "[INFO] No device-tree blobs found." + rm -rf "${OUTPUT}/dtb/00_kernel" - ## Clean-up - rm -rf "${OUTPUT}/ramdisk.lz4" - fi + # Do not run 'dtc' if no DTB was found + if [ "$(find "${OUTPUT}/dtb" -name "*.dtb")" ]; then + echo "[INFO] Decompiling device-tree blobs..." + # Decompile '.dtb' to '.dts' + for dtb in $(find "${PWD}/boot/dtb" -type f); do + dtc -q -I dtb -O dts "${dtb}" >> "${OUTPUT}/dts/$(basename "${dtb}" | sed 's/\.dtb/.dts/')" || echo "[ERROR] Failed to decompile." + done fi fi # Extract 'vendor_boot.img' if [[ -f "${PWD}/vendor_boot.img" ]]; then - echo "[INFO] Extracting 'vendor_boot.img' content" # Set a variable for each path ## Image IMAGE=${PWD}/vendor_boot.img @@ -403,29 +405,12 @@ if [[ -f "${PWD}/vendor_boot.img" ]]; then ## Output OUTPUT=${PWD}/vendor_boot - # Create necessary directories - mkdir -p "${OUTPUT}/dts" "${OUTPUT}/dtb" "${OUTPUT}/ramdisk" - - # Extract device-tree blobs from 'vendor_boot.img' - echo "[INFO] Extracting device-tree blobs..." - extract-dtb "${IMAGE}" -o "${OUTPUT}/dtb" > /dev/null || echo "[INFO] No device-tree blobs found." - rm -rf "${OUTPUT}/dtb/00_kernel" - - # Decompile '.dtb' to '.dts' - if [ "$(find "${OUTPUT}/dtb" -name "*.dtb")" ]; then - echo "[INFO] Decompiling device-tree blobs..." - # Decompile '.dtb' to '.dts' - for dtb in $(find "${OUTPUT}/dtb" -type f); do - dtc -q -I dtb -O dts "${dtb}" >> "${OUTPUT}/dts/$(basename "${dtb}" | sed 's/\.dtb/.dts/')" || echo "[ERROR] Failed to decompile." - done - fi - # Python rewrite automatically extracts such partitions if [[ "${USE_ALT_DUMPER}" == "true" ]]; then mkdir -p "${OUTPUT}/ramdisk" ## Unpack 'vendor_boot.img' through 'unpackbootimg' - echo "[INFO] Extracting 'vendor_boot.img' to 'vendor_boot/'..." + echo "[INFO] Extracting 'vendor_boot.img' content..." ${UNPACKBOOTIMG} -i "${IMAGE}" -o "${OUTPUT}" > /dev/null || echo "[ERROR] Extraction unsuccessful." # Decrompress 'vendor_boot.img-vendor_ramdisk' @@ -440,8 +425,6 @@ fi # Extract 'vendor_kernel_boot.img' if [[ -f "${PWD}/vendor_kernel_boot.img" ]]; then - echo "[INFO] Extracting 'vendor_kernel_boot.img' content" - # Set a variable for each path ## Image IMAGE=${PWD}/vendor_kernel_boot.img @@ -449,29 +432,12 @@ if [[ -f "${PWD}/vendor_kernel_boot.img" ]]; then ## Output OUTPUT=${PWD}/vendor_kernel_boot - # Create necessary directories - mkdir -p "${OUTPUT}/dts" "${OUTPUT}/dtb" - - # Extract device-tree blobs from 'vendor_kernel_boot.img' - echo "[INFO] Extracting device-tree blobs..." - extract-dtb "${IMAGE}" -o "${OUTPUT}/dtb" > /dev/null || echo "[INFO] No device-tree blobs found." - rm -rf "${OUTPUT}/dtb/00_kernel" - - # Decompile '.dtb' to '.dts' - if [ "$(find "${OUTPUT}/dtb" -name "*.dtb")" ]; then - echo "[INFO] Decompiling device-tree blobs..." - # Decompile '.dtb' to '.dts' - for dtb in $(find "${OUTPUT}/dtb" -type f); do - dtc -q -I dtb -O dts "${dtb}" >> "${OUTPUT}/dts/$(basename "${dtb}" | sed 's/\.dtb/.dts/')" || echo "[ERROR] Failed to decompile." - done - fi - # Python rewrite automatically extracts such partitions if [[ "${USE_ALT_DUMPER}" == "true" ]]; then mkdir -p "${OUTPUT}/ramdisk" # Unpack 'vendor_kernel_boot.img' through 'unpackbootimg' - echo "[INFO] Extracting 'vendor_kernel_boot.img' to 'vendor_kernel_boot/'..." + echo "[INFO] Extracting 'vendor_kernel_boot.img' content..." ${UNPACKBOOTIMG} -i "${IMAGE}" -o "${OUTPUT}" > /dev/null || echo "[ERROR] Extraction unsuccessful." # Decrompress 'vendor_kernel_boot.img-vendor_ramdisk' @@ -482,12 +448,25 @@ if [[ -f "${PWD}/vendor_kernel_boot.img" ]]; then ## Clean-up rm -rf "${OUTPUT}/ramdisk.lz4" fi + + # Create necessary directories + mkdir -p "${OUTPUT}/dts" mkdir -p "${OUTPUT}/dtb" + + # Extract device-tree blobs from 'vendor_kernel_boot.img' + echo "[INFO] vendor_kernel_boot.img: Extracting device-tree blobs..." + extract-dtb "${IMAGE}" -o "${OUTPUT}/dtb" > /dev/null || echo "[INFO] No device-tree blobs found." + rm -rf "${OUTPUT}/dtb/00_kernel" + + # Decompile '.dtb' to '.dts' + if find "${OUTPUT}/dtb" -name "*.dtb"; then + echo "[INFO] Decompiling device-tree blobs..." + find "${OUTPUT}/dtb" -type f \ + -exec sh -c 'dtc -q -I dtb -O dts "${1}" >> "${OUTPUT}/dts/$(basename "${1}" | sed 's/\.dtb/.dts/')"' shell {} \; + fi fi # Extract 'init_boot.img' -if [[ -f "${PWD}/init_boot.img" ]]; then - echo "[INFO] Extracting 'init_boot.img' content" - +if [[ -f "${PWD}/init_boot.img" ]] && [[ "${USE_ALT_DUMPER}" == "false" ]]; then # Set a variable for each path ## Image IMAGE=${PWD}/init_boot.img @@ -496,24 +475,19 @@ if [[ -f "${PWD}/init_boot.img" ]]; then OUTPUT=${PWD}/init_boot # Create necessary directories - mkdir -p "${OUTPUT}/dts" "${OUTPUT}/dtb" + mkdir -p "${OUTPUT}/ramdisk" - # Python rewrite automatically extracts such partitions - if [[ "${USE_ALT_DUMPER}" == "false" ]]; then - mkdir -p "${OUTPUT}/ramdisk" + # Unpack 'init_boot.img' through 'unpackbootimg' + echo "[INFO] Extracting 'init_boot.img' to 'init_boot/'..." + ${UNPACKBOOTIMG} -i "${IMAGE}" -o "${OUTPUT}" > /dev/null || echo "[ERROR] Extraction unsuccessful." - # Unpack 'init_boot.img' through 'unpackbootimg' - echo "[INFO] Extracting 'init_boot.img' to 'init_boot/'..." - ${UNPACKBOOTIMG} -i "${IMAGE}" -o "${OUTPUT}" > /dev/null || echo "[ERROR] Extraction unsuccessful." + # Decrompress 'init_boot.img-ramdisk' + echo "[INFO] Extracting ramdisk..." + unlz4 "${OUTPUT}/init_boot.img-ramdisk" "${OUTPUT}/ramdisk.lz4" > /dev/null + 7zz -snld x "${OUTPUT}/ramdisk.lz4" -o"${OUTPUT}/ramdisk" > /dev/null || echo "[ERROR] Failed to extract ramdisk." - # Decrompress 'init_boot.img-ramdisk' - echo "[INFO] Extracting ramdisk..." - unlz4 "${OUTPUT}/init_boot.img-ramdisk" "${OUTPUT}/ramdisk.lz4" > /dev/null - 7zz -snld x "${OUTPUT}/ramdisk.lz4" -o"${OUTPUT}/ramdisk" > /dev/null || echo "[ERROR] Failed to extract ramdisk." - - ## Clean-up - rm -rf "${OUTPUT}/ramdisk.lz4" - fi + ## Clean-up + rm -rf "${OUTPUT}/ramdisk.lz4" fi # Extract 'dtbo.img' @@ -531,12 +505,12 @@ if [[ -f "${PWD}/dtbo.img" ]]; then mkdir -p "${OUTPUT}/dts" # Extract device-tree blobs from 'dtbo.img' - echo "[INFO] Extracting device-tree blobs..." + echo "[INFO] dbto.img: Extracting device-tree blobs..." extract-dtb "${IMAGE}" -o "${OUTPUT}" > /dev/null || echo "[INFO] No device-tree blobs found." rm -rf "${OUTPUT}/00_kernel" # Decompile '.dtb' to '.dts' - echo "[INFO] Decompiling device-tree blobs..." + echo "[INFO] dbto.img: Decompiling device-tree blobs..." for dtb in $(find "${OUTPUT}" -type f); do dtc -q -I dtb -O dts "${dtb}" >> "${OUTPUT}/dts/$(basename "${dtb}" | sed 's/\.dtb/.dts/')" || echo "[ERROR] Failed to decompile." done