如何使用 yguard 混淆 Spring Boot Web

问题描述 投票:0回答:1

我使用的是带有maven和yguard(4.1.0)的spring boot 2.x,并且该项目被打包为war。 这个项目只有两个类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CustomerApplication {

    public static void main(String[] args) {

        SpringApplication.run(CustomerApplication.class, args);
    }
}

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

        return application.sources(CustomerApplication.class);
    }
}

yguard 的配置如下:

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <id>obfuscate</id>
            <configuration>
                <target>
                    <property name="runtime_classpath" refid="maven.runtime.classpath"/>
                    <taskdef name="yguard" classname="com.yworks.yguard.YGuardTask" classpath="${runtime_classpath}"/>
                    <yguard>
                        <inoutpair in="${project.build.directory}/test.war" out="${project.basedir}/wars/test.war" />
                        <rename mainclass="com.my.CustomerApplication"
                                            logfile="${project.build.directory}/yguard.log.xml">
                            <keep>
                                <class name="com.my.ServletInitializer" classes="protected" methods="protected" fields="protected"/>
                            </keep>
                        </rename>
                    </yguard>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

混淆后,我将war部署到tomcat上并启动,但是tomcat终端上没有打印spring boot的标志,并且有类似

org.apache.catalina.core.ApplicationContext.log 1 Spring WebApplicationInitializers detected on classpath
的信息,而没有混淆的话应该是
2 Spring WebApplicationInitializers detected on classpath

看来这次Spring Boot之战不被认作Spring Boot,为什么呢?

yguard日志如下:

<yguard version="1.5">
<expose>
  <class name="com.my.CustomerApplication"/>
  <method class="com.my.CustomerApplication" name="void main(java.lang.String[])"/>
  <class name="com.my.ServletInitializer"/>
  <method class="com.my.ServletInitializer" name="org.springframework.boot.builder.SpringApplicationBuilder configure(org.springframework.boot.builder.SpringApplicationBuilder)"/>
</expose>
<map>
</map>
</yguard>
java spring-boot obfuscation yguard
1个回答
0
投票

yGuard 不支持 WAR 档案。您可能会丢失存档中包含的任何元数据。为了能够使用 yGuard 混淆的类创建 WAR 存档,您需要

  1. 将您的应用程序类打包为常规 JAR 存档,
  2. 将上述 JAR 存档传递给 yGuard,
  3. 从 yGuard 创建的 JAR 存档中提取混淆的类,并且
  4. 将混淆的类打包为 WAR 存档。

processing示例演示了 Spring Boot JAR 的重新打包(即

BOOT_INF
中的应用程序类)。

此外,根据您的 yGuard 日志,yGuard 没有重命名任何内容。这支持了您正在丢失元数据的假设。

最后,您可能应该将(Spring)编译时依赖项传递给 yGuard 作为

externalclasses

© www.soinside.com 2019 - 2024. All rights reserved.