混淆技术研究笔记(二)yGuard入门

logo
yGuard官方文档地址:https://yworks.github.io/yGuard/index.html

yGuard官方文档包含了比较全面的内容,由于文档是英文的,而且文档翻译后的浏览效果不是特别好,所以看文档入门有点难度。

这个系列的重点是混淆,所以不会涉及yGuard中的shrink用法,主要是rename的用法。

本文使用的 maven-antrun-plugin 插件,插件的基本配置如下:

<plugin><artifactId>maven-antrun-plugin</artifactId><version>1.8</version><executions><execution><phase>package</phase><goals><goal>run</goal></goals><id>obfuscate</id><configuration><tasks><!-- Ant具体配置 --></tasks></configuration></execution></executions>
</plugin>

在插件配置的 <tasks> 中是 Ant 的具体配置,下面是一个参考官方示例修改过的配置,针对单个模块的配置。

<tasks><propertyname="project.jar"value="${project.build.directory}/${project.build.finalName}.jar"/><propertyname="project.jar.unobf"value="${project.build.directory}/${project.build.finalName}_unobf.jar"/><movefile="${project.jar}"tofile="${project.jar.unobf}"verbose="true"/><propertyname="runtime_classpath"refid="maven.runtime.classpath"/><taskdefname="yguard"classname="com.yworks.yguard.YGuardTask"classpath="${runtime_classpath}"/><yguard><inoutpair in="${project.jar.unobf}" out="${project.jar}" /><externalclasses><pathelement location="${runtime_classpath}"/><!-- 下面配置是错误的 --><pathelement location="${maven.dependency.com.google.code.gson.gson.jar.path}"/></externalclasses><rename logfile="${project.build.directory}/${project.build.finalName}_renamelog.xml"><keep><class classes="none" methods="none" fields="none"><patternset><include name="org.example."/></patternset></class></keep></rename></yguard>
</tasks>

在这个配置中,前两个 <property 定义了两个属性,在ant中可以通过 ${project.build.directory} 引用Maven配置,并不是所有配置都能生效,可以通过下面的方式简单验证:

<target><echo message="basedir: ${basedir}"/><echo message="project.build.directory: ${project.build.directory}"/>
</target>

上面任务会输出以下内容(和所在项目有关):

main:[echo] basedir: D:\GitLab\module-parent\module-yuard[echo] project.build.directory: D:\GitLab\module-parent\module-yuard\target

上面配置第三个 <move 实际上给 maven 默认打包出来的 jar 改了个名字,从.jar 后缀改成了 .jar.unobf

再下面一个 <property 中通过 refid="maven.runtime.classpath" 指定了运行时的类路径,可以用下面方式查看类路径的信息:

<property name="runtime_classpath" refid="maven.runtime.classpath"/>
<echo message="runtime_classpath: ${runtime_classpath}"/>

关于 refid="maven.runtime.classpath" 更多的信息可以看下面文档
https://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html

输出结果如下:

main:[echo] runtime_classpath: D:\GitLab\module-parent\module-yuard\target\classes;D:\GitLab\module-parent\module-a\target\module-a-1.0-SNAPSHOT.jar;D:\GitLab\module-parent\module-b\target\module-b-1.0-SNAPSHOT.jar;D:\GitLab\module-parent\module-c\target\module-c-1.0-SNAPSHOT.jar;D:\Dev\.m2\repository\com\yworks\yguard\4.1.1-SNAPSHOT\yguard-4.1.1-SNAPSHOT.jar;D:\Dev\.m2\repository\com\yworks\annotation\4.1.1-SNAPSHOT\annotation-4.1.1-SNAPSHOT.jar;D:\Dev\.m2\repository\org\ow2\asm\asm\9.2\asm-9.2.jar;D:\Dev\.m2\repository\org\apache\ant\ant\1.10.12\ant-1.10.12.jar;D:\Dev\.m2\repository\org\apache\ant\ant-launcher\1.10.12\ant-launcher-1.10.12.jar;D:\Dev\.m2\repository\cn\hutool\hutool-all\5.7.22\hutool-all-5.7.22.jar

这里正好结合下面的 <externalclasses> 看看,通过 debug yGuard,可以看到注入的实际地址:
在这里插入图片描述
可以看到类路径最后一个是 D:\GitLab\module-parent\module-yuard\${maven.dependency.com.google.code.gson.gson.jar.path},这个明显没有对应的 jar,这种写法是无法自动解析为对应jar包的,使用Maven时需要注意,官方示例和文档中也有类似的错误。

再下面的 <taskdef 就是 ant 扩展任务的定义,属于固定写法,再往下的 <yguard> 就是 yGuard 主要的配置部分了。

yGuard部分通过<inoutpair in="${project.jar.unobf}" out="${project.jar}" />定义要处理的jar包,in是输入,out是输出,这两个名字可以一样,相当于会覆盖。<inoutpair>可以配置多个,但是maven执行的机制导致这里能被有效混淆的只能有1个,后续实现的多模块混淆是利用了Maven生命周期的一些特点实现的。

<externalclasses>部分是外部 jar 依赖,运行时用到的可以配置到这里,可以一个个指定,也可以像上面文档直接指定 maven 的运行时类路径。

<rename>是本系列的重点,上面示例中使用的 <keep>配置具体的混淆规则,混淆规则中主要使用 <class>配置,一般情况下不需要细致的具体的方法进行配置,通过 <class> 的属性配置一般的通用规则即可。

针对 <class>元素的 classesmethodsfields 三个属性,遵循以下表格的规则(-代表被混淆,*代表保留)。

Value/Visibilitypublicprotectedfriendlyprivate
none----
public*---
protected**--
friendly***-
private****

例如当配置 classes="public" 时,所有 public class XXX 会保持原样,其他类型的会被混淆,当 classes="private 时,所有类名都会保留,方法和字段也是类似的,上面示例中 <class classes="none" methods="none" fields="none">,相当于类名、方法、字段全部被混淆,都不被保留。

上面配置 <include name="org.example."/> 时,包名最后的 . 必须包含,你还可以使用 ant 中的 *** 匹配单级或多级,通过 ? 匹配单个字符。

<class> 可以配置很多个:

<class classes="none" methods="none" fields="none"><patternset><include name="org.example."/><include name="org.example.c.util.FileUtil"/></patternset>
</class>
<class classes="private" methods="private" fields="private"><patternset><include name="org.example.c."/></patternset>
</class>

上面相当于两部分规则,第一部分是完全混淆的代码,第二部分是完全保留的代码,当配置多块时,<patternset> 部分配置的类不能重叠。上面部分配置中存在重叠的部分,首先 org.example. 包含了 org.example.c.org.example.c.util.FileUtil,上面配置想法是把 org.example. 下面的代码都混淆,把 org.example.c 下面的 FileUtil 混淆。但是不混淆 org.example.c.,真正执行的结果是 org.example.c. 都没有被混淆(如下图),但是a和b被混淆了。
在这里插入图片描述
如果把上面两部分 <class>顺序调整一下,结果还是一样,虽然看了yGuard源码,但是没找到明确的规则,目前猜测是混淆低的优先级更高。如果把上面两个 <class><patternset> 调换,所有代码都不会被混淆。

因此当你有多组配置时,指定的范围要尽可能的小,而且所有配置要互斥,不能互相包含,想要实现想要的效果,需要按下面的方式进行配置:

<class classes="none" methods="none" fields="none"><patternset><include name="org.example."/><include name="org.example.c.util.FileUtil"/></patternset>
</class>
<class classes="private" methods="private" fields="private"><patternset><include name="org.example.c."/><exclude name="org.example.c.util.FileUtil"/></patternset>
</class>

在这里插入图片描述
这里在优先级更高的规则中通过 <exclude name="org.example.c.util.FileUtil"/> 进行了排除,如果你的混淆配置更复杂,优先级无法确定时,上面的配置粒度仍然不够小,应该把 <include name="org.example."/> 变得更具体,如下:

<class classes="none" methods="none" fields="none"><patternset><include name="org.example.a."/><include name="org.example.b."/><include name="org.example.c.util.FileUtil"/></patternset>
</class>
<class classes="private" methods="private" fields="private"><patternset><include name="org.example.c."/><exclude name="org.example.c.util.FileUtil"/></patternset>
</class>

当你遇到更难解决的情况时,有可能是指定所有具体类的规则。

了解的 yGuard 这部分配置后,接下来就可以进行多模块配置了,多模块配置中也会提供一个示例项目,方便跟着操作研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.物联网射频识别,RFID开发【智能门禁项目】

补充&#xff1a;学习路径 一。项目介绍及需求分析 1.酒店智能门禁使用场景介绍 1.客人入住 客人在前台办理入住手续&#xff0c;前台管理员通过门禁管理系统为客户开一张门禁卡 客户持卡到相应客房&#xff0c;用IC 卡刷卡开门 客人过了入住时间后&#xff0c;卡自动失效&a…

Linux自用笔记

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Linux相关 ✨特色专栏&#xff1a; My…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

HDMI简介

VGA接口 VGA传输红绿蓝模拟信号和同步信号。因传输的模拟信号&#xff0c;易受干扰&#xff0c;因此&#xff0c;在高分辨率下字体容易虚&#xff0c;信号线长的话&#xff0c;图像有拖尾现象。目前一些显示器已经不带VGA接口&#xff0c;取而代之的是HDMI和DP接口。 如下图所示…

Python元组解密:不可变的数据之美

更多资料获取 &#x1f913; 作者主页&#xff1a;涛哥聊Python &#x1f4da; 个人网站&#xff1a;涛哥聊Python 元组是Python中一种有用的数据类型&#xff0c;用于存储不可变的有序集合。 本文将带您深入了解Python元组&#xff0c;包括定义、特点、创建、基本操作、不可…

第86步 时间序列建模实战:Transformer回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍Transformer回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Sy…

机器学习必修课 - 交叉验证 Cross-Validation

想象一下你有一个包含5000行数据的数据集。通常情况下&#xff0c;你会将约20%的数据保留作为验证数据集&#xff0c;即1000行。但这会在确定模型得分时引入一些随机性。也就是说&#xff0c;一个模型可能在一组1000行数据上表现良好&#xff0c;即使在另一组1000行数据上表现不…

cv2.split函数与cv2.merge函数

split函数用于图像BGR通道的分离 merge函数用于可将分开的图像通道合并到一起 1.split函数的使用 这是原图&#xff0c;我们使用split函数对其三个通道进行分离。 注意&#xff1a;split函数分离通道的顺序是B、G、R。 以下方法是将三个通道的值都设置为与某一个通道相同。…

【Mysql】 blob 转text

有个数据表字段存储的字段类型是blob&#xff0c;想查看字段内容。 blob是二进制的无法直接查看怎么办&#xff1f; 写sql&#xff0c;blob 转text SELECT CONVERT(content USING utf8) FROM article_content ; 我想把原来content字段完全转成text 新建 text 类型字段conten…

k8s-8 ingress-nginx

nodeport 默认端口 nodeport默认端口是30000-32767&#xff0c;超出会报错 添加如下参数&#xff0c;端口范围可以自定义 externalname ingress-nginx 通过一个外部的vip 地址 访问到集群内的多个service 一种全局的、为了代理不同后端 Service 而设置的负载均衡服务&…

uniapp:swiper-demo效果

单元格轮播 <swiper class"swiper1" :circular"true" :autoplay"true" interval"3000" previous-margin"195rpx" next-margin"195rpx"><swiper-item v-for"(item,index) in 5" :key"inde…

虹科方案 | 车载以太网解决方案

全文导读&#xff1a;针对车载以太网&#xff0c;虹科为您提供转换器/交换机/捕捉模块/测试分析软件等相关专业工具、一体化培训以及“交钥匙”的解决方案&#xff0c;助力您的车载以太网数据传输、远程诊断、及时检测等项目。 文章目录 一、车载以太网的重要性&#xff1f;二、…

webstorm自定义文件模板(Vue + Scss)

最终效果如下&#xff1a; 具体配置如下&#xff1a; 新增文件代码如下&#xff1a; <!--* Description: ${COMPONENT_NAME} 页面* Author: mhf* Date: ${DATE} --> <template><div>${COMPONENT_NAME} </div> </template><script&g…

TensorFlow入门(十三、动态图Eager)

一个图(Graph)代表一个计算任务,且在模型运行时,需要把图放入会话(session)里被启动。一旦模型开始运行,图就无法修改了。TensorFlow把这种图一般称为静态图。 动态图是指在Python中代码被调用后,其操作立即被执行的计算。 它与静态图最大的区别是不需要使用session来建立会话…

Scala第二十章节

Scala第二十章节 scala总目录 文档资料下载 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事…

[MongoDB]-权限验证管理

[MongoDB]-权限验证管理 senge | 2023年9月 背景说明&#xff1a;现有两套MongoDB副本集群给开发人员使用时未开启认证。 产生影响&#xff1a;用户若输入账号以及密码则会进行校验&#xff0c;但用户可以在不输入用户名和密码的情况下也可直接登录。 倘若黑客借此进行攻击勒索…

ubuntu增加内存

文章目录 1、硬盘操作步骤第二步:点击【扩展】(必须关闭ubuntu电源才能修改)第三步:修改【最大磁盘容量大小】1、硬盘操作步骤 最近发现Ubuntu空间不足,怎么去扩容呢? 第一步:点击【硬盘】 第二步:点击【扩展】(必须关闭ubuntu电源才能修改) 第三步:修改【最大磁…

Git 学习笔记 | Git 项目创建及克隆

Git 学习笔记 | Git 项目创建及克隆 Git 学习笔记 | Git 项目创建及克隆创建工作目录与常用指令本地仓库搭建克隆远程仓库 Git 学习笔记 | Git 项目创建及克隆 创建工作目录与常用指令 工作目录&#xff08;WorkSpace)一般就是你希望Git帮助你管理的文件夹&#xff0c;可以是…

vue3中动态设置ref,如表格中使用级联选择器

需求&#xff1a;vue3中有一个表格&#xff0c;表格里是表单项&#xff0c;用户可以输入或选择&#xff0c;有一项是一个级联选择器&#xff0c;需要使用到ref&#xff0c;然后通过getCheckedNodes()方法获取到这一项选择的数据。 数据源是一个级联选择器&#xff0c;如果这个表…

Linux防火墙之firewalld

iptables与firewalld的联系 netfilter 位于Linux内核中的包过滤功能体系 称为Linux防火墙的“内核态” Firewalld/iptables CentOS7默认的管理防火墙规则的工具&#xff08;Firewalld&#xff09; 称为Linux防火墙的“用户态” iptables与firewalld的区别 iptables主要是基…