mirror of
https://github.com/NohamR/RMHook-Android.git
synced 2026-10-10 18:29:42 +00:00
Update
This commit is contained in:
@@ -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 <clinit>()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.<clinit>"
|
||||
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..."
|
||||
|
||||
Reference in New Issue
Block a user