#!/bin/bash orig=$SECONDS echo "--------------------------------------------------------------------------------" HOMEDIR=$(pwd) export FWORIGDIR="Firmware.orig" export FWBASE="$HOMEDIR/$FWORIGDIR" export FWNEWDIR="Firmware.new" export NEWDIR="$HOMEDIR/$FWNEWDIR" export inc_DIR="${HOMEDIR}/includes" TOOLS_SUBDIR="tools" export TOOLS_DIR="${HOMEDIR}/${TOOLS_SUBDIR}" export include_modpatch="${TOOLS_DIR}/freetz_patch" FBMOD="7170" SPNUM="900" NEWIMG="fw_C_Speedport_900_34.04.57-0_Fritz_Box_DECT_W900V_29.04.76-0-sp2fr-09.10.14-r-593M-946_OEM-avm_de.image" AVM_New_version="XX.XX.XX" TCOM_New_version="XX.XX.XX" #above settings are not in use if ./incl_var is included . ./incl_var RDIR="$HOMEDIR/recoversubscripts" if [ "$PATCH_OEM" != "y" ]; then echo "Option 'Force branding' was not selectet!" sleep 5 exit 0 fi if [ "$BUILDRECOVER" = "y" ]; then echo "--------------------------------------------------------------------------------" echo echo "If you don't want a recover firmware you can use 'Control C'" echo "or better disable this Option within Speed-to-fritz menu." echo "Generation of recover firmware takes about two times as" echo "long as it did take to build the patched firmware." echo echo "--------------------------------------------------------------------------------" fi #------------------------------------------------------------------------------------------------- #------------------------------------------------------------------------------------------------- RECOVERIMG7170="ftp://ftp.avm.de/fritz.box/fritzbox.fon_wlan_7170/x_misc/deutsch/fritz.box_fon_wlan_7170.04.80.recover-image.exe" # multilingual recover firmware is usual larger and preverable if new ones are avalabel # v3 recover can be used as well for all 7270 compatibel boxes # 7390 recover can be used for 7270 compatibel boxes as well RECOVERIMG7270="ftp://ftp.avm.de/fritz.box/fritzbox.fon_wlan_7390/x_misc/deutsch/FRITZ.Box_Fon_WLAN_7390.04.86.recover-image.exe" #------------------------------------------------------------------------------------------------- #------------------------------------------------------------------------------------------------- #5010, 5012, FB Fon und FB Fon WLAN [ "${FBMOD}" == "FBDW" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "FBFo" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "5010" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "5012" ] && R_IMG="$RECOVERIMG7170" #5140, IAD5130, 7050 [ "${FBMOD}" == "5130" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "5140" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "7050" ] && R_IMG="$RECOVERIMG7170" #5050 [ "${FBMOD}" == "5050" ] && R_IMG="$RECOVERIMG7170" #7113, 7140, 7141, 7150 [ "${FBMOD}" == "7113" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "7140" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "7141" ] && R_IMG="$RECOVERIMG7170" [ "${FBMOD}" == "7150" ] && R_IMG="$RECOVERIMG7170" #for all newer 8mb boxes [ "${FBMOD}" == "7170" ] && R_IMG="$RECOVERIMG7170" #for W501 [ "${SPNUM}" == "501" ] && R_IMG="$RECOVERIMG7170" #for a Sinus500 [ "${SPNUM}" == "500" ] && R_IMG="$RECOVERIMG7170" #for all 16MB boxes [ "${FBMOD}" == "7270" ] && R_IMG="$RECOVERIMG7270" [ "${FBMOD}" == "7240" ] && R_IMG="$RECOVERIMG7270" #7270v3 [ "${FBMOD}" == "7273" ] && R_IMG="$RECOVERIMG7270" #for 7390 [ "${FBMOD}" == "7390" ] && R_IMG="$RECOVERIMG7270" #for 7570 [ "${FBMOD}" == "7570" ] && R_IMG="$RECOVERIMG7270" #for a W503 #[ "${SPNUM}" == "503" ] && R_IMG="$RECOVERIMGC503" if [ "$R_IMG" == "" ];then R_IMG="$RECOVERIMG7170" echo "No special original recover firmware selected, 7170 used as default!" sleep 5 fi #------------------------------------------------------------------------------------------------- . $inc_DIR/includefunctions #echo "R_IMG: $R_IMG" export FILENAME_R_IMG_PATH="$(get_item "$R_IMG" "1")" export MIRROR_R_IMG_PATH="$(get_item "$R_IMG" "2")" export R_IMG_PATH="$(get_item "$R_IMG" "0")" fwselect "$R_IMG_PATH" "$FWBASE" "R_IMG" "R_IMG" "$MIRROR_R_IMG_PATH" "$FILENAME_R_IMG_PATH" "${SPNUM}V" input_recover_file="$FWBASE/$(echo $R_IMG | sed -e "s/.*\///")" #echo "input_recover_file: $input_recover_file" #------------------------------------------------------------------------------------------------- kernel_dir="$NEWDIR" mkdir -p "$kernel_dir" output_dir="$(basename "$input_recover_file" | sed -r 's/(.*)\.[^\.]*/\1/')" rm -fr "$output_dir" mkdir -p "$output_dir" [ "$BUILDRECOVER" != "y" ] && [ -f $NEWDIR/$NEWIMG ] && $RDIR/extract_kernel.image $HOMEDIR $NEWIMG $kernel_dir if ! [ -f "$kernel_dir/kernel.image" ];then echo "New kernel.image is missing!" sleep 20 exit 1 fi if ! [ -f "$input_recover_file" ];then echo "AVM $input_recover_file file is missing!" sleep 20 exit 1 fi rm -f "$RDIR/ipsr" (cd $RDIR make > /dev/null ) $RDIR/split_recover $HOMEDIR $input_recover_file $output_dir || . $RDIR/wait_for_enterkey #cp -fv "$output_dir/*" ./1 #cp -v ./1/* "$output_dir" NEWNAME=$(echo "$NEWIMG" | sed -r 's/Speedport_//' | sed -r 's/-r-/-/' | sed -r 's/_OEM-/-/' | sed -r 's/M-/-/' | sed -r 's/-sp2fr-/-/' | sed -r 's/_W...V_/_/' | sed -r 's/_Fritz_Box//' | sed -r 's/_DECT//' | sed -r 's/-0_/_/'| sed -r 's/.image//' | sed -r 's/fw_//' | sed -r 's/C_//' | cut -c-70 | sed -r "s/-$//" )-recover.exe #echo "new name lenght: ${#NEWNAME}" #echo "new name: $NEWNAME" new_recover_file="$kernel_dir/$NEWNAME" new_recover_file="$kernel_dir/Speedport_W${SPNUM}V.recover-image.exe" cp -f "$output_dir/exe_start" "$output_dir/ori_start" ! [ -f "$output_dir/exe_start" ] && echo "missing: $output_dir/exe_start" && sleep 10 && exit 1 ! [ -f "$RDIR/ipsr" ] && echo "missing: $RDIR/ipsr" && sleep 10 && exit 1 ! [ -f "$output_dir/ori_start" ] && echo "missing: $output_dir/ori_start" && sleep 10 && exit 1 [ "${SPNUM}" == "500" ] && sed -i -e "s|FRITZ!Box Fon WLAN 7170|FRITZ!Box Sinus ${SPNUM:0:3} |g" "$output_dir/exe_start" [ "${SPNUM}" == "501" ] && sed -i -e "s|FRITZ!Box Fon WLAN 7170|FRITZ!Box Speedp. W${SPNUM:0:3}V|g" "$output_dir/exe_start" SPNUM+="X" if [ ${SPNUM:3:1} == "X" ]; then sed -i -e "s|FRITZ!Box Fon WLAN ....|FRITZ!Box Speedp. W${SPNUM:0:3}V|g" "$output_dir/exe_end" sed -i -e "s|FRITZ!Box Fon WLAN ....|FRITZ!Box Speedp. W${SPNUM:0:3}V|g" "$output_dir/exe_start" else sed -i -e "s|FRITZ!Box Fon WLAN ....|FRITZ!Box Fon WLAN ${SPNUM:0:4}|g" "$output_dir/exe_start" fi sed -i -e "s|FRITZ!Box Speedp. W${SPNUM:0:3}V v3|FRITZ!Box Speedp. W${SPNUM:0:3}V |g" "$output_dir/exe_end" sed -i -e "s|FRITZ!Box Speedp. W${SPNUM:0:3}V v3|FRITZ!Box Speedp. W${SPNUM:0:3}V |g" "$output_dir/exe_start" #sed is much faster as ipsr! for replacing! #example: ./ipsr/ipsr s 0x85C0590F85FA0100008D85 0x85C0590F85FA0100008D85 "$output_dir/exe_start" # test eax,eax pop eax => 85 C0 59 # jz => 0F 85 #sed -i -e 's| 85 C0 59 0F 85 EF 01 00 00 8D 85 SED="$TOOLS_DIR/sed" [ ! -f "$SED" ] && [ ! -L "$SED" ] && ln -s /bin/sed "$SED" ver=`echo $($SED --version | grep ersion | tr -d [:alpha:],[:blank:],-)` #echo "seddir: $SED" echo "installed sed version on this system: $ver" [ "$ver" != "4.1.6" ] && [ "$ver" != "4.2.1" ] && echo -e "\033[31m --> We need to install a newer local sed version,\nbecause system sed is not compatible!\033[0m\n" && \ sleep 5 && make sedtooldirclean && make sedtool && \ ver=`echo $($SED --version | grep ersion | tr -d [:alpha:],[:blank:],-)` && \ echo "installed sed version on this system: $ver" && \ [ "$ver" != "4.1.6" ] && [ "$ver" != "4.2.1" ] && echo -e "\033[31mcould not install new sed version!\033[0m\n" && sleep 5 && exit 1 #do the sed replacements line by line to give more output in case of errors $SED -i -e 's|\x85\xC0\x59\x0F\x85[\x00-\xFF][\x00-\xFF][\x00-\xFF][\x00-\xFF]\x8D\x85|\x85\xC0\x59\x90\x90\x90\x90\x90\x90\x8D\x85|' "$output_dir/exe_start" $SED -i -e 's|\x85\xC0\x59\x0F\x85[\x00-\xFF][\x00-\xFF][\x00-\xFF][\x00-\xFF]\x39\x9D|\x85\xC0\x59\x90\x90\x90\x90\x90\x90\x39\x9D|' "$output_dir/exe_start" $SED -i -e 's|\x3B\xFB\x74\([\x00-\xFF]\)\x83\xFF\xFF\x89|\x3B\xFB\xEB\1\x83\xFF\xFF\x89|' "$output_dir/exe_start" $SED -i -e 's|\xC4\x0C\x85\xC0[\x00-\xFF]\x4A|\xC4\x0C\x85\xC0\xEB\x4A|' "$output_dir/exe_start" $SED -i -e 's|\x73\[\x00-\xFF][\x00-\xFF][\x00-\xFF]\x50\xB6\x8F\x00|\x73\x00\x90\x90\x50\xB6\x8F\x00|' "$output_dir/exe_start" $SED -i -e 's|\x72\([\x00-\xFF]\)\x81\xFF\xE8\x03\x00\x00|\x72\x08\x81\xFF\xE8\x03\x00\x00|' "$output_dir/exe_start" $SED -i -e 's|\x72\([\x00-\xFF]\)\x39\x7D\x08\x73\([\x00-\xFF]\)\x89|\x73\1\x39\x7D\x08\x73\2\x89|' "$output_dir/exe_start" $SED -i -e 's|\x00\x3B\xC8[\x00-\xFF]\x4A\x8D\x95|\x00\x3B\xC8\xEB\x4A\x8D\x95|' "$output_dir/exe_start" $SED -i -e 's|\x83\xC4\x24\x3B\x4D\x18\x77\([\x00-\xFF]\)\x8D\x85|\x83\xC4\x24\x3B\x4D\x18\xEB\1\x8D\x85|' "$output_dir/exe_start" $SED -i -e 's|\x73\x4A\x8D\x95\x08\xFC\xFF|\xEB\x4A\x8D\x95\x08\xFC\xFF|' "$output_dir/exe_start" ##ipsr v = verbose ##ipsr s = silent ##ipsr p = print address ! $RDIR/ipsr s "0x85c0599090909090908d85" "$output_dir/exe_start" && echo "-- firmware version remove error!" && checkerror="y" ! $RDIR/ipsr s "0x85c0590f85........8d85" "$output_dir/ori_start" && echo "-- firmware version not found check error!" && checkerror="y" ! $RDIR/ipsr s "0x85c059909090909090399d" "$output_dir/exe_start" && echo "-- OEM check remove error!" && checkerror="y" ! $RDIR/ipsr s "0x85c0590f85........399d" "$output_dir/ori_start" && echo "-- OEM check not found error!" && checkerror="y" ! $RDIR/ipsr s "0x3bfbeb..83ffff89" "$output_dir/exe_start" && echo "-- kernel check remove error!" && checkerror="y" ! $RDIR/ipsr s "0x3bfb74..83ffff89" "$output_dir/ori_start" && echo "-- kernel check not found error!" && checkerror="y" ! $RDIR/ipsr s "0xc40c85c0eb4a" "$output_dir/exe_start" && echo "-- CRC check remove error!" && checkerror="y" ! $RDIR/ipsr s "0xc40c85c0..4a" "$output_dir/ori_start" && echo "-- CRC check not found error!" && checkerror="y" ! ($RDIR/ipsr s "0x72..81ffe8030000" "$output_dir/exe_start" || \ $RDIR/ipsr s "0x7300909050b68f00" "$output_dir/exe_start" || \ $RDIR/ipsr s "0x73..397D08730689" "$output_dir/exe_start" ) && echo "-- urloader update remove error!" && checkerror="y" ! ($RDIR/ipsr s "0x72..81ffe8030000" "$output_dir/ori_start" || \ $RDIR/ipsr s "0x73......50b68f00" "$output_dir/ori_start" || \ $RDIR/ipsr s "0x72..397d08730689" "$output_dir/ori_start" ) && echo "-- urloader update not found error!" && checkerror="y" ! $RDIR/ipsr s "0x003bc8eb4a8d95" "$output_dir/exe_start" && echo "-- check kernel size remove error!" && checkerror="y" ! $RDIR/ipsr s "0x003bc8..4a8d95" "$output_dir/ori_start" && echo "-- check kernel size not found error!" && checkerror="y" ! $RDIR/ipsr s "0x83c4243b4d18..458d85" "$output_dir/exe_start" && echo "-- check2 kernel size remove error!" && checkerror="y" ! $RDIR/ipsr s "0x83c4243b4d18..458d85" "$output_dir/ori_start" && echo "-- check2 kernel size not found error!" && checkerror="y" act_size=`ls -l "$output_dir/kernel.image" | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'` new_act_size=`ls -l "$kernel_dir/kernel.image" | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'` act_diff=$((act_size - new_act_size)) #echo "original size= $act_size, new size= $new_act_size, difference= $act_diff" error_size=$((new_act_size - act_size)) [ -n "$kernel_size" ] && [ "$act_size" -lt "$kernel_size" ] && kernel_diff_size=$((kernel_size - act_size)) if [ $act_size -lt $new_act_size ]; then echo "ERROR! New kernel.image does not fit into recover firmware." && checkerror="y" [ -n "$kernel_size" ] && [ "$kernel_diff_size" -gt 0 ] && echo " space within the recover firmware is smaller as in the flash by: $kernel_diff_size Bytes." fi AVM_New_version="$AVM_VERSION_MAJOR.$AVM_VERSION" #TCOM_New_version="$TCOM_VERSION_MAJOR.$TCOM_VERSION" #echo "New recoverversion: $AVM_New_version" #echo "New tcom recoverversion: $TCOM_New_version" OldRversion="$(dd if=$output_dir/exe_mid bs=1 count=16 2> /dev/null)" OldRversion_C="$(dd if=$output_dir/exe_mid bs=1 count=16 2> /dev/null | sed 's/-//' | tr -d '[:alpha:]' | sed 's/-\.//' )" New_Rversion=$AVM_New_version$(dd if=$output_dir/exe_mid bs=1 count=16 2> /dev/null | sed 's/-it/ /' | sed 's/-en/ /' | sed 's/-fr/ /' | sed 's/-sp/ /' | sed 's/ \./ /' | sed "s|$OldRversion_C||") [ "$ORI" != "y" ] && echo "New recoverversion: .$New_Rversion." #echo "Old recoverversion : .$OldRversion." #echo "Old recoverversionC: .$OldRversion_C." [ "$ORI" != "y" ] && sed -i -e "s|$OldRversion|$New_Rversion|" "$output_dir/exe_mid" dd if=/dev/zero bs=1 count=$act_diff >$output_dir/zerro.image 2> /dev/null #echo "concat all parts ..." cat $output_dir/exe_start >$new_recover_file cat $kernel_dir/kernel.image >>$new_recover_file cat $output_dir/zerro.image >>$new_recover_file cat $output_dir/exe_mid >>$new_recover_file cat $output_dir/urlader.image >>$new_recover_file cat $output_dir/exe_end >>$new_recover_file if [ ${SPNUM:3:1} == "X" ]; then if ! `cat "$new_recover_file" | grep -q "FRITZ!Box Speedp. W${SPNUM:0:3}V"`; then echo "-- Text not changed to: FRITZ!Box Speedp. W${SPNUM:0:3}V" fi fi chmod -x $new_recover_file act_size=`ls -l "$input_recover_file" | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'` new_act_size=`ls -l "$new_recover_file" | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'` #echo "actual size= $act_size, new actual size= $new_act_size" [ $act_size -eq $new_act_size ] || echo " Reduce size of kernel.image by: $error_size Bytes." if [ "$checkerror" == "y" ]; then rm -f "$new_recover_file" echo -e "\033[31mNo Recover image was built!\033[0m\n" echo else [ $act_size -eq $new_act_size ] && [ -f "$new_recover_file" ] && echo -e "New recover: \033[32m$new_recover_file\033[0m\n\ To load firmware into your router, transfer this new recover to windows and start it.\n\ This is another method to update a firmware, in most cases this will be\n\ the most reliable way to do a firmware update.\n\ The fastest way is to use the speed-to-fritz LINUX FTP push option.\n\ Update via web-interface is preferable, if settings should be restored or push \n\ FTP transfer did not work because PC network settings are wrong." fi #((elasped=SECONDS-orig)) #echo "elasped time: ${elasped}s" [ "$BUILDRECOVER" = "y" ] && exit 0 echo "All done, Press 'ENTER' to finish" while !(read -s);do sleep 1 done exit 0