since v6.5.15, the check is more stricter, extended to all files in assets and apk after converted to apk it will trigger checksum fail error and throw GW934 error as response. fix is not implemented yet, but it depends on new lib : `libnframes.so`, without that the login button is not clickable. Signed-off-by: Cuynu <cuynu@proton.me>
524 lines
29 KiB
Shell
Executable file
524 lines
29 KiB
Shell
Executable file
#!/usr/bin/env bash
|
|
# vim: expandtab tabstop=4 shiftwidth=4
|
|
|
|
FILEPATH=$(readlink -f "$0")
|
|
DIRPATH=$(dirname "$FILEPATH")
|
|
export DIRPATH
|
|
|
|
# Initial startup
|
|
cd "$DIRPATH"
|
|
mkdir -p "$DIRPATH"/mbapk
|
|
mkdir -p "$DIRPATH"/mbcpapp_apk
|
|
mkdir -p "$DIRPATH"/tools
|
|
clear
|
|
|
|
. "$DIRPATH/common.sh"
|
|
|
|
# Check if user is running on an actual Linux environment
|
|
if uname -a | grep -i Linux ; then
|
|
info "You have Linux environment :)"
|
|
fi
|
|
|
|
# Check if figlet exists or not
|
|
if command -v figlet ; then
|
|
FIGLET=figlet
|
|
else
|
|
warn "figlet not found, ignoring banner !"
|
|
FIGLET=:
|
|
fi
|
|
|
|
# Check if java exists
|
|
if ! java -version ; then
|
|
err "Java not found !!!"
|
|
info "Please install Java for your system ! "
|
|
exit 127
|
|
fi
|
|
|
|
# Check if wget exists
|
|
if ! wget --version ; then
|
|
err "wget not found !!!"
|
|
info "Please install wget for your system !"
|
|
exit 127
|
|
fi
|
|
|
|
# Check if xmlstarlet exists
|
|
if ! xmlstarlet --version ; then
|
|
err "xmlstarlet not found, please install it"
|
|
exit 127
|
|
fi
|
|
|
|
COMMIT="$(git rev-parse --short HEAD)"
|
|
BRANCH="$(git rev-parse --abbrev-ref HEAD)"
|
|
clear
|
|
|
|
zshield_found='zShield found on [mbapk_unpacked/assets/*.szip] !!!
|
|
Patching operation is limited due to zShield :(
|
|
You need to extract assets from Android device for some patching operation to works properly !!!'
|
|
|
|
zshield_not_found='zShield NOT found on [mbapk_unpacked/assets/]
|
|
Patching operation are all not limited at all !
|
|
Asset extraction are not needed :)'
|
|
|
|
download_tools() {
|
|
apktool_link="https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_3.0.1.jar"
|
|
apkeditor_link="https://github.com/REAndroid/APKEditor/releases/download/V1.4.8/APKEditor-1.4.8.jar"
|
|
|
|
cd tools && rm -rf ./*.jar
|
|
wget -q --no-check-certificate --show-progress -O apktool.jar "$apktool_link" || err "downloading apktool failed"
|
|
wget -q --no-check-certificate --show-progress -O apkeditor.jar "$apkeditor_link" || err "downloading apkeditor failed"
|
|
cd ..
|
|
}
|
|
|
|
darwindeps() {
|
|
PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
|
|
}
|
|
|
|
darwin() {
|
|
[ $(brew list | grep gnu-sed) ] && echo "gnu-sed is installed!" && darwindeps || echo "gnu-sed is not installed. Please install it!"
|
|
}
|
|
|
|
if uname -a | grep -i Darwin ; then
|
|
info "You have macOS environment :)"
|
|
darwin
|
|
clear
|
|
fi
|
|
|
|
copy_assets() {
|
|
adb shell su -c cp -rf "/data/data/com.mbmobile/files/$1" /sdcard/assets
|
|
}
|
|
|
|
is_unpacked() {
|
|
[ -d "$DIRPATH"/mbapk/mbapk_unpacked ] || {
|
|
err "[mbapk_unpacked] not found ! Please unpack APK first !" ; return 127
|
|
}
|
|
}
|
|
is_unpacked_lib() {
|
|
[ -d "$DIRPATH"/mbapk/mbapk_unpacked/root/lib ] || {
|
|
err "[mbapk_unpacked/root/lib] folder not found ! Please unpack APK first !" ; return 127
|
|
}
|
|
}
|
|
apktool_exist() {
|
|
[ -f "$DIRPATH"/tools/apktool.jar ] || { err "apktool not found" ; return 127 ; }
|
|
}
|
|
apkeditor_exist() {
|
|
[ -f "$DIRPATH"/tools/apkeditor.jar ] || { err "apkeditor not found" ; return 127 ; }
|
|
}
|
|
mb_apk_exist() {
|
|
ls "$DIRPATH"/mbapk/*.apk >/dev/null 2>&1 || {
|
|
err "No *.apk found in [mbapk] folder, please copy apk to [mbapk] folder !"
|
|
err "If you got apks from eMBee APKs, use [Convert apks to apk] option !"
|
|
}
|
|
}
|
|
|
|
# gw934 check sha256 hash of libraries and dex files
|
|
copyHash() {
|
|
info "Dumping libraries & dex sha256 hash..."
|
|
mkdir -p "$DIRPATH"/mbapk/original_hash
|
|
# libapp flutter
|
|
sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libapp.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libapp_arm64_sum && good "Success dump sha256 libapp (arm64) hash to [mbapk/original_hash] !"
|
|
sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libapp.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libapp_armv7a_sum && good "Success dump sha256 libapp (armv7a) hash to [mbapk/original_hash] !"
|
|
|
|
# mbshield (zShield)
|
|
# exist in MB v6.4.22 ~ v6.5.6 (except v6.4.45 versionCode 658)
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/arm64-v8a/libmbshield.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libmbshield.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libmbshield_arm64_sum && good "Success dump sha256 libmbshield (arm64) hash to [mbapk/original_hash] !"
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libmbshield.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libmbshield.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libmbshield_armv7a_sum && good "Success dump sha256 libmbshield (armv7a) hash to [mbapk/original_hash] !"
|
|
|
|
# new zshield + zdefend (v6.5.7+)
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/arm64-v8a/libempirememorial.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libempirememorial.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libempirememorial_arm64_sum && good "Success dump sha256 libempirememorial (arm64) hash to [mbapk/original_hash] !"
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libempirememorial.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libempirememorial.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libempirememorial_armv7a_sum && good "Success dump sha256 libempirememorial (armv7a) hash to [mbapk/original_hash] !"
|
|
|
|
# built in flutter zdefend plugin lib call, it might call to libempirememorial.so
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/arm64-v8a/libcode.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libcode.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libcode_arm64_sum && good "Success dump sha256 libcode (arm64) hash to [mbapk/original_hash] !"
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libcode.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libcode.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libcode_armv7a_sum && good "Success dump sha256 libcode (armv7a) hash to [mbapk/original_hash]"
|
|
|
|
# old zimperium zdefend
|
|
# exist in MB v6.4.72 ~ v6.5.6
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/arm64-v8a/libclosestmadagascar.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libclosestmadagascar.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libclosestmadagascar_arm64_sum && good "Success dump sha256 zimperium (arm64) hash to [mbapk/original_hash] !"
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libclosestmadagascar.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libclosestmadagascar.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libclosestmadagascar_armv7_sum && good "Success dump sha256 zimperium (armv7a) hash to [mbapk/original_hash] !"
|
|
|
|
# Tian37 (since MB v6.4.86+)
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/arm64-v8a/libanTian37.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libanTian37.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libanTian37_arm64_sum && good "Success dump libanTian37 (arm64) hash to [mbapk/original_hash] !"
|
|
[ -f 'mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libanTian37.so' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/armeabi-v7a/libanTian37.so | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/libanTian37_armv7a_sum && good "Success dump libanTian37 (armv7a) hash to [mbapk/original_hash] !"
|
|
|
|
# dex files
|
|
sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/.cache/classes.dex | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/dex1_sum && good "Success dump sha256 dex1 hash to [mbapk/original_hash]!"
|
|
sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/.cache/classes2.dex | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/dex2_sum && good "Success dump sha256 dex2 hash to [mbapk/original_hash] !"
|
|
sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/.cache/classes3.dex | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/dex3_sum && good "Success dump sha256 dex3 hash to [mbapk/original_hash]!"
|
|
sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/.cache/classes4.dex | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/dex4_sum && good "Success dump sha256 dex4 hash to [mbapk/original_hash] !"
|
|
sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/.cache/classes5.dex | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/dex5_sum && good "Success dump sha256 dex5 hash to [mbapk_original_hash] !"
|
|
# dex6 for v6.5.2+
|
|
[ -f 'mbapk/mbapk_unpacked/.cache/classes6.dex' ] && sha256sum "$DIRPATH"/mbapk/mbapk_unpacked/.cache/classes6.dex | cut -f 1 -d " " > "$DIRPATH"/mbapk/original_hash/dex6_sum && good "Success dump sha256 dex6 hash to [mbapk/original_hash] !"
|
|
info "Copying hashes to app assets"
|
|
cp -r "$DIRPATH"/mbapk/original_hash "$DIRPATH"/mbapk/mbapk_unpacked/root/assets/ && good "Success copy hashes to app assets!"
|
|
}
|
|
|
|
unpack_mbcp() {
|
|
[[ $(uname -a | grep Linux) ]] && local - ; set -e
|
|
{ apkeditor_exist && mb_apk_exist ; } || return 0
|
|
rm -rf 'mbapk/mbapk_unpacked'
|
|
rm -rf 'mbapk/*.apks'
|
|
rm -rf 'mbapk/*merged.apk'
|
|
rm -rf 'mbapk/original_hash'
|
|
java -jar tools/apkeditor.jar d -i mbapk/*.apk -o mbapk/mbapk_unpacked || { err "Unpacking failed !" ; return 1 ; }
|
|
touch 'mbapk/mbapk_unpacked/isreal_unpacked'
|
|
unzip -l mbapk/MBOriginal.apk | grep -oH "flutter_assets" > /dev/null 2>&1 && good "Current app is Flutter!" || { err "Current converted app is not Flutter, or too outdated, cannot continue! Deleting files..." ; rm -rf mbapk/* ; return 1 ;
|
|
}
|
|
unzip -l mbapk/MBOriginal.apk | grep -oH "ic-appmb.ttf" > /dev/null 2>&1 && good "Current converted app is MBBank! Continuing" || { err "Current converted app is NOT MBBank! Deleting files..." ; rm -rf mbapk/* ; return 1 ; }
|
|
info "Removing local zimperium detection models..."
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/_4A9w8flncUrhDOG8dyqLi_azBTYT3PlSXz0hiCzRQA_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/0QDl12M5S2hKxoKF4cNI4kEX1qDQRMiOd34TXjSjy4M_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/2GcdAWdkXGgxPfHSIhzLkrkf2LU6Z_cuZfUWnczoEHw_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/BiLlLhV4LAy_y_rvwmD82q_4yN_liwgN1X0mfwfqTeE_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/c7uFHgsHzlQ_T524_4N3h9neXvtcUg0m1ERhEjFpPI8_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/ccBu4aSM_mSaMBpFvr14pizu6EGMvwRiZltU_zVJMz0_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/DcM3z3tolULDhbn8YrUE7hxOlxZx2oFC5yNQFG1SX9k_'
|
|
# v6.5.7+ and new zimperium need this, without it the app will crash in startup, libcode.so
|
|
# is new pattern to detect v6.5.7+, older app base with old zimperium does not need this
|
|
# so i added condition check, whether if libcode.so is exist or not, if not then it will
|
|
# continue to delete the local model as before.
|
|
[ ! -f 'mbapk/mbapk_unpacked/root/lib/arm64-v8a/libcode.so' ] && rm -rf 'mbapk/mbapk_unpacked/root/assets/fPGzhQFvISia1NiVGU8vQx9IpRm63E4_1Xv0Z2ypWUE_'
|
|
# v6.5.9+ behavior (does not affect v6.5.7/v6.5.8 behavior)
|
|
[ ! -f 'mbapk/mbapk_unpacked/root/lib/arm64-v8a/libcode.so' ] && rm -rf 'mbapk/mbapk_unpacked/root/assets/2lclXWtX58GC8tXgJr1E_tmzpvS_K1Q7_0jHeXBaECc_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/GXNv8xc5IcVF6TyUgjJpyYFeyHGqUqN7ZS0X_2WRbEE_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/g9x205p_On9_RR4kI_GdsoQ2pfSrV_OQXSopshyhYVk_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/H8leCCp85eX0YRvo4WCzqF5MEuj2_9ix6zL2bjnj6hk_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/Hput_BfAb8ftOt8hvazec24Eqk0gC5DDY6qALJMLtcI_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/MZuOOtdhO6pcGnZ5_kqMPh56hL3LqawBZd05vfIivww_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/noNmNoHJ0EUpV0TiKtyRPIVWI0im6K1RPIq3N_q0ho0_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/oOot9yCPD3GFqBix7JXjoz4Uui3k3NrwI8wHRlOpn4s_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/rqfr7ucXEZM4vIIYYPHXlo6IG1iEad_H61Z4bbEMR3s_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/Sje9R7eg_A4wlgbLNHwXS5xNFmS5qaoPnJ6Vg0RnIQ8_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/t8_bY_8ibDPQ9rngMwnd7WFI_uqoPlht9nBi26_llbw_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/VipqZ50mSUd28eIlPS_2t31IZ6tY24fl8sSl5YsQrbI_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/vLpH08bnGzkpsq_MmUdHqkh3bjrVN5tutp6s4jscm3w_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/WZ7CC4mxgoVWzgm8AO7rbOneE6TkqXwT2YV3htdswEQ_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/x_uYtCXdh_oYw_XLfZQkX10Bcqq2HFK3q7v1dJVw3zM_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/Y83jllvBi79vZIh2_UNtyo3_Lvd94lqie_q1dc5O3j0_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/ZN6CRAqtR7CKp7LFoivhHDbCS6iAtrEW6_sLvrfWgEM_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/ZOKOK1a6XCiqYb_a8bYPE9c0rjUf7_n7k77YxX5Ypdw_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/zxHdhL4_ZEQLQeo8R2DzSYl9PGss_cKSCQTcZGBtVmU_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/jNMI79raTvV7VHN5Vrzw4Xs66YP_a1ftP9SmUB24DYg_'
|
|
# New zimperium for v6.4.66+
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/_4A9w8flncUrhDOG8dyqLi_azBTYT3PlSXz0hiCzRQA_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/2GcdAWdkXGgxPfHSIhzLkrkf2LU6Z_cuZfUWnczoEHw_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/5ZgPqFnAWhQNY00pFq2V1t1CQ2Pu_v5fmZ1z_J8mpRc_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/BiLlLhV4LAy_y_rvwmD82q_4yN_liwgN1X0mfwfqTeE_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/ccBu4aSM_mSaMBpFvr14pizu6EGMvwRiZltU_zVJMz0_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/DcM3z3tolULDhbn8YrUE7hxOlxZx2oFC5yNQFG1SX9k_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/eB0ZLvEtv8_qoOAcmcB19tx0pnT_RXKn5WU3rOVgK4k_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/g9x205p_On9_RR4kI_GdsoQ2pfSrV_OQXSopshyhYVk_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/GXNv8xc5IcVF6TyUgjJpyYFeyHGqUqN7ZS0X_2WRbEE_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/H8leCCp85eX0YRvo4WCzqF5MEuj2_9ix6zL2bjnj6hk_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/jNMI79raTvV7VHN5Vrzw4Xs66YP_a1ftP9SmUB24DYg_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/L99mUhn96s4yqqm5R9PfAaEKDqXeeymBiZ6LXsL7Q6g_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/MZuOOtdhO6pcGnZ5_kqMPh56hL3LqawBZd05vfIivww_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/noNmNoHJ0EUpV0TiKtyRPIVWI0im6K1RPIq3N_q0ho0_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/PFG4UoVDN_g9I8eyvXTlS_1wTyyW7MSBQgALLx3oais_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/rqfr7ucXEZM4vIIYYPHXlo6IG1iEad_H61Z4bbEMR3s_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/VipqZ50mSUd28eIlPS_2t31IZ6tY24fl8sSl5YsQrbI_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/Vk2u994oKcVWweAMd1MiPV1CqM_arKjtcMTiEstc_tQ_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/WZ7CC4mxgoVWzgm8AO7rbOneE6TkqXwT2YV3htdswEQ_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/x_uYtCXdh_oYw_XLfZQkX10Bcqq2HFK3q7v1dJVw3zM_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/Y83jllvBi79vZIh2_UNtyo3_Lvd94lqie_q1dc5O3j0_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/yUIRfgijg_pUl2cxzI4uUChxQx0eaY_KqL0HkZDq9_8_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/zK8ofKgkgZpE0H2lDulbI7VQeUuxZFk7PXXPHT1fQqE_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/ZN6CRAqtR7CKp7LFoivhHDbCS6iAtrEW6_sLvrfWgEM_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/ZOKOK1a6XCiqYb_a8bYPE9c0rjUf7_n7k77YxX5Ypdw_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/zxHdhL4_ZEQLQeo8R2DzSYl9PGss_cKSCQTcZGBtVmU_'
|
|
# New zimperium for v6.4.67+
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/EHFtsAf7MYH_M7kQF1YX8LeWfU1_RjdRH62oJRE0v38_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/KZsyhtgSOXgFDPIf88NF5svaDH3xQ8feGsAQiy1c9_s_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/mT0VvAZ00szUCjj1fIELzEtu8jyGYugItWXzMzctw5s_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/nH9wnyFkomjAn0FTQ_yjrJV_GNWjgWxVgbb8jcJP4HY_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/PZQ2Z8TvSXXOMX3cIQ2_GUS5YMkOTffOx4OJGCrspa0_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/Q69Adz_RZ_IeUuPTQYy90NvmZgYOhihkaYyXz_zZShw_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/RqFhgUA_YBZkLQQ_fCTirgXJUoOFPqP97IMjQbilqD4_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/t8NSiy6tAaumDccCfaZJufNIdIbRzIki5BH3ob2WBgY_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/U8M8_vW2i8G_dLkEBAPC1ARUe5wGRu8ebXKFfhZMvOw_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/uEmV2ugmVX1f4hLUo7L5kR4ukfV8Y04sHlpabtch9HE_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/X7Y6j7fmtuE5o33sw4Sh6Z97oMv_uaNPyZJ6PjF6l5M_'
|
|
# New zimperium for v6.4.72+
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/Z1YbTXaPlMjbmWCKXXD0m4wkWyE0I6xxDebGhXz5igk_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/zxwCzUaZ8itWQeAMKtyu52RbljJe1Pd8GuV7H4RPsy4_'
|
|
# New zimperium for v6.5.7+
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/BHCdF10ojcfyA7xfkrsMHYFMRUCn2CVYK6zKEnI8Jdc_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/i_4CYiKEHQ3wTzTlrx_YVNIvHCgFjnkpMtMf4pgDlic_'
|
|
rm -rf 'mbapk/mbapk_unpacked/root/assets/OrE6E3b6dxQnoToaT2eLN48gKz8_Iui_eFezclhtVQk_'
|
|
info "Creating [mbcp_info] folder..."
|
|
mkdir 'mbapk/mbapk_unpacked/root/assets/mbcp_info/'
|
|
|
|
info "Reformatting AndroidManifest.xml with xmlstarlet..."
|
|
mv "$DIRPATH"/mbapk/mbapk_unpacked/AndroidManifest.xml "$DIRPATH"/mbapk/mbapk_unpacked/AndroidManifest.xml.orig
|
|
xmlstarlet fo "$DIRPATH"/mbapk/mbapk_unpacked/AndroidManifest.xml.orig > "$DIRPATH"/mbapk/mbapk_unpacked/AndroidManifest.xml
|
|
|
|
info "Changing minSdkVersion to 28..."
|
|
sed -i 's|android:minSdkVersion="24"|android:minSdkVersion="28"|g' "$DIRPATH"/mbapk/mbapk_unpacked/AndroidManifest.xml
|
|
copyHash
|
|
}
|
|
|
|
repack_mbcp() {
|
|
{ apktool_exist && is_unpacked ; } || return 0
|
|
info "Repacking APK..."
|
|
echo "Compiled with MBCPApp Patcher by $(whoami) on $(uname -s -r) with commit $COMMIT at $(date). That's all xD" > 'mbapk/mbapk_unpacked/root/assets/mbcp_info/mbcpinfo.txt'
|
|
(
|
|
set -e
|
|
java -jar tools/apkeditor.jar b -i 'mbapk/mbapk_unpacked' -o mbcpapp_apk/MBCP_Flutter_TMP.apk
|
|
[ ! -f 'mbcpapp_apk/MBCP_Flutter_TMP.apk' ] && exit 1
|
|
info "Processing APK signature scheme v2/v3..."
|
|
rm -rf mbcpapp_apk/MBCP_Flutter_SelfPatched*
|
|
java -jar tools/apkeditor.jar b -t sig -i 'mbcpapp_apk/MBCP_Flutter_TMP.apk' -sig 'mbsig/signatures' -o "mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT.apk"
|
|
rm 'mbcpapp_apk/MBCP_Flutter_TMP.apk'
|
|
) && {
|
|
good "Completed! Repacked APK are saved as [mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT.apk] !!!"
|
|
good 'Install and trying to open it when ಠ‿ಠ'
|
|
good 'If you are facing issues, report it on Telegram [@mbcposs_en] or [@mbcposs] (for Vietnamese users) !!'
|
|
good 'It is recommended to report issues to [https://git.disroot.org/mbcp/mbbpatch/issues] instead !'
|
|
} || err 'ERROR : Repacking failed !'
|
|
}
|
|
|
|
successunpack() {
|
|
if [ -f "$DIRPATH"/mbapk/mbapk_unpacked/isreal_unpacked ]
|
|
then
|
|
echo -e "\033[32m"Unpacked."$1\033[0m"
|
|
|
|
else
|
|
echo -e "\033[31m"Not yet unpacked or not found."$1\033[0m"
|
|
fi
|
|
}
|
|
|
|
check_zshield() {
|
|
is_unpacked || return 1
|
|
if [ -f "$DIRPATH"/mbapk/mbapk_unpacked/root/assets/*.szip ]
|
|
then
|
|
info "$zshield_found"
|
|
iszdefend
|
|
else
|
|
info "$zshield_not_found"
|
|
fi
|
|
}
|
|
|
|
convert_apks() {
|
|
[[ $(uname -a | grep Linux) ]] && local - ; set -e
|
|
ls "$DIRPATH"/mbapk/*.apks >/dev/null 2>&1 || {
|
|
err "APKs missing, cannot continue !"
|
|
return 0
|
|
}
|
|
apkeditor_exist
|
|
info "Converting apks to apk..."
|
|
java -jar tools/apkeditor.jar m -i mbapk/*.apks
|
|
mv mbapk/*.apk mbapk/MBOriginal.apk
|
|
info 'Cleaning left over [apks] files...'
|
|
rm -f mbapk/*.apks
|
|
unzip -l mbapk/MBOriginal.apk | grep -oH "ic-appmb.ttf" && good "Current converted app is MBBank! Continuing" || { err "Current converted app is NOT MBBank! Deleting files" ; rm -rf mbapk/* ; return 1 ; }
|
|
info "You probably can continue to unpack APK!"
|
|
}
|
|
|
|
run_patcher() {
|
|
is_unpacked_lib && bash ./parse.sh && bash ./patch.sh
|
|
# check v6.5.15+
|
|
[ -f "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libnframes.so ] && warn "You are using v6.5.15+! Patches continue to work but you can't login until a workaround is implemented !"
|
|
}
|
|
|
|
run_legacy_patcher() {
|
|
is_unpacked_lib && bash ./legacy_patch.sh
|
|
}
|
|
|
|
# Banner
|
|
$FIGLET "MBCPApp Patcher"
|
|
echo -------------------------------------------------------------
|
|
echo "Patching tool for MB Bank app with Flutter engine (v6.4.0+)"
|
|
echo "Original APK must be inside [mbapk] folder !"
|
|
echo -------------------------------------------------------------
|
|
echo "Current commit : $COMMIT ($BRANCH)"
|
|
echo "Source code : https://git.disroot.org/mbcp/mbbpatch.git"
|
|
echo "Documentation : see [README.md] or [docs] folder"
|
|
echo "Written from scratch by Cuynu with love <3"
|
|
echo -------------------------------------------------------------
|
|
echo App status : $(successunpack)
|
|
echo -------------------------------------------------------------
|
|
# Main functions
|
|
PS3='Please select options to continue : '
|
|
select opt in 'Pull latest commit' 'Unpack APK' 'Convert apks to apk' 'Repack APK' 'Install patched app' 'zShield Check' 'Patch App' 'Legacy patches' 'Extract assets [ROOT]' 'Launch MBCPApp/MBBank' 'Force close MBCPApp/MBBank' 'Clear MBCPApp/MBBank app data' 'Clean patched app' 'Download/update tools' 'Restart script' 'Exit'
|
|
do
|
|
case "$opt" in
|
|
'Download/update tools' ) download_tools ;;
|
|
'Unpack APK' ) unpack_mbcp ;;
|
|
'Repack APK' ) repack_mbcp ;;
|
|
'Patch App' ) run_patcher ;;
|
|
'Legacy patches' ) run_legacy_patcher ;;
|
|
'zShield Check' ) check_zshield ;;
|
|
'Convert apks to apk' ) convert_apks ;;
|
|
'Extract assets [ROOT]' )
|
|
is_unpacked || exit 1
|
|
isvcm1
|
|
iszdefend
|
|
info "If you have v6.4.98 or newer, app resource extraction is no longer possible. Please use older version."
|
|
info 'To extract encrypted assets [if current app has zShield protection] you need rooted device'
|
|
info 'And trigger a built-in app assets extraction !'
|
|
echo -------------------------------------------
|
|
PS3='Select options continue, or [3] to quit : '
|
|
select opt in 'Launch MBCPApp/MBBank' 'Extract assets' 'Exit'
|
|
do
|
|
if [ "$opt" == 'Launch MBCPApp/MBBank' ]; then
|
|
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
|
|
info 'After app started, you MUST need to trigger assets extraction'
|
|
info 'By trigger eKYC authetication with reset account password option or register DigitalOTP'
|
|
info 'After you got into eKYC screen, close the app, then use Extract assets option to extract assets.'
|
|
elif [ "$opt" == 'Extract assets' ]; then
|
|
if [ -d "$DIRPATH"/mbapk/mbapk_unpacked/ ]
|
|
then
|
|
if [ -f "$DIRPATH"/mbapk/mbapk_unpacked/root/assets/*.szip ]
|
|
then
|
|
info "zShield found ! Continuing !!!"
|
|
warn 'You MUST grant root access to [com.android.shell] in order to extract assets !'
|
|
info 'Trying to extract assets...'
|
|
adb shell am force-stop com.mbmobile
|
|
adb shell rm -rf /sdcard/assets
|
|
adb shell mkdir /sdcard/assets
|
|
copy_assets flutter_assets
|
|
copy_assets dexopt
|
|
copy_assets font
|
|
copy_assets mbshield
|
|
copy_assets media_init_data
|
|
copy_assets mlkit_barcode_models
|
|
copy_assets models_bundled
|
|
copy_assets mwebview
|
|
copy_assets zfiles
|
|
copy_assets crashlytics-build.properties
|
|
copy_assets firmware
|
|
copy_assets insider.ttf
|
|
copy_assets dlangV5.dat
|
|
copy_assets dlangV5.en.dat
|
|
copy_assets policy0
|
|
copy_assets policy1
|
|
copy_assets policy2
|
|
copy_assets policy3
|
|
copy_assets policy4
|
|
copy_assets policy5
|
|
copy_assets policy6
|
|
copy_assets policy8
|
|
copy_assets policy9
|
|
copy_assets policym
|
|
copy_assets profile
|
|
copy_assets rulesV5.dat
|
|
copy_assets sgprofile
|
|
copy_assets signature
|
|
copy_assets smart_ekyc_finall.zip
|
|
copy_assets version.json
|
|
copy_assets vkeylicensepack
|
|
copy_assets voscodesign.vky
|
|
info 'Copying assets...'
|
|
adb pull /sdcard/assets mbapk/mbapk_unpacked/root/ && good "Assets copied to [mbapk_unpacked/root/] !" || err "Failed to copy assets ! Please try again."
|
|
info 'Removing leftover assets...'
|
|
adb shell rm -rf /sdcard/assets && good "Removed leftover assets !" || err "Failed to remove leftover assets from device !"
|
|
else
|
|
info "zShield not found ! No need to extract assets !"
|
|
fi
|
|
else
|
|
err "Can't find [mbapk/mbapk_unpacked] folder, cannot continue ! "
|
|
err "Please unpack APK first !"
|
|
fi
|
|
|
|
elif [ "$opt" == 'Exit' ]; then
|
|
clear
|
|
bash mbcpapp.sh
|
|
break
|
|
fi
|
|
done
|
|
;;
|
|
'Restart script' )
|
|
bash mbcpapp.sh
|
|
;;
|
|
'Clear MBCPApp/MBBank app data' )
|
|
info "Clearing [com.mbmobile] data..."
|
|
adb shell pm clear com.mbmobile
|
|
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
|
|
info "Current logged in account will remain present, even if app data is cleared !"
|
|
;;
|
|
'Pull latest commit' )
|
|
git pull origin dev
|
|
info "Please run patcher again !"
|
|
exit
|
|
;;
|
|
'Launch MBCPApp/MBBank' )
|
|
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
|
|
;;
|
|
'Force close MBCPApp/MBBank' )
|
|
adb shell am force-stop com.mbmobile
|
|
;;
|
|
'Clean patched app' )
|
|
info "Cleaning, please wait..."
|
|
rm -f mbcpapp_apk/*.apk
|
|
rm -f mbcpapp_apk/*.zip
|
|
rm -f mbapk/*.apk
|
|
rm -f mbapk/*.apks
|
|
rm -rf mbapk/mbapk_unpacked
|
|
rm -rf mbapk/original_hash
|
|
info "Cleared !"
|
|
;;
|
|
'Install patched app' )
|
|
echo 'Choose install options :'
|
|
ls mbcpapp_apk | grep -q MBCP_Flutter_SelfPatched_$(git rev-parse --short HEAD).apk || err "Couldn't find APK with current commit ID, you might already do new commits : $(git rev-parse --short HEAD)" || warn "Please repack APK again after each new commits !"
|
|
PS3='Select option to continue, or [3] to quit : '
|
|
select opt in 'Install & open app' 'Install & delete local detection model & open app' 'Exit'
|
|
do
|
|
|
|
if [ "$opt" == 'Install & open app' ]; then
|
|
if [ -f "$DIRPATH"/mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT.apk ]
|
|
then
|
|
warn "MBCP Helper / CorePatch must be installed with disable digest verify on !!!"
|
|
warn "You must have connected Android device with USB debugging turned on in order to install !!!"
|
|
adb kill-server
|
|
adb start-server
|
|
adb install "mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT.apk" | grep -q Success && echo "App installation successful! Opening app..." && adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity || echo "Failed to install app, please check your device!"
|
|
else
|
|
err "[MBCP_Flutter_SelfPatched_$COMMIT.apk] not found, cannot continue !"
|
|
fi
|
|
|
|
elif [ "$opt" == 'Install & delete local detection model & open app' ]; then
|
|
# handle method for newer app
|
|
[ -f "$DIRPATH"/mbapk/mbapk_unpacked/root/lib/arm64-v8a/libcode.so ] && warn "This method works best with v6.4.58 ~ v6.5.6. For newer app please block Zimperium host first !"
|
|
if [ -f "$DIRPATH"/mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT.apk ]
|
|
then
|
|
warn "MBCP Helper / CorePatch must be installed with disable digest verify on !!!"
|
|
warn "You must have connected Android device with USB debugging turned on in order to install !!!"
|
|
adb kill-server
|
|
adb start-server
|
|
adb shell [ -f /system/bin/su ] || warn "No su binary found in [/system/bin/su] from connected device. Root-related commands will not work!!"
|
|
adb install "mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT.apk" | grep -q Success && echo "App installation successful! Opening app..." && adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity || echo "Failed to install app, please check your device!"
|
|
# Delete zimperium detection files
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/0*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/1*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/2*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/3*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/4*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/5*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/6*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/7*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/8*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/9*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/KNOV3PN*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/zxpolicyme*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/zxpolicymd*
|
|
adb shell su -c rm -rf /data/data/com.mbmobile/files/policyme*
|
|
warn "ATTENTION : Network traffic will be redirected to [medium.com] for 20 seconds !!!"
|
|
adb shell su -c 'iptables -t nat -A OUTPUT -p tcp -d 0/0 -j DNAT --to-destination 162.159.153.4:443'
|
|
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
|
|
sleep 20
|
|
info "Restoring network traffic"
|
|
adb shell su -c 'iptables -t nat -F OUTPUT'
|
|
info "Press [Try again] after got 1005/1007 error on MB, so it's can skip device not secure dialog !"
|
|
else
|
|
err "[MBCP_Flutter_SelfPatched_$COMMIT.apk] not found, cannot continue !"
|
|
fi
|
|
|
|
elif [ "$opt" == 'Exit' ]; then
|
|
PS3='Please select options to continue : '
|
|
break
|
|
fi
|
|
done
|
|
;;
|
|
'Exit' ) exit ;;
|
|
esac
|
|
done
|
|
|