为类、成员和参数混淆 Proguard 自定义命名

Posted

技术标签:

【中文标题】为类、成员和参数混淆 Proguard 自定义命名【英文标题】:Proguard custom naming for classes, members and parameters obfuscation 【发布时间】:2012-04-20 03:51:12 【问题描述】:

有没有简单的描述一下Proguard中字典文件的结构?

我已阅读有关 -?obfuscationdictionary 的信息,但我找不到有关文件本身的任何信息。

此外,我想将命名方案更改为更复杂的东西,而不仅仅是ab 等和paramXparamY...我想要一个随机的系列字符,如果可能的话。

是的,我知道这只是视觉上的差异,可以被改造(重构?)成更易于阅读的东西。不过,只是问...

谢谢

【问题讨论】:

【参考方案1】:

字典文件格式非常简单:

    每行一个字 空白行被忽略 以# 开头的行被忽略

如果你想创建一个随机字符串的字典,你可以编写一个简单的程序来生成它们并将它们转储到一个文本文件中,或者使用http://www.random.org/strings,它有一个很好的简单的网络界面来创建随机字符串。它每行输出一个,因此您可以将其输出直接用作您的字典文件。

这是一些示例输出(您可以生成任意大小的字符串):

HISPj7KHQ7 wja3o2vx62 eyd3OXAZgV DxDJysLV5r BSUTWEAMAI R7N8DF4OVS 4q7UsoAgP4 cWbN6pumKk SJowARcXwM OyIbF7L6XB

这是我找到的一个例子:

https://trac.openxdata.org/browser/trunk/j2me/openxdata-mobile/epihandy-lite/proguard/examples/dictionaries/keywords.txt?rev=1156

# # 这个混淆字典包含保留的 Java 关键字。他们不能 # 在Java源文件中使用,但它们可以在编译的类文件中使用。 # 请注意,这几乎不会改善混淆。体面的反编译器可以 # 自动替换保留关键字,效果可以很简单 # 通过使用更简单的名称再次混淆来撤销。 # 用法: # java -jar proguard.jar ..... -obfuscationdictionary keywords.txt # 做 如果 为了 整数 新的 尝试 字节 案子 字符 别的 去 长 这 空白 休息 抓住 班级 常量 最终的 漂浮 短的 极好的 扔 尽管 双倍的 进口 本国的 民众 返回 静止的 转变 投掷 布尔值 默认 延伸 最后 包裹 私人的 抽象的 继续 严格的fp 易挥发的 界面 受保护 短暂的 工具 实例化 同步的

【讨论】:

所以,我认为没有办法随机化它,是吗? 好吧,你可以写一个简单的程序来生成一个字典文件,里面全是随机生成的字符串。 事实上,random.org/strings 有一个网络表单生成器,可以为您完成这些工作。它会以您可以用于字典文件的格式将其吐出。 是的,是的,愚蠢的问题,呃。当然,只需生成随机数并将其放入 dict... 感谢您的帮助。 生成的字节码会比使用简单的 a,b,c 大吗?【参考方案2】:

任何文本文件都可以使用。 ProGuard 使用文件中的所有有效标识符。它忽略以“#”开头的行。 ProGuard 发行版中的目录 examples/dictionaries 包含一些示例(包括 ulmangt 粘贴的示例)。

【讨论】:

那么使用这本词典不是个好主意吗?这就是重点吗?

以上是关于为类、成员和参数混淆 Proguard 自定义命名的主要内容,如果未能解决你的问题,请参考以下文章

Proguard 不会保留班级成员的枚举

Android混淆规则--proguard-rules.pro

error C2825: '_Iter': 当后面跟“::”时必须为类或命名空间 -- 原因可能是参数错误或者自定义函数名和库函数名冲突

ProGuard 混淆、java、Google Gson 和泛型集合——如何留住成员?

代码混淆

java proguard混淆示例和结果