diff --git a/scripts/auto-install.sh b/scripts/auto-install.sh index 8f87088..26fa565 100755 --- a/scripts/auto-install.sh +++ b/scripts/auto-install.sh @@ -43,13 +43,6 @@ curl -sL \ -o "$WORKDIR/libs/libshadowhook_nothing.so" \ "https://github.com/$REPO/releases/latest/download/libshadowhook_nothing.so" -# --- Download inject script --- -echo "[INFO] Downloading inject script..." -curl -sL \ - -o "$WORKDIR/inject.sh" \ - "https://raw.githubusercontent.com/$REPO/refs/heads/main/scripts/inject.sh" -chmod +x "$WORKDIR/inject.sh" - # --- Pull APK splits from device --- APK_DIR="$HOME/reMarkable/app" mkdir -p "$APK_DIR" @@ -74,9 +67,128 @@ if [ ! -f "$APK_DIR/base.apk" ]; then exit 1 fi -# --- Run inject --- -echo "[INFO] Running inject script..." -"$WORKDIR/inject.sh" "$APK_DIR" +# --- Inject RMHook into APKs --- +APK_DIR_INJECT="$APK_DIR" +BUILD_DIR="$WORKDIR/build" +OUTPUT_DIR="$WORKDIR/output" +LIBS_DIR="$WORKDIR/libs" +KEYSTORE="$WORKDIR/config/rmhook.keystore" +KEYSTORE_PASS="rmhook" +KEY_ALIAS="rmhook" +ZIPALIGN="$BUILD_TOOLS/zipalign" +APKSIGNER="$BUILD_TOOLS/apksigner" + +# Portable in-place sed (GNU vs BSD/macOS) +sed_inplace() { + if sed --version >/dev/null 2>&1; then + sed -i "$@" + else + sed -i '' "$@" + fi +} + +echo "" +echo "[INFO] Injecting RMHook into reMarkable APKs..." + +rm -rf "$OUTPUT_DIR" +mkdir -p "$OUTPUT_DIR" +rm -rf "$BUILD_DIR/base" "$BUILD_DIR/split_arm64" "$BUILD_DIR/split_xxhdpi" +rm -f "$BUILD_DIR"/*.apk + +# --- Step 1: Decompile and patch base.apk (smali injection) --- +echo "[1/4] Patching base.apk (smali injection)..." +apktool d -r "$APK_DIR_INJECT/base.apk" -o "$BUILD_DIR/base" -f + +MAIN_SMALI="$BUILD_DIR/base/smali/com/remarkable/mobile/MainActivity.smali" +if [ ! -f "$MAIN_SMALI" ]; then + echo "❌ MainActivity.smali not found" + exit 1 +fi + +sed_inplace '/.method static constructor ()V/{ +n +/.locals/{ +a\ +\ + const-string v0, "rmhook"\ +\ + invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V +} +}' "$MAIN_SMALI" + +if ! grep -q 'invoke-static {v0}, Ljava/lang/System;->loadLibrary' "$MAIN_SMALI"; then + echo "❌ Failed to inject loadLibrary(\"rmhook\") into MainActivity.smali" + exit 1 +fi + +echo "✅ Injected System.loadLibrary(\"rmhook\") into MainActivity." +apktool b "$BUILD_DIR/base" -o "$BUILD_DIR/base_patched.apk" + +# --- Step 2: Inject libraries into arm64 split --- +echo "[2/4] Injecting ShadowHook libraries into arm64 split..." +SPLIT_ARM64="$APK_DIR_INJECT/split_config.arm64_v8a.apk" +if [ ! -f "$SPLIT_ARM64" ]; then + echo "❌ $SPLIT_ARM64 not found" + exit 1 +fi + +mkdir -p "$BUILD_DIR/split_arm64" +unzip -q "$SPLIT_ARM64" -d "$BUILD_DIR/split_arm64" +cp "$BUILD_DIR/librmhook.so" "$BUILD_DIR/split_arm64/lib/arm64-v8a/" +cp "$LIBS_DIR/libshadowhook_nothing.so" "$BUILD_DIR/split_arm64/lib/arm64-v8a/" +rm -rf "$BUILD_DIR/split_arm64/META-INF" +(cd "$BUILD_DIR/split_arm64" && zip -q -r -0 "$BUILD_DIR/split_arm64_raw.apk" .) + +# --- Step 3: Align APKs --- +echo "[3/4] Aligning APKs..." +"$ZIPALIGN" -p -f 4 "$BUILD_DIR/base_patched.apk" "$BUILD_DIR/base_aligned.apk" +"$ZIPALIGN" -p -f 4 "$BUILD_DIR/split_arm64_raw.apk" "$BUILD_DIR/split_arm64_aligned.apk" + +SPLIT_XXHDPI="$APK_DIR_INJECT/split_config.xxhdpi.apk" +if [ -f "$SPLIT_XXHDPI" ]; then + mkdir -p "$BUILD_DIR/split_xxhdpi" + unzip -q "$SPLIT_XXHDPI" -d "$BUILD_DIR/split_xxhdpi" + rm -rf "$BUILD_DIR/split_xxhdpi/META-INF" + (cd "$BUILD_DIR/split_xxhdpi" && zip -q -r -0 "$BUILD_DIR/split_xxhdpi_raw.apk" .) + "$ZIPALIGN" -p -f 4 "$BUILD_DIR/split_xxhdpi_raw.apk" "$BUILD_DIR/split_xxhdpi_aligned.apk" +fi + +# --- Step 4: Sign all APKs --- +echo "[4/4] Signing APKs..." + +if [ ! -f "$KEYSTORE" ]; then + mkdir -p "$(dirname "$KEYSTORE")" + echo "🔑 Generating signing keystore..." + keytool -genkeypair -v \ + -keystore "$KEYSTORE" \ + -alias "$KEY_ALIAS" \ + -keyalg RSA -keysize 2048 \ + -validity 10000 \ + -storepass "$KEYSTORE_PASS" \ + -keypass "$KEYSTORE_PASS" \ + -dname "CN=RMHook, OU=Dev, O=RMHook, L=Unknown, ST=Unknown, C=US" \ + 2>/dev/null +fi + +sign_apk() { + local input="$1" + local output="$2" + "$APKSIGNER" sign \ + --ks "$KEYSTORE" \ + --ks-pass "pass:$KEYSTORE_PASS" \ + --ks-key-alias "$KEY_ALIAS" \ + --key-pass "pass:$KEYSTORE_PASS" \ + --out "$output" \ + "$input" +} + +sign_apk "$BUILD_DIR/base_aligned.apk" "$OUTPUT_DIR/base.apk" +sign_apk "$BUILD_DIR/split_arm64_aligned.apk" "$OUTPUT_DIR/split_config.arm64_v8a.apk" +if [ -f "$BUILD_DIR/split_xxhdpi_aligned.apk" ]; then + sign_apk "$BUILD_DIR/split_xxhdpi_aligned.apk" "$OUTPUT_DIR/split_config.xxhdpi.apk" +fi + +echo "✅ Injection successful!" # --- Install --- echo "[INFO] Installing patched APKs..."