scripts/android/mitmproxy.sh

157 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env sh
res=
choose_emulator() {
emulators=($(emulator -list-avds | tr ' ' '\n'))
if [ ${#emulators[@]} -eq 0 ]; then
echo "No avds found. Please create (at least) one"
exit 1
fi
echo "Choose one of the following ${#emulators[@]} avds:"
i=0
for emulator in ${emulators[@]}; do
i=$((i+1))
echo " $i) $emulator"
done
printf "AVD (number): "
read avd
avd_index=$((avd-1))
if [ ! -v 'emulators[avd_index]' ]; then
echo "'$avd' is not a valid number"
exit 1
fi
res=${emulators[$avd_index]}
}
ca_certname() {
certname=$(openssl x509 -inform PEM -subject_hash_old -in ~/.mitmproxy/mitmproxy-ca-cert.cer | head -1)
res=$certname.0
}
ensure_ca_cert() {
ca_certname
certname=$res
cp ~/.mitmproxy/mitmproxy-ca-cert.cer ~/.mitmproxy/$certname
}
proxy_address() {
proxy=$(ip route get 1.1.1.1 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'):8080
if [[ -v MITMPROXY_ADDRESS ]]; then
proxy=$MITMPROXY_ADDRESS
echo "Using proxy address set via 'MITMPROXY_ADDRESS' env variable ($proxy)"
else
echo "Using default proxy settings ($proxy). Set the 'MITMPROXY_ADDRESS' env variable to overwrite the proxy address. Always use your network address instead of 127.0.0.1"
fi
res=$proxy
}
verify_commands() {
commands=("adb" "emulator" "mitmproxy")
for command in "${commands[@]}"; do
which $command &> /dev/null
if [ $? -ne 0 ]; then
# if the command cannot be found it maybe wasn't added to PATH but still exists on the system
case $command in
adb)
PATH=$PATH:$HOME/Android/Sdk/platform-tools
;;
emulator)
PATH=$PATH:$HOME/Android/Sdk/emulator
;;
esac
which $command &> /dev/null
if [ $? -ne 0 ]; then
echo "command '$command' not found"
exit 1
fi
echo "Warn: command '$command' was found ($(which $command)) but isn't in PATH"
fi
done
}
verify_certs() {
if [ ! -f ~/.mitmproxy/mitmproxy-ca-cert.cer ]; then
echo "mitmproxy ca cert doesn't exist (~/.mitmproxy/mitmproxy-ca-cert.cer). Please run mitmproxy at least once to generate it"
exit 1
fi
}
up() {
verify_certs
choose_emulator
avd=$res
# shut down existing avds
down &> /dev/null
adb kill-server &> /dev/null
adb start-server > /dev/null
emulator -avd $avd -writable-system > /dev/null &
adb wait-for-device
if [ "$(adb shell getprop ro.build.fingerprint)" = "*/release-keys" ]; then
echo "Doesn't work on release android version. Please use an emulator without Google Play."
exit 1
fi
ensure_ca_cert
ca_certname
ca_cert=$res
adb root
# without sleeping adb wouldn't find the emulator
sleep 5
api_version=$(adb shell getprop ro.build.version.sdk)
if [[ "$api_version" -gt "28" ]]; then
adb shell avbctl disable-verification
adb reboot
adb wait-for-device
adb root
sleep 5
fi
adb remount
adb push ~/.mitmproxy/$ca_cert /system/etc/security/cacerts
adb shell chmod 644 /system/etc/security/cacerts/$ca_cert
adb reboot
# wait until device has actually booted. this is required b/c it needs to be booted in order to set the proxy
while [ "`adb shell getprop sys.boot_completed 2> /dev/null | tr -d '\r' `" != "1" ]; do sleep 1; done
proxy_address
proxy_addr=$res
adb shell settings put global http_proxy $proxy_addr
}
down() {
adb shell shell settings put global http_proxy :0
adb shell reboot -p
}
main() {
case "$1" in
up)
verify_commands
up
;;
down)
verify_commands
down
;;
*)
echo "$0 [up|down]"
exit 1
;;
esac
}
main $@