Skip to content

Commit 4e0116a

Browse files
committed
Try to fix AppDataIsolationHook
1 parent 75cbe52 commit 4e0116a

3 files changed

Lines changed: 32 additions & 8 deletions

File tree

zygote/src/main/java/org/frknkrc44/hma_oss/zygote/hook/AppDataIsolationHook.kt

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package org.frknkrc44.hma_oss.zygote.hook
22

3+
import android.annotation.SuppressLint
34
import android.os.Build
45
import android.os.SystemProperties
56
import androidx.annotation.RequiresApi
67
import org.frknkrc44.hma_oss.common.BuildConfig
78
import org.frknkrc44.hma_oss.zygote.service.BulkHooker
89
import org.frknkrc44.hma_oss.zygote.service.HMAService
10+
import org.frknkrc44.hma_oss.zygote.service.SystemServerHook
911
import org.frknkrc44.hma_oss.zygote.util.Logcat.logD
1012
import org.frknkrc44.hma_oss.zygote.util.Logcat.logE
1113
import org.frknkrc44.hma_oss.zygote.util.Logcat.logI
@@ -15,9 +17,11 @@ import org.frknkrc44.hma_oss.zygote.util.Utils4Zygote.getIntField
1517
import org.frknkrc44.hma_oss.zygote.util.Utils4Zygote.getObjectField
1618
import org.frknkrc44.hma_oss.zygote.util.Utils4Zygote.setBooleanField
1719
import org.frknkrc44.hma_oss.zygote.util.ZygoteConstants.PROCESS_LIST_CLASS
20+
import org.frknkrc44.hma_oss.zygote.util.ZygoteConstants.PROCESS_RECORD_INTERNAL_CLASS
1821
import org.frknkrc44.hma_oss.zygote.util.ZygoteConstants.STORAGE_MANAGER_SERVICE_CLASS
1922
import java.util.Map
2023

24+
@SuppressLint("PrivateApi")
2125
@RequiresApi(Build.VERSION_CODES.R)
2226
class AppDataIsolationHook(private val service: HMAService): IFrameworkHook {
2327
override val TAG = "AppDataIsolationHook"
@@ -30,6 +34,15 @@ class AppDataIsolationHook(private val service: HMAService): IFrameworkHook {
3034

3135
private var voldHookSkipped = false
3236

37+
private val processRecordIntClass: Class<*> by lazy {
38+
Class.forName(
39+
PROCESS_RECORD_INTERNAL_CLASS,
40+
true,
41+
SystemServerHook.classLoader,
42+
)
43+
}
44+
45+
@SuppressLint("PrivateApi")
3346
override fun load() {
3447
if (!(service.config.altAppDataIsolation || service.config.altVoldAppDataIsolation)) return
3548
logI(TAG) { "Load hook" }
@@ -87,19 +100,29 @@ class AppDataIsolationHook(private val service: HMAService): IFrameworkHook {
87100
) { param ->
88101
if (service.config.altVoldAppDataIsolation) {
89102
val app = param.args.find { it?.javaClass?.simpleName == "ProcessRecord" }!!
90-
val uid = getIntField(app, "uid")
103+
val uid = runCatching {
104+
getIntField(app, "uid")
105+
}.getOrElse {
106+
getIntField(app, "uid", processRecordIntClass)
107+
}
91108
val processName = runCatching {
92109
getObjectField(app, "processName")
93-
}.getOrDefault("<unknown>")
110+
}.getOrElse {
111+
getObjectField(app, "processName", processRecordIntClass)
112+
}
94113
val mountNode = runCatching {
95114
getIntField(app, "mMountMode")
96115
}.getOrDefault(0)
97116
val isolated = runCatching {
98117
getBooleanField(app, "isolated")
99-
}.getOrDefault(false)
118+
}.getOrElse {
119+
getBooleanField(app, "isolated", processRecordIntClass)
120+
}
100121
val appZygote = runCatching {
101122
getBooleanField(app, "appZygote")
102-
}.getOrDefault(false)
123+
}.getOrElse {
124+
getBooleanField(app, "appZygote", processRecordIntClass)
125+
}
103126

104127
val apps = Utils4Zygote.getCallingApps(service, uid)
105128

zygote/src/main/java/org/frknkrc44/hma_oss/zygote/util/Utils4Zygote.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import android.os.Binder
55
import android.os.Build
66
import android.os.IBinder
77
import android.os.ServiceManager
8-
import android.os.SystemProperties
98
import com.android.apksig.ApkVerifier
109
import com.v7878.unsafe.Reflection.getDeclaredField
1110
import com.v7878.unsafe.Reflection.getDeclaredMethod
@@ -17,6 +16,7 @@ import org.frknkrc44.hma_oss.common.BuildConfig
1716
import org.frknkrc44.hma_oss.zygote.Magic
1817
import org.frknkrc44.hma_oss.zygote.service.HMAService
1918
import org.frknkrc44.hma_oss.zygote.service.SystemServerHook
19+
import org.frknkrc44.hma_oss.zygote.util.Logcat.logD
2020
import org.frknkrc44.hma_oss.zygote.util.Logcat.logE
2121
import java.io.File
2222
import java.lang.reflect.Constructor
@@ -132,11 +132,11 @@ object Utils4Zygote {
132132
name,
133133
).getInt(null)
134134

135-
fun getIntField(obj: Any, name: String) = getDeclaredField(obj.javaClass, name).getInt(obj)
135+
fun getIntField(obj: Any, name: String, clazz: Class<*>? = null) = getDeclaredField(clazz ?: obj.javaClass, name).getInt(obj)
136136

137-
fun getBooleanField(obj: Any, name: String) = getDeclaredField(obj.javaClass, name).getBoolean(obj)
137+
fun getBooleanField(obj: Any, name: String, clazz: Class<*>? = null) = getDeclaredField(clazz ?: obj.javaClass, name).getBoolean(obj)
138138

139-
fun getObjectField(obj: Any, name: String): Any? = getDeclaredField(obj.javaClass, name).get(obj)
139+
fun getObjectField(obj: Any, name: String, clazz: Class<*>? = null): Any? = getDeclaredField(clazz ?: obj.javaClass, name).get(obj)
140140

141141
fun setBooleanField(obj: Any, name: String, value: Boolean) {
142142
val field = getDeclaredField(obj.javaClass, name).apply { isAccessible = true }

zygote/src/main/java/org/frknkrc44/hma_oss/zygote/util/ZygoteConstants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ object ZygoteConstants {
1717
const val ACTIVITY_STACK_SUPERVISOR_CLASS = "com.android.server.wm.ActivityStackSupervisor"
1818
const val ZYGOTE_PROCESS_CLASS = "android.os.ZygoteProcess"
1919
const val PROCESS_LIST_CLASS = "com.android.server.am.ProcessList"
20+
const val PROCESS_RECORD_INTERNAL_CLASS = "com.android.server.am.psc.ProcessRecordInternal"
2021
}

0 commit comments

Comments
 (0)