2025-07-30 19:00:00 +07:00
#!/usr/bin/env bash
2025-07-26 20:02:12 +07:00
# vim: expandtab tabstop=4 shiftwidth=4
2025-04-30 20:29:51 +07:00
2025-07-30 09:37:35 +07:00
FILEPATH = $( readlink -f " $0 " )
2025-07-30 10:25:15 +07:00
DIRPATH = $( dirname " $FILEPATH " )
export DIRPATH
2025-07-30 09:37:35 +07:00
# Initial startup
2025-07-30 16:47:34 +07:00
cd " $DIRPATH "
2025-07-30 09:53:39 +07:00
mkdir -p " $DIRPATH " /mbapk
mkdir -p " $DIRPATH " /mbcpapp_apk
mkdir -p " $DIRPATH " /tools
2025-07-23 01:44:13 +07:00
clear
2025-04-30 20:39:57 +07:00
2025-07-31 08:58:10 +07:00
. " $DIRPATH /common.sh "
2025-09-17 08:18:01 +07:00
# Check if user is running on an actual Linux environment
2025-08-25 16:18:34 +07:00
if uname -a | grep -i Linux ; then
info "You have Linux environment :)"
fi
2025-04-30 20:51:31 +07:00
# Check if figlet exists or not
2025-07-23 01:55:24 +07:00
if command -v figlet ; then
FIGLET = figlet
2025-04-30 20:51:31 +07:00
else
2025-07-30 13:46:47 +07:00
warn "figlet not found, ignoring banner !"
2025-04-30 20:51:31 +07:00
FIGLET = :
fi
2025-07-30 13:46:47 +07:00
# Check if java exists
2025-07-23 11:00:09 +07:00
if ! java -version ; then
2025-07-30 13:46:47 +07:00
err "Java not found !!!"
2025-12-26 12:23:17 +07:00
info "Please install Java for your system ! "
2025-07-23 01:55:24 +07:00
exit 127
2025-09-16 20:15:33 +07:00
fi
# Check if wget exists
if ! wget --version ; then
err "wget not found !!!"
2025-12-26 12:23:17 +07:00
info "Please install wget for your system !"
2025-09-16 20:15:33 +07:00
exit 127
2025-05-01 07:23:40 +07:00
fi
2025-09-14 10:49:08 +07:00
# Check if xmlstarlet exists
if ! xmlstarlet --version ; then
err "xmlstarlet not found, please install it"
exit 127
fi
2025-07-30 13:46:47 +07:00
COMMIT = " $( git rev-parse --short HEAD) "
2025-09-17 10:20:39 +07:00
BRANCH = " $( git rev-parse --abbrev-ref HEAD) "
2025-07-23 11:00:09 +07:00
clear
2025-07-28 23:10:07 +07:00
mbshield_found = ' MBShield found on [ mbapk_unpacked/assets/mbshield.szip] !!!
Patching operation is limited due to MBShield :(
You need to extract assets from Android device for some patching operation to works properly !!!'
mbshield_not_found = ' MBShield NOT found on [ mbapk_unpacked/assets/]
Patching operation are all not limited at all !
Asset extraction are not needed :) '
2025-07-26 20:26:57 +07:00
download_tools( ) {
2026-03-05 00:28:50 +07:00
apktool_link = "https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_3.0.1.jar"
2026-04-23 10:17:31 +07:00
apkeditor_link = "https://github.com/REAndroid/APKEditor/releases/download/V1.4.8/APKEditor-1.4.8.jar"
2025-07-26 20:26:57 +07:00
2025-07-30 10:25:15 +07:00
cd tools && rm -rf ./*.jar
2025-07-30 13:46:47 +07:00
wget -q --show-progress -O apktool.jar " $apktool_link " || err "downloading apktool failed"
wget -q --show-progress -O apkeditor.jar " $apkeditor_link " || err "downloading apkeditor failed"
2025-07-29 01:47:29 +07:00
cd ..
2025-07-26 20:26:57 +07:00
}
2025-12-26 12:23:17 +07:00
darwindeps( ) {
2026-01-13 02:36:11 +07:00
PATH = " /usr/local/opt/gnu-sed/libexec/gnubin: $PATH "
2025-12-26 12:23:17 +07:00
}
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
2025-07-26 20:59:15 +07:00
copy_assets( ) {
2025-11-10 13:39:46 +07:00
adb shell su -c cp -rf " /data/data/com.mbmobile/files/ $1 " /sdcard/assets
2025-07-26 20:59:15 +07:00
}
2025-07-30 10:29:41 +07:00
is_unpacked( ) {
[ -d " $DIRPATH " /mbapk/mbapk_unpacked ] || {
2025-07-30 13:46:47 +07:00
err "[mbapk_unpacked] not found ! Please unpack APK first !" ; return 127
2025-07-30 10:29:41 +07:00
}
}
2025-07-26 22:24:59 +07:00
is_unpacked_lib( ) {
2025-09-09 17:13:10 +07:00
[ -d " $DIRPATH " /mbapk/mbapk_unpacked/root/lib ] || {
err "[mbapk_unpacked/root/lib] folder not found ! Please unpack APK first !" ; return 127
2025-07-26 22:24:59 +07:00
}
}
apktool_exist( ) {
2025-07-30 13:46:47 +07:00
[ -f " $DIRPATH " /tools/apktool.jar ] || { err "apktool not found" ; return 127 ; }
2025-07-26 22:24:59 +07:00
}
2025-07-28 23:19:08 +07:00
apkeditor_exist( ) {
2025-07-30 13:46:47 +07:00
[ -f " $DIRPATH " /tools/apkeditor.jar ] || { err "apkeditor not found" ; return 127 ; }
2025-07-28 23:19:08 +07:00
}
2025-07-26 22:24:59 +07:00
mb_apk_exist( ) {
2025-07-30 09:53:39 +07:00
ls " $DIRPATH " /mbapk/*.apk >/dev/null 2>& 1 || {
2025-07-31 09:02:08 +07:00
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 !"
2025-07-26 22:24:59 +07:00
}
}
2025-07-26 21:51:56 +07:00
unpack_mbcp( ) {
2025-12-31 17:46:49 +07:00
[ [ $( uname -a | grep Linux) ] ] && local - ; set -e
2026-01-14 23:59:42 +07:00
{ apkeditor_exist && mb_apk_exist ; } || return 0
2025-07-30 10:25:15 +07:00
rm -rf 'mbapk/mbapk_unpacked'
2025-11-08 22:31:11 +07:00
rm -rf 'mbapk/*.apks'
rm -rf 'mbapk/*merged.apk'
2025-09-09 17:13:10 +07:00
java -jar tools/apkeditor.jar d -i mbapk/*.apk -o mbapk/mbapk_unpacked || { err "Unpacking failed !" ; return 1 ; }
2026-01-11 11:46:55 +07:00
touch 'mbapk/mbapk_unpacked/isreal_unpacked'
2026-03-25 18:25:49 +07:00
unzip -l mbapk/MBOriginal.apk | grep -oH "flutter_assets" && 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" && good "Current converted app is MBBank! Continuing" || { err "Current converted app is NOT MBBank! Deleting files..." ; rm -rf mbapk/* ; return 1 ; }
2025-07-31 09:02:08 +07:00
info "Cleaning useless files..."
2025-09-13 17:30:58 +07:00
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_'
rm -rf 'mbapk/mbapk_unpacked/root/assets/fPGzhQFvISia1NiVGU8vQx9IpRm63E4_1Xv0Z2ypWUE_'
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/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/fPGzhQFvISia1NiVGU8vQx9IpRm63E4_1Xv0Z2ypWUE_'
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_'
2025-09-24 23:57:30 +07:00
# New zimperium for v6.4.67+
rm -rf 'mbapk/mbapk_unpacked/root/assets/2lclXWtX58GC8tXgJr1E_tmzpvS_K1Q7_0jHeXBaECc_'
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_'
2025-10-26 09:42:19 +07:00
# New zimperium for v6.4.72+
rm -rf 'mbapk/mbapk_unpacked/root/assets/Z1YbTXaPlMjbmWCKXXD0m4wkWyE0I6xxDebGhXz5igk_'
rm -rf 'mbapk/mbapk_unpacked/root/assets/zxwCzUaZ8itWQeAMKtyu52RbljJe1Pd8GuV7H4RPsy4_'
2025-09-13 17:30:58 +07:00
2025-07-31 09:02:08 +07:00
info "Creating [mbcp_info] folder..."
2025-09-09 17:13:10 +07:00
mkdir 'mbapk/mbapk_unpacked/root/assets/mbcp_info/'
2025-09-14 09:34:40 +07:00
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
2025-11-25 01:28:17 +07:00
info "Changing minSdkVersion to 28..."
sed -i 's|android:minSdkVersion="24"|android:minSdkVersion="28"|g' " $DIRPATH " /mbapk/mbapk_unpacked/AndroidManifest.xml
2025-07-26 21:51:56 +07:00
}
2025-07-26 21:35:23 +07:00
repack_mbcp( ) {
2026-01-14 23:59:42 +07:00
{ apktool_exist && is_unpacked ; } || return 0
2025-07-31 09:02:08 +07:00
info "Repacking APK..."
2025-12-01 00:05:37 +07:00
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'
2025-07-26 21:35:23 +07:00
(
set -e
2025-09-09 17:13:10 +07:00
java -jar tools/apkeditor.jar b -i 'mbapk/mbapk_unpacked' -o mbcpapp_apk/MBCP_Flutter_TMP.apk
2026-03-13 14:06:35 +07:00
[ ! -f 'mbcpapp_apk/MBCP_Flutter_TMP.apk' ] && exit 1
2025-07-31 09:02:08 +07:00
info "Processing APK signature scheme v2/v3..."
2026-02-07 12:09:45 +07:00
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 "
2025-07-26 21:35:23 +07:00
rm 'mbcpapp_apk/MBCP_Flutter_TMP.apk'
) && {
2026-02-07 12:09:45 +07:00
good " Completed! Repacked APK are saved as [mbcpapp_apk/MBCP_Flutter_SelfPatched_ $COMMIT .apk] !!! "
2025-07-31 09:02:08 +07:00
good 'Install and trying to open it when ಠ‿ಠ'
2025-12-19 16:04:33 +07:00
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 !'
2025-07-31 09:02:08 +07:00
} || err 'ERROR : Repacking failed !'
2025-07-26 21:35:23 +07:00
}
2026-01-11 11:46:55 +07:00
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
}
2025-07-28 23:19:08 +07:00
check_mbshield( ) {
2025-07-30 11:04:11 +07:00
is_unpacked || return 1
2025-09-13 15:13:49 +07:00
if [ -f " $DIRPATH " /mbapk/mbapk_unpacked/root/assets/mbshield.szip ]
2025-07-28 23:19:08 +07:00
then
2025-07-31 09:02:08 +07:00
info " $mbshield_found "
2025-12-02 20:52:22 +07:00
iszdefend
2025-07-28 23:19:08 +07:00
else
2025-07-31 09:02:08 +07:00
info " $mbshield_not_found "
2025-07-28 23:19:08 +07:00
fi
}
convert_apks( ) {
2025-12-31 17:46:49 +07:00
[ [ $( uname -a | grep Linux) ] ] && local - ; set -e
2025-07-30 09:53:39 +07:00
ls " $DIRPATH " /mbapk/*.apks >/dev/null 2>& 1 || {
2025-07-31 09:02:08 +07:00
err "APKs missing, cannot continue !"
2026-01-11 11:49:38 +07:00
return 0
2025-07-28 23:19:08 +07:00
}
apkeditor_exist
2025-07-31 09:02:08 +07:00
info "Converting apks to apk..."
2025-07-28 23:19:08 +07:00
java -jar tools/apkeditor.jar m -i mbapk/*.apks
mv mbapk/*.apk mbapk/MBOriginal.apk
2025-07-31 09:02:08 +07:00
info 'Cleaning left over [apks] files...'
2025-07-28 23:19:08 +07:00
rm -f mbapk/*.apks
2026-02-20 01:26:04 +07:00
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 ; }
2025-07-31 09:02:08 +07:00
info "You probably can continue to unpack APK!"
2025-07-28 23:19:08 +07:00
}
2025-07-26 22:24:59 +07:00
run_patcher( ) {
2025-07-30 13:46:47 +07:00
is_unpacked_lib && bash ./parse.sh && bash ./patch.sh
2025-07-26 22:24:59 +07:00
}
run_legacy_patcher( ) {
is_unpacked_lib && bash ./legacy_patch.sh
}
2025-04-30 20:51:31 +07:00
# Banner
2025-06-20 08:32:46 +07:00
$FIGLET "MBCPApp Patcher"
2025-05-01 07:23:40 +07:00
echo -------------------------------------------------------------
2025-07-30 09:41:48 +07:00
echo "Patching tool for MB Bank app with Flutter engine (v6.4.0+)"
echo "Original APK must be inside [mbapk] folder !"
2025-06-21 11:36:36 +07:00
echo -------------------------------------------------------------
2025-09-17 10:20:39 +07:00
echo " Current commit : $COMMIT ( $BRANCH ) "
2025-08-19 12:35:47 +07:00
echo "Source code : https://git.disroot.org/mbcp/mbbpatch.git"
2026-02-20 01:26:04 +07:00
echo "Documentation : see [docs] folder"
echo "Written from scratch by Cuynu with love <3"
2025-09-13 17:30:58 +07:00
echo -------------------------------------------------------------
2026-01-11 11:46:55 +07:00
echo App status : $( successunpack)
echo -------------------------------------------------------------
2025-09-13 17:30:58 +07:00
# Main functions
2025-04-30 20:29:51 +07:00
PS3 = 'Please select options to continue : '
2026-01-11 11:46:55 +07:00
select opt in 'Pull latest commit' 'Unpack APK' 'Convert apks to apk' 'Repack APK' 'Install patched app' 'MBShield 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'
2025-04-30 20:29:51 +07:00
do
2025-07-28 23:10:07 +07:00
case " $opt " in
2025-12-19 16:19:58 +07:00
'Download/update tools' ) download_tools ; ;
2025-07-28 23:10:07 +07:00
'Unpack APK' ) unpack_mbcp ; ;
'Repack APK' ) repack_mbcp ; ;
'Patch App' ) run_patcher ; ;
'Legacy patches' ) run_legacy_patcher ; ;
2025-07-28 23:19:08 +07:00
'MBShield Check' ) check_mbshield ; ;
'Convert apks to apk' ) convert_apks ; ;
2025-07-28 23:10:07 +07:00
'Extract assets [ROOT]' )
2026-02-08 14:07:06 +07:00
is_unpacked || exit 1
2026-02-08 00:48:49 +07:00
isvcm1
2025-12-02 20:52:22 +07:00
iszdefend
2025-07-31 09:02:08 +07:00
info 'To extract encrypted assets [if current app has MBShield protection] you need rooted device'
2026-04-04 00:21:23 +07:00
info 'And trigger a built-in app assets extraction !'
2025-04-30 20:29:51 +07:00
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
2025-07-31 09:02:08 +07:00
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.'
2025-04-30 20:29:51 +07:00
elif [ " $opt " = = 'Extract assets' ] ; then
2025-07-30 09:53:39 +07:00
if [ -d " $DIRPATH " /mbapk/mbapk_unpacked/ ]
2025-04-30 20:29:51 +07:00
then
2025-09-13 15:13:49 +07:00
if [ -f " $DIRPATH " /mbapk/mbapk_unpacked/root/assets/mbshield.szip ]
2025-04-30 20:29:51 +07:00
then
2025-07-30 13:46:47 +07:00
info "MBShield found ! Continuing !!!"
2025-07-31 09:02:08 +07:00
warn 'You MUST grant root access to [com.android.shell] in order to extract assets !'
info 'Trying to extract assets...'
2025-05-01 07:23:40 +07:00
adb shell am force-stop com.mbmobile
adb shell rm -rf /sdcard/assets
adb shell mkdir /sdcard/assets
2025-07-26 21:04:14 +07:00
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
2025-07-31 09:02:08 +07:00
info 'Copying assets...'
2025-10-26 10:03:40 +07:00
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 !"
2025-04-30 20:29:51 +07:00
else
2025-07-30 13:46:47 +07:00
info "MBShield not found ! No need to extract assets !"
2025-04-30 20:29:51 +07:00
fi
else
2025-07-30 13:46:47 +07:00
err "Can't find [mbapk/mbapk_unpacked] folder, cannot continue ! "
2025-07-31 09:02:08 +07:00
err "Please unpack APK first !"
2025-04-30 20:29:51 +07:00
fi
elif [ " $opt " = = 'Exit' ] ; then
clear
2025-07-23 02:40:48 +07:00
bash mbcpapp.sh
2025-04-30 20:29:51 +07:00
break
fi
done
2026-01-11 11:46:55 +07:00
; ;
'Restart script' )
bash mbcpapp.sh
2025-07-28 23:10:07 +07:00
; ;
'Clear MBCPApp/MBBank app data' )
2025-07-31 09:02:08 +07:00
info "Clearing [com.mbmobile] data..."
2025-07-28 23:10:07 +07:00
adb shell pm clear com.mbmobile
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
2025-07-30 13:46:47 +07:00
info "Current logged in account will remain present, even if app data is cleared !"
2025-07-28 23:10:07 +07:00
; ;
'Pull latest commit' )
2026-03-16 04:19:50 +07:00
git pull origin dev
2025-07-31 09:02:08 +07:00
info "Please run patcher again !"
2025-07-28 23:10:07 +07:00
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' )
2025-07-31 09:02:08 +07:00
info "Cleaning, please wait..."
2025-07-28 23:10:07 +07:00
rm -f mbcpapp_apk/*.apk
rm -f mbcpapp_apk/*.zip
rm -f mbapk/*.apk
rm -f mbapk/*.apks
rm -rf mbapk/mbapk_unpacked
2025-07-31 09:02:08 +07:00
info "Cleared !"
2025-07-28 23:10:07 +07:00
; ;
'Install patched app' )
2025-07-31 09:02:08 +07:00
info 'Select your patched version to continue'
2025-08-08 08:13:48 +07:00
PS3 = 'Select patched version to continue, or [4] to quit : '
2025-10-06 17:28:31 +07:00
select opt in 'App patched with newer version [v6.4.59+]' 'App patched with specific version' 'App patched with older version [v6.4.55 or lower]' 'Exit'
2025-07-16 04:05:15 +07:00
do
2025-08-07 05:31:02 +07:00
if [ " $opt " = = 'App patched with newer version [v6.4.59+]' ] ; then
2026-02-07 16:06:24 +07:00
if [ -f " $DIRPATH " /mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT .apk ]
then
2025-08-07 05:31:02 +07:00
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
2026-02-07 16:06:24 +07:00
adb install " mbcpapp_apk/MBCP_Flutter_SelfPatched_ $COMMIT .apk "
2025-08-07 05:31:02 +07:00
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
else
2026-02-07 16:06:24 +07:00
err " [MBCP_Flutter_SelfPatched_ $COMMIT .apk] not found, cannot continue ! "
2025-08-07 05:31:02 +07:00
fi
2025-10-01 17:40:23 +07:00
elif [ " $opt " = = 'App patched with specific version' ] ; then
2026-02-07 16:06:24 +07:00
if [ -f " $DIRPATH " /mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT .apk ]
then
2025-07-31 09:02:08 +07:00
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 !!!"
2025-07-16 04:05:15 +07:00
adb kill-server
adb start-server
2026-02-07 16:06:24 +07:00
adb install " mbcpapp_apk/MBCP_Flutter_SelfPatched_ $COMMIT .apk "
2025-10-01 17:40:23 +07:00
# 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*
2025-11-16 02:59:55 +07:00
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/policyme*
2025-07-31 09:02:08 +07:00
warn "ATTENTION : Network traffic will be redirected to [medium.com] for 20 seconds !!!"
2025-07-26 21:11:41 +07:00
adb shell su -c 'iptables -t nat -A OUTPUT -p tcp -d 0/0 -j DNAT --to-destination 162.159.153.4:443'
2025-07-16 04:05:15 +07:00
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
sleep 20
2025-07-31 09:02:08 +07:00
info "Restoring network traffic"
2025-07-26 21:11:41 +07:00
adb shell su -c 'iptables -t nat -F OUTPUT'
2025-07-31 09:02:08 +07:00
info "Press [Try again] after got 1005/1007 error on MB, so it's can skip device not secure dialog !"
2025-07-16 04:05:15 +07:00
else
2026-02-07 16:06:24 +07:00
err " [MBCP_Flutter_SelfPatched_ $COMMIT .apk] not found, cannot continue ! "
2025-07-16 04:05:15 +07:00
fi
elif [ " $opt " = = 'App patched with older version [v6.4.55 or lower]' ] ; then
2026-02-07 16:06:24 +07:00
if [ -f " $DIRPATH " /mbcpapp_apk/MBCP_Flutter_SelfPatched_$COMMIT .apk ]
then
2025-07-31 09:02:08 +07:00
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 !!!"
2025-07-16 04:05:15 +07:00
adb kill-server
adb start-server
2026-02-07 16:06:24 +07:00
adb install " mbcpapp_apk/MBCP_Flutter_SelfPatched_ $COMMIT .apk "
2025-07-16 04:05:15 +07:00
adb shell am start -n com.mbmobile/io.flutter.plugins.MainActivity
else
2026-02-07 16:06:24 +07:00
err " [MBCP_Flutter_SelfPatched_ $COMMIT .apk] not found, cannot continue ! "
2025-07-16 04:05:15 +07:00
fi
elif [ " $opt " = = 'Exit' ] ; then
2025-07-31 09:29:19 +07:00
PS3 = 'Please select options to continue : '
break
2025-07-16 04:05:15 +07:00
fi
done
2025-07-28 23:10:07 +07:00
; ;
2026-01-11 11:46:55 +07:00
'Exit' ) exit ; ;
2025-07-28 23:10:07 +07:00
esac
2025-05-01 07:23:40 +07:00
done
2025-06-16 23:30:42 +07:00