Skip to content

bygeee/android-check

Repository files navigation

Android Anti-Debugging Challenge App

这个Android应用程序实现了多层反调试保护机制,以下是每个关卡的详细说明和破解策略。

关卡1:Java层基础反调试

实现的反调试手段:

  1. Debug.isDebuggerConnected() 检测
  2. ApplicationInfo flags检查 (FLAG_DEBUGGABLE)

破解策略:

  1. 使用Frida hook Debug.isDebuggerConnected()
Java.perform(function() {
    var Debug = Java.use('android.os.Debug');
    Debug.isDebuggerConnected.implementation = function() {
        return false;
    };
});
  1. 修改ApplicationInfo flags:
Java.perform(function() {
    var MainActivity = Java.use('com.grand.test.MainActivity');
    MainActivity.checkLevel1.implementation = function() {
        return true;
    };
});

关卡2:Native层基础反调试

实现的反调试手段:

  1. ptrace自我附加检测
  2. 通过/proc/self/status检查TracerPid

破解策略:

  1. 使用Frida hook native函数:
Interceptor.attach(Module.findExportByName(null, 'ptrace'), {
    onEnter: function(args) {
        args[0] = ptr(0);  // PTRACE_TRACEME
    }
});
  1. 文件内容欺骗:
const openPtr = Module.findExportByName(null, 'open');
const open = new NativeFunction(openPtr, 'int', ['pointer', 'int']);
Interceptor.replace(openPtr, new NativeCallback(function(pathname, flags) {
    var path = pathname.readUtf8String();
    if (path.indexOf('/proc/self/status') !== -1) {
        return -1;
    }
    return open(pathname, flags);
}, 'int', ['pointer', 'int']));

关卡3:基于时间的反调试

实现的反调试手段:

  1. Java层定时器检测
  2. Native层高精度时间检测

破解策略:

  1. Hook系统时间函数:
Interceptor.attach(Module.findExportByName(null, 'clock_gettime'), {
    onLeave: function(retval) {
        // 修改返回的时间值
    }
});
  1. 使用Frida hook Java层Handler:
Java.perform(function() {
    var MainActivity = Java.use('com.grand.test.MainActivity');
    MainActivity.checkLevel3.implementation = function() {
        return true;
    };
});

关卡4:进程名称检测

实现的反调试手段:

  1. 检测当前进程名
  2. 检测父进程名
  3. 检测常见调试器进程名(gdb、lldb、ida)

破解策略:

  1. 修改进程名称读取:
Interceptor.attach(Module.findExportByName(null, 'open'), {
    onEnter: function(args) {
        var path = args[0].readUtf8String();
        if (path.indexOf('/proc/') !== -1 && path.indexOf('/cmdline') !== -1) {
            args[0] = Memory.allocUtf8String('/dev/null');
        }
    }
});
  1. 直接hook native检测函数:
Java.perform(function() {
    var MainActivity = Java.use('com.grand.test.MainActivity');
    MainActivity.checkProcessNative.implementation = function() {
        return true;
    };
});

关卡5:高级ptrace反调试

实现的反调试手段:

  1. 使用prctl检测跟踪状态
  2. 使用fork子进程进行ptrace检测
  3. 多重进程保护机制

破解策略:

  1. Hook prctl系统调用:
Interceptor.attach(Module.findExportByName(null, 'prctl'), {
    onEnter: function(args) {
        if (args[0].equals(PR_GET_TRACEFLAG)) {
            args[0] = ptr(0);
        }
    }
});
  1. 修改fork和ptrace行为:
Interceptor.attach(Module.findExportByName(null, 'fork'), {
    onLeave: function(retval) {
        retval.replace(ptr(0));  // 让fork总是返回0
    }
});

通用破解策略

  1. 使用Magisk隐藏root和Xposed框架
  2. 使用IDA Pro + IDAPython脚本自动化破解
  3. 使用Frida-Gadget注入而不是frida-server,避免被检测
  4. 修改Android系统属性隐藏调试特征

示例Frida脚本(通用):

setTimeout(function() {
    Java.perform(function() {
        // Hook所有关卡检测
        var MainActivity = Java.use('com.grand.test.MainActivity');
        
        // Hook Java层方法
        MainActivity.checkLevel1.implementation = function() {
            console.log("Bypassed Level 1");
            return true;
        };
        
        // Hook Native方法
        ['checkDebuggerNative', 'checkTimingNative', 
         'checkProcessNative', 'checkPtraceNative'].forEach(function(method) {
            MainActivity[method].implementation = function() {
                console.log("Bypassed " + method);
                return true;
            };
        });
    });
}, 0);

高级保护建议

  1. 实现代码完整性校验
  2. 添加反模拟器检测
  3. 使用代码混淆和加密
  4. 实现SSL证书钉扎
  5. 添加反Frida和反Xposed检测
  6. 使用Native层代码保护关键逻辑
  7. 实现反调试代码自我修改机制

注意事项

  1. 本文档仅供学习研究使用
  2. 建议在模拟器或测试设备上进行实验
  3. 请遵守相关法律法规
  4. 破解技术仅用于安全研究目的

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published