From 38edc05f812c752713ca0fcecf1239d99d3efc3c Mon Sep 17 00:00:00 2001
From: Ryan Kurtz
Date: Thu, 17 Jun 2021 14:43:18 -0400
Subject: [PATCH] GP-1057: Preventing Ghidra from launching when path contains
!. Also updating Installation Guide's "Known Issues" section.
---
Ghidra/RuntimeScripts/Linux/server/ghidraSvr | 6 ++++
Ghidra/RuntimeScripts/Linux/support/launch.sh | 8 +++++
.../Windows/server/ghidraSvr.bat | 30 +++++++++++++------
.../Windows/server/svrInstall.bat | 6 +---
.../Windows/server/svrUninstall.bat | 6 +---
.../Windows/support/analyzeHeadless.bat | 10 +++----
.../Windows/support/buildGhidraJar.bat | 15 +++++++---
.../RuntimeScripts/Windows/support/launch.bat | 14 +++++++--
.../Windows/support/pythonRun.bat | 8 ++---
GhidraDocs/InstallationGuide.html | 9 +++++-
10 files changed, 73 insertions(+), 39 deletions(-)
diff --git a/Ghidra/RuntimeScripts/Linux/server/ghidraSvr b/Ghidra/RuntimeScripts/Linux/server/ghidraSvr
index 25e660ca40..833f002e93 100755
--- a/Ghidra/RuntimeScripts/Linux/server/ghidraSvr
+++ b/Ghidra/RuntimeScripts/Linux/server/ghidraSvr
@@ -64,6 +64,12 @@ SERVICE_NAME=org.rzo.yajsw.$APP_NAME
SCRIPT_FILE="$(readlink -f "$0" 2>/dev/null || readlink "$0" 2>/dev/null || echo "$0")"
SCRIPT_DIR="${SCRIPT_FILE%/*}"
+# Ensure Ghidra path doesn't contain illegal characters
+if [[ "$SCRIPT_DIR" = *"!"* ]]; then
+ echo "Ghidra path cannot contain a \"!\" character."
+ exit 1
+fi
+
# YAJSW likes absolute paths
cd "${SCRIPT_DIR}"
SCRIPT_DIR="$(pwd)"
diff --git a/Ghidra/RuntimeScripts/Linux/support/launch.sh b/Ghidra/RuntimeScripts/Linux/support/launch.sh
index 1a8109d705..84388eb590 100755
--- a/Ghidra/RuntimeScripts/Linux/support/launch.sh
+++ b/Ghidra/RuntimeScripts/Linux/support/launch.sh
@@ -86,7 +86,15 @@ if [[ ${INDEX} -lt 5 ]]; then
exit 1
fi
+# Sets SUPPORT_DIR to the directory that contains this file (launch.sh)
SUPPORT_DIR="${0%/*}"
+
+# Ensure Ghidra path doesn't contain illegal characters
+if [[ "$SUPPORT_DIR" = *"!"* ]]; then
+ echo "Ghidra path cannot contain a \"!\" character."
+ exit 1
+fi
+
if [ -f "${SUPPORT_DIR}/launch.properties" ]; then
# Production Environment
diff --git a/Ghidra/RuntimeScripts/Windows/server/ghidraSvr.bat b/Ghidra/RuntimeScripts/Windows/server/ghidraSvr.bat
index 5c84319168..bb2cf2596b 100644
--- a/Ghidra/RuntimeScripts/Windows/server/ghidraSvr.bat
+++ b/Ghidra/RuntimeScripts/Windows/server/ghidraSvr.bat
@@ -13,6 +13,22 @@ rem below:
rem set "JAVA_HOME="
+:: Sets SERVER_DIR to the directory that contains this file (ghidraSvr.bat).
+:: SERVER_DIR will not contain a trailing slash.
+::
+:: '% ~' dereferences the value in param 0
+:: 'd' - drive
+:: 'p' - path (without filename)
+:: '~0,-1' - removes trailing \
+set "SERVER_DIR=%~dp0"
+set "SERVER_DIR=%SERVER_DIR:~0,-1%"
+
+rem Ensure Ghidra path doesn't contain illegal characters
+if not %SERVER_DIR:!=%==%SERVER_DIR% (
+ echo Ghidra path cannot contain a "!" character.
+ exit /B 1
+)
+
setlocal enabledelayedexpansion
set OPTION=%1
@@ -48,10 +64,6 @@ if "%IS_ADMIN%"=="NO" (
if "%OPTION%"=="restart" goto adminFail
)
-rem Find the script directory
-rem %~dsp0 is location of current script under NT
-set "_REALPATH=%~dp0"
-
set APP_NAME=ghidraSvr
set APP_LONG_NAME=Ghidra Server
@@ -59,13 +71,13 @@ set MODULE_DIR=Ghidra\Features\GhidraServer
set WRAPPER_NAME_PREFIX=yajsw
-if exist "%_REALPATH%..\Ghidra\" goto normal
+if exist "%SERVER_DIR%\..\Ghidra\" goto normal
rem NOTE: If adjusting JAVA command assignment - do not attempt to add parameters (e.g., -d64, -version:1.7, etc.)
rem Development Environment
-set "GHIDRA_HOME=%_REALPATH%..\..\..\.."
-set "WRAPPER_CONF=%_REALPATH%..\..\Common\server\server.conf"
+set "GHIDRA_HOME=%SERVER_DIR%\..\..\..\.."
+set "WRAPPER_CONF=%SERVER_DIR%\..\..\Common\server\server.conf"
set "DATA_DIR=%GHIDRA_HOME%\%MODULE_DIR%\build\data"
set "CLASSPATH_FRAG=%GHIDRA_HOME%\%MODULE_DIR%\build\dev-meta\classpath.frag"
set "LS_CPATH=%GHIDRA_HOME%\GhidraBuild\LaunchSupport\bin\main"
@@ -73,8 +85,8 @@ set "LS_CPATH=%GHIDRA_HOME%\GhidraBuild\LaunchSupport\bin\main"
goto lab1
:normal
-set "GHIDRA_HOME=%_REALPATH%.."
-set "WRAPPER_CONF=%_REALPATH%server.conf"
+set "GHIDRA_HOME=%SERVER_DIR%\.."
+set "WRAPPER_CONF=%SERVER_DIR%\server.conf"
set "DATA_DIR=%GHIDRA_HOME%\%MODULE_DIR%\data"
set "CLASSPATH_FRAG=%GHIDRA_HOME%\%MODULE_DIR%\data\classpath.frag"
set "LS_CPATH=%GHIDRA_HOME%\support\LaunchSupport.jar"
diff --git a/Ghidra/RuntimeScripts/Windows/server/svrInstall.bat b/Ghidra/RuntimeScripts/Windows/server/svrInstall.bat
index 2df9605318..2e73d7afab 100644
--- a/Ghidra/RuntimeScripts/Windows/server/svrInstall.bat
+++ b/Ghidra/RuntimeScripts/Windows/server/svrInstall.bat
@@ -1,10 +1,6 @@
@echo off
setlocal
-rem Find the script directory
-rem %~dsp0 is location of current script under NT
-set "_REALPATH=%~dp0"
-
-call "%_REALPATH%\ghidraSvr" install
+call "%~dp0ghidraSvr" install
pause
diff --git a/Ghidra/RuntimeScripts/Windows/server/svrUninstall.bat b/Ghidra/RuntimeScripts/Windows/server/svrUninstall.bat
index ac5131418b..eb58d014c4 100644
--- a/Ghidra/RuntimeScripts/Windows/server/svrUninstall.bat
+++ b/Ghidra/RuntimeScripts/Windows/server/svrUninstall.bat
@@ -1,11 +1,7 @@
@echo off
setlocal
-rem Find the script directory
-rem %~dsp0 is location of current script under NT
-set "_REALPATH=%~dp0"
-
-call "%_REALPATH%\ghidraSvr" uninstall
+call "%~dp0ghidraSvr" uninstall
pause
diff --git a/Ghidra/RuntimeScripts/Windows/support/analyzeHeadless.bat b/Ghidra/RuntimeScripts/Windows/support/analyzeHeadless.bat
index e972b07cae..21824bccf8 100644
--- a/Ghidra/RuntimeScripts/Windows/support/analyzeHeadless.bat
+++ b/Ghidra/RuntimeScripts/Windows/support/analyzeHeadless.bat
@@ -1,8 +1,7 @@
:: Ghidra Headless Analyzer launch (see analyzeHeadlessREADME.html)
@echo off
-
-setlocal EnableDelayedExpansion
+setlocal
:: Maximum heap memory size. For headless, it is recommended to not use the default value
:: because garbage collection could take too long on systems with a large amount of physical
@@ -23,9 +22,6 @@ set DEBUG_ADDRESS=127.0.0.1:13002
set VMARG_LIST=-XX:ParallelGCThreads=2
set VMARG_LIST=%VMARG_LIST% -XX:CICompilerCount=2
-:: store current path
-set "filepath=%~dp0"
-
:: Loop through parameters (if there aren't any, just continue) and store
:: in params variable.
@@ -36,6 +32,7 @@ if "%~1" == "" goto cont
:: If -import is found and Windows has not done proper wildcard expansion, force
:: this to happen and save expansion to params variable.
+setlocal EnableDelayedExpansion
if "%~1" == "-import" (
set params=!params! -import
for %%f in ("%~2") DO (
@@ -45,10 +42,11 @@ if "%~1" == "-import" (
) else (
set params=!params! "%~1"
)
+setlocal DisableDelayedExpansion
shift
goto Loop
:cont
-call "%filepath%launch.bat" %LAUNCH_MODE% Ghidra-Headless "%MAXMEM%" "%VMARG_LIST%" ghidra.app.util.headless.AnalyzeHeadless %params%
+call "%~dp0launch.bat" %LAUNCH_MODE% Ghidra-Headless "%MAXMEM%" "%VMARG_LIST%" ghidra.app.util.headless.AnalyzeHeadless %params%
diff --git a/Ghidra/RuntimeScripts/Windows/support/buildGhidraJar.bat b/Ghidra/RuntimeScripts/Windows/support/buildGhidraJar.bat
index 07f1c4dddc..1d58bad254 100644
--- a/Ghidra/RuntimeScripts/Windows/support/buildGhidraJar.bat
+++ b/Ghidra/RuntimeScripts/Windows/support/buildGhidraJar.bat
@@ -7,10 +7,17 @@ setlocal
:: fg, debug, debug-suspend
set LAUNCH_MODE=fg
-:: Sets SCRIPT_DIR to the directory that contains this file (ends with '\')
-set "SCRIPT_DIR=%~dp0"
+:: Sets SUPPORT_DIR to the directory that contains this file (buildGhidraJar.bat).
+:: SUPPORT_DIR will not contain a trailing slash.
+::
+:: '% ~' dereferences the value in param 0
+:: 'd' - drive
+:: 'p' - path (without filename)
+:: '~0,-1' - removes trailing \
+set "SUPPORT_DIR=%~dp0"
+set "SUPPORT_DIR=%SUPPORT_DIR:~0,-1%"
-set "GHIDRA_ROOT_DIR=%SCRIPT_DIR%..\Ghidra"
+set "GHIDRA_ROOT_DIR=%SUPPORT_DIR%\..\Ghidra"
if exist "%GHIDRA_ROOT_DIR%" goto continue
echo This script does not support development mode use
@@ -20,4 +27,4 @@ exit /B 1
set APP_VMARGS=-DGhidraJarBuilder.Name=%~n0
-call "%~dp0launch.bat" %LAUNCH_MODE% Ghidra "" "%APP_VMARGS%" ghidra.util.GhidraJarBuilder -main ghidra.JarRun %*
+call "%SUPPORT_DIR%\launch.bat" %LAUNCH_MODE% Ghidra "" "%APP_VMARGS%" ghidra.util.GhidraJarBuilder -main ghidra.JarRun %*
diff --git a/Ghidra/RuntimeScripts/Windows/support/launch.bat b/Ghidra/RuntimeScripts/Windows/support/launch.bat
index 4ce41ccfed..b5ae0ca399 100644
--- a/Ghidra/RuntimeScripts/Windows/support/launch.bat
+++ b/Ghidra/RuntimeScripts/Windows/support/launch.bat
@@ -24,9 +24,6 @@ exit /B 1
:continue
-:: Delay the expansion of our loop items below since the value is being updated as the loop works
-setlocal enabledelayedexpansion
-
:: See if we were doubled clicked or run from a command prompt
set DOUBLE_CLICKED=n
for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" set DOUBLE_CLICKED=y
@@ -40,6 +37,17 @@ for /f "tokens=2" %%# in ("%cmdcmdline%") do if /i "%%#" equ "/c" set DOUBLE_CLI
:: '~0,-1' - removes trailing \
set "SUPPORT_DIR=%~dp0"
set "SUPPORT_DIR=%SUPPORT_DIR:~0,-1%"
+
+:: Ensure Ghidra path doesn't contain illegal characters
+if not %SUPPORT_DIR:!=%==%SUPPORT_DIR% (
+ echo Ghidra path cannot contain a "!" character.
+ set ERRORLEVEL=1
+ goto exit1
+)
+
+:: Delay the expansion of our loop items below since the value is being updated as the loop works
+setlocal enabledelayedexpansion
+
::
:: Parse arguments
::
diff --git a/Ghidra/RuntimeScripts/Windows/support/pythonRun.bat b/Ghidra/RuntimeScripts/Windows/support/pythonRun.bat
index 650e9f172b..3622672d2b 100644
--- a/Ghidra/RuntimeScripts/Windows/support/pythonRun.bat
+++ b/Ghidra/RuntimeScripts/Windows/support/pythonRun.bat
@@ -1,8 +1,7 @@
:: Ghidra python launch
@echo off
-
-setlocal EnableDelayedExpansion
+setlocal
:: Maximum heap memory size
:: Default for Windows 32-bit is 768M and 64-bit is 1024M
@@ -25,7 +24,4 @@ set DEBUG_ADDRESS=127.0.0.1:13002
set VMARG_LIST=-XX:ParallelGCThreads=2
set VMARG_LIST=%VMARG_LIST% -XX:CICompilerCount=2
-:: store current path
-set "filepath=%~dp0"
-
-call "%filepath%launch.bat" %LAUNCH_MODE% Ghidra-Python "%MAXMEM%" "%VMARG_LIST%" ghidra.python.PythonRun %params%
+call "%~dp0launch.bat" %LAUNCH_MODE% Ghidra-Python "%MAXMEM%" "%VMARG_LIST%" ghidra.python.PythonRun %params%
diff --git a/GhidraDocs/InstallationGuide.html b/GhidraDocs/InstallationGuide.html
index f7f5b5e72d..84dfd1fb84 100644
--- a/GhidraDocs/InstallationGuide.html
+++ b/GhidraDocs/InstallationGuide.html
@@ -18,7 +18,7 @@
Ghidra Installation Guide
-The installation information provided is effective as of Ghidra 9.2 and is subject to change with
+The installation information provided is effective as of Ghidra 10.0.1 and is subject to change with
future releases.
@@ -537,6 +537,10 @@ be installed in a pre-existing Eclipse installation.
new files. Future versions of Ghidra will address this in order to ensure compatibility with
the newest versions of Java.
+
+ Ghidra will not launch when its path contains a "!" character. This is to avoid issues that
+ Java's internal libraries have parsing these paths ("!" is used as a jar-separator by Java).
+
Windows
@@ -544,6 +548,9 @@ be installed in a pre-existing Eclipse installation.
Older versions of 7-Zip may not be able to unpack the Ghidra distribution file if it contains
any files with a 0-byte length. Upgrade to a newer version of 7-Zip to fix this problem.
+ -
+ Ghidra will fail to launch when its path contains a "^" character.
+
Linux