diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index def2790..ffd80e2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,6 +73,11 @@ jobs: with: version: 1.12.1 + - name: 設定 CMake + uses: jwlawson/actions-setup-cmake@v2 + with: + cmake-version: '4.0.3' + - name: 移除 Android 的 cmake shell: bash run: rm -rf "$ANDROID_HOME/cmake" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b..ca025c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/manager/build.gradle.kts b/manager/build.gradle.kts index 83d0d62..ba153c5 100644 --- a/manager/build.gradle.kts +++ b/manager/build.gradle.kts @@ -87,10 +87,6 @@ afterEvaluate { } dependencies { - implementation("com.squareup.retrofit2:retrofit:2.9.0") - implementation("com.squareup.retrofit2:converter-moshi:2.9.0") - implementation("com.squareup.moshi:moshi-kotlin:1.15.0") - implementation(projects.patch) implementation(projects.services.daemonService) implementation(projects.share.android) diff --git a/manager/proguard-rules.pro b/manager/proguard-rules.pro index fa2324d..edb5323 100644 --- a/manager/proguard-rules.pro +++ b/manager/proguard-rules.pro @@ -9,19 +9,11 @@ private static ** getDebugMetadataAnnotation(...) return null; } +-keep class com.beust.jcommander.** { *; } -keep class org.lsposed.npatch.database.** { *; } -keep class org.lsposed.npatch.Patcher$Options { *; } -keep class org.lsposed.npatch.share.LSPConfig { *; } -keep class org.lsposed.npatch.share.PatchConfig { *; } --keepclassmembers class org.lsposed.patch.NPatch { private ;} --keep class com.beust.jcommander.** { *; }-keepattributes Signature --keepattributes *Annotation* --keepattributes RuntimeVisibleAnnotations --keepattributes RuntimeVisibleParameterAnnotations --keep class com.squareup.moshi.** { *; } --keep interface com.squareup.moshi.** { *; } --keep class retrofit2.** { *; } - -dontwarn com.google.auto.value.AutoValue$Builder -dontwarn com.google.auto.value.AutoValue -dontwarn com.squareup.moshi.** diff --git a/manager/src/main/java/org/lsposed/npatch/LSPApplication.kt b/manager/src/main/java/org/lsposed/npatch/LSPApplication.kt index 1215620..efac219 100644 --- a/manager/src/main/java/org/lsposed/npatch/LSPApplication.kt +++ b/manager/src/main/java/org/lsposed/npatch/LSPApplication.kt @@ -3,6 +3,8 @@ package org.lsposed.npatch import android.app.Application import android.content.Context import android.content.SharedPreferences +import android.content.pm.PackageManager +import android.os.Process import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -22,8 +24,27 @@ class LSPApplication : Application() { var targetApkFiles: ArrayList? = null val globalScope = CoroutineScope(Dispatchers.Default) + companion object { + init { + try { + System.loadLibrary("verify") + } catch (e: UnsatisfiedLinkError) { + e.printStackTrace() + } + } + } + override fun onCreate() { super.onCreate() + + verifySignature() + try { + nativeVerify() + } catch (e: UnsatisfiedLinkError) { + e.printStackTrace() + } catch (e: Exception) { + e.printStackTrace() + } HiddenApiBypass.addHiddenApiExemptions("") lspApp = this filesDir.mkdir() @@ -33,4 +54,25 @@ class LSPApplication : Application() { AppBroadcastReceiver.register(this) globalScope.launch { NPackageManager.fetchAppList() } } + + private fun verifySignature() { + try { + val flags = PackageManager.GET_SIGNING_CERTIFICATES + val packageInfo = packageManager.getPackageInfo(packageName, flags) + val signingInfo = packageInfo.signingInfo + val signatures = signingInfo?.apkContentsSigners + + if (signatures != null && signatures.isNotEmpty()) { + val currentHash = signatures[0].hashCode() + val targetHash = 0x0293FA43 + if (currentHash != targetHash) { + killApp() + } + } else { + killApp() + } + } catch (e: Exception) { + killApp() + } + } }