ZKM混淆工具
原创文章,尊重劳动,转载请标明出处
ZKM 介绍
zkm 是一款付费的代码混淆工具。
一般使用步骤
直接下载 zkm.jar ,根据 ZKM 混淆语法规则编写混淆脚本(这里假设脚本名为 zkm.script.txt ),直接输入命令:
#zkm.script.txt 脚本名 java -jar zkm.jar zkm.script.txt |
zkm 脚本的语法规则详见参考的链接
-
运行命令
java -jar zkm.jar
运行结束后,可以看到 GUI 程序启动了 - 运行 Build Helper
或者 - 设置 ClassPath
classPath是配置要混淆的 jar 包所依赖的 jar。
默认情况下 java 依赖已经添加了
我这里直接将 jar 依赖的包同一放到了一个 lib 目录下, 然后点击 add 按钮, 在下面的这个对话框里面将 lib 下的 jar 包全部选中,点击 ok 全部选中
设置成功后就可以下一步了 - 设置 open,也就是选择要被混淆的 jar
设置完后就会进入这个界面了,如果前面的classPath 没有配好这里会提示出错, 我这设置的没问题,所以只是提示了 warning - 一路操作下来,就到了设置 Trim Exclusions 了, Trim Exclusions 的作用是设置不配 zkm trim的 class 或者 field ( trim 操作比如删除源文件属性, 行号属性等), 我后面会跳过 Trim 设置, 所以这一步也跳过 (设置的操作也很简单,可以参考第7步)
- 设置 Trim Options,ZKM 会对除了第 5 步配置的 Trim Exclusions ,其他的打开的类会根据这里的配置做一些修剪操作,我这里就直接跳过了
- 配置 Obfuscate Name Exclusions, 这里主要是设置不被混淆的包名, 类, field, method 等
介绍:
Application type:
这里是默认提供的一些模版, 比如这里选择其中的一个
可以看到选择了 Extensible framework 之后, 自动帮我们添加了一些配置
Exclude package qualifiers:
配置不会被混淆的包名
可以看到我们选择了 com.bluware.agent.android 这个包名后, 配置里面就出现了 com.blueware.agent.android. 根据 zkm 脚本规则, 这条配置就是指 com.blueware.agent.android这个包名不会被混淆
don't change main class name:
如果 jar 清单配置文件里面配置了 main 类的信息, 这里就可以选择不被混淆的 Main类了
Add
可以看出, 点击了 Add 按钮后, 弹出的对话框里面有 包名, 类, field, 方法等选项, 说明这里可以配置不会混淆的类、包名、 field、方法等,注意包名不被混淆除了在 Exclude package qualifiers 里面配置外, 也可以在这里配置
我这里以配置方法为例说明, 选中 method ,点击 ok
现在我要配置 OneApmAgent.class这个类 里面的所有 public 修饰的方法都不被混淆, 同时OneApmAgent.class这个类所在的包名以及 OneApmAgent.class 这个类名也不被混淆
1.配置 Method, public *(*) 也就是只要是public 类修饰的方法都不被混淆
这里的 * 是通配符, 经过这么设置后, jar 包里面的 public 方法都不会被混淆, 但是其所所在的类的类名, 以及包名都会被混淆
2.限定方法所在的类,设置 Containing class
经过这一部设置后,也就是只有名为 OneApmAgent 的类中的 public 方法才不会被混淆, OneApmAgent 类名和所在的包名还是会被混淆, 如果要向类名不会被混淆的话, 需要勾选 Exclude class name as well
这样类名也不会被混淆了,但是所在的包名还是会被混淆
3 配置 Containing package
这一步主要是配置类所在的包,可以指定具体的包名,或者使用通配符匹配的包名, 我这里任意包名都可以,所以使用通配符 *.
注意这里如果不勾选 Exclude package name as well 的话, 那么OneApmAgent.class所在的包名不会被混淆, Name 是限制 OneApmAgent.class 所在的包名, 只有包名配置 Name 的 OneApmAgent.class才会被混淆
设置完后可以看到添加了一条配置信息
根据 ZKM 混淆规则 的确是 任意包名下的 名为 OneApmAgent 的类的所有 public 方法均不混淆, 同时不混淆 OneApmAgent类名,以及所在的包名。 - 设置 Obfuscate Options, 主要是配置一些信息
- 设置 Save Classes 点击 Next - 点击 ok, 这里是配置混淆后的 jar 保存路径,
一路确定, 到这混淆就正式开始了, 混淆后的 jar 包 可以在这里配置的路径下找到
- 查看和保存 ZMK Script, 这样以后就可以直接用这个脚本来混淆了