如何使用由Proguard生成的mapping.txt文件对jar文件进行去混淆?

8
这可能听起来有些可疑,但我需要解混淆我的应用程序。一段时间前,我发布了使用Proguard混淆的应用程序。不幸的是,我没有保存该版本的应用程序,并且修改了很多代码。
现在我需要那个旧版本的代码。我仍然拥有由Proguard生成的mapping.txt文件。
我已经将classes.dex文件转换为jar(使用dex2jar工具),现在我需要根据mapping.txt解淆它。是否有任何可以帮助我的工具?也许是Proguard本身?
更新:我需要一个可以自动重命名所有类、函数等的工具,这样我就不必手动操作了。谢谢。

这可能是不可能的。一旦你编译应用程序,代码已经被编译器"混淆"了。如果你再用Proguard对应用程序进行混淆,那就是双重混淆了。可能有一种方法可以去混淆和反编译应用程序。我建议你在下次编码之前保存和备份任何东西。 - user5287318
1
这对你现在并没有帮助,但为了避免类似的问题,在未来使用版本控制系统(VCS)。 - F43nd1r
2个回答

14
如果你有映射,那么你可以找回每个类、字段和方法的名称。你可以使用java-asm(一个字节码修改库)来重新映射类和成员名称。大部分工作将是更新成员描述符。
我为自己做了一个,花了一天时间才能可靠地使其工作。
编辑:它并不完美,但非常接近。链接GUI截图给它一个混淆过的jar文件和映射,它会重命名所有可以找到的内容。虽然存在一些问题,但只需查看源代码即可完成任务。只需将其生成的jar文件(文件名+“-Re.jar”)转储到反编译器中,例如Luyten/JD-GUI。此外,文件输入仅通过按钮更改。文本框仅用于视觉反馈/确认。
编辑2:修复了当映射中的类条目不存在于给定的jar文件中时发生的NPE。
编辑3:修复了许多导致方法未被重命名的问题。
编辑4:将编译后的jar包上传到Github(发布版,在zip文件中的映射工具中),新增了多个映射类型支持。

这看起来就是我想要的东西,但不幸的是,当我按“撤消”按钮时,我得到了NPE:java.lang.NullPointerException at me.lpk.mapping.MappedClass.<init>(MappedClass.java:38) at me.lpk.mapping.ProguardLoader.readClass(ProguardLoader.java:121) at me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:61) at me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:41) at me.lpk.mapping.MappingGen.mappingsFromProguard(MappingGen.java:49) at me.lpk.ReProguard$4.actionPerformed(ReProguard.java:123) ... - user2758776
看起来它抛出了异常,因为它尝试加载的类名在jar包中不存在。重新设计了ProguardLoader类以检查这个问题。如果该类在jar包中不存在,则该类的映射将被忽略。已经修复并重新上传了工具。 - Display Name
非常感谢您的努力,但我仍然遇到了空指针异常:java.lang.NullPointerException at me.lpk.mapping.MappedClass.<init>(MappedClass.java:38) at me.lpk.mapping.ProguardLoader.readClass(ProguardLoader.java:126) at me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:61) at me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:41) at me.lpk.mapping.MappingGen.mappingsFromProguard(MappingGen.java:49) at me.lpk.ReProguard$4.actionPerformed(ReProguard.java:123)也许您可以与我分享一下您工具的源代码?谢谢! - user2758776
2
这是链接:https://github.com/LPK-Matt/SkidSuite2我正在尝试复制NPE,但似乎无法弄清楚您的映射是如何触发它的。 - Display Name
@beppe9000 我在这里找到了它:https://github.com/FireMasterK/SkidSuite2-Latest - Oleksandr Albul
显示剩余2条评论

3

我建议使用Proguard工具,如在上述答案中建议的那样,以及Enigma。解决您的问题并不是非常直接,您需要使用可用工具的组合来解决它。


除了Proguard之外,我还使其与Engima映射一起工作。但是,我没有编译带有Enigma GUI激活的版本。源代码在该存储库中:https://github.com/LPK-Matt/SkidSuite2/blob/master/SkidReob/src/me/lpk/gui/windows/mapping/WindowEnigma.java - Display Name
@DankVader,该网址返回404错误。 - beppe9000
@beppe9000 具体文件已在提交中删除,但存储库仍然存在。https://github.com/LPK-Matt/SkidSuite2/releases 自发表该评论以来,它已被编译并放置在发布版下。 - Display Name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接