mirror of
https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
synced 2026-10-12 02:06:59 +00:00
145 lines
5.1 KiB
Bash
Executable File
145 lines
5.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Check if START_PORT, AVD_NAME, and open_gapps.zip are provided as arguments
|
|
AVD_NAME=$1
|
|
START_PORT=${2:-5554}
|
|
GAPPS_ZIP=$3
|
|
|
|
# Determine the emulator path based on OS
|
|
if [ "$(uname)" = "Darwin" ]; then
|
|
EMULATOR_PATH="$HOME/Library/Android/sdk/emulator/emulator"
|
|
elif [ "$(uname)" = "Linux" ]; then
|
|
EMULATOR_PATH="$HOME/Android/Sdk/emulator/emulator"
|
|
else
|
|
echo "$(tput setaf 1)Unsupported OS: $(uname)$(tput sgr0)"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if the emulator path exists and is executable
|
|
if [ ! -x "$EMULATOR_PATH" ]; then
|
|
echo "$(tput setaf 1)Emulator not found at $EMULATOR_PATH$(tput sgr0)"
|
|
exit 1
|
|
fi
|
|
|
|
# Locate adb path
|
|
if [ -x "$HOME/Android/Sdk/platform-tools/adb" ]; then
|
|
ADB_PATH="$HOME/Android/Sdk/platform-tools/adb"
|
|
elif [ -x "$HOME/Library/Android/sdk/platform-tools/adb" ]; then
|
|
ADB_PATH="$HOME/Library/Android/sdk/platform-tools/adb"
|
|
elif command -v adb >/dev/null 2>&1; then
|
|
ADB_PATH=$(command -v adb)
|
|
else
|
|
echo "$(tput setaf 3)adb not found in common locations. Defaulting to 'adb' in PATH.$(tput sgr0)"
|
|
ADB_PATH="adb"
|
|
fi
|
|
|
|
# Check if adb is available
|
|
if [ ! -x "$ADB_PATH" ]; then
|
|
echo "$(tput setaf 1)adb not found at $ADB_PATH$(tput sgr0)"
|
|
exit 1
|
|
fi
|
|
|
|
# If no AVD_NAME is provided, list available AVDs and exit
|
|
if [ -z "$AVD_NAME" ]; then
|
|
echo -e "$(tput bold)Available AVDs:$(tput sgr0)\n"
|
|
"$EMULATOR_PATH" -list-avds
|
|
echo -e "$(tput bold)\nUse any Android AVD 5.0 - 11.0, up to API 30 without Google Play (production image).$(tput sgr0)"
|
|
echo "$(tput bold)Usage: $0 AVD_NAME [START_PORT] [open_gapps.zip path]$(tput sgr0)"
|
|
echo "$(tput bold)Example: $0 Pixel_6_Pro_API_28 5554 /path/to/open_gapps.zip$(tput sgr0)"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if provided AVD_NAME exists in available AVDs
|
|
AVAILABLE_AVDS=$("$EMULATOR_PATH" -list-avds)
|
|
if ! echo "$AVAILABLE_AVDS" | grep -q "^$AVD_NAME$"; then
|
|
echo "$(tput setaf 1)Error: AVD $AVD_NAME not found in available AVDs.$(tput sgr0)"
|
|
echo "$(tput bold)Available AVDs:$(tput sgr0)"
|
|
echo "$AVAILABLE_AVDS"
|
|
exit 1
|
|
fi
|
|
|
|
# Kill any existing emulator processes
|
|
for pid in $(pgrep -f emulator); do
|
|
echo "Killing emulator process with PID $pid"
|
|
kill -9 "$pid"
|
|
done
|
|
|
|
# Start the emulator with user-defined AVD and port
|
|
"$EMULATOR_PATH" -avd "$AVD_NAME" -writable-system -no-snapshot -wipe-data -port "$START_PORT" >/dev/null 2>&1 &
|
|
echo "$(tput setaf 2)Starting AVD $AVD_NAME on port $START_PORT$(tput sgr0)"
|
|
echo "Waiting for emulator to boot..."
|
|
"$ADB_PATH" wait-for-device
|
|
|
|
# Check if socat is available only on Linux
|
|
if [ "$(uname)" = "Linux" ]; then
|
|
if command -v socat >/dev/null; then
|
|
SOCAT_AVAILABLE=true
|
|
else
|
|
SOCAT_AVAILABLE=false
|
|
echo "$(tput setaf 3)Warning: socat is not installed. Skipping port forwarding with socat. This might be required for docker in Linux.$(tput sgr0)"
|
|
fi
|
|
else
|
|
SOCAT_AVAILABLE=false
|
|
fi
|
|
|
|
# Increment ports and start socat listeners if socat is available
|
|
if [ "$SOCAT_AVAILABLE" = true ]; then
|
|
LISTEN_PORT=$((START_PORT + 2))
|
|
TARGET_PORT=$((START_PORT + 1))
|
|
# Remove all previous forwards
|
|
for pid in $(lsof -t -i TCP:$LISTEN_PORT -sTCP:LISTEN -c socat); do
|
|
echo "Killing socat process on port $LISTEN_PORT with PID $pid"
|
|
kill -9 "$pid"
|
|
done
|
|
# Start a single socat listener
|
|
socat TCP-LISTEN:$LISTEN_PORT,fork,reuseaddr TCP:localhost:$TARGET_PORT &
|
|
|
|
echo "socat listener started on port $LISTEN_PORT forwarding to $TARGET_PORT in the host."
|
|
echo "$(tput bold)Docker users please set the environment variable MOBSF_ANALYZER_IDENTIFIER=host.docker.internal:$LISTEN_PORT for adb connectivity.$(tput sgr0)"
|
|
fi
|
|
|
|
# Install Play Store if open_gapps.zip is provided
|
|
if [ -n "$GAPPS_ZIP" ]; then
|
|
if [ ! -f "$GAPPS_ZIP" ]; then
|
|
echo "$(tput setaf 1)Error: File $GAPPS_ZIP not found.$(tput sgr0)"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Installing PlayStore"
|
|
|
|
if ! command -v unzip >/dev/null; then
|
|
echo "$(tput setaf 1)Error: unzip is not installed.$(tput sgr0)"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v lzip >/dev/null; then
|
|
echo "$(tput setaf 1)Error: lzip is not installed.$(tput sgr0)"
|
|
exit 1
|
|
fi
|
|
|
|
PLAY_EXTRACT_DIR="play"
|
|
[ -d "$PLAY_EXTRACT_DIR" ] && rm -rf $PLAY_EXTRACT_DIR
|
|
unzip "$GAPPS_ZIP" 'Core/*' -d ./$PLAY_EXTRACT_DIR || { echo "$(tput setaf 1)Error: Unzip failed$(tput sgr0)"; exit 1; }
|
|
rm $PLAY_EXTRACT_DIR/Core/setup*
|
|
lzip -d $PLAY_EXTRACT_DIR/Core/*.lz || { echo "$(tput setaf 1)Error: Decompression failed$(tput sgr0)"; exit 1; }
|
|
for f in $(ls $PLAY_EXTRACT_DIR/Core/*.tar); do
|
|
tar -x --strip-components 2 -f $f -C $PLAY_EXTRACT_DIR || { echo "$(tput setaf 1)Error: Extraction failed$(tput sgr0)"; exit 1; }
|
|
done
|
|
|
|
echo "Waiting for the emulator to be ready..."
|
|
sleep 25
|
|
echo "Installing PlayStore components"
|
|
"$ADB_PATH" root
|
|
"$ADB_PATH" remount >/dev/null 2>&1
|
|
"$ADB_PATH" push $PLAY_EXTRACT_DIR/etc /system
|
|
"$ADB_PATH" push $PLAY_EXTRACT_DIR/framework /system
|
|
"$ADB_PATH" push $PLAY_EXTRACT_DIR/app /system
|
|
"$ADB_PATH" push $PLAY_EXTRACT_DIR/priv-app /system
|
|
"$ADB_PATH" shell stop
|
|
"$ADB_PATH" shell start
|
|
[ -d "$PLAY_EXTRACT_DIR" ] && rm -rf $PLAY_EXTRACT_DIR
|
|
echo "PlayStore installed successfully"
|
|
else
|
|
echo "$(tput setaf 3)No open_gapps.zip provided. Skipping Play Store installation.$(tput sgr0)"
|
|
fi
|