2 Commits

Author SHA1 Message Date
√(noham)²
acdbd1a3a2 Add inject.sh and permanent injection docs 2026-07-12 14:23:04 +02:00
√(noham)²
c77cb47e51 Update README.md 2026-07-12 13:20:44 +02:00
2 changed files with 85 additions and 1 deletions

View File

@@ -11,7 +11,7 @@ The dylib hooks `MainWindow::ValidateLicense` to force license flags, then calls
## Build ## Build
```sh ```sh
git clone --recurse-submodules https://github.com/nohamelin/MasterPDFEditor-patch.git git clone --recurse-submodules https://github.com/NohamR/MasterPDFEditor-patch.git
cd MasterPDFEditor-patch cd MasterPDFEditor-patch
make make
``` ```
@@ -20,10 +20,20 @@ Output: `MasterPDFEditor.dylib`
## Usage ## 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 ```sh
DYLD_INSERT_LIBRARIES=/path/to/MasterPDFEditor.dylib '/Applications/Master PDF Editor.app/Contents/MacOS/Master PDF Editor' 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 ## Analysis
Full reverse engineering write-up: [noham.dev](https://noh.am/en/posts/master-pdf-editor-patch-analysis/) Full reverse engineering write-up: [noham.dev](https://noh.am/en/posts/master-pdf-editor-patch-analysis/)

74
inject.sh Executable file
View File

@@ -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 <dylib> <app_path>"
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