即使在 debuggable=false 的发布 apk 中,应用程序也可以在 Android 模拟器中调试

Posted

技术标签:

【中文标题】即使在 debuggable=false 的发布 apk 中,应用程序也可以在 Android 模拟器中调试【英文标题】:Application is debuggable in Android emulator even in release apk with debuggable=false 【发布时间】:2017-06-27 15:38:36 【问题描述】:

当应用程序可调试时,您可以附加调试器、创建堆转储等。这是调试版本中的默认选项,而在发布版本中则关闭。

我注意到即使是发布的 apk 在 debuggable=false 的 android 模拟器上仍然可以调试

有人可以解释为什么以及如何在 android 模拟器中实现这一点吗? 有根设备有同样的能力吗?

【问题讨论】:

【参考方案1】:

在每台设备中,您都可以通过查看其日志来调试应用程序,这就是为什么某些应用程序在打开调试器(如银行应用程序)时无法运行的原因,以避免通过调试进行逆向工程(显然它们会使用混淆来离线逆向工程)。 所以如果你在安卓模拟器上并且你有源代码,你可以附加调试并调试它(在这种情况下你会遇到断点,但你看不到变量值)。

您可以通过以下方式检查您的 apk 是否可调试:

aapt dump xmltree your_app.apk AndroidManifest.xml | grep debug

也可以去:Android Studio -> Build -> Edit Build Type 并检查您用于发布 apk 的风格和类型是否不可调试。

如果您希望任何人都无法调试您的应用程序日志,您应该检查是否附加了可调试项,然后不要启动应用程序。

另外,Android 使用虚拟机 (Dalvik),因此您的指令会被转换为由虚拟机解释的字节码,而不是像 C++ 编译器那样在 Windows 上构建可移植可执行文件时执行的机器码。 因此,任何知道如何反转 apk 的人都可以通过以这种方式反转它来从您的 apk 中提取重要信息,并且由于它使用字节码,他将获得比通过反转写入的可执行文件获得的 apk 组件更解释的视图C++。在 C++ 中,如果您反转代码,您只会得到低级代码(因此是汇编代码),而且它不太像人类理解(如果您不太了解汇编)。

为了避免在 java 上反汇编,你应该使用混淆(就像你在 javascript 等脚本语言上使用的那样)。

因此,如果您的 apk 不应该是可调试和可逆的,那么您应该:

如果附加了调试或设备上的调试处于“开启”状态,请停止应用并且不要启动它。 (避免调试)

使用混淆。 (避免拆卸)

我希望这会有所帮助,并且我没有写错任何东西xD

祝你有美好的一天和美好的编码! :D

再见!

aapt 命令的功劳:

credits (Charuක)

【讨论】:

以上是关于即使在 debuggable=false 的发布 apk 中,应用程序也可以在 Android 模拟器中调试的主要内容,如果未能解决你的问题,请参考以下文章

Android - 用于调试和发布模式的应用程序图标

一些Android程序的反逆向方法

当 debuggable 设置为 true 时,Proguard 不会缩小

此应用程序未在其清单中启用 debuggable 属性

Android debuggable=true with proguard 开启

清单文件-应用程序标记