对于 PE 文件或 ELF 文件,有很多关于如何进行反混淆、从内存中转储、重建符号等的资料。对于 android 二进制文件,情况似乎并非如此。
- 您如何处理被 ProGuard、DexGuard 或自定义混淆器混淆的 APK?
- 你如何处理字符串加密和反射?您是否通过 jdb 进行调试并查找类加载?
- 有什么阅读推荐吗?
对于 PE 文件或 ELF 文件,有很多关于如何进行反混淆、从内存中转储、重建符号等的资料。对于 android 二进制文件,情况似乎并非如此。
这是我将如何处理它。这不一定是最好的方法。
第一步是通过使用您最喜欢的反编译器环顾四周,找出应用程序使用的混淆类型。大多数应用程序实际上没有被混淆,或者只有名称混淆。如果名字被混淆了,对RE来说仍然会很烦人,但代码至少是完整的。
如果应用程序进行了名称混淆,您可以尝试查看它们是否也混淆了任何流行的库或 sdk。谷歌一些字符串文字,看看是否有任何东西可以识别为开源库。如果是这样,您可以编写一个脚本将混淆代码与开源库代码进行匹配,并用未混淆的名称替换所有内容。这通常需要一些启发式和手动调整,因为事情不会完全匹配。一旦删除了这些库,手动 RE 所需的代码量就会大大减少。
一些应用程序具有更复杂的混淆方法。例如,字符串加密。有些人实际上会运行代码来转储解密的字符串,这具有(大部分)无论加密方法如何都可以工作的优点。我更喜欢静态地做所有事情,所以我只看解密函数做了什么,并编写一个脚本来解密代码中的所有字符串,并将它们替换为原始字符串。
我实际上还没有看到任何使用反射进行混淆的 Android 应用程序(使用它来访问私有 apis 是另一回事)。但是我在Java程序中看到过,处理起来还是很简单的。解密所有字符串后,您可以编写另一个脚本来用原始方法替换反射调用。
就 Java 代码混淆器而言,就是这样。打包程序和本机代码加载程序是另一回事。我没有使用它们的经验,但通常的方法是运行应用程序并转储解压后的代码。
我对去混淆步骤帮不上忙,因为我也在为此苦苦挣扎。我最好的选择是反编译代码并使用Sublime Text 3进行重构(它的“将文件夹添加到项目”选项也对代码分析有很大帮助)。
字节码查看器也将很有帮助,因为它为您提供 5 个不同的反编译器的输出以及 smali 输出。可能看起来不多,但并排比较输出确实加快了一些“瓶颈区域”代码的读取速度
我可以为您提供一个工具的名称,该工具将帮助您解决这些字符串解密和反射问题。
FRIDA是一种适用于 Android 应用程序的动态检测工具,可让您使用 Javascript 将自己的代码添加到应用程序中。它将让您打印解密的文本,调整应用程序代码,以便为您提供有关数据的更多信息等。