使用 Proguard 混淆 WAR 文件

Posted

技术标签:

【中文标题】使用 Proguard 混淆 WAR 文件【英文标题】:Obfuscating WAR file with Proguard 【发布时间】:2015-04-25 18:45:49 【问题描述】:

我想混淆我构建为 WAR 存档的 Web 应用程序,因为这个敏感的应用程序首次部署在我们的数据中心之外。我尝试使用 Proguard GUI 工具来混淆输入战争,使用 UI 应用程序所需的所有服务 jar 以及其他外部依赖项。尽管 Proguard 成功运行并出现了一些警告,例如库类 [javax.servlet.UnavailableException] 的重复定义,但输出战争不包含任何类,但包含带有库 jar 和 web.xml 文件的 lib。有什么步骤我搞砸了吗?有什么正确的文件吗?如果有人能提供正确的文档或步骤来成功混淆 WAR 文件与依赖项目(.jar 文件)和其他外部 jar 文件(不需要混淆),我将不胜感激。

【问题讨论】:

我想知道您是如何解决这个问题的? 【参考方案1】:

您不会混淆战争,而是混淆您使用的罐子。您可以在这里做的是设置您的项目,以便构成战争的项目 - 配置 xml、WEB-INF 内容、资源以及 Web 内容和 servlet 定义,并将您的 java 放入库项目中。混淆库项目并在您的 Web 项目中使用那些经过混淆处理的 jar。

我就是这么做的,希望对你有帮助。

【讨论】:

【参考方案2】:

Protector4j 是混淆战争文件的最佳解决方案,由于图形用户界面太容易使用,而且他们的 eclipse 插件也可用。 您将从此链接下载它 https://doc.protector4j.com/protect-tomcat-web-app

【讨论】:

【参考方案3】:

我也是这样做的。我使用下面的 url 进行代码混淆,我成功了。

http://bratonfire.blogspot.com/2012/01/war-file-obfuscation-using-proguard.html

我创建了一个新文件夹并将类的输出重定向到该文件夹​​。但奇怪的是,我能够在这两个位置看到 .java 和 .class 文件。我也担心重新创建一个战争文件。谁能提一下清晰详细的步骤。

谢谢, 拉胡尔

【讨论】:

【参考方案4】:

我们也有同样的问题,需要混淆所有打包在war文件中的类。这是我遵循的方法。 首先我们需要设置插件的顺序**(compiler, proguard, war)**在 pom.xml 文件中声明如下。

                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>

                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>com.github.wvengen</groupId>
                    <artifactId>proguard-maven-plugin</artifactId>
                    <version>2.0.14</version>
                    <configuration>

                    </configuration>
                    <executions>
                        <execution>
        <!-- Dont worry about compiler error. For first time, change this value to package so that plugin installs successfully. -->
                            <phase>process-classes</phase>
                            <goals>
                                <goal>proguard</goal>
                            </goals>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>net.sf.proguard</groupId>
                            <artifactId>proguard-base</artifactId>
                            <version>1.0</version>
                        </dependency>
                    </dependencies>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>

                    <configuration>
                        <warName>mfs-transaction-management</warName>
                        <warSourceDirectory>WebContent</warSourceDirectory>
                        <failOnMissingWebXml>false</failOnMissingWebXml>
        <!-- Exclude your default packages from war packaging. Do not include "**" in double quotes in actual code   -->
                        <packagingExcludes>
                            WEB-INF/classes/com/package/mypackage1/"**",
                            WEB-INF/classes/com/package/mypackage2/"**",
                        </packagingExcludes>

                        <webResources>
                            <webResource>
                                <directory>$project.build.directory/proguardClasses</directory>
                                <targetPath>WEB-INF/classes</targetPath>
                            </webResource>
                        </webResources>         
                    </configuration>
                </plugin>

            </plugins>`

然后在你的项目根目录下创建一个文件 proguard.conf,与放置 pom.xml 的级别相同。 在文件中添加您自己的有关 proguard 的配置,并在此文件中添加以下两行以将输入和输出文件夹告诉 proguard 插件。 您需要在这些行中根据您的项目结构设置路径

            -injars 'C:\Users\Rajdeep\git\dfs-core\mfs-transaction-management\target\classes'
            -outjars 'C:\Users\Rajdeep\git\dfs-core\mfs-transaction-management\target\proguardClasses'

除此之外,您还需要使用 mvn install 命令在 maven 存储库中手动安装 proguard-base。 提供您自己的 groupid、artifact 和 version,并对 pom.xml 进行相同的更改。 手动下载 proguard 时在 proguard6.0.3\lib 文件夹下找到 proguard.jar。 我认为一切都会好起来的,现在当你运行 mvn clean package 时,你的 war 文件应该包含混淆的类文件。

【讨论】:

【参考方案5】:

使用 Proguard GUI 混淆战争文件。 从 proguard 目录的 bin 文件夹中运行 proguardgu.bat 或 proguardgui.sh 文件后。您可以通过单击输入/输出菜单来选择战争。

【讨论】:

以上是关于使用 Proguard 混淆 WAR 文件的主要内容,如果未能解决你的问题,请参考以下文章

proguard生成的pro怎么载入

Proguard 仅在我的战争中混淆 /WEB-INF/classes/**/*.class 文件

使用 Cordova Android 4 的 Proguard?

使用 ProGuard 进行文件混淆

Android 安装包优化开启 ProGuard 混淆 ( 压缩 Shrink | 优化 Optimize | 混淆 Obfuscate | 预检 | 混淆文件编写 | 混淆前后对比 )

如何在 Eclipse 中使用 Proguard 混淆 Android 库(.jar 文件)