#!/usr/bin/env bash # analyze_native_libs.sh - regenerate native-side facts for analysis/NATIVE_LIB_*.md. # Emits ELF headers, NEEDED, JNI exports, import/export counts, and modern-linker checks. set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJ="$(cd "$HERE/../.." && pwd)" NL="$PROJ/original_reference/native_libs_original" OUT="$PROJ/analysis/rawdata"; mkdir -p "$OUT" [ -d "$NL" ] || { echo "Run extract_apk.sh first"; exit 1; } for so in "$NL"/*.so; do b="$(basename "$so")" echo "================= $b =================" file "$so" readelf -h "$so" | grep -iE 'Class|Type|Machine|Flags' echo "-- NEEDED --"; readelf -d "$so" 2>/dev/null | grep -E 'NEEDED|SONAME' | grep -oE '\[.*\]' echo -n "-- TEXTREL: "; readelf -d "$so" 2>/dev/null | grep -qi TEXTREL && echo PRESENT || echo none echo -n "-- exec-stack: "; readelf -l "$so" 2>/dev/null | grep -A1 GNU_STACK | grep -qi RWE && echo EXEC || echo non-exec echo -n "-- JNI exports: "; readelf -W --dyn-syms "$so" 2>/dev/null | grep -cE 'Java_|JNI_OnLoad' # per-lib dumps readelf -W --dyn-syms "$so" 2>/dev/null | grep -E 'Java_|JNI_OnLoad' | awk '{print $8}' | sort -u > "$OUT/${b%.so}_jni.txt" || true readelf -W --dyn-syms "$so" 2>/dev/null | awk '$7!="UND" && ($4=="FUNC"||$4=="OBJECT"){print $8}' | sort -u > "$OUT/${b%.so}_exports.txt" || true readelf -W --dyn-syms "$so" 2>/dev/null | awk '$7=="UND"{print $8}' | grep -vE '^$' | sort -u > "$OUT/${b%.so}_imports.txt" || true echo " exports=$(wc -l < "$OUT/${b%.so}_exports.txt") imports=$(wc -l < "$OUT/${b%.so}_imports.txt")" done echo "[+] Dumps in $OUT/"