首页 > 其他分享 >混淆技术研究笔记(三)多模块混淆

混淆技术研究笔记(三)多模块混淆

时间:2023-10-03 16:32:41浏览次数:39  
标签:混淆 jar module 构建 笔记 模块 yguard

logo

示例项目: https://github.com/abel533/yguard-modules-parent

假设有如下多模块项目:

module-parent
├─module-a
├─module-b
└─module-c

混淆技术研究笔记(一)常见工具介绍 中提到,默认只能使用单模块混淆,每个模块构建时的上下文只有自己,无法对其他模块进行处理,虽然 <<inoutpair/> 能配置多个,比如 a 依赖 b,b 依赖 c 的情况,如果配置到 a 中,在 a 中对a,b,c进行混淆,确实能实现对 jar 包内容的混淆,但是当执行 mvn clean deploy 命令时,这种混淆只对 a 自己有效。

主要的原因和 Maven 的生命周期有关,在 module-parent 这一级执行 mvn clean deploy 发布时,Maven会根据模块依赖顺序计算构建的顺序,第一个构建的模块会走完全部的生命周期后,再对第二个模块进行相同的处理,依次执行完全部的模块。

在 a 中配置多个时,当 a 模块执行时,其他模块构建完就已经发布了,对发布后的 b,c 再进行混淆已经没有意义。

该如何实现呢?

Maven在package打包时有个特性,如果源码没有变化就不会再次进行编译,已经构建的 jar 不会被覆盖,Maven只检测源码的变化,不会检测 jar 包的变化,从这点入手就能实现多模块混淆。 在这里插入图片描述 上面这种方式执行时,需要避免混淆插件执行两次,因此最好的办法就是在多模块基础上增加一个新的模块,例如 module-yguard,变成如下结构:

module-parent
├─module-a
├─module-b
├─module-c
└─module-yguard

module-yguard中添加a,b,c的依赖,保证最后执行,在module-yguard中配置yGuard插件,在配置中对a,b,c进行混淆,并且在执行发布命令时通过 -pl !module-yguard 排除混淆模块的构建,避免多次混淆。 在这里插入图片描述 在构建时分成两步不会增加更多的时间,也没有变的更复杂,通过这种方式就实现了多模块混淆。

下面是本文示例的配置:

<tasks>
    <property name="runtime_classpath" refid="maven.runtime.classpath"/>

    <taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="${runtime_classpath}"/>
    <yguard>
        <inoutpair in="..\module-b\target\module-b-${project.version}.jar"
                   out="..\module-b\target\module-b-${project.version}.jar"/>
        <inoutpair in="..\module-c\target\module-c-${project.version}.jar"
                   out="..\module-c\target\module-c-${project.version}.jar"/>
        <inoutpair in="..\module-a\target\module-a-${project.version}.jar"
                   out="..\module-a\target\module-a-${project.version}.jar"/>

        <attribute name="SourceFile, LineNumberTable, LocalVariableTable">
            <patternset>
                <include name="org.example.**"/>
            </patternset>
        </attribute>
        <rename logfile="${project.build.directory}/yguard.log.xml"
                replaceClassNameStrings="true">
            <keep>
                <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>
            </keep>
            <property name="naming-scheme" value="best"/>
            <property name="language-conformity" value="illegal"/>
            <property name="overload-enabled" value="true"/>
        </rename>

        <externalclasses>
            <pathelement path="${runtime_classpath}"/>
        </externalclasses>
    </yguard>
</tasks>

混淆后的代码效果: 在这里插入图片描述 使用的jadx反编译工具,一次可以同时查看多个jar。

在这个混淆示例中,相当于只暴露了 UserServiceUser 接口,如果是支持ioc注入的情况下,可以注入 UserService 接口进行使用,但是其他被混淆的就不方便被使用。

虽然这里很简单,但是我实际要处理的这个项目有4级多模块,总共能打包七十几个模块,而且要和旧版打包方式接近,因此耗时很久,最难的就是上一节介绍的,如果有多种混淆配置(<class>),多种配置之间的排除会很麻烦。

到这里就解决了一个难题,但是更难的还在后头,如何在混淆代码的基础上实现反篡改

标签:混淆,jar,module,构建,笔记,模块,yguard
From: https://blog.51cto.com/isea533/7693617

相关文章

  • naive set theory 笔记
    19:302023/9/28今天粗略看了第九到十二章的内容,没有完全看懂,只是粗略看了一遍。16:212023/9/29第十三到第十七章,同上。17:022023/9/30第十八到第二十二章,同上。16:362023/10/1第二十三到第二十五章,同上。第一章,终于知道axiomofextension是什么了,就是简单的元素相......
  • HTML学习笔记
    一、标签在html中每个标签都是成对存在例如:<html> <body>HelloCSDN!</body></html>二、属性写在<>里面的用来定义功能的作用例如:<h2style="background-clolor:red;text-align:center">Helloworld!</h2&......
  • GSM7816工作原理分析(新手笔记)
    7816协议初学者刚上手7816,感觉有些吃力,但经过几天的死磕,终于也是大概了解整体的框架,所以打算记录一下理解过程。首先要明白几个大的IC卡功能,无非就是接口设备(读卡器)与卡片的通信过程所需要的几个重要功能。上电复位:在卡片接触读卡器后会自动通电,同时需要对卡片进行一次冷复位,防......
  • 10月1日《需求分析与系统设计》阅读笔记一
    《需求分析与系统设计》阅读笔记一软件工程的本质问题体现在软件本身所有的困难中,我们只能承认这些困难。Brooks认为软件工程的本质问题是由软件固有的复杂性、一致性、可变性和不可见性所致的。一些重要的软件特征不易受人为因素的影响,因此在软件项目中都保持不变。软件本......
  • 什么是软件设计领域里,前后端模块的 interoperability?
    在软件设计领域,前后端模块的interoperability(互操作性)是指不同部分或组件之间能够有效地协同工作,以实现系统的整体功能。这种互操作性在全栈开发中尤为重要,因为现代应用程序通常由前端(Frontend)和后端(Backend)两个主要部分组成,它们必须能够无缝协作以提供用户所需的功能和体验。前......
  • 列表与字典学习笔记
    python中要想用对象做某种处理,需要这个对象的名字(变量名),然后是一个点,再后面是要对对象做的操作。如要向friends列表zhui追加一个元素,就要写成:friends.append(something)列表:列表可以包含python能存储的任何类型的数据(数字,字符串、对象,甚至其他列表)列表中的元素并不要求元素是......
  • vue 学习笔记
    https://www.bilibili.com/video/BV13m4y1Y7MD安装vuecli1安装 node.js要求node.js12+版本, https://nodejs.org/zh-cn 首页下载安装lts版本,如果已安装就覆盖安装vscode终端或cmd中输入npm--vesion  node--v可以查看是否安装成功npm(nodepackagemanager):no......
  • 用户故事与敏捷开发 读书笔记 02
    阅读用户故事与敏捷开发的后边几章,搜集故事这一章,我们经常有一种错觉:“需求本来已经存在了,我们只是让客户给我们解释需求,然后把他们锁入一个笼子里就可以了。”事实上,用户并不知道所有的需求。让我们像捕鱼一样去捕获需求:首先,不同大小的网捕获不同大小的需求。第一遍,用大网眼捞一......
  • openGauss学习笔记-87 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-M
    openGauss学习笔记-87openGauss数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用简单概述使用MOT非常简单,以下几个小节将会进行描述。openGauss允许应用程序使用MOT和基于标准磁盘的表。MOT适用于最活跃、高竞争和对吞吐量敏感的应用程序表,也可用于所有应用程序的表。......
  • SQLite学习笔记——创建数据库和SELECT,INSERT语句
    SQLite创建数据库我们可以直接使用sqlite3DatabaseName.db来创建数据库,这时候我们就会发现同一目录下出现了对应的.db文件或者我们可以先启动sqlite3然后在里面使用点命令.openDatabaseName.db来创建数据库,如果已经存在对应的数据库,那么我们默认就会打开该数据库。......