diff --git a/README.md b/README.md index b1aecad..42e2f24 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,20 @@ Output: `MasterPDFEditor.dylib` ## Usage +To use the dylib, you have two options: + +**Option 1 — DYLD_INSERT_LIBRARIES** (requires SIP to be turned off; refer to [Apple's documentation](https://developer.apple.com/documentation/security/disabling-and-enabling-system-integrity-protection)): + ```sh DYLD_INSERT_LIBRARIES=/path/to/MasterPDFEditor.dylib '/Applications/Master PDF Editor.app/Contents/MacOS/Master PDF Editor' ``` +**Option 2 — Permanent injection** (uses [optool](https://github.com/alexzielenski/optool) to inject the dylib into the app bundle): + +```sh +./inject.sh /path/to/MasterPDFEditor.dylib '/Applications/Master PDF Editor.app' +``` + ## Analysis Full reverse engineering write-up: [noham.dev](https://noh.am/en/posts/master-pdf-editor-patch-analysis/) \ No newline at end of file diff --git a/inject.sh b/inject.sh new file mode 100755 index 0000000..9718919 --- /dev/null +++ b/inject.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +set -e # Exit immediately if a command exits with a non-zero status + +# Function to display usage instructions +usage() { + echo "Usage: $0 " + echo " dylib - The dynamic library to inject." + echo " app_path - The path to the .app bundle." + exit 1 +} + +# Ensure required arguments are provided +if [ "$#" -ne 2 ]; then + echo "[ERROR] Incorrect number of arguments." + usage +fi + +DYLIB=$1 +APP_PATH=$2 + +# Validate inputs +if [ ! -f "$DYLIB" ]; then + echo "[ERROR] The specified dynamic library ($DYLIB) does not exist." + exit 1 +fi + +if [ ! -d "$APP_PATH" ]; then + echo "[ERROR] The specified app path ($APP_PATH) does not exist." + exit 1 +fi + +INFO_PLIST_PATH="$APP_PATH/Contents/Info.plist" +if [ ! -f "$INFO_PLIST_PATH" ]; then + echo "[ERROR] Info.plist not found at $INFO_PLIST_PATH" + exit 1 +fi + +# Get the executable name from Info.plist +APP_NAME=$(/usr/libexec/PlistBuddy -c "Print CFBundleExecutable" "$INFO_PLIST_PATH") +if [ -z "$APP_NAME" ]; then + echo "[ERROR] Could not read CFBundleExecutable from $INFO_PLIST_PATH" + exit 1 +fi + +echo "[INFO] Executable name: $APP_NAME" + +EXECUTABLE_PATH="$APP_PATH/Contents/MacOS/$APP_NAME" +if [ ! -f "$EXECUTABLE_PATH" ]; then + echo "[ERROR] The specified executable ($EXECUTABLE_PATH) does not exist." + exit 1 +fi + +# Ensure Resources folder exists +mkdir -p "$APP_PATH/Contents/Resources/" + +# Copy the dylib to the Resources folder +cp "$DYLIB" "$APP_PATH/Contents/Resources/" +echo "[INFO] Copied $DYLIB to $APP_PATH/Contents/Resources/" + +# # Remove existing code signature +# codesign --remove-signature "$EXECUTABLE_PATH" +# echo "[INFO] Removed existing code signature from $EXECUTABLE_PATH" + +# Inject the dylib using optool +optool install -c load -p "@executable_path/../Resources/$(basename "$DYLIB")" -t "$EXECUTABLE_PATH" +echo "[INFO] Injected $DYLIB into $EXECUTABLE_PATH" + +# Re-sign the application +sudo codesign -f -s - --timestamp=none --all-architectures --deep "$APP_PATH" +sudo xattr -cr "$APP_PATH" +echo "[INFO] Re-signed $APP_PATH" + +exit 0 \ No newline at end of file