| 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 |
|
|
| |
| 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 |
|
|
| |
| RUN yes | sdkmanager --sdk_root="$ANDROID_SDK_ROOT" --licenses >/dev/null && \ |
| sdkmanager --sdk_root="$ANDROID_SDK_ROOT" "ndk;29.0.14206865" |
|
|
| |
| 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 |
|
|
| |
| 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 |
|
|
| |
| RUN cat > /home/user/index.html <<'HTML' |
| <!doctype html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <title>Ghidra Analysis Active</title> |
| <style> |
| body { font-family: Arial, sans-serif; margin: 40px; background: |
| .card { max-width: 760px; background: white; border-radius: 16px; padding: 24px 28px; box-shadow: 0 4px 22px rgba(0,0,0,0.08); } |
| code { background: |
| </style> |
| </head> |
| <body> |
| <div class="card"> |
| <h1>Ghidra Analysis Active</h1> |
| <p>Target: <code>libmsaoaidsec.so</code></p> |
| <p>Real ARM64 Android libraries are loaded from the official NDK sysroot.</p> |
| <p>Output: <code>/data/libmsaoaidsec_pseudocode.cpp</code></p> |
| </div> |
| </body> |
| </html> |
| HTML |
|
|
| |
| RUN cat > /home/user/run.sh <<'SH' |
| |
| set -euo pipefail |
|
|
| GHIDRA="/home/user/ghidra/support/analyzeHeadless" |
| test -x "$GHIDRA" |
|
|
| IMPORT_ARGS=() |
|
|
| |
| while IFS= read -r -d '' f; do |
| IMPORT_ARGS+=(-import "$f") |
| done < <(find ./android_libs -maxdepth 1 -type f -name '*.so' -print0 | sort -z) |
|
|
| |
| 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 |