Skip to content

Instantly share code, notes, and snippets.

@0xstragner
Last active August 26, 2023 20:51
Show Gist options
  • Save 0xstragner/d1537ba5357af1dab57832f80c0cd1fd to your computer and use it in GitHub Desktop.
Save 0xstragner/d1537ba5357af1dab57832f80c0cd1fd to your computer and use it in GitHub Desktop.
An example of an iOS application's content switching
#!/bin/sh
WORKING_DIRECTORY="${PWD}/.motch"
BUILDED_IPA_PATH="${TARGET_IPA_PATH}"
EMBEDDED_IPA_PATH="${PWD}/Artifacts/Embedded.ipa"
EMBEDDED_CONTENTS_PATH="${WORKING_DIRECTORY}/embedded"
rm -rf "${WORKING_DIRECTORY}" || true
mkdir -p "${WORKING_DIRECTORY}" || true
mkdir -p "${EMBEDDED_CONTENTS_PATH}" || true
# Extract embedded .ipa to temporary directory
unzip -oqq $EMBEDDED_IPA_PATH -d "${EMBEDDED_CONTENTS_PATH}"
# Switch our builded binary to embedded binary
EMBEDDED_APP_PATH=$(set -- "${EMBEDDED_CONTENTS_PATH}/Payload/"*.app; echo "$1")
EMBEDDED_BINARY_NAME=$(/usr/libexec/PlistBuddy -c "Print CFBundleExecutable" "${EMBEDDED_APP_PATH}/Info.plist")
BUILDED_APP_PATH="${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app"
BUILDED_BINARY_NAME=$(/usr/libexec/PlistBuddy -c "Print CFBundleExecutable" "${BUILDED_APP_PATH}/Info.plist")
echo "Builded .ipa binary name is '${BUILDED_BINARY_NAME}'"
echo "Embedded .ipa binary name is '${EMBEDDED_BINARY_NAME}'"
rm -rf $BUILDED_APP_PATH
mv $EMBEDDED_APP_PATH $BUILDED_APP_PATH
TARGET_APP_PATH="${BUILDED_APP_PATH}"
TARGET_BINARY_PATH="${BUILDED_APP_PATH}/${BUILDED_BINARY_NAME}"
#mv "${BUILDED_APP_PATH}/${EMBEDDED_BINARY_NAME}" $TARGET_BINARY_PATH
# Inject Assembly.framework into binary
ASSEMBLY_FRAMEWORK_PATH="${TARGET_BUILD_DIR}/PackageFrameworks/Assembly.framework"
cp -r $ASSEMBLY_FRAMEWORK_PATH "${TARGET_APP_PATH}/Frameworks/Assembly.framework"
OPTOOL="Scripts/optool"
"$OPTOOL" install -c load -p "@rpath/Frameworks/Assembly.framework/Assembly" -t $TARGET_BINARY_PATH
chmod +x "${TARGET_BINARY_PATH}"
# Update Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier ${PRODUCT_BUNDLE_IDENTIFIER}" "${TARGET_APP_PATH}/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName Motch" "${TARGET_APP_PATH}/Info.plist"
# Remove code signature & extensions
rm -rf "${TARGET_APP_PATH}/PlugIns" || true
rm -rf "${TARGET_APP_PATH}/_CodeSignature" || true
# Code signing
for FRAMEWORK_PATH in $TARGET_APP_PATH/Frameworks/*.framework; do
echo "Code signing '${FRAMEWORK_PATH}'.."
/usr/bin/codesign --force --sign "${EXPANDED_CODE_SIGN_IDENTITY}" "${FRAMEWORK_PATH}"*
done
echo "Code signing '${TARGET_APP_PATH}'.."
/usr/bin/codesign --force --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --timestamp=none "$TARGET_APP_PATH"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment