diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/start_eufwupdater.sh b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/start_eufwupdater.sh new file mode 100644 index 0000000..d848c0f --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/start_eufwupdater.sh @@ -0,0 +1,128 @@ +#!/bin/sh + +# $1 update package +# $2 output directory +# $3 pub key to verify sig +# $4 pri key to decrypt data key + +SIG_FILE="$2/sig.dat" +AES256_KEY="$2/aes256.key" +IV="$2/iv" + +ANIM_SIG_FILE="$2/anim_sig.dat" +ANIM_PID=0 + + +epd_cmd() +{ + epd_fb_test $@ >/dev/null 2>&1 +} + + +######################################## +# file header check +######################################## +HEAD_MARK=`head -c 4 $1` +if [ $HEAD_MARK != "DPUP" ] +then + echo "Invalid file" + exit 0 +fi + + +DATA_OFFSET=`dd if=$1 bs=4 skip=1 count=1 2>/dev/null | od -A n -t d4 -v` +BODY_SIZE=`dd if=$1 bs=4 skip=2 count=1 2>/dev/null | od -A n -t d4 -v` +######################################## +# start animation for package check +######################################## +ANIM_HEADER_OFFSET=$(( $DATA_OFFSET + $BODY_SIZE )) +if [ -z "$ANIM_HEADER_OFFSET" ] +then + ANIM_HEADER_OFFSET=0 +fi +ANIM_HEADER_SIZE=`dd if=$1 bs=1 skip=$ANIM_HEADER_OFFSET count=4 2>/dev/null | od -A n -t d4 -v` +if [ -z "$ANIM_HEADER_SIZE" ] +then + ANIM_HEADER_SIZE=0 +fi +ANIM_ARCH_SIZE=`dd if=$1 bs=1 skip=$(($ANIM_HEADER_OFFSET + 4)) count=4 2>/dev/null | od -A n -t d4 -v` +ANIM_SIG_SIZE=`dd if=$1 bs=1 skip=$(($ANIM_HEADER_OFFSET + 8)) count=4 2>/dev/null | od -A n -t d4 -v` +dd if=$1 of=$ANIM_SIG_FILE bs=1 skip=$(($ANIM_HEADER_OFFSET + 12)) count=$(($ANIM_SIG_SIZE)) 2>/dev/null +ANIM_ARCH_OFFSET=$(($ANIM_HEADER_OFFSET + $ANIM_HEADER_SIZE)) +dd if=$1 bs=$ANIM_ARCH_OFFSET skip=1 2>/dev/null | head -c $(($ANIM_ARCH_SIZE)) | openssl dgst -sha256 -verify $3 -signature $ANIM_SIG_FILE 1>/dev/null +if [ $? -eq 0 ] +then + start_prepare_animation.sh $1 $2 $ANIM_ARCH_OFFSET $(($ANIM_ARCH_SIZE)) & + ANIM_PID=$! +fi + + + +######################################## +# extract sig +######################################## +SIG_SIZE=`dd if=$1 bs=4 skip=4 count=1 2>/dev/null | od -A n -t d4 -v` +dd if=$1 of=$SIG_FILE bs=1 skip=20 count=$(($SIG_SIZE)) 2>/dev/null + + +######################################## +# verify sig +######################################## +# dd if=$1 bs=$(($DATA_OFFSET)) skip=1 2>/dev/null | head -c $(($BODY_SIZE)) | openssl dgst -sha256 -verify $3 -signature $SIG_FILE 1>/dev/null +#if [ $? -ne 0 ] +#then +# echo "Verify failed." +# exit 0 +#fi + + +######################################## +# decrypt data key +######################################## +ENC_KEY_OFFSET=$((20 + $SIG_SIZE)) +PAD_SIZE=$((16 - $SIG_SIZE % 16 )) +if [ $PAD_SIZE -ne 16 ] +then + ENC_KEY_OFFSET=$(( $ENC_KEY_OFFSET + $PAD_SIZE )) +fi + +ENC_KEY_SIZE=`dd if=$1 bs=1 skip=${ENC_KEY_OFFSET} count=4 2>/dev/null | od -A n -t d4 -v` +ENC_KEY_OFFSET=$(( $ENC_KEY_OFFSET + 4 )) +dd if=$1 bs=1 skip=${ENC_KEY_OFFSET} count=$(($ENC_KEY_SIZE)) 2>/dev/null | openssl rsautl -decrypt -inkey $4 > ${AES256_KEY} + + +######################################## +# extract iv +######################################## +IV_OFFSET=$(($ENC_KEY_OFFSET + $ENC_KEY_SIZE)) +dd if=$1 of=$IV bs=1 skip=${IV_OFFSET} count=32 2>/dev/null + + +######################################## +# decrypt data and extract directory tree +######################################## +dd if=$1 bs=$(($DATA_OFFSET)) skip=1 2>/dev/null | head -c $(($BODY_SIZE)) | openssl enc -d -aes-256-cbc -K `cat ${AES256_KEY}` -iv `cat ${IV}` | tar -xz -C $2 + + +######################################## +# stop animation for package check +######################################## +if [ $ANIM_PID -ne 0 ] +then + kill $ANIM_PID + epd_cmd gray DU PART 0 + epd_cmd wait 300000 +fi + + +######################################## +# start updater +######################################## +if [ -f ${2}/FwUpdater/eufwupdater.sh ] +then + ${2}/FwUpdater/eufwupdater.sh + exit $? # tentative +else + echo "Invalid archive (No updater script)." + exit 0 +fi diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/startprocess.sh b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/startprocess.sh index b903922..f4796a5 100755 --- a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/startprocess.sh +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/startprocess.sh @@ -3,6 +3,7 @@ ROOTPWD=/etc/passwd DIAGFUNC=/usr/local/bin/diag_functions UPDATER=/usr/local/bin/updater_check.sh +FWUPDATER=/usr/local/bin/start_eufwupdater.sh KEY_DETECTION_TMPF=/tmp/key_pressed.log @@ -108,6 +109,7 @@ echo "=======================================" echo " Patching customized updater script.." echo "=======================================" echo "" + echo "== Original ${UPDATER} (30 lines):" tail -n 30 ${UPDATER} echo "== Backing up..." @@ -118,6 +120,16 @@ cat updater_check.sh > ${UPDATER} echo "== New ${UPDATER} (30 lines):" tail -n 30 ${UPDATER} +echo "== Original ${FWUPDATER} (30 lines):" +tail -n 30 ${FWUPDATER} +echo "== Backing up..." +cp ${FWUPDATER} ${FWUPDATER}_bak +echo "== Enabling..." +# use cat to prevent permission change +cat start_eufwupdater.sh > ${FWUPDATER} +echo "== New ${FWUPDATER} (30 lines):" +tail -n 30 ${FWUPDATER} + # validation echo "== Looking fine?" echo "==== If YES, do nothing, or press HOME to continue (default)..." @@ -129,8 +141,11 @@ then echo "== Rolling back..." # use cat to prevent permission change cat ${UPDATER}_bak > ${UPDATER} + cat ${FWUPDATER}_bak > ${FWUPDATER} echo "== Current ${UPDATER} (30 lines):" tail -n 30 ${UPDATER} + echo "== Current ${FWUPDATER} (30 lines):" + tail -n 30 ${FWUPDATER} echo "== Done. No modifications were made." exit 0 fi diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/fw.pkg b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/fw.pkg index cbd2dd5..1472aaf 100644 Binary files a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/fw.pkg and b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/fw.pkg differ