Skip to content

MASTG-DEMO-0088: Runtime Detection of Root Detection Mechanisms

Download MASTG-DEMO-0088 APK Open MASTG-DEMO-0088 Folder Build MASTG-DEMO-0088 APK

Sample

This demo shows how to detect root detection mechanisms at runtime using Frooky. The sample app from Uses of Root Detection Techniques with Semgrep implements multiple root detection checks.

../MASTG-DEMO-0087/MastgTest.kt
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
package org.owasp.mastestapp

import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import java.io.File

// SUMMARY: This sample demonstrates common root detection techniques used in Android applications.

class MastgTest(private val context: Context) {

    private val tag = "MASTG.RootDetect"

    fun mastgTest(): String {
        val checks = mutableListOf<String>()
        Log.i(tag, "Starting root detection checks")

        val su = checkForSuBinary()
        checks.add(if (su) "✓ Found su binary" else "✗ No su binary found")

        val whichSu = checkForWhichSu()
        checks.add(if (whichSu) "✓ Found su via which command" else "✗ su not found via which command")

        val pkgs = checkForRootPackages()
        checks.add(if (pkgs) "✓ Found root management apps" else "✗ No root management apps found")

        val testKeys = checkForTestKeys()
        checks.add(if (testKeys) "✓ Device has test-keys build" else "✗ Device has release-keys build")

        val props = checkForDangerousProps()
        checks.add(if (props) "✓ Found dangerous system properties" else "✗ No dangerous system properties")

        val isRooted = su || whichSu || pkgs || testKeys || props
        Log.i(tag, "Completed checks: rooted=$isRooted")

        return "Root Detection Results:\n\n" +
                checks.joinToString("\n") +
                "\n\nDevice appears to be rooted: $isRooted"
    }

    private fun checkForSuBinary(): Boolean {
        val paths = arrayOf(
            "/system/app/Superuser.apk",
            "/sbin/su",
            "/system/bin/su",
            "/system/xbin/su",
            "/data/local/xbin/su",
            "/data/local/bin/su",
            "/system/sd/xbin/su",
            "/system/bin/failsafe/su",
            "/data/local/su",
            "/su/bin/su"
        )

        Log.d(tag, "checkForSuBinary: testing ${paths.size} paths")

        var found = false
        for (path in paths) {
            try {
                val exists = File(path).exists()
                Log.d(tag, "su path check: path=$path, exists=$exists")
                if (exists) found = true
            } catch (se: SecurityException) {
                Log.w(tag, "su path check blocked: path=$path, msg=${se.message}")
            } catch (t: Throwable) {
                Log.w(
                    tag,
                    "su path check error: path=$path, err=${t::class.java.simpleName}, msg=${t.message}"
                )
            }
        }

        Log.i(tag, "checkForSuBinary result: found=$found")
        return found
    }

    private fun checkForWhichSu(): Boolean {
        return try {
            Log.d(tag, "checkForWhichSu: executing which su")
            val process = Runtime.getRuntime().exec(arrayOf("which", "su"))

            val stdout = process.inputStream.bufferedReader().use { it.readText().trim() }
            val stderr = process.errorStream.bufferedReader().use { it.readText().trim() }
            val exit = try { process.waitFor() } catch (_: Throwable) { -1 }

            val found = stdout.isNotEmpty() && exit == 0
            if (found) {
                Log.i(tag, "su found via which: path=$stdout")
            } else {
                Log.d(
                    tag,
                    "which su not found: exit=$exit, stderr=$stderr"
                )
            }
            found
        } catch (se: SecurityException) {
            Log.w(
                tag,
                "checkForWhichSu blocked: msg=${se.message}"
            )
            false
        } catch (t: Throwable) {
            Log.w(
                tag,
                "checkForWhichSu error: err=${t::class.java.simpleName}, msg=${t.message}"
            )
            false
        }
    }

    private fun checkForRootPackages(): Boolean {
        val packages = arrayOf(
            "com.noshufou.android.su",
            "com.noshufou.android.su.elite",
            "eu.chainfire.supersu",
            "com.koushikdutta.superuser",
            "com.thirdparty.superuser",
            "com.yellowes.su",
            "com.topjohnwu.magisk",
            "com.kingroot.kinguser",
            "com.kingo.root",
            "com.smedialink.oneclickroot",
            "com.zhiqupk.root.global",
            "com.alephzain.framaroot"
        )

        Log.d(tag, "checkForRootPackages: testing ${packages.size} package names")

        var foundAny = false
        for (packageName in packages) {
            try {
                context.packageManager.getPackageInfo(packageName, 0)
                Log.i(tag, "root package detected: package=$packageName")
                foundAny = true
            } catch (_: PackageManager.NameNotFoundException) {
                Log.d(tag, "root package not present: package=$packageName")
            } catch (se: SecurityException) {
                Log.w(
                    tag,
                    "package check blocked: package=$packageName, msg=${se.message}"
                )
            } catch (t: Throwable) {
                Log.w(
                    tag,
                    "package check error: package=$packageName, err=${t::class.java.simpleName}, msg=${t.message}"
                )
            }
        }

        Log.i(tag, "checkForRootPackages result: found=$foundAny")
        return foundAny
    }

    private fun checkForTestKeys(): Boolean {
        val buildTags = Build.TAGS
        val isTestKeys = buildTags != null && buildTags.contains("test-keys")
        Log.i(
            tag,
            "checkForTestKeys: buildTags=$buildTags, isTestKeys=$isTestKeys"
        )
        return isTestKeys
    }

    private fun checkForDangerousProps(): Boolean {
        val dangerousProps = mapOf(
            "ro.debuggable" to "1",
            "ro.secure" to "0"
        )

        Log.d(
            tag,
            "checkForDangerousProps: testing ${dangerousProps.size} properties"
        )

        var matchedAny = false
        for ((prop, expected) in dangerousProps) {
            val actual = getSystemProperty(prop)
            val matched = actual == expected
            Log.i(
                tag,
                "system property check: prop=$prop, actual=$actual, expected=$expected, matched=$matched"
            )
            if (matched) matchedAny = true
        }

        Log.i(tag, "checkForDangerousProps result: matched=$matchedAny")
        return matchedAny
    }

    private fun getSystemProperty(key: String): String? {
        return try {
            Log.d(tag, "getSystemProperty exec: key=$key")
            val process = Runtime.getRuntime().exec(arrayOf("getprop", key))

            val stdout = process.inputStream.bufferedReader().use { it.readText().trim() }
            val stderr = process.errorStream.bufferedReader().use { it.readText().trim() }
            val exit = try { process.waitFor() } catch (_: Throwable) { -1 }

            if (stderr.isNotEmpty()) {
                Log.w(
                    tag,
                    "getprop stderr: key=$key, exit=$exit, stderr=$stderr"
                )
            } else {
                Log.d(
                    tag,
                    "getprop ok: key=$key, exit=$exit"
                )
            }

            stdout.ifEmpty { null }
        } catch (se: SecurityException) {
            Log.w(
                tag,
                "getSystemProperty blocked: key=$key, msg=${se.message}"
            )
            null
        } catch (t: Throwable) {
            Log.w(
                tag,
                "getSystemProperty error: key=$key, err=${t::class.java.simpleName}, msg=${t.message}"
            )
            null
        }
    }
}

Steps

  1. Ensure the target app is installed on the device and frida-server is running.
  2. Run Frooky with the hooks configuration to monitor root detection methods.
run.sh
1
2
#!/bin/bash
frooky -U -f org.owasp.mastestapp --platform android hooks.json

The hooks configuration monitors common root detection methods:

hooks.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
  "category": "RESILIENCE",
  "hooks": [
    {
      "class": "java.io.File",
      "method": "$init",
      "overloads": [
        {
          "args": ["java.lang.String"]
        }
      ],
      "filterEventsByStacktrace": ["org.owasp.mastestapp.MastgTest"]
    },
    {
      "class": "android.app.ApplicationPackageManager",
      "method": "getPackageInfo",
      "overloads": [
        {
          "args": ["java.lang.String", "int"]
        }
      ],
      "filterEventsByStacktrace": ["org.owasp.mastestapp.MastgTest"]
    },
    {
      "class": "java.lang.Runtime",
      "method": "exec",
      "overloads": [
        {
          "args": ["[Ljava.lang.String;"]
        }
      ]
    }
  ]
}

Observation

The output shows all root detection method invocations captured during app execution.

output.json
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{"type": "summary", "hooks": [{"class": "java.io.File", "method": "$init", "overloads": [{"args": ["java.lang.String"]}]}, {"class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "overloads": [{"args": ["java.lang.String", "int"]}]}, {"class": "java.lang.Runtime", "method": "exec", "overloads": [{"args": ["[Ljava.lang.String;"]}]}], "totalHooks": 3, "errors": [], "totalErrors": 0}
{"id": "2bc95e12-7fa6-4640-91fb-5d287d54f60d", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.752Z", "class": "java.io.File", "method": "$init", "instanceId": 49832000, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/system/app/Superuser.apk"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "0d220b35-b60f-411a-81f0-6010ec0c88ab", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.754Z", "class": "java.io.File", "method": "$init", "instanceId": 43297657, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/sbin/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "405f4728-6ecc-42a0-9c52-e0d32bf8e6b5", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.756Z", "class": "java.io.File", "method": "$init", "instanceId": 237113534, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/system/bin/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "1ca1a8ed-d1b4-47b2-9274-0b1ca4646285", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.760Z", "class": "java.io.File", "method": "$init", "instanceId": 110048543, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/system/xbin/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "0fdaf07f-37d1-4aeb-bda9-2008baad706b", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.765Z", "class": "java.io.File", "method": "$init", "instanceId": 37353304, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/data/local/xbin/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "ae6d4a4c-645c-4c3b-a81b-2fb558b789ff", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.769Z", "class": "java.io.File", "method": "$init", "instanceId": 35486102, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/data/local/bin/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "78bece12-2a4b-4b16-92aa-7b43a8de46c5", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.770Z", "class": "java.io.File", "method": "$init", "instanceId": 27044119, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/system/sd/xbin/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "60190048-ecd7-4bdc-b0e0-405675e39ec3", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.773Z", "class": "java.io.File", "method": "$init", "instanceId": 167981316, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/system/bin/failsafe/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "01df5a15-fba3-415d-abd7-b3dd101cc645", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.775Z", "class": "java.io.File", "method": "$init", "instanceId": 157501165, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/data/local/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "325626cc-fd8f-4176-a74d-4416890ff77b", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.779Z", "class": "java.io.File", "method": "$init", "instanceId": 120559906, "stackTrace": ["java.io.File.<init>(Native Method)", "org.owasp.mastestapp.MastgTest.checkForSuBinary(MastgTest.kt:61)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:19)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "/su/bin/su"}], "returnValue": [{"declaredType": "void", "value": "void"}]}
{"id": "385d5f31-fa52-45f7-9715-d9fc2bd5ef16", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.781Z", "class": "java.lang.Runtime", "method": "exec", "instanceId": 67393904, "stackTrace": ["java.lang.Runtime.exec(Native Method)", "org.owasp.mastestapp.MastgTest.checkForWhichSu(MastgTest.kt:81)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:22)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "[Ljava.lang.String;", "value": ["which", "su"]}], "returnValue": [{"declaredType": "java.lang.Process", "value": "<instance: java.lang.Process, $className: java.lang.UNIXProcess>", "runtimeType": "java.lang.UNIXProcess", "instanceToString": "Process[pid=6601, hasExited=false]"}]}
{"id": "1b61d305-5554-413f-973f-b337f58a817d", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.826Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.noshufou.android.su"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.noshufou.android.su"}
{"id": "6f7cef7d-c2b6-4b69-a499-4a8ff9005e7d", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.834Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.noshufou.android.su.elite"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.noshufou.android.su.elite"}
{"id": "02b89b31-fefa-477f-98fc-4f168520da84", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.852Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "eu.chainfire.supersu"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: eu.chainfire.supersu"}
{"id": "57ba9e86-32d6-45d0-b698-dc09a8f6f5dc", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.858Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.koushikdutta.superuser"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.koushikdutta.superuser"}
{"id": "44fe9491-60dd-45c5-b5bf-72c979c6208b", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.862Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.thirdparty.superuser"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.thirdparty.superuser"}
{"id": "766f5577-154d-42a5-8a23-10004c9b4716", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.876Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.yellowes.su"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.yellowes.su"}
{"id": "08b96c9b-a910-4e78-82ed-5bd6d50b5254", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.881Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.topjohnwu.magisk"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.topjohnwu.magisk"}
{"id": "4c359624-fbfd-4471-8d08-61610f1b799f", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.885Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.kingroot.kinguser"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.kingroot.kinguser"}
{"id": "c948ed44-1abe-43e2-98bb-8a36459543da", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.889Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.kingo.root"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.kingo.root"}
{"id": "756ae922-4ae2-46b6-8b2a-a424668fcaa5", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.892Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.smedialink.oneclickroot"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.smedialink.oneclickroot"}
{"id": "45d92ad0-0da8-4d7b-905f-d245648a6ec5", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.895Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.zhiqupk.root.global"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.zhiqupk.root.global"}
{"id": "bbdfb9a7-1b3f-43f5-89a7-5e72f37c7d4a", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.898Z", "class": "android.app.ApplicationPackageManager", "method": "getPackageInfo", "instanceId": 267547179, "stackTrace": ["android.app.ApplicationPackageManager.getPackageInfo(Native Method)", "org.owasp.mastestapp.MastgTest.checkForRootPackages(MastgTest.kt:133)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:25)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "java.lang.String", "value": "com.alephzain.framaroot"}, {"declaredType": "int", "value": 0}], "exception": "Error: android.content.pm.PackageManager$NameNotFoundException: com.alephzain.framaroot"}
{"id": "a59ea037-ed09-44e7-9a10-ce696e3fa914", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.904Z", "class": "java.lang.Runtime", "method": "exec", "instanceId": 67393904, "stackTrace": ["java.lang.Runtime.exec(Native Method)", "org.owasp.mastestapp.MastgTest.getSystemProperty(MastgTest.kt:194)", "org.owasp.mastestapp.MastgTest.checkForDangerousProps(MastgTest.kt:178)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:31)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "[Ljava.lang.String;", "value": ["getprop", "ro.debuggable"]}], "returnValue": [{"declaredType": "java.lang.Process", "value": "<instance: java.lang.Process, $className: java.lang.UNIXProcess>", "runtimeType": "java.lang.UNIXProcess", "instanceToString": "Process[pid=6603, hasExited=false]"}]}
{"id": "d2d6d40d-197f-4c25-aba6-8e652cad6653", "type": "hook", "category": "RESILIENCE", "time": "2026-02-09T15:04:21.948Z", "class": "java.lang.Runtime", "method": "exec", "instanceId": 67393904, "stackTrace": ["java.lang.Runtime.exec(Native Method)", "org.owasp.mastestapp.MastgTest.getSystemProperty(MastgTest.kt:194)", "org.owasp.mastestapp.MastgTest.checkForDangerousProps(MastgTest.kt:178)", "org.owasp.mastestapp.MastgTest.mastgTest(MastgTest.kt:31)", "org.owasp.mastestapp.MainActivityKt.MainScreen$lambda$12$lambda$11(MainActivity.kt:101)", "org.owasp.mastestapp.MainActivityKt.$r8$lambda$Pm6AsbKBmypP53K-UABM21E_Xxk(Unknown Source:0)", "org.owasp.mastestapp.MainActivityKt$$ExternalSyntheticLambda3.run(D8$$SyntheticClass:0)", "java.lang.Thread.run(Thread.java:1012)"], "inputParameters": [{"declaredType": "[Ljava.lang.String;", "value": ["getprop", "ro.secure"]}], "returnValue": [{"declaredType": "java.lang.Process", "value": "<instance: java.lang.Process, $className: java.lang.UNIXProcess>", "runtimeType": "java.lang.UNIXProcess", "instanceToString": "Process[pid=6604, hasExited=false]"}]}

Evaluation

The test passes because the output confirms the app implements root detection checks that were monitored at runtime:

  • java.io.File.<init> calls for su path checks:

    • From MastgTest.checkForSuBinary() at line 61.
    • The app checks for 10 su binary locations such as /system/app/Superuser.apk, /sbin/su, /system/bin/su, /system/xbin/su, etc.
    • Additional constructor calls from libraries like androidx.profileinstaller.ProfileInstaller may appear in the trace but are not related to root detection.
  • Runtime.exec calls for which su command:

    • From MastgTest.checkForWhichSu() at line 81.
    • The app executes the which su command to detect if the su binary is available in the system PATH.
  • PackageManager.getPackageInfo calls for root packages:

    • From MastgTest.checkForRootPackages at line 133.
    • The app checks for 12 root management packages including com.topjohnwu.magisk, eu.chainfire.supersu, etc. In the captured output, the relevant getPackageInfo calls throw NameNotFoundException as expected since none of these packages are installed.
    • Additional getPackageInfo calls from system or library components may appear in the trace but are unrelated to root detection.
  • Runtime.exec calls for system property checks:

    • From MastgTest.getSystemProperty at line 181, called by checkForDangerousProps.
    • The app executes getprop ro.debuggable and getprop ro.secure commands to read system properties.