diff --git a/docker/Dockerfile b/docker/Dockerfile index e0560b0..f5b4ade 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -35,11 +35,24 @@ ENV GHIDRA_HOME=/opt/ghidra # Copy GhydraMCP source and build WORKDIR /build + +# Copy pom.xml first and download dependencies (cached until pom.xml changes) COPY pom.xml . +RUN mvn dependency:resolve -P plugin-only -q \ + -Dghidra.generic.jar=${GHIDRA_HOME}/Ghidra/Framework/Generic/lib/Generic.jar \ + -Dghidra.softwaremodeling.jar=${GHIDRA_HOME}/Ghidra/Framework/SoftwareModeling/lib/SoftwareModeling.jar \ + -Dghidra.project.jar=${GHIDRA_HOME}/Ghidra/Framework/Project/lib/Project.jar \ + -Dghidra.docking.jar=${GHIDRA_HOME}/Ghidra/Framework/Docking/lib/Docking.jar \ + -Dghidra.decompiler.jar=${GHIDRA_HOME}/Ghidra/Features/Decompiler/lib/Decompiler.jar \ + -Dghidra.utility.jar=${GHIDRA_HOME}/Ghidra/Framework/Utility/lib/Utility.jar \ + -Dghidra.base.jar=${GHIDRA_HOME}/Ghidra/Features/Base/lib/Base.jar \ + || true + +# Now copy source - only this layer rebuilds on code changes COPY src ./src # Build the plugin (skip git-commit-id plugin since .git isn't in Docker context) -RUN mvn clean package -P plugin-only -DskipTests \ +RUN mvn package -P plugin-only -DskipTests \ -Dmaven.gitcommitid.skip=true \ -Dghidra.generic.jar=${GHIDRA_HOME}/Ghidra/Framework/Generic/lib/Generic.jar \ -Dghidra.softwaremodeling.jar=${GHIDRA_HOME}/Ghidra/Framework/SoftwareModeling/lib/SoftwareModeling.jar \ @@ -93,20 +106,24 @@ RUN mkdir -p /opt/ghidra/Ghidra/Extensions \ && rm /tmp/GhydraMCP-*.zip \ && chown -R ghidra:ghidra /opt/ghidra/Ghidra/Extensions/ -# Create directories for projects, binaries, and scripts -RUN mkdir -p /projects /binaries /home/ghidra/.ghidra /opt/ghidra/scripts \ - && chown -R ghidra:ghidra /projects /binaries /home/ghidra /opt/ghidra/scripts +# Create directories for projects and binaries +RUN mkdir -p /projects /binaries /home/ghidra/.ghidra \ + && chown -R ghidra:ghidra /projects /binaries /home/ghidra -# Download Gson JAR for headless script support -# (GhydraMCPServer.java requires Gson but headless scripts can't access extension libs) -RUN curl -fsSL "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.13.1/gson-2.13.1.jar" \ - -o /opt/ghidra/Ghidra/Framework/Generic/lib/gson-2.13.1.jar \ - && chown ghidra:ghidra /opt/ghidra/Ghidra/Framework/Generic/lib/gson-2.13.1.jar +# Copy GhydraMCP scripts to the BSim module's scripts directory +# BSim is a working feature module with proper OSGi bundle configuration for scripts +COPY docker/GhydraMCPServer.java /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/ +COPY docker/ImportRawARM.java /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/ +COPY docker/TestScript.java /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/ -# Copy the GhydraMCP scripts -COPY docker/GhydraMCPServer.java /opt/ghidra/scripts/ -COPY docker/ImportRawARM.java /opt/ghidra/scripts/ -RUN chown -R ghidra:ghidra /opt/ghidra/scripts/ && chmod 644 /opt/ghidra/scripts/*.java +# Set proper ownership, permissions, and timestamp to match Ghidra installation +# Ghidra appears to validate scripts by timestamp - newer files may be rejected +RUN chown ghidra:ghidra /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/GhydraMCPServer.java \ + /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/ImportRawARM.java \ + /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/TestScript.java \ + && touch -t 202508261420 /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/GhydraMCPServer.java \ + && touch -t 202508261420 /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/ImportRawARM.java \ + && touch -t 202508261420 /opt/ghidra/Ghidra/Features/BSim/ghidra_scripts/TestScript.java # Copy entrypoint script (755 so ghidra user can read and execute) COPY docker/entrypoint.sh /entrypoint.sh