#!/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 abs_ispr="`find -name ipsr_1.c`" RDIR="${abs_ispr%/*}" #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="@AVM/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 #ok#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7390/x_misc/deutsch/fritz.box_wlan_7390_84.04.84.recover-image.exe" #ok#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7390/x_misc/deutsch/fritz.box_wlan_7390_84.04.86.recover-image.exe" #ok#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7390/x_misc/deutsch/fritz.box_wlan_7390_84.04.89.recover-image.exe" #err#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7390/x_misc/deutsch/fritz.box_wlan_7390_84.04.91.recover-image.exe" #err#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7390/x_misc/english/FRITZ.Box_Fon_WLAN_7390.en-de-es-it-fr.04.87.recover-image.exe" #err#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7390/x_misc/deutsch_a-ch/FRITZ.Box_Fon_WLAN_7390.en-de-es-it-fr.04.88.recover-image.exe" #ok#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7270_v3/x_misc/english/FRITZ.Box_Fon_WLAN_7270_v3.en-de-es-it-fr.04.90.recover-image.exe" #ok#RECOVERIMG7270="@AVM/fritz.box/fritzbox.fon_wlan_7270_v3/x_misc/english/FRITZ.Box_Fon_WLAN_7270_v3.en-de-es-it-fr.05.05.recover-image.exe" RECOVERIMG7270="FRITZ.Box_Fon_WLAN_7270_v3.en-de-es-it-fr.05.06.recover-image.zip mirror http://upload.crunkbass.de/big39324c6263465249545a2e426f785f466f6e5f574c414e5f373237305f76332e656e2d64652d65732d69742d66722e30352e30362e7265636f7665722d696d6167652e7a6970.zip" RECOVERIMG7170="$RECOVERIMG7270" #------------------------------------------------------------------------------------------------- R_IMG="$RECOVERIMG7270" #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" #------------------------------------------------------------------------------------------------- . $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" #------------------------------------------------------------------------------------------------- output_dir="$(basename "$input_recover_file" | sed -r 's/(.*)\.[^\.]*/\1/')" 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 # ispr is built now the first time split_recover is executed $RDIR/split_recover $HOMEDIR $input_recover_file $output_dir || . $RDIR/wait_for_enterkey Date=$(date +%Y%m%d%H%M) [ "$TYPE_LOCAL_MODEL" != "y" ] && [ "$SPNUM" != "7570" ] && [ "$SPNUM" != "7150" ] && Xmodel="${CLASS}_W${SPNUM}V" [ "$TYPE_LOCAL_MODEL" = "y" ] || [ "$SPNUM" = "7570" ] || [ "$SPNUM" = "7150" ] && Xmodel="${SPNUM}" [ "7570" == "${TYPE_LABOR_TYPE:0:4}" ] && [ "$TYPE_LOCAL_MODEL" != "y" ] && [ "$SPNUM" == "7570" ] && Xmodel="7570" [ "$ORI" == "y" ] && Xmodel="${Xmodel}_R" new_recover_file="$kernel_dir/${Xmodel}_$Date.recover.exe" echo "Original fliename: $NEWIMG --> $(basename $new_recover_file)" >> $FWNEWDIR/recover_file.lst ##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 #sleep 1000 [ "${SPNUM}" == "500" ] && sed -i -e "s|FRITZ!Box Fon WLAN 7....v.|FRITZ!Box Sinus ${SPNUM:0:3} |g" "$output_dir/exe_start" [ "${SPNUM}" == "501" ] && sed -i -e "s|FRITZ!Box Fon WLAN 7....v.|FRITZ!Box Speedp. W${SPNUM:0:3}V |g" "$output_dir/exe_start" [ "${SPNUM}" == "500" ] && sed -i -e "s|FRITZ!Box Fon WLAN 7...|FRITZ!Box Sinus ${SPNUM:0:3} |g" "$output_dir/exe_start" [ "${SPNUM}" == "501" ] && sed -i -e "s|FRITZ!Box Fon WLAN 7...|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" 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" # test eax,eax pop eax => 85 C0 59 # jz => 0F 85 echo "do the main patch ..." # --> older variants sed -i \ -e 's|\x73\x06\x89\x1D\x50\xB6\x8F\x00|\x73\x00\x90\x90\x50\xB6\x8F\x00|' \ -e 's|\x72\x0E\x81\xFF\xE8\x03\x00\x00|\x72\x08\x81\xFF\xE8\x03\x00\x00|' \ -e 's|\x74\x59\x83\xFF\xFF\x89\xBD|\xEB\x59\x83\xFF\xFF\x89\xBD|' \ -e 's|\x73\x4A\x8D\x95\x08\xFC\xFF|\xEB\x4A\x8D\x95\x08\xFC\xFF|' \ "$output_dir/exe_start" # <-- # --> neue 7390 recover.exe ! $RDIR/ipsr s "0x85c0590f85........8d85" "0x85c0599090909090908d85" "$output_dir/exe_start" && echo "-- firmware version not found check error!" && checkerror="y" ! $RDIR/ipsr s "0x85c0590f85........399d" "0x85c059909090909090399d" "$output_dir/exe_start" && echo "-- OEM check not found error!" && checkerror="y" ! $RDIR/ipsr s "0x3bfb74..83ffff89" "0x3bfbeb..83ffff89" "$output_dir/exe_start" && echo "-- kernel check not found error!" && checkerror="y" ! $RDIR/ipsr s "0xc40c85c0..4a" "0xc40c85c0eb4a" "$output_dir/exe_start" && echo "-- CRC check not found error!" && checkerror="y" ! $RDIR/ipsr s "0x72..397D0873..89" "0x73..397D0873..89" "$output_dir/exe_start" && echo "-- urloader update not found error!" && checkerror="y" ! $RDIR/ipsr s "0x3bc8..4a8d95" "0x3bc8eb4a8d95" "$output_dir/exe_start" && echo "-- check kernel size remove error!" && checkerror="y" ! $RDIR/ipsr s "0x83c4243b4d18..458d85" "0x83c4243b4d18..458d85" "$output_dir/exe_start" && echo "-- check2 kernel size not found error!" && checkerror="y" # <-- ! $RDIR/ipsr s "0x85c0599090909090908d85" "$output_dir/exe_start" && echo "-- firmware version remove error!" && checkerror="y" ! $RDIR/ipsr s "0x85c059909090909090399d" "$output_dir/exe_start" && echo "-- OEM check remove error!" && checkerror="y" ! $RDIR/ipsr s "0x3bfbeb..83ffff89" "$output_dir/exe_start" && echo "-- kernel check remove error!" && checkerror="y" ! $RDIR/ipsr s "0xc40c85c0eb4a" "$output_dir/exe_start" && echo "-- CRC check remove 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 "0x3bc8eb4a8d95" "$output_dir/exe_start" && echo "-- check kernel size remove error!" && checkerror="y" ! $RDIR/ipsr s "0x83c4243b4d18..458d85" "$output_dir/exe_start" && echo "-- check2 kernel size remove error!" && checkerror="y" ! $RDIR/ipsr s "0x83c4243b4d1877..8d85" "0x83c4243b4d18eb..8d85" "$output_dir/exe_start" && echo "-- check2 kernel size not found error!" && checkerror="y" ## ! $RDIR/ipsr s "0x85c0590f85........8d85" "$output_dir/ori_start" && echo "-- firmware version not found check error!" && checkerror="y" ## ! $RDIR/ipsr s "0x85c0590f85........399d" "$output_dir/ori_start" && echo "-- OEM check not found error!" && checkerror="y" ## ! $RDIR/ipsr s "0x3bfb74..83ffff89" "$output_dir/ori_start" && echo "-- kernel check not found 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/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 "0x003bc8..4a8d95" "$output_dir/ori_start" && echo "-- check kernel size not found 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 echo "patch version ..." #R_IMG is filenam of original recover in use old_v="$(basename "$R_IMG")" #echo "old_v: $old_v" old_v="${old_v%recover*}" #echo "old_v: $old_v" #find .en within filename Recover_firmware_version="en${old_v##*.en} " #filename misses two numbers #echo "Original Recover Firmware Version: $Recover_firmware_version" count=${#Recover_firmware_version} OldRversion="$(dd if=$output_dir/exe_mid bs=1 count=${count} 2> /dev/null)" #get it directly #echo temp:$OldRversion OldRversion="$(echo $OldRversion | sed 's/\(.*[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\).*/\1/')" count=${#OldRversion} #${X:start:length} #${X/substring/replacement} [ "$ORI" = "y" ] && New_Rversion="$TCOM_VERSION_MAJOR.$TCOM_VERSION $TCOM_SUBVERSION original " #echo "New tcom recoverversion: $New_Rversion" [ "$ORI" != "y" ] && New_Rversion="$AVM_VERSION_MAJOR.$AVM_VERSION $AVM_SUBVERSION $OEM s2f " #fill with space #echo "count: ${#OldRversion}" New_Rversion="${New_Rversion:0:$count}" echo "Old Recover Version : .$OldRversion." echo "New Recover Version : .$New_Rversion." sed -i -e "s|$OldRversion|$New_Rversion|" "$output_dir/exe_mid" echo "concat all parts ..." dd if=/dev/zero bs=1 count=$act_diff >$output_dir/zerro.image 2> /dev/null 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