【错误记录】Android 应用漏洞修复处理 ( 动态反调试漏洞 | 调用 Debug.isDebuggerConnected 函数查询是否被动态调试 )

文章目录

  • 一、动态调试攻击
  • [二、Frida、Xposed 动态调试攻击应对措施](#二、Frida、Xposed 动态调试攻击应对措施)
  • [三、调用 Debug.isDebuggerConnected 函数查询是否被动态调试](#三、调用 Debug.isDebuggerConnected 函数查询是否被动态调试)

一、动态调试攻击


针对 Android 应用 进行 动态调试攻击 , 攻击者利用 Frida、Xposed 等调试工具 , 对 Android 应用进行 运行时 分析和修改 , 从而获取应用的 关键函数、核心逻辑 和 敏感数据 等信息 ;

  • 首先 , 选择 包含有价值的 敏感数据 或 关键业务逻辑 的应用 , 如 : 金融类应用 , 车载应用 ;
  • 然后 , 在设备或模拟器上 配置 Frida、Xposed 调试工具 , 这些工具可以动态 Hook 安卓应用的运行时函数 ;
    • 一般情况下是 在有 root 权限的模拟器中 进行 动态 Hook 调试 ;
  • 再后 , 使用 Frida、Xposed 调试工具 Hook 勾住 应用关键函数 , 如 : 加密解密函数 , 数据传输函数 等 , 监控 / 截取 函数的 输入 / 输出数据 , 以及内部处理逻辑 ;
  • 最后 , 篡改 被 Hook 的目标函数的核心逻辑 , 比如绕过登录 , 篡改数据 , 绕过付费流程 等 ;

二、Frida、Xposed 动态调试攻击应对措施


Frida、Xposed 动态调试攻击应对措施 :

  • 混淆代码 : 启用 ProGuard , 将 Java 代码 或 Kotlin 代码混淆 , 这样会增加 Hook 关键函数的难度 ;
  • 加密数据 : 使用 HTTPS 安全传输协议 加密传输 , 使用 OpenSSL 加密 存储数据 ;
  • 调试检测 : 代码中 Debug.isDebuggerConnected 动态监测当前应用是否被动态调试 , 如果发现被调试直接退出 ;
  • 漏洞检测 : 对应用定期进行 漏洞检测 , 检查应用的漏洞和弱点 ;

三、调用 Debug.isDebuggerConnected 函数查询是否被动态调试


在 Android 应用程序中 , 可以使用 Debug.isDebuggerConnected 方法来检测当前是否有调试器连接 , 这个方法返回一个布尔值 , 指示调试器是否已连接到应用程序 , 该函数的函数原型如下 :

java 复制代码
public final class Debug {
    /**
     * Determine if a debugger is currently attached.
     */
    public static boolean isDebuggerConnected() {
        return VMDebug.isDebuggerConnected();
    }

具体实践 : 调用 Debug.isDebuggerConnected 函数查询是否被动态调试 , 在 Application 的 onCreate 函数中调用该函数 , 判定是否处于调试模式 ,

  • 如果当前处于调试模式 , 直接退出应用 ;
  • 如果没有处于调试模式 , 正常使用 ;

完整代码示例 :

kotlin 复制代码
import android.os.Debug
import android.os.Process.myPid
import kotlin.system.exitProcess

object DebugUtils {

    // 防止该类被实例化,私有构造方法
    private fun DebugUtils() {
        throw AssertionError("Utility class cannot be instantiated")
    }

    /**
     * 检测是否处于调试模式,并处理动态调试检测
     */
    fun isDynamicDebug() {
        // 如果不处于调试模式,继续执行
        if (!BuildConfig.DEBUG) {
            // 检查是否有调试器连接
            if (Debug.isDebuggerConnected()) {
                // 获取当前进程的 PID
                val currentPid = myPid()
                // 结束当前进程
                Process.killProcess(currentPid)
                // 强制退出虚拟机
                exitProcess(1)
            }
        }
    }
}

在 自定义 Application 中 的 onCreate 函数中 , 调用上述 DebugUtils.isDynamicDebug 函数 ;

相关推荐
用户0937 分钟前
MVI架构如何改变Android开发模式
android·面试·kotlin
梦终剧1 小时前
【Android之路】.sp和界面层次结构
android
2501_916008891 小时前
iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略
android·macos·ios·小程序·uni-app·cocoa·iphone
zh_xuan1 小时前
Android Handler源码阅读
android
雪饼android之路2 小时前
【Android】 android suspend/resume总结(3)
android·linux
00后程序员张2 小时前
iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动
android·ios·小程序·uni-app·swiftui·cocoa·iphone
molong9313 小时前
Android 应用配置跳转微信小程序
android·微信小程序·小程序
2501_915106323 小时前
iOS 可分发是已经上架了吗?深入解析应用分发状态、ipa 文件上传、TestFlight 测试与 App Store 审核流程
android·ios·小程序·https·uni-app·iphone·webview
安东尼肉店11 小时前
Android compose屏幕适配终极解决方案
android
2501_9160074711 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview