如何在每个构建中随机化 ProGuard 字典?

Posted

技术标签:

【中文标题】如何在每个构建中随机化 ProGuard 字典?【英文标题】:How to randomize ProGuard dictionaries on each build? 【发布时间】:2020-07-15 20:29:38 【问题描述】:

我发现了一个article,它引入了随机化字典条目的概念,而不是在混淆时对类名和变量使用标准的“a、b、c、...”。他解释说,任务可以在构建时在 gradle 中运行,以生成一个随机文本文件,该文件可以替换默认提供的文件:

tasks.whenTaskAdded  currentTask ->
    //android Gradle plugin may change this task name in the future
    def prefix = 'transformClassesAndResourcesWithProguardFor'
    if (currentTask.name.startsWith(prefix)) 
        def taskName = currentTask.name.replace(prefix,
                       'createProguardDictionariesFor')
        task "$taskName" 
            doLast 
                createRandomizedDictonaries()
            
        

        //append scramble task to proguard task
        currentTask.dependsOn "$taskName"
    

但是,我不知道他如何在 gradle 中运行 createRandomizedDictonaries(),以及他如何创建一个包含字母/整数/符号随机列表的文本文件。逻辑可能是这样的:

在 gradle 的类中运行函数。 读取主文本文件(在应用程序内)中的字符串并将它们一一添加到带有循环的字符串 Arraylist 中?潜在地 将其与一些随机化逻辑相结合,仅添加 X 字符串 文本文件? 如果所有字符串都添加到 Arraylist 中,请使用一些随机化逻辑将 X 个字符串添加到另一个字符串中 用于 ProGuard 混淆的 Arraylist。 使用 Arraylist 中的随机字符串创建一个新文本文件。 指导 ProGuard 使用新生成的文本文件进行混淆。

欢迎使用 kotlin 和 java 的解决方案。

【问题讨论】:

【参考方案1】:

我找到了一个关于使用 gradle 构建混淆字典的网站。 https://yrom.net/blog/2019/06/19/simple-codes-to-generate-obfuscation-dictionary/

我在我的 gradle 任务中运行代码,但它需要稍作修改。 以下是我的gradle代码:

task genDict
outputs.file('D:/ProjectName/build/tmp/builddict.txt')
doLast
    def r =new Random()
    println(r)
    def begin = r.nextInt(1000) + 0x0100
    def end = begin + 0x40000
    println("end: "+end)
    def chars = (begin..end)
            .findAll  Character.isValidCodePoint(it) && Character.isJavaIdentifierPart(it) 
            .collect  String.valueOf(Character.toChars(it)) 
    println("chars: "+chars)
    int max = chars.size()
    println(max)
    def start = []
    def dict = []
    for (int i = 0; i < max; i++) 
        char c = chars.get(i).charAt(0)
        if (Character.isJavaIdentifierStart(c)) 
            start << String.valueOf(c)
        
    
    println(start.size())
    def f = outputs.files.getSingleFile()
    f.getParentFile().mkdirs()
    f.withWriter("UTF-8") 
        it.write(start.join(System.lineSeparator()))
        it.write()
    

我认为你可以设置你的字典规则。这是一个例子。 不要忘记在你的 proguard-rules.pro 文件中添加混淆规则

-obfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'

-classobfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'

-packageobfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'

【讨论】:

以上是关于如何在每个构建中随机化 ProGuard 字典?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ProGuard 实例化 AndroidPlatform 类

在c中随机化一维数组中的序列[重复]

如何在 PostgreSQL 中获得随机笛卡尔积?

如何使用相同的随机排序对两个数组进行排序

如何在 SQL 中请求随机行?

sass构建CSS时,如何给文件随机加版本号,以防止老文件缓存?