這個文章說明如何使用 Lucent Sky AVM 掃描一個 Java 應用程式。
若是在 Android 執行的 Java 應用程式,請參考 Lucent Sky 知識庫:
掃描一個 Android 應用程式
在這個文章中,你將會學習如何:
- 掃描一個 Java 應用程式。
本文結束後,你將能夠掃描一個 Java 應用程式。
Ant 專案
Ant 專案具有一個組建檔案(build.xml)。
瀏覽至專案的根目錄,並建立一個根目錄包含其組建檔案的壓縮檔案。
若未在 [分析目標] 指定組建檔案,Lucent Sky AVM 會試著在程式碼中找一個組建檔案。若有找到組建檔案,該組建檔案會被用於組建過程。否則,一個預設的組建檔案會被使用。要在組建過程中未修改的使用特定的組建檔案,在 [分析目標] 指定組建檔案的修對路徑。若 Lucent Sky AVM 無法識別該應用程式為 Ant 專案,將 JavaBuild,Ant 加入掃描參數中。
Lucent Sky AVM 使用相對於基礎目錄的 WEB-INF\classes 或 src 作為 Java source path。若要使用其他的 Java source path,將其相對於基礎目錄的路徑設定為 JavaSourcePath 掃描參數的值。例如,若基礎目錄是 ContosoWeb 而 Java source path 是 ContosoWeb\source,將 JavaSourcePath,source 加入掃描參數中。
Lucent Sky AVM 會在 Ant 輸出中尋找是 EAR、JAR、WAR 檔案的組建成品進行二進位分析,其中位於 build\jar 和 build 目錄下的檔案較不位於這些目錄下的檔案優先。要使用特定的組建成品進行二進位分析,將 JavaBuild 掃描參數設為 ant,再使用 BuildOutputPath 掃描參數來指定組建成品相對於基礎目錄的路徑。例如,若基礎目錄是 ContosoWeb 而組建成品是 ContosoWeb\build\jar\Contoso.war,將 BuildOutputPath,build\jar\Contoso.war 加入掃描參數中。指定的組建成品必需有 .ear、.jar、.war 副檔名。
其他 Ant 專案考量
-
基礎目錄
BuildOutputPath、JavaSourcePath、WebAppPath 等掃描參數是相對於應用程式的基礎目錄(base directory)。Ant 專案的基礎目錄是分析目標的上層目錄。例如,若分析目標是 ContosoWeb\build.xml,基礎目錄是 ContosoWeb。
-
網頁應用程式
-
Lucent Sky AVM 分析應用程式的架構以找出 WEB-INF 目錄。如果無法正確找出 WEB-INF 目錄,使用 WebAppPath 掃描參數來指定 WEB-INF 上層目錄相對於基礎目錄的路徑。例如,若基礎目錄是 ContosoWeb 而 WEB-INF 目錄位於 ContosoWeb\webapp\WEB-INF,將 WebAppPath,webapp 加入掃描參數中。
-
若專案包含 JSP 檔案,在組建檔案中加入如使用 Jasper 的 JSP 編譯目標可以增加對 JSP 檔案的掃描覆蓋度。例如:
<project name="Webapp Precompilation" default="all" basedir="."> ... <!-- ${tomcat.home} is supplied by Lucent Sky AVM during Ant build. --> <import file="${tomcat.home}/bin/catalina-tasks.xml"/> <target name="jspc"> <jasper validateXml="false" uriroot="${webapp.path}" webXmlInclude="${webapp.path}/WEB-INF/generated_web.xml" outputDir="${webapp.path}/WEB-INF/src" verbose="9" smapSuppressed="false" smapDumped="true"/> </target> <target name="compile"> <javac destdir="${webapp.path}/WEB-INF/classes" debug="on" optimize="off" failonerror="true" srcdir="${webapp.path}/WEB-INF/src" excludes="**/*.smap" target="1.6" source="1.6"> <classpath> <pathelement location="${webapp.path}/WEB-INF/classes"/> <fileset dir="${webapp.path}/WEB-INF/lib"> <include name="*.jar"/> </fileset> <pathelement location="${tomcat.home}/lib"/> <fileset dir="${tomcat.home}/lib"> <include name="*.jar"/> </fileset> <fileset dir="${tomcat.home}/bin"> <include name="*.jar"/> </fileset> </classpath> <include name="**"/> <exclude name="tags/**"/> </javac> </target> ... </project>
若 Lucent Sky AVM 在二進位分析時遇到編譯後的 JSP 位元組碼,會在專案檔案上層目錄下的 build 目錄中或 web app path 下的 WEB-INF 目錄中尋找其原始檔案。
-
Gradle 專案
Gradle 專案具有一個以上的組建腳本(build.gradle 或 build.gradle.kts)。
瀏覽至專案的根目錄,並建立一個根目錄包含其最頂層組建腳本的壓縮檔案。
建立掃描時,在 [分析目標] 指定專案的組建腳本。若 Lucent Sky AVM 無法識別該應用程式為 Gradle 專案,將 JavaBuild,Gradle 加入掃描參數中。
Lucent Sky AVM 使用相對於基礎目錄的 src\main\java 或 src\main\groovy 作為 Java source path。若要使用其他的 Java source path,將其相對於基礎目錄的路徑設定為 JavaSourcePath 掃描參數的值。例如,若基礎目錄是 ContosoWeb 而 Java source path 是 ContosoWeb\source,將 JavaSourcePath,source 加入掃描參數中。
Lucent Sky AVM 會在 build\libs 目錄下尋找是 JAR 檔案的組建成品進行二進位分析。如果組建腳本產生的組建成品不是 JAR 檔案,或不在 build\libs 目錄下,將 JavaBuild 掃描參數設為 gradle,再使用 BuildOutputPath 掃描參數來指定組建成品相對於基礎目錄的路徑。例如,若基礎目錄是 ContosoWeb 而組建成品是 ContosoWeb\build\jar\Contoso.war,將 BuildOutputPath,build\libs\Contoso.war 加入掃描參數中。指定的組建成品必需有 .ear、.jar、.war 副檔名。
其他 Gradle 專案考量
-
基礎目錄
BuildOutputPath 和 JavaSourcePath 等掃描參數是相對於應用程式的基礎目錄(base directory)。Gradle 專案的基礎目錄是分析目標的上層目錄。例如,若分析目標是 ContosoWeb\build.gradle,基礎目錄是 ContosoWeb。
Maven 專案
Maven 專案具有一個以上的 POM(專案物件模型)檔案(pom.xml)。它也可能包含模組,而模組具有其自己的 POM 檔案。
瀏覽至專案的根目錄,並建立一個根目錄包含其最頂層 pom.xml 的壓縮檔案。
建立掃描時,在 [分析目標] 指定專案或模組的 pom.xml 在壓縮檔案中的相對路徑。所選擇的 pom.xml 的 packaging
屬性應為 ear
、jar
、或 war
。若 Lucent Sky AVM 無法識別該應用程式為 Maven 專案,將 JavaBuild,Maven 加入掃描參數中。
Lucent Sky AVM 使用相對於基礎目錄的 src\main\java 或 src\main\groovy 作為 Java source path。若要使用其他的 Java source path,將其相對於基礎目錄的路徑設定為 JavaSourcePath 掃描參數的值。例如,若基礎目錄是 ContosoWeb 而 Java source path 是 ContosoWeb\source,將 JavaSourcePath,source 加入掃描參數中。
Lucent Sky AVM 會在 Maven 輸出中尋找是 EAR、JAR、WAR 檔案的組建成品進行二進位分析。如果組建過程中產生了多個組建成品,它們都將被設為分析目標。要使用特定的組建成品進行二進位分析,將 JavaBuild 掃描參數設為 maven,再使用 BuildOutputPath 掃描參數來指定組建成品的路徑。對於沒有模組的 Maven 專案,該路徑應相對於基礎目錄。例如,若基礎目錄是 ContosoWeb 而組建成品是 ContosoWeb\target\jar\Contoso.war,將 BuildOutputPath,target\Contoso.war 加入掃描參數中。對於多模組 Maven 專案,該路徑應相對於各模組的基礎目錄。例如,如果模組的基礎目錄是 api 和 web,組建成品是 api\target\api.jar 和 web\target\web.jar,則將 BuildOutputPath,target\*.jar 加入掃描參數中。萬用字元(*)可被用於指定不同模組下的組建成品。指定的組建成品必需有 .ear、.jar、.war 副檔名。
其他 Maven 專案考量
-
基礎目錄
BuildOutputPath、JavaSourcePath、WebAppPath 等掃描參數是相對於應用程式的基礎目錄(base directory)。Maven 專案的基礎目錄是分析目標的上層目錄。例如,若分析目標是 ContosoWeb\pom.xml,基礎目錄是 ContosoWeb。多重模組的 Maven 專案的基礎目錄是模組目錄。例如,若 Maven 專案包含 api 和 web 模組,模組的基礎目錄分別是 api 和 web。
-
Maven profiles
有些專案使用 profiles 來控制組建流程。將 JavaBuild 掃描參數設為 maven,再使用 BuildProperties 掃描參數來提供這些 profiles。此參數的值應是 Maven
-P
參數的值。例如 !profile-1,!profile-2,!?profile-3。 -
網頁應用程式
-
Lucent Sky AVM 分析應用程式的架構以找出 WEB-INF 目錄。如果無法正確找出 WEB-INF 目錄,使用 WebAppPath 掃描參數來指定 WEB-INF 上層目錄相對於基礎目錄的路徑。例如,若基礎目錄是 ContosoWeb 而 WEB-INF 目錄位於 ContosoWeb\src\main\webapp\WEB-INF,將 WebAppPath,src\main\webapp 加入掃描參數中。
-
若專案包含 JSP 檔案,在 POM 檔案的 build 設定中加入如
jetty-jspc-maven-plugin
或jspc-maven-plugin
等 JSP 編譯外掛元件可以增加對 JSP 檔案的掃描覆蓋度。例如:<build> ... <plugins> ... <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jspc-maven-plugin</artifactId> <version>${jetty-version}</version> <executions> <execution> <id>jspc</id> <goals> <goal>jspc</goal> </goals> <configuration> <jspc> <smapSuppressed>false</smapSuppressed> <smapDumped>true</smapDumped> </jspc> <keepSources>true</keepSources> <useProvidedScope>true</useProvidedScope> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-version}</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> ... </plugins> ... </build>
若 Lucent Sky AVM 在二進位分析時遇到編譯後的 JSP 位元組碼,會在專案檔案上層目錄下的 target/classes 目錄中尋找其原始檔案。
-
Sbt 專案
Sbt 專案具有一個以上的組建定義檔案(build.sbt)或中繼組建目錄(project)。
瀏覽至專案的根目錄,並建立一個根目錄包含其最頂層組建定義檔案或中繼組建目錄的壓縮檔案。
建立掃描時,在 [分析目標] 指定專案的組建定義檔案或中繼組建目錄。若 Lucent Sky AVM 無法識別該應用程式為 sbt 專案,將 JavaBuild,Sbt 加入掃描參數中。
Lucent Sky AVM 使用相對於基礎目錄的 src\main\scala 或 src\main\java 作為 Java source path。若要使用其他的 Java source path,將其相對於基礎目錄的路徑設定為 JavaSourcePath 掃描參數的值。例如,若基礎目錄是 ContosoWeb 而 Java source path 是 ContosoWeb\source,將 JavaSourcePath,source 加入掃描參數中。
Lucent Sky AVM 會在 target\scala-2.13(2.13 是 sbt 組建所使用的 Scala 版本) 目錄下尋找是 JAR 檔案的組建成品進行二進位分析。如果組建腳本產生的組建成品不是 JAR 檔案,或不在 target\scala-* 目錄下,將 JavaBuild 掃描參數設為 sbt,再使用 BuildOutputPath 掃描參數來指定組建成品相對於基礎目錄的路徑,例如,若基礎目錄是 ContosoWeb 而組建成品是 target\Contoso.war,將 BuildOutputPath,target\Contoso.war 加入掃描參數中。指定的組建成品必需有 .ear、.jar、.war 副檔名。
其他 sbt 專案考量
-
基礎目錄
BuildOutputPath 和 JavaSourcePath 等掃描參數是相對於應用程式的基礎目錄(base directory)。Sbt 專案的基礎目錄是分析目標的上層目錄。例如,若分析目標是 ContosoWeb\build.sbt,基礎目錄是 ContosoWeb。
其他專案類型
-
Eclipse 歷史專案
Eclipse 歷史專案應在其根目錄包含 java 或 src 程式碼資料夾。若其為網頁應用程式,亦應包含一個內有 web.xml 的 WEB-INF 目錄。
瀏覽至專案的根目錄,並建立一個根目錄包含 java 或 src 資料夾的壓縮檔案。
-
網頁應用程式
若此專案可在 Eclipse 中開啟,依照以下步驟來匯出包含 .class 和 .java 檔案的 .war 檔案:
- 在 Project Explorer 視窗中,右點擊此專案並選取 [Export]。
- 選取 Export source files,並選擇專案的名稱以及匯入檔案的儲存位置。
若此專案是 Maven 專案,依照以下步驟來產生包含 .class 和 .java 檔案的 .war 檔案:
- 在命令提示字元中,瀏覽至包含專案頂層 pom.xml 檔案的目錄。
-
使用文字編輯器開啟頂層 pom.xml 檔案。找到
<build>
` 元素,並確認其包含以下的內容:<build> <resources> <resource> <directory>${basedir}/src/main/java</directory> </resource> </resources> </build>
-
輸入以下命令:
mvn clean package
若是使用其他組建系統的專案,依照其組建系統的指示匯出一個 WAR 檔案。
匯出的 WAR 檔案的根目錄應包含一個 WEB-INF 目錄。WEB-INF 目錄中應包含一個含有程式碼檔案(.java)以及類別檔案(.class)的 classes 目錄,以及 web.xml。
其他考量
-
相依性
若專案使用 Maven 來管理其相依性,確保系統可以存取此專案使用的來源。
-
直接二進位分析
Lucent Sky AVM 可以直接掃描 Java 應用程式的二進位檔案,不論是否包含對應的程式碼。使用直接二進位分析可增快掃描時間,並可以完整掃描因缺少程式碼或 SDK 等原因而無法組建的應用程式。要對 Java 應用程式進行直接二進位分析,建立掃描時,在 [分析目標] 指定其主要的二進位檔案在壓縮檔案中的相對路徑。
要深入了解如何使用直接二進位分析掃描應用程式,請參考 Lucent Sky 知識庫:
使用直接二進位分析掃描應用程式 -
效能
若應用程式包含大量 JSON 或 XML 格式,或有大量的備份檔案,建議在掃描前將這些檔案移除或將 ExcludeFileTypes 掃描參數設定為 Backup、Config、Backup,Config 來將這些檔案排除在分析外以提升分析效能。
若應用程式包含大量媒體檔案,建議在掃描前將這些檔案移除以減少所需要的磁碟空間。