android 如何在每次构建时随机化ProGuard字典?

zbdgwd5y  于 2023-06-28  发布在  Android
关注(0)|答案(1)|浏览(131)

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

  1. tasks.whenTaskAdded { currentTask ->
  2. //Android Gradle plugin may change this task name in the future
  3. def prefix = 'transformClassesAndResourcesWithProguardFor'
  4. if (currentTask.name.startsWith(prefix)) {
  5. def taskName = currentTask.name.replace(prefix,
  6. 'createProguardDictionariesFor')
  7. task "$taskName" {
  8. doLast {
  9. createRandomizedDictonaries()
  10. }
  11. }
  12. //append scramble task to proguard task
  13. currentTask.dependsOn "$taskName"
  14. }
  15. }

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

  • 从gradle运行类中的函数。
  • 读取主文本文件中的字符串(在应用程序中),并使用循环将它们逐个添加到字符串数组列表中?潜在地合并一些随机化逻辑,从文本文件中只添加X字符串?
  • 如果所有字符串都被添加到Arraylist中,则使用一些随机化逻辑将X个字符串添加到另一个字符串Arraylist中,该字符串将用于ProGuard的混淆。
  • 使用Arraylist中的随机字符串创建一个新的文本文件。
  • 指示ProGuard使用新生成的文本文件进行模糊处理。

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

v1l68za4

v1l68za41#

我发现了一个关于使用gradle来构建混淆字典的网站。https://yrom.net/blog/2019/06/19/simple-codes-to-generate-obfuscation-dictionary/
我在我的gradle任务中运行代码,但它需要修改一点。以下是我的Gradle代码:

  1. task genDict{
  2. outputs.file('D:/ProjectName/build/tmp/builddict.txt')
  3. doLast{
  4. def r =new Random()
  5. println(r)
  6. def begin = r.nextInt(1000) + 0x0100
  7. def end = begin + 0x40000
  8. println("end: "+end)
  9. def chars = (begin..end)
  10. .findAll { Character.isValidCodePoint(it) && Character.isJavaIdentifierPart(it) }
  11. .collect { String.valueOf(Character.toChars(it)) }
  12. println("chars: "+chars)
  13. int max = chars.size()
  14. println(max)
  15. def start = []
  16. def dict = []
  17. for (int i = 0; i < max; i++) {
  18. char c = chars.get(i).charAt(0)
  19. if (Character.isJavaIdentifierStart(c)) {
  20. start << String.valueOf(c)
  21. }
  22. }
  23. println(start.size())
  24. def f = outputs.files.getSingleFile()
  25. f.getParentFile().mkdirs()
  26. f.withWriter("UTF-8") {
  27. it.write(start.join(System.lineSeparator()))
  28. it.write()
  29. }
  30. }

我想你可以设置你的字典规则。这是一个例子。不要忘记在www.example.com文件中添加模糊处理规则proguard-rules.pro file

  • obfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'
  • classobfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'
  • packageobfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'
展开查看全部

相关问题