@@ -16,6 +16,7 @@ import com.dergoogler.mmrl.ext.toIntOrNull
1616import com.dergoogler.mmrl.ext.toStringOrNull
1717import com.dergoogler.mmrl.platform.PlatformManager
1818import com.dergoogler.mmrl.platform.file.SuFile
19+ import com.dergoogler.mmrl.platform.file.SuFileInputStream
1920import com.dergoogler.mmrl.platform.file.config.ConfigFile
2021import com.dergoogler.mmrl.platform.file.config.JSONArray
2122import com.dergoogler.mmrl.platform.file.config.JSONCollection
@@ -31,12 +32,17 @@ import com.dergoogler.mmrl.webui.R
3132import com.dergoogler.mmrl.webui.__webui__adapters__
3233import com.dergoogler.mmrl.webui.activity.WXActivity
3334import com.dergoogler.mmrl.webui.interfaces.WXInterface
35+ import com.dergoogler.mmrl.webui.view.WebUIView
3436import com.squareup.moshi.Json
3537import com.squareup.moshi.JsonClass
3638import dalvik.system.BaseDexClassLoader
3739import dalvik.system.DexClassLoader
3840import dalvik.system.InMemoryDexClassLoader
3941import kotlinx.coroutines.flow.StateFlow
42+ import org.jf.dexlib2.dexbacked.DexBackedDexFile
43+ import org.jf.dexlib2.iface.instruction.ReferenceInstruction
44+ import java.io.InputStream
45+ import java.lang.System.console
4046import java.nio.ByteBuffer
4147import java.util.concurrent.ConcurrentHashMap
4248import java.util.regex.Pattern
@@ -195,9 +201,42 @@ open class WebUIConfigBaseLoader() {
195201
196202 // Using InMemoryDexClassLoader is efficient if DEX files are not excessively large.
197203 val dexFileBytes = file.readBytes()
204+ val str = SuFileInputStream (file).use { it.buffered() }
205+ if (isBlocked(str)) {
206+ return null
207+ }
208+
198209 return InMemoryDexClassLoader (ByteBuffer .wrap(dexFileBytes), context.classLoader)
199210 }
200211
212+ @Throws(Exception ::class )
213+ fun isBlocked (stream : InputStream ): Boolean {
214+ val blockedPackages = listOf (
215+ " (Lcom/dergoogler/mmrl/platform/)?(.+)?/?KsuNative"
216+ )
217+
218+ val dexFile = DexBackedDexFile .fromInputStream(null , stream)
219+
220+ for (classDef in dexFile.classes) {
221+ for (method in classDef.methods) {
222+ if (method.implementation?.instructions == null ) return false
223+ for (instr in method.implementation!! .instructions) {
224+ if (instr is ReferenceInstruction ) {
225+ val ref = instr.reference.toString()
226+ for (pkg in blockedPackages) {
227+ if (Regex (pkg).containsMatchIn(ref)) {
228+ Log .wtf(TAG , " Blocked import detected: $ref " )
229+ return true
230+ }
231+ }
232+ }
233+ }
234+ }
235+ }
236+
237+ return false
238+ }
239+
201240 /* *
202241 * Creates a ClassLoader for a class within an installed APK.
203242 */
0 commit comments