mirror of
https://codeberg.org/KeybadeBlox/JSRF-Decompilation.git
synced 2026-02-20 02:07:02 +03:00
In short, we ran afoul of this issue because the Ghidra delinking
headless script begins its arguments with slashes, making them look like
absolute paths:
https://stackoverflow.com/questions/7250130/how-to-stop-mingw-and-msys-from-mangling-path-names-given-at-the-command-line
77 lines
2.2 KiB
Bash
Executable file
77 lines
2.2 KiB
Bash
Executable file
#!/bin/sh -eu
|
|
# Script to produce delinked object files in decompile/target/ directory from
|
|
# objects.csv and a Ghidra project via boricj's delinker extension
|
|
|
|
main() {
|
|
if [ $# -ne 3 ]; then usage; fi
|
|
|
|
ghidra_path=$1
|
|
project_path=$2
|
|
project_name=$3
|
|
|
|
printf '=== Delinking object files into ../decompile/target/ ===\n'
|
|
|
|
while IFS= read -r line; do # Read objects.csv line by line
|
|
# Split columns (col 1 in $1, col 2 in $2, etc.)
|
|
set -f; IFS_PREV=$IFS; IFS=,
|
|
set -- $line
|
|
set +f; IFS=$IFS_PREV
|
|
|
|
if [ "$2" = true ]; then # If object is marked for extraction
|
|
object_name=$1
|
|
printf '\n--- %s ---\n' "$object_name"
|
|
|
|
# Delete object name and delink toggle positional
|
|
# arguments, leaving only address ranges
|
|
shift 2
|
|
|
|
# Call Ghidra delinker script
|
|
delink "$ghidra_path" "$project_path" "$project_name" "$*" "$object_name"
|
|
fi
|
|
done < objects.csv
|
|
|
|
printf '\nDelinking complete!\n'
|
|
}
|
|
|
|
usage() {
|
|
printf '%s\n'\
|
|
'Usage: delink.sh GHIDRA_PATH PROJECT_PATH PROJECT_NAME'\
|
|
' GHIDRA_PATH is the path to your Ghidra installation'\
|
|
' PROJECT_PATH is the path to your JSRF Ghidra project'\
|
|
' PROJECT_NAME is the name of your JSRF Ghidra project'\
|
|
''\
|
|
'Populates the target/ directory with delinked object files using the address'\
|
|
'ranges given in objects.csv.' >& 2
|
|
exit 2
|
|
}
|
|
|
|
delink() {
|
|
# Invoke headless Ghidra with the delinker script to produce an object file
|
|
# $1: Ghidra installation path
|
|
# $2: Ghidra project path
|
|
# $3: Ghidra project name
|
|
# $4: Whitespace-separated address ranges to include in object
|
|
# $5: Output path (inside decompile/target/)
|
|
# Call the right script depending on whether we're on Windows
|
|
# (this seems like the most reliable method I can find for POSIX sh)
|
|
if [ -n "$WINDIR" ]; then suffix=.bat
|
|
else suffix=
|
|
fi
|
|
|
|
# POSIX compatibility layers for Windows (like in git bash) will
|
|
# interpret arguments like /exporter as filepaths and attempt to
|
|
# convert them to Windows paths, breaking them; this variable disables
|
|
# that
|
|
export MSYS_NO_PATHCONV=1
|
|
|
|
"$1/support/analyzeHeadless$suffix" "$2" "$3"\
|
|
-process default.xbe\
|
|
-noanalysis\
|
|
-postScript DelinkProgram.java\
|
|
/exporter 'COFF relocatable object'\
|
|
$(printf "/include-range %s " $4)\
|
|
/export "../decompile/target/$5"
|
|
}
|
|
|
|
|
|
main "$@"
|