android - 应用程序在 Android 模拟器中是可调试的,即使在带有 debuggable=false 的发布 apk 中也是如此

标签 android security debugging apk emulation

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

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

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

最佳答案

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

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

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

同时转到:Android Studio -> 构建 -> 编辑构建类型 并检查您用于发布 apk 的风格和类型是否不可调试。

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

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

为避免在 Java 上进行反汇编,您应该使用混淆(就像您在 Javascript 等脚本语言上使用的那样)。

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

Stop the app and don't start it if a debug is attached or debuggin on the device is "on". (Avoid Debugging)

Use obfuscation. (Avoid Disassembling)

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

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

再见!

aapt 命令的功劳:

credits (查鲁ක)

关于android - 应用程序在 Android 模拟器中是可调试的,即使在带有 debuggable=false 的发布 apk 中也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44784466/

相关文章:

ios - 如何为 iOS 和 OSX 构建 OpenSSL

objective-c - 你如何验证代码中二进制的签名证书?

c# - 在 C# : what iteration is this? 中调试 foreach 循环

javascript - 我可以在不设置断点的情况下单步执行浏览器正在解析的所有 JavaScript 代码吗?

android - 杀死 Android 上长时间运行的 native 代码

java - 使用 Appium 在 Android native 应用程序中滚动的问题

android - Robolectric 与 Android 测试框架

javascript - 调试 "unsafe javascript attempt to access frame with URL ... "

java - JUnit 4 和异常暂停

android - 我怎么知道特定协程调度程序使用的线程数是多少?