summaryrefslogtreecommitdiffstats
path: root/userspace/cuda/tools/ghidra_full_analysis.sh
blob: a143a8001fc29c80a1c2b7c85fc4a14d1c9b8635 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/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 <binary> [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 <binary> [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"