当应用程序是可调试的时,您可以附加调试器,创建堆转储等。这是调试版本中的默认选项,在发布版本中是关闭的。
我注意到即使是发布的apk仍然可以在Android模拟器上调试,并且debuggable = false
有人能解释为什么以及如何在Android模拟器中实现这一点? 有根设备具有相同的能力吗?
答案 0 :(得分:1)
在每台设备上,您都可以通过查看日志来调试应用程序,这就是为什么在打开调试器时某些应用程序无法运行的原因(例如银行业务应用程序),从而避免通过调试进行反向工程(很显然,它们将对离线使用混淆处理逆向工程)。 因此,如果您使用的是Android模拟器,并且拥有源代码,则可以附加调试并对其进行调试(在这种情况下,您将遇到断点,但看不到变量值)。
您可以通过以下方式检查您的apk是否可调试:
aapt dump xmltree your_app.apk AndroidManifest.xml | grep debug
也可以转到:Android Studio->构建->编辑构建类型 并检查用于发布apk的风格和类型是否不可调试。
如果您希望任何人都无法调试您的应用程序日志,则应检查是否已连接可调试对象,然后不要启动该应用程序。
还请注意,Android使用虚拟机(Dalvik),因此在Windows上构建可移植可执行文件时,您的指令将转换为虚拟机解释的字节码,而不是像C ++编译器那样转换为机器代码。 因此,任何知道如何逆转apk的人都可以通过以这种方式逆转apk来提取重要信息,并且由于它使用字节码,因此与逆转所写的Executable相比,他将获得更详细的apk组件视图。 C ++。在C ++中,如果您反转代码,则只会得到低级代码(因此是汇编代码),而对它的理解却不太像人类(如果您不太了解汇编的话)。
为避免在Java上反汇编,您应该使用混淆处理(就像在Javascript之类的脚本语言上使用的那样)。
因此,如果您的apk不应该是可调试和可逆的,则应该:
如果已附加调试或设备上的调试已“打开”,请停止应用程序并不要启动它。 (避免调试)
使用模糊处理。 (避免拆卸)
我希望这会有所帮助,并且我没有写错任何xD
祝您有美好的一天,并且编码愉快! :D
再见!
credits(Charuක)