#!/bin/bash # SPDX-License-Identifier: BSD-3-Clause # # ghidra_full_analysis.sh - import a CUDA userspace library into a fresh # Ghidra project and run a full auto-analysis tuned for a large stripped # vendor binary. # # This is the fixed version of the original per-version helper: passing # `-analysisTimeoutPerFile 0` made this Ghidra build abort analysis after # 0 seconds (see run/ghidra-analyze.log: "Analysis timed out at 0 seconds"), # so the old project contains no analysis at all. # # Usage: ghidra_full_analysis.sh [project_dir] [project_name] # env: GHIDRA_HOME (default /snap/ghidra/current/ghidra) # GHIDRA_HEADLESS_MAXMEM (default 12G) # # The project is kept so the expensive analysis runs exactly once; all later # decompilation uses ghidra_batch_decompile.sh / ghidra_decompile_at.sh with # -noanalysis against the same project. set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" GHIDRA_HOME="${GHIDRA_HOME:-/snap/ghidra/current/ghidra}" ANALYZE="$GHIDRA_HOME/support/analyzeHeadless" export GHIDRA_HEADLESS_MAXMEM="${GHIDRA_HEADLESS_MAXMEM:-12G}" BIN="${1:?usage: $0 [project_dir] [project_name]}" PROJECT_DIR="${2:-$(dirname "$BIN")/ghidra-full}" PROJECT_NAME="${3:-cuda-full}" [ -x "$ANALYZE" ] || { echo "analyzeHeadless not found at $ANALYZE"; exit 1; } [ -f "$BIN" ] || { echo "no such binary: $BIN"; exit 1; } mkdir -p "$PROJECT_DIR" echo "[*] importing + analyzing $BIN" echo " project: $PROJECT_DIR/$PROJECT_NAME" echo " heap: $GHIDRA_HEADLESS_MAXMEM" echo " (Decompiler Parameter ID and Function ID are disabled by" echo " ConfigureAnalysis.java; everything else stays on.)" "$ANALYZE" "$PROJECT_DIR" "$PROJECT_NAME" \ -import "$BIN" \ -overwrite \ -scriptPath "$HERE/ghidra" \ -preScript ConfigureAnalysis.java \ -analysisTimeoutPerFile 14400 \ -max-cpu "${MAX_CPU:-8}" echo "[ok] analysis complete: $PROJECT_DIR/$PROJECT_NAME"