反调试技术
- 目的
- 防止程序被第三方调试器调试和分析
- 方法
- 在程序启动过程中检查其是否被调试器附加
- 自身程序的父进程是否存在异常
- 进程列表中是否有正在运行的调试器
- ……
- 实例:CheckDebugger
调试器状态检测
-
动态调试通过调试器 Hook 软件,进而获取软件运行时的数据。可在软件中添加检测调试器的代码,检测到软件被调试器连接则中止运行
-
Android SDK 提供
android.os.Debug.isDebuggerConnected()
判断程序是否被调试器调试 -
示例代码:
private boolean isDebuggerConnected() { if ((getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) { return true; } return android.os.Debug.isDebuggerConnected(); }
-
AndroidManifest.xml
中,android:debuggable
属性用于控制程序是否可被调试,若无此选项,则默认禁止调试。若要基于 Smali Debug 调试 APK,就要修改(增加)该属性为 true。因此,可先在代码中检测它的属性值是否被设为FLAG_DEBUGGABLE
,初步判断程序是否被修改 -
AS 中可在 app 模块的
build.gradle
中添加如下代码,禁止第三方对其调试:buildTypes { release { debuggable false jnidebuggable false } }
调试器端口检测
-
使用调试器远程调试程序时,调试服务端会在 Android 设备上运行,打开指定端口进行监听,等待调试器