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:
HappyZ 2019-03-22 17:22:08 -05:00
parent 454ddf012c
commit 930d8166c4
13 changed files with 485 additions and 0 deletions

View File

@ -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.

View File

@ -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
}

View File

@ -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

View File

@ -0,0 +1,7 @@
#!/bin/sh
echo ""
echo "====================================="
echo "Done!"
echo "====================================="
echo ""

View File

@ -0,0 +1,9 @@
#!/bin/sh
echo ""
echo "====================================="
echo "Welcome DPT Users"
echo "We will begin the process soon"
echo "Fingers crossed!"
echo "====================================="
echo ""

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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