在进行Android应用逆向分析的时候,让目标应用处于调试状态能极大的增加效率,能够完成如下功能:
- 动态调试
- 使用DDMS、Android Profiler进行分析
- 优化Logcat输出,因为当应用处于调试状态时,logcat包含包名
开启调试开关的方法有:
- 修改AndroidManifest.xml文件
- 使用Xposed插件,修改启动参数
- 修改系统的ro.debuggable属性
修改AndroidManifest.xml文件不推荐使用,不仅效率低下,而且越来多的应用加入完整性校验(甚至包括服务端完整性校验)后,还需要增加额外的时间成本完成这一简单的修改。尽管绕过完整性校验的方法并不难。
在能够安装、运行Xposed Framework的手机上,使用Xposed模块修改启动参数,是过去几年用的最多的方法,如XInstaller、XDebug等模块,其原理如下:
private XC_MethodHook debugAppsHook = new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("-- beforeHookedMethod :" + param.args[1]); int id = 5; int flags = (Integer) param.args[id]; if ((flags & DEBUG_ENABLE_DEBUGGER) == 0) { flags |= DEBUG_ENABLE_DEBUGGER; } param.args[id] = flags; if (BuildConfig.DEBUG) { XposedBridge.log("-- app debugable flags to 1 :" + param.args[1]); } } }; @Override public void initZygote(final IXposedHookZygoteInit.StartupParam startupParam) throws Throwable { XposedBridge.hookAllMethods(Process.class, "start", debugAppsHook); }
对于无法运行Xposed Framework的机器,则需要设置ro.debuggable
调试模式的全局开关。由于ro.debuggable
位于default.prop
中,而default.prop
实际处于boot.img内,启动的时候通过映射的方式挂在到ramdisk中。因此,需要修改ro.debuggable
,需要对修改boot.img,十分繁琐,且通用性和可操作性都很低。
当然,现在设置default.prop
用Maigsk就可以很好的解决。但由于Magisk自带的MagiskHide功能开启后,会强制将ro.debuggable
设置为0。所以,在Magisk下开启MaigskHide并且设置ro.debuggable
,需要完成以下步骤:
- 安装MagiskHide Props Config;
- 安装Busybox for Android NDK;
- 重启机器;
- 进入adb shell,运行props进行设置即可。