# fn2vma path function => vma_in_hex fn2vma() { nm -CD "$1" | grep " $2\$" | grep -o "^[^ ]*" | sed -e 's/^0*/0x0/' } # vma2offset path vma => file_offset_in_dec vma2offset() { local query="$2" objdump -h "$1" | grep -Po "( +[0-9a-f]+){4}" | sed -Ee 's/ +0+/ 0x0/g' | while read line; do read size vma lma offset <<< "$line" local vma_end=$(("$vma" + "$size")) if [[ "$query" -ge "$vma" ]] && [[ "$query" -le "$vma_end" ]]; then echo $(("$query" - "$vma" + "$offset")) return fi done } # patch_bytes path offset bytes_in_hex patch_binary() { local patch_path=$(mktemp) echo -ne "$3" > "$patch_path" local patch_length=$(stat --printf="%s" "$patch_path") local backup_path=$(mktemp) cp "$1" "$backup_path" -f local part2_begin="$2" local part3_begin=$(("$part2_begin" + "$patch_length" + 1)) head "$backup_path" -c "$part2_begin" > "$1" cat "$patch_path" >> "$1" tail "$backup_path" -c "+$part3_begin" >> "$1" rm "$patch_path" "$backup_path" } patch() { local binary="$1" local symbol="$2" local content="$3" local vma=$(fn2vma "$binary" "$symbol") [[ -z "$vma" ]] && echo "Symbol not found" && exit 1 echo "VMA of $symbol = $vma" local offset=$(vma2offset "$binary" "$vma") [[ -z "$vma" ]] && echo "Offset not found" && exit 2 echo "File offset = $offset" patch_binary "$binary" "$offset" "$content" echo "Patch completed" } patch_understand() { patch "$1" \ "HeliosLicenseManager::testGuiLicense(int&, HeliosLicenseManager::LoginStatus&, bool)" \ "\xb8\x01\x00\x00\x00\xc3" patch "$1" \ "STI::MaintainApp::TestHeliosHeartbeat()" \ "\xc3" }