如果您曾经考虑过应用程序的安全性,或者以某种方式想要优化您的代码,那么您肯定会知道ProGuard是什么。 也许您已经受苦于此,或者有能力克服文档问题,在浩如烟海的几篇文章中,您已经知道发生了什么。
在本文中,我不会讨论如何保留保持规则或一些有用的选项。 我认为,要将ProGuard拖入项目中,只需阅读随附的教程就足够了。 我将根据代码分析ProGuard的工作方式。 如果您有兴趣-欢迎加入。
许多人误以为ProGuard,错误地认为它是混淆器,这并不是出于以下几个原因:
ProGuard的主要任务是更改对象,类,方法的名称,从而使反向工程师的代码分析复杂化。 此外,他还优化了代码,删除了程序中未使用的资源。 但是,最终,从经典意义上讲,它不能被称为混淆器。
那么我们要处理什么呢?
通常,ProGuard是可与Java代码一起使用的开源实用程序。 是的,它也是用java编写的。 处理它的人也在开发DexGuard,如果您发出声音,它也可以在空旷的地方找到,因为它们会定期合并。 但总的来说,DexGuard被认为是付费的,实际上是同一ProGuard的较硬版本。
因此,我们可以得出结论,ProGuard是一个jar文件,可以重新排列代码中的字符,对其进行优化,并且看起来可以增强安全性。 默认情况下,ProGuard可以使用26个大写和小写英文字母。
proguard的规则在各个项目之间被拖延,并且被认为是不可侵犯的,因为不要触摸它-它可以起作用,否则可能会出现一些让人难以理解且不想知道的地狱般的红线。 一些神谕制定了这些规则,要达到这些规则,您需要转七圈,变成一只鸟,然后飞向西南方向飞行两小时四十三分钟。
好吧,既然没有人想要去那里,也没有人需要去那里,那就让我们开始吧。
如果查看proguard项目的目录,则可以立即确定其主要功能。
到目前为止,一切似乎都很清楚。 因此,让我们看一下主类。
public class ProGuard {
好吧,让我们在这里进入一个显而易见的main方法,在该方法中,我们将了解如何设置默认规则以及如何解析开发人员自己设置的规则。
另外,还有一个预期的对象jectedClassNameMap,通过它我们可以得到文件build / outputs / proguard / release / mapping.txt,如下所示:
因此,如果我们突然想打开自己的代码并使之可读,则可以使用mapping.txt做到这一点。 为此,发布apk文件时,您需要在Google Play控制台中下载mapping.txt的版本。
现在,您可以查看开发人员设置的配置解析器。
public class ConfigurationParser {
嗯,我不是说混淆器,它不是混淆器,但是在这里您可以看到整个混淆器目录。 怎么会这样
如果查看上面的屏幕,则可以轻松找到负责重命名对象的类(SimpleNameFactory,ClassRenamer ...)。 如上所述,默认情况下使用26个拉丁字符。
public class SimpleNameFactory implements NameFactory { private static final int CHARACTER_COUNT = 26; private static final List cachedMixedCaseNames = new ArrayList(); private static final List cachedLowerCaseNames = new ArrayList(); private final boolean generateMixedCaseNames; private int index = 0;
在SimpleNameFactory类中,有一个特殊的方法可以检查printNameSamples(),该方法将为我们提供期望的值
public static void main(String[] args) { System.out.println("Some mixed-case names:"); printNameSamples(new SimpleNameFactory(true), 60); System.out.println("Some lower-case names:"); printNameSamples(new SimpleNameFactory(false), 60); System.out.println("Some more mixed-case names:"); printNameSamples(new SimpleNameFactory(true), 80); System.out.println("Some more lower-case names:"); printNameSamples(new SimpleNameFactory(false), 80); } private static void printNameSamples(SimpleNameFactory factory, int count) { for (int counter = 0; counter < count; counter++) { System.out.println(" ["+factory.nextName()+"]"); } }
Some mixed-case names: [a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] ...
Obfuscator类负责“混淆”,其中只有一种执行方法,其中将转移项目本身的所有收集的类库以及添加到其中的所有库。
public class Obfuscator { private final Configuration configuration;
除ProGuard之外,还有Optimizer类启动的优化,从而执行了非常重要的功能以清理非运行资源。 它还考虑了开发人员设置的参数。 因此,如果您想确保代码的安全性,则可以随时为其规定规则。 优化从ProGuard类启动。
private boolean optimize(int currentPass, int maxPasses) throws IOException { if (configuration.verbose) { System.out.println("Optimizing (pass " + currentPass + "/" + maxPasses + ")..."); }
Proguard的工作可以分为几个阶段:
- 阅读预设规则
- 最佳化
- 删除标记为优化的资产
- 重命名对象
- 以修订形式将项目记录在指定目录中
您可以使用以下命令手动启动proguard:
java -jar proguard.jar @android.pro
其中proguard.jar是ProGuard组装的项目,而android.pro是使用输入和输出参数的规则。
为什么编写自己的ProGuard太痛苦了
实际上,当我浏览ProGuard代码时,在作者专栏中只看到一个名字-Eric Lafortune。 通过快速谷歌搜索,我发现
了他的个人网站 ,如果有人感兴趣,您可以熟悉一下他。
Google将ProGuard视为优化和保护其代码的唯一解决方案,实际上,它是唯一的解决方案。 所有其他解决方案都是付费的,或者是在github上并被灰尘覆盖的,我个人不建议您在项目中尝试使用它们,因为缩小,混淆,重新打包和优化的主要问题是在任何时候都可能发生冲突,因为很难预见代码中可能出现的所有选项。 另外,这样的实用程序需要尽可能紧密地包含在测试中,谁愿意这样做?:)不幸的是,每个人都喜欢谈论测试,而不是编写测试。
为什么使用ProGuard没用
ProGuard根据已知的规则工作,并且如果您不设置规则而只是将其包含在项目中,则为攻击者访问代码将不会很困难,因为逆变器已经编写了很长时间并且属于公共领域。 当然,如果您更详细地研究该主题并添加规则,则难度会更大,但是却很少。 出路是什么?
优先考虑隐藏代码的公司,请坚持使用ProGuard并对其进行修改以适合他们的需求,从而获得独特的解决方案。
为什么,为什么,您无事可做?
通常,proguard并不是一个有用的工具,那里没有超自然现象发生,因此很有可能通过花几个晚上喝杯茶然后抚摸猫来研究来源。 你为什么需要这个? 为了更详细地了解与您一起使用的工具并了解它们对代码的作用,您真的需要它们吗? 这不仅适用于ProGuard,还适用于您在项目中使用的任何其他第三方代码。 您的代码是您的职责范围,应该保持整洁;否则,进行开发的目的是什么?
这篇文章写于大约六个月前,而proguard也在不断发展,因为某些片段可能不再重合。
PS我像往常一样在电报频道
@paradisecurity中发布所有集合,该链接可以在我的个人资料中找到,也可以在按名称搜索电报中找到。