对于PE文件或ELF文件,关于如何进行去混淆,从内存中转储,重新构建符号等方面的材料很多。对于似乎不是这种情况的android二进制文件。 >

如何处理被ProGuard,DexGuard或自定义混淆器混淆的APK?
如何处理字符串加密和反射?您是否通过jdb进行调试并查找类加载?
是否有任何阅读建议?


评论

github.com/CalebFenton/simplify可能有用。 Wrt * Guard混淆器-它们的处理是单向的,不可恢复,因此也许得到一个反编译器,使您可以编辑方法名称等或至少对其进行注释

只要我使用proguard,就可以通过某种方式来还原新代码。

想知道是否有更多的人可以加入其他答案,即使在今天,这仍然很重要。任何提示都将非常有帮助!

#1 楼

这就是我的处理方法。不一定是最好的方法。

第一步是通过与您喜欢的反编译器一起查看,找出应用程序正在使用哪种混淆方式。实际上,大多数应用程序不会被混淆,或者只会混淆名称。如果名称被混淆,那么RE仍然很烦人,但是代码至少是完整的。

如果应用名称混淆,您可以尝试查看它们是否也混淆了任何流行的库或SDK。 Google搜索一些字符串文字,看看是否有任何东西可以识别为开源库。如果是这样,您可以编写脚本以将混淆的代码与开放源代码库代码进行匹配,并使用未混淆的名称替换所有内容。这通常需要一些试探法和手动调整,因为事情不会完全匹配。删除库后,手动RE所需的代码量将大大减少。

一些应用程序具有更复杂的混淆方法。例如,字符串加密。有些人实际上将运行代码以转储解密的字符串,这具有(大部分)不管加密方法如何都能工作的优点。我更喜欢静态地做所有事情,所以我只看解密函数的作用,并编写一个脚本来解密代码中的所有字符串,并用原始字符串替换它们。

我实际上还没有见过任何使用反射进行混淆的Android应用程序(使用它来访问私有api是另一回事)。但是我已经在Java程序中看到它,并且它仍然非常易于处理。一旦解密了所有字符串,就可以编写另一个脚本来用原始方法替换反射调用。就Java代码混淆器而言,就是这样。打包器和本机代码加载器是另一回事。我没有经验,但是通常的方法是运行应用程序并转储解压缩的代码。

#2 楼

在混淆处理方面,我无能为力,因为我也在为此而苦苦挣扎。我最好的选择是反编译代码并使用Sublime Text 3进行重构(其“将文件夹添加到项目”选项也有助于代码分析)。

字节码查看器也将非常有用,因为它可以为您提供5个不同的反编译器的输出以及smali输出。可能看起来并不多,但是并排比较输出确实可以加快某些“瓶颈区域”代码的读取速度。

我能为您提供的就是可以帮助您的工具名称

FRIDA是适用于Android应用程序的动态检测工具,可让您使用Javascript将自己的代码添加到应用程序中。它可以让您打印解密的文本,调整应用程序代码,以便为您提供有关数据的更多信息,等等。