#!/bin/bash #orig=$SECONDS helpmsg() { cat << 'EOF' patch_ori_recover_firmware - patch recover.exe Usage: patch_ori_recover_firmware (-?|--help) | () -?, --help - print this help text Examples: patch_ori_recover_firmware ./Firmwae.orig/recover.exe EOF } # Wrong number of parameters -> exit with error if [ $# -lt 1 -o $# -gt 1 ]; then helpmsg >&2 sleep 5 exit 1 fi echo "--------------------------------------------------------------------------------" HOMEDIR=$(pwd) export FWORIGDIR="Firmware.orig" export FWBASE="$HOMEDIR/$FWORIGDIR" export FWNEWDIR="Firmware.new" export NEWDIR="$HOMEDIR/$FWNEWDIR" TOOLS_SUBDIR="tools" export TOOLS_DIR="${HOMEDIR}/${TOOLS_SUBDIR}" export include_modpatch="${TOOLS_DIR}/freetz_patch" export VERBOSE=" " #------------------------------------------------------------------------------------------------- #------------------------------------------------------------------------------------------------- R_IMG="$1" #------------------------------------------------------------------------------------------------- . ${HOMEDIR}/includes/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" #------------------------------------------------------------------------------------------------- if ! [ -f "$input_recover_file" ]; then echo "AVM $input_recover_file file is missing!" sleep 20 exit 1 fi new_recover_file="$NEWDIR/patched_$(echo $R_IMG | sed -e "s/.*\///")" act_size=`ls -l "$input_recover_file" | sed -e 's/[^0-9]/#/g' | sed -e 's/#\+[0-9]\+#\+\([0-9]\+\).*/\1/'` echo "Do patching, wait..." #0x1a249 sed -i -e 's|\x0F\x85\xFA\x01\x00\x00\x8D\x85|\x90\x90\x90\x90\x90\x90\x8D\x85|' "$input_recover_file" #0x1a25e sed -i -e 's|\x0F\x85\x26\x02\x00\x00\x39\x9D|\x90\x90\x90\x90\x90\x90\x39\x9D|' "$input_recover_file" #0x1a684 sed -i -e 's|\x74\x59\x83\xFF\xFF\x89\xBD|\xEB\x59\x83\xFF\xFF\x89\xBD|' "$input_recover_file" #0x18520 sed -i -e 's|\xC4\x0C\x85\xC0\x74\x4A|\xC4\x0C\x85\xC0\xEB\x4A|' "$input_recover_file" #0x1a310 sed -i -e 's|\x73\x06\x89\x1D\x50\xB6\x8F\x00|\x73\x00\x90\x90\x50\xB6\x8F\x00|' "$input_recover_file" #0x1a308 sed -i -e 's|\x72\x0E\x81\xFF\xE8\x03\x00\x00|\x72\x08\x81\xFF\xE8\x03\x00\x00|' "$input_recover_file" #0x1a5f0 #Check Kernel size #0x1846D sed -i -e 's|\x77\x48\x8D\x85\x08|\xEB\x48\x8D\x85\x08|' "$input_recover_file" #0x184C1 sed -i -e 's|\x73\x4A\x8D\x95\x08\xFC\xFF|\xEB\x4A\x8D\x95\x08\xFC\xFF|' "$input_recover_file" #0x1a5f0 .26 firmware #sed -i -e 's|\x73\x4A\x8D\x95\x1C\xFC\xFF\xFF\x52\x51\x50\x68\x4C\x61\x90\x00|\xEB\x4A\x8D\x95\x1C\xFC\xFF\xFF\x52\x51\x50\x68\x4C\x61\x90\x00|' "./$input_recover_file" rplbytes="90 90 90 90 90 90 8d 85" [ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- Firmware version check remove error!" && checkerror="y" rplbytes="90 90 90 90 90 90 39 9d" [ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- OEM check remove error!" && checkerror="y" rplbytes="eb 59 83 ff ff 89 bd" [ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- Kernel check remove error!" && checkerror="y" #rplbytes="c4 0c 85 c0 eb 4a" #[ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- CRC check remove error!" && checkerror="y" #rplbytes="73 00 90 90 50 b6 8f 00" #[ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- Urloader update remove error!" && checkerror="y" rplbytes="72 08 81 ff e8 03 00 00" [ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- Urloader2 update remove error!" && checkerror="y" rplbytes="eb 4a 8d 95 1c fc ff ff 52 51 50 68 4c 61 90 00" #[ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- Check kernel size remove error!" && checkerror="y" if ! ( [ "${R_IMG}" == "${RECOVERIMG7140}" ] || [ "${R_IMG}" == "${RECOVERIMG5050}" ] ) ; then rplbytes="eb 4a 8d 95 08 fc ff" [ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- Check kernel size remove error!" && checkerror="y" rplbytes="eb 48 8d 85 08" [ "$rplbytes" != "$(tools/hexgrep "$rplbytes" "$input_recover_file" | sed 's/.*://')" ] && echo "-- Check2 kernel size remove error!" && checkerror="y" fi echo "--------------------" mv "$input_recover_file" "$new_recover_file" chmod -x $new_recover_file 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 "ERROR! Reduce size of kernel.image by: $error_size Bytes." [ $act_size -eq $new_act_size ] && [ -f "$new_recover_file" ] && echo -e "New Recover:\n$new_recover_file\n\ Transfer this file to windows and start it to to recover your router." if [ "$checkerror" == "y" ]; then rm "$new_recover_file" echo "No Recover image was build!" echo 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