当应用程序可调试时,您可以附加调试器、创建堆转储等。这是调试版本中的默认选项,而在发布版本中则关闭。
我注意到即使是发布的 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/