即使在 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 模拟器中调试的主要内容,如果未能解决你的问题,请参考以下文章
当 debuggable 设置为 true 时,Proguard 不会缩小