diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/LICENSE b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/LICENSE new file mode 100755 index 0000000..e70b1e4 --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Jan-Gerd Tenberge + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/diag_functions b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/diag_functions new file mode 100755 index 0000000..7883454 --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/diag_functions @@ -0,0 +1,70 @@ +#!/bin/sh + + + +# -- private functions -- + +DIAG_get_usb_device () +{ + echo $(( $(i2cget -y -f 1 0x35 0x04) & 0x1F )) +} + + +DIAG_get_hash () +{ + md5sum | cut -f1 -d' ' +} + + +DIAG_set_welcome_screen () +{ + epd_fb_test gray GC16 FULL 8 0 700 1020 250 155 +} + + + +# -- public functions -- + +DIAG_get_mode () +{ + return 0 + device_hash=$(rawdata --get_dump=diag_mode | + DIAG_get_hash) + target_hash=$(dd if=/dev/zero count=1 \ + bs=$(echo $(rawdata --get_offset=diag_mode | cut -f3 -d:)) \ + 2>/dev/null | + DIAG_get_hash) + + if test $(DIAG_get_usb_device) -eq 7; then + echo "USB key detected." + return 0 + fi + + if test $device_hash = $target_hash; then + return 0 + fi + + return 1 +} + + +DIAG_enter () +{ + + initctl start usb + DIAG_set_welcome_screen + + return 0 +} + + +DIAG_enable () +{ + rawdata --set_dump=diag_mode < /dev/zero +} + + +DIAG_disable () +{ + rawdata --set_dump=diag_mode < /dev/urandom +} \ No newline at end of file diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/eufwupdater.sh b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/eufwupdater.sh new file mode 100755 index 0000000..1e86f71 --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/eufwupdater.sh @@ -0,0 +1,63 @@ +#!/bin/sh + +LOG_FP="/root/updater_$(date +%s).log" +exec &>"$LOG_FP" + +UPDATER_BASE=$(dirname ${0}) +cd "$UPDATER_BASE" + +### +### Initialize printing on screen service +### + +YAFT_PID=0 +./yaft /tmp/pty.txt & +YAFT_PID=$! +pty="" +for i in $(seq 1 10); do + pty="$(cat /tmp/pty.txt)" + if [ -n "$pty" ]; then + break; + fi + sleep 1 +done + +if [ -z "$pty" ]; then + echo "openpty failed" + kill -INT $YAFT_PID + exit 0; +fi + +echo "will open pty $pty" +rm "/tmp/_fifo" +mkfifo "/tmp/_fifo" +tee "$pty" < /tmp/_fifo & + +exec &>"/tmp/_fifo" + +### +### Starting message +### +cat LICENSE + +./greetings.sh + + +### +### Start the process +### +./startprocess.sh + + +### +### Ending message +### +./finished.sh + +for i in $(seq 5 -1 1); do + echo "Reboot in ${i} seconds." + sleep 1 +done + + +exit 0 diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/finished.sh b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/finished.sh new file mode 100755 index 0000000..291fbcf --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/finished.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +echo "" +echo "=====================================" +echo "Done!" +echo "=====================================" +echo "" \ No newline at end of file diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/greetings.sh b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/greetings.sh new file mode 100755 index 0000000..496bcf5 --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/greetings.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +echo "" +echo "=====================================" +echo "Welcome DPT Users" +echo "We will begin the process soon" +echo "Fingers crossed!" +echo "=====================================" +echo "" \ No newline at end of file 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 new file mode 100755 index 0000000..b903922 --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/startprocess.sh @@ -0,0 +1,139 @@ +#!/bin/sh + +ROOTPWD=/etc/passwd +DIAGFUNC=/usr/local/bin/diag_functions +UPDATER=/usr/local/bin/updater_check.sh +KEY_DETECTION_TMPF=/tmp/key_pressed.log + + +### +### key detection function +### +detect_key_pressed () { + echo "---- Waiting for key pressing (${1}s count down)..." + tmpcontent="" + for i in $(seq ${1} -1 1) + do + echo "---- Waiting for response for ${i} seconds.." + tmpcontent="$(busybox script -c 'timeout -t 1 keyscan' -f -q ${KEY_DETECTION_TMPF})" + echo $tmpcontent | grep -Fq "HOME" + if [ $? -eq 0 ] + then + echo "---- found HOME!" + return 1 + fi + echo $tmpcontent | grep -Fq "POWER" + if [ $? -eq 0 ] + then + echo "----found POWER!" + return 2 + fi + done + return 0 +} + + +echo "" +echo "================================================" +echo " Replacing diagnosis root password to 12345.." +echo "================================================" +if [ ! -f ${ROOTPWD} ] +then + echo "!! Error: Cannot find ${ROOTPWD}, exiting.." + exit 0 +fi +echo "== Original ${ROOTPWD}:" +cat ${ROOTPWD} +echo "== Backing up..." +cp ${ROOTPWD} ${ROOTPWD}_bak +echo "== Replacing..." +# sed in place +sed -i '/root:/c\root:$6$i2VmFAOV$sEMLa5no1zFKnEpFdobNI2dJFqGZE3sWUFJDf1Jn34vO8\.Q9EuwP5\.7aGpmwNLsyX\/lOrh285\.xSzjSHNzMau0:0:0::\/root:\/bin\/sh' $ROOTPWD +echo "== New ${ROOTPWD}:" +cat ${ROOTPWD} + +# validation +echo "== Looking fine?" +echo "==== If YES, do nothing, or press HOME to continue (default)..." +echo "==== If NO, press POWER to rollback..." +detect_key_pressed 30 +status=$? +if [ $status -eq 2 ] +then + echo "== Rolling back..." + # use cat to prevent permission change + cat ${ROOTPWD}_bak > ${ROOTPWD} + echo "== Current ${ROOTPWD}:" + cat ${ROOTPWD} + echo "== Done. No modifications were made." + exit 0 +fi + + +echo "" +echo "=========================================" +echo " Enabling diagnosis mode without OTG.." +echo "=========================================" +echo "" +echo "== Original ${DIAGFUNC} (30 lines):" +head -n 30 ${DIAGFUNC} +echo "== Backing up..." +cp ${DIAGFUNC} ${DIAGFUNC}_bak +echo "== Enabling..." +# use cat to prevent permission change +cat diag_functions > ${DIAGFUNC} +echo "== New ${DIAGFUNC} (30 lines):" +head -n 30 ${DIAGFUNC} + +# validation +echo "== Looking fine?" +echo "==== If YES, do nothing, or press HOME to continue (default)..." +echo "==== If NO, press POWER to rollback..." +detect_key_pressed 30 +status=$? +if [ $status -eq 2 ] +then + echo "== Rolling back..." + # use cat to prevent permission change + cat ${DIAGFUNC}_bak > ${DIAGFUNC} + echo "== Current ${DIAGFUNC} (30 lines):" + head -n 30 ${DIAGFUNC} + echo "== Done. No modifications were made." + exit 0 +fi + + +echo "" +echo "=======================================" +echo " Patching customized updater script.." +echo "=======================================" +echo "" +echo "== Original ${UPDATER} (30 lines):" +tail -n 30 ${UPDATER} +echo "== Backing up..." +cp ${UPDATER} ${UPDATER}_bak +echo "== Enabling..." +# use cat to prevent permission change +cat updater_check.sh > ${UPDATER} +echo "== New ${UPDATER} (30 lines):" +tail -n 30 ${UPDATER} + +# validation +echo "== Looking fine?" +echo "==== If YES, do nothing, or press HOME to continue (default)..." +echo "==== If NO, press POWER to rollback..." +detect_key_pressed 30 +status=$? +if [ $status -eq 2 ] +then + echo "== Rolling back..." + # use cat to prevent permission change + cat ${UPDATER}_bak > ${UPDATER} + echo "== Current ${UPDATER} (30 lines):" + tail -n 30 ${UPDATER} + echo "== Done. No modifications were made." + exit 0 +fi + + + diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/updater_check.sh b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/updater_check.sh new file mode 100755 index 0000000..e64eefc --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/updater_check.sh @@ -0,0 +1,114 @@ +#!/bin/sh + + +DDAT_MOUNT_PATH=/tmp/ddat +END_USER_UPDATER_PKG=${DDAT_MOUNT_PATH}/FwUpdater.pkg +KEY_DETECTION_TMPF=/tmp/keyDetect.log + + + +# $1 : reboot=1, shutdown 0 +local_reboot() +{ + umount $DDAT_MOUNT_PATH + sync + sync + mount -o remount,ro / + if [ $1 -eq 1 ] + then + /sbin/reboot + else + /sbin/poweroff + fi + + while [ 1 ] + do + sleep 3 + done +} + + +######################### +# mount tmp file system +######################### +mount -t tmpfs tmpfs /tmp + +######################### +# Button check +######################### + +# animation hint +epd_fb_test gray DU PART 0 && \ +epd_fb_test gray GC16 PART 10 0 50 50 150 50 && \ +sleep 1 && \ +epd_fb_test gray GC16 PART 10 0 50 150 150 50 && \ +sleep 1 && \ +epd_fb_test gray GC16 PART 10 0 50 250 150 50 && \ +sleep 1 & + +# if HOME pressed, go into diagnosis mode directly +busybox script -c "timeout -t 3 keyscan" -f -q ${KEY_DETECTION_TMPF} +grep -Fq "HOME" ${KEY_DETECTION_TMPF} +if [ $? -eq 0 ] +then + rm ${KEY_DETECTION_TMPF} + epd_fb_test gray GC16 PART 10 0 50 50 150 250 + initctl start diag + exit 0 +fi + +# if POWER pressed, cancel and remove update +grep -Fq "POWER" ${KEY_DETECTION_TMPF} +if [ $? -eq 0 ] +then + rm ${KEY_DETECTION_TMPF} + mkdir ${DDAT_MOUNT_PATH} + mount /dev/mmcblk0p16 ${DDAT_MOUNT_PATH} + change_boot_mode.sh normal + rm -rf ${END_USER_UPDATER_PKG} + local_reboot 1 + umount ${DDAT_MOUNT_PATH} +fi + +rm ${KEY_DETECTION_TMPF} + + +######################### +# End User Updater check +######################### + +mkdir ${DDAT_MOUNT_PATH} +mount /dev/mmcblk0p16 ${DDAT_MOUNT_PATH} +if [ -f ${END_USER_UPDATER_PKG} ] +then + rawdata --get_dump=sig_key > /tmp/sig.key + rawdata --get_dump=dec_key > /tmp/dec.key + start_eufwupdater.sh ${END_USER_UPDATER_PKG} /tmp /tmp/sig.key /tmp/dec.key + ret=$? + if [ $ret -eq 0 ] + then + # remove pkg, change normal boot and reboot + change_boot_mode.sh normal + rm -rf ${END_USER_UPDATER_PKG} + local_reboot 1 + # elif [ $ret -eq 1 ] + # then + # # remain pkg, keep boot mode and shutdown + # local_reboot 0 + else + # remove pkg, change normal boot and shutdown + change_boot_mode.sh normal + rm -rf ${END_USER_UPDATER_PKG} + local_reboot 0 + fi +fi + +umount ${DDAT_MOUNT_PATH} + +######################### +# Diag check +######################### + +initctl start diag +exit 0 + diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/yaft b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/yaft new file mode 100755 index 0000000..40b71b2 Binary files /dev/null and b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/FwUpdater/yaft differ diff --git a/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/Makefile b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/Makefile new file mode 100644 index 0000000..3096abf --- /dev/null +++ b/fw_updater_packer_by_shankerzhiwu/pkg_example/hack_basics/Makefile @@ -0,0 +1,20 @@ +all: fw.pkg + +fw.pkg: base.pkg payload.tar.gz + echo 12836160f229d466bf4f051ba26fb46697bfa748e81b279b69ad9a5bd340958e $< | openssl sha256 -c + cp $< $@ + echo "55 -none -in /tmp/anim_sig.dat" | dd bs=8 count=4 seek=67 of=$@ conv=notrunc + echo "00 00 00 00" | xxd -r -p >> $@ + echo "00 00 00 00" | xxd -r -p >> $@ + printf '%08x' $$(wc -c < payload.tar.gz) | sed -E 's/(..)(..)(..)(..)/\4\3\2\1/' | xxd -r -p | head -c 4 >> fw.pkg + cat payload.tar.gz >> $@ + + +payload.tar.gz: FwUpdater + [ -x $> $@ + echo "00 00 00 00" | xxd -r -p >> $@ + printf '%08x' $$(wc -c < payload.tar.gz) | \ + sed -r 's/(..)(..)(..)(..)/\4\3\2\1/' | \ + xxd -r -p | head -c 4 >> fw.pkg + cat payload.tar.gz >> $@ + + +payload.tar.gz: FwUpdater + [ -x $> $@ + echo "00 00 00 00" | xxd -r -p >> $@ + printf '%08x' $$(wc -c < payload.tar.gz) | sed -E 's/(..)(..)(..)(..)/\4\3\2\1/' | xxd -r -p | head -c 4 >> fw.pkg + cat payload.tar.gz >> $@ + + +payload.tar.gz: FwUpdater + [ -x $