FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive ENV JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ENV ANDROID_SDK_ROOT=/home/user/android-sdk ENV PATH="${JAVA_HOME}/bin:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${PATH}" RUN apt-get update && apt-get install -y \ openjdk-21-jdk wget unzip python3 curl ca-certificates \ && rm -rf /var/lib/apt/lists/* RUN useradd -m -u 1000 user WORKDIR /home/user # Android command-line tools RUN mkdir -p "$ANDROID_SDK_ROOT/cmdline-tools" && \ cd /tmp && \ wget -q https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip -O cmd.zip && \ unzip -q cmd.zip && \ mv cmdline-tools "$ANDROID_SDK_ROOT/cmdline-tools/latest" && \ rm -f cmd.zip # Install official NDK RUN yes | sdkmanager --sdk_root="$ANDROID_SDK_ROOT" --licenses >/dev/null && \ sdkmanager --sdk_root="$ANDROID_SDK_ROOT" "ndk;29.0.14206865" # Ghidra ENV GHIDRA_URL=https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_12.0.4_build/ghidra_12.0.4_PUBLIC_20260303.zip RUN wget -q "$GHIDRA_URL" -O ghidra.zip && \ unzip -q ghidra.zip && \ mv ghidra_* ghidra && \ test -x /home/user/ghidra/support/analyzeHeadless && \ rm ghidra.zip RUN mkdir -p /data /home/user/android_libs COPY --chown=user:user libmsaoaidsec.so /home/user/libmsaoaidsec.so COPY --chown=user:user export_all.py /home/user/export_all.py # Copy REAL ARM64 libraries from the NDK sysroot RUN set -eux; \ ndk_root="$(find "$ANDROID_SDK_ROOT/ndk" -mindepth 1 -maxdepth 1 -type d | sort | tail -n 1)"; \ test -n "$ndk_root"; \ arm64_sysroot="$(find "$ndk_root/toolchains/llvm/prebuilt" -type d -path '*/sysroot/usr/lib/aarch64-linux-android' | head -n 1)"; \ test -n "$arm64_sysroot"; \ for lib in \ liblog.so \ libandroid.so \ libEGL.so \ libGLESv2.so \ libGLESv3.so \ libGLESv1_CM.so \ libc.so \ libm.so \ libdl.so \ libz.so; do \ src="$(find "$arm64_sysroot" -type f -name "$lib" | head -n 1)"; \ test -n "$src"; \ cp "$src" "/home/user/android_libs/$lib"; \ done # UI RUN cat > /home/user/index.html <<'HTML' Ghidra Analysis Active

Ghidra Analysis Active

Target: libmsaoaidsec.so

Real ARM64 Android libraries are loaded from the official NDK sysroot.

Output: /data/libmsaoaidsec_pseudocode.cpp

HTML # Launcher RUN cat > /home/user/run.sh <<'SH' #!/bin/bash set -euo pipefail GHIDRA="/home/user/ghidra/support/analyzeHeadless" test -x "$GHIDRA" IMPORT_ARGS=() # Import ARM64 libs first so Ghidra has them in-project before analyzing lib.so while IFS= read -r -d '' f; do IMPORT_ARGS+=(-import "$f") done < <(find ./android_libs -maxdepth 1 -type f -name '*.so' -print0 | sort -z) # Target last IMPORT_ARGS+=(-import ./libmsaoaidsec.so) "$GHIDRA" \ /tmp tmp_proj \ "${IMPORT_ARGS[@]}" \ -scriptPath . \ -postScript export_all.py /data/libmsaoaidsec_pseudocode.cpp \ -deleteProject echo "--- DECOMPILATION COMPLETE ---" SH RUN chmod +x /home/user/run.sh USER user CMD python3 -m http.server 7860 & \ ./run.sh && \ wait