add a basic hack pkg (without any complicated process)
does three things (startprocess.sh): 1. replacing diagnosis root password 2. enabling diagnosis mode without OTG 3. patching the customized updater script with key detections
This commit is contained in:
parent
454ddf012c
commit
930d8166c4
|
|
@ -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.
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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 </dev/null >/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
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "====================================="
|
||||||
|
echo "Done!"
|
||||||
|
echo "====================================="
|
||||||
|
echo ""
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "====================================="
|
||||||
|
echo "Welcome DPT Users"
|
||||||
|
echo "We will begin the process soon"
|
||||||
|
echo "Fingers crossed!"
|
||||||
|
echo "====================================="
|
||||||
|
echo ""
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
Binary file not shown.
|
|
@ -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 $</eufwupdater.sh ]
|
||||||
|
tar -cvz --exclude=".*" --numeric-owner -f $@ $<
|
||||||
|
|
||||||
|
.PHONY: all check_sig payload.tar.gz
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm fw.pkg payload.tar.gz
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
all: fw.pkg
|
||||||
|
|
||||||
|
fw.pkg: base.pkg payload.tar.gz
|
||||||
|
echo 12836160f229d466bf4f051ba26fb46697bfa748e81b279b69ad9a5bd340958e $< | sha256sum -c
|
||||||
|
cp $< $@
|
||||||
|
echo "55 -none -in /tmp/anim_sig.dat" | dd bs=32 count=1 seek=536 oflag=seek_bytes 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 -r 's/(..)(..)(..)(..)/\4\3\2\1/' | \
|
||||||
|
xxd -r -p | head -c 4 >> fw.pkg
|
||||||
|
cat payload.tar.gz >> $@
|
||||||
|
|
||||||
|
|
||||||
|
payload.tar.gz: FwUpdater
|
||||||
|
[ -x $</eufwupdater.sh ]
|
||||||
|
tar -cvz --exclude=".*" --owner=0 --group=0 --numeric-owner --no-acls --no-xattrs -f $@ $<
|
||||||
|
|
||||||
|
.PHONY: all check_sig payload.tar.gz
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm fw.pkg payload.tar.gz
|
||||||
|
|
@ -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 $</eufwupdater.sh ]
|
||||||
|
tar -cvz --exclude=".*" --numeric-owner -f $@ $<
|
||||||
|
|
||||||
|
.PHONY: all check_sig payload.tar.gz
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm fw.pkg payload.tar.gz
|
||||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue