1. Java.perform(function () {
    2. function showStacks() {
    3. console.log(
    4. Java.use("android.util.Log")
    5. .getStackTraceString(
    6. Java.use("java.lang.Throwable").$new()
    7. )
    8. );
    9. }
    10. Java.use("java.io.File").$init.overload("java.lang.String").implementation = function (str) {
    11. if (str.toLowerCase().endsWith("/su") || str.toLowerCase() == "su") {
    12. console.log("发现检测su文件");
    13. showStacks();
    14. }
    15. return this.$init(str);
    16. }
    17. Java.use("java.lang.Runtime").exec.overload("java.lang.String").implementation = function (str) {
    18. if (str.endsWith("/su") || str == "su") {
    19. console.log("发现尝试执行su命令的行为");
    20. showStacks();
    21. }
    22. return this.exec(str);
    23. }
    24. Java.use("java.lang.Runtime").exec.overload("[Ljava.lang.String;").implementation = function (stringArray) {
    25. for (var i = 0; i < stringArray.length; i++){
    26. if (stringArray[i].includes("su") || stringArray[i].includes("/su") || stringArray[i] == "su"){
    27. console.log("发现尝试执行su命令的行为");
    28. showStacks();
    29. break;
    30. }
    31. }
    32. return this.exec(stringArray);
    33. }
    34. Java.use("java.lang.ProcessBuilder").$init.overload("[Ljava.lang.String;").implementation = function (stringArray){
    35. for (var i = 0;i < stringArray.length; i++) {
    36. if (stringArray[i].includes("su") || stringArray[i].includes("/su") || stringArray[i] == "su") {
    37. console.log("发现尝试执行su命令的行为");
    38. showStacks();
    39. break;
    40. }
    41. }
    42. return this.$init(stringArray);
    43. }
    44. });

    通关检测root打印堆栈来定位关键代码;