使用直接二進位分析掃描應用程式

2024/2/29 |

Lucent Sky AVM 可以直接掃描 .NET 和 Java 應用程式的二進位檔案,不論是否包含對應的程式碼。使用直接二進位分析可增快掃描時間,並可以完整掃描因缺少程式碼或 SDK 等原因而無法組建的應用程式。

這個文章描述了使用直接二進位分析掃描 .NET 和 Java 應用程式。

在這個文章中,你將會學習如何:

  • 在開發環境組建並包裝應用程式
  • 使用直接二進位分析掃描應用程式

本文結束後,你將能夠使用直接二進位分析組建、包裝、掃描掃描應用程式。

.NET

在開發環境組建並包裝應用程式

  1. 在開發環境中,使用 MSBuild 或 Visual Studio 組建應用程式。

    • 雖然二進位分析不依賴偵錯符號,它們能讓分析引擎產生更有意義的分析結果。

      • 要在使用 MSBuild 時產生偵錯符號,在組建內容中加入 DebugSymbols=trueDebugType=pdbonly
      • 要在使用 Visual Studio 2019 或更早的版本時產生偵錯符號,將 Project Properties > Build > Advanced > Debugging information 設定為 Pdb-only
      • 要在使用 Visual Studio 2022 時產生偵錯符號,若應用程式為 .NET 或 .NET Core 專案,將 Project Properties > Build > Advanced > Debugging symbols 設定為 PDB, currentdb-only;若為其他類型專案(例如 .NET Framework 專案),將 Project Properties > Build > Advanced > Debugging information 設定為 Pdb-only
    • 若應用程式使用 ASP.NET web application 或 web site 範本, 考慮發佈應用程式而非組建它來增加二進位分析的覆蓋率。

      • 要使用 Visual Studio 2019 或更新的版本發佈應用程式,在解決方案管理員中右點選應用程式,選擇 Publish,再選擇發佈到一個資料夾。在發佈設定中,點選 Show all settings,展開 File Publish Options,選擇 Precompile during publishing,再點選 Configure。在 Advanced Precompile Settings 對話框中,取消選擇 Allow precompiled site to be updatable 並選擇 Emit debug information,再選擇 Save。最後,選擇 Publish 來將應用程式發佈到一個資料夾。
      • 要使用 Visual Studio 2017 或更早的版本發佈應用程式,在解決方案管理員中右點選應用程式,選擇 Publish。在發佈設定中,選則 Settings 頁籤,展開 File Publish Options,選擇 Precompile during publishing,再點選 Configure。在 Advanced Precompile Settings 對話框中,取消選擇 Allow precompiled site to be updatable 並選擇 Emit debug information,再選擇 Save。最後,選擇 Publish 來將應用程式發佈到一個資料夾。
      • 要使用 ASP.NET Compilation Tool 發佈應用程式,開啟 Developer PowerShell for Visual Studio,再輸入 aspnet_compiler.exe -p "C:\source\website" -v / -f "C:\published",其中 C:\source\website 是應用程式的根目錄,而 C:\published 是儲存發佈後應用程式的任意位置。

      要深入了解如何發佈一個 ASP.NET web app,請參考 Microsoft Learn 網站:
      快速入門:發佈 ASP.NET Web 應用程式

  2. 組建完成後,記下主要組建成品(一個 .dll 或 .exe 檔案)和專案根目錄的相對路徑。

    • 如果組建成品位於專案根目錄之外,將成品複製至專案根目錄下的一個目錄中。
    • 若是網站專案,任何 App_*.dll 檔案(例如 App_Code.dll)皆可做為主要組建成品。
  3. 在專案的根目錄建立一個 .zip 壓縮檔案,不要包含根目錄。壓縮檔案應包含專案檔案(一個 .*proj 檔案),用來組建專案的程式碼,以及所有的組建成品。

使用直接二進位分析掃描應用程式

  1. 使用 Web UI 或 CLI 建立一個掃描。
  2. 將主要組建成品在壓縮檔案中的相對路徑指定於分析目標欄位。例如,若主要組建成品是 bin\Contoso.Web.dll,將分析目標設定為 bin\Contoso.Web.dll
  3. 多個 DLL 和 EXE 檔案可被指定為分析目標,將它們的相對路徑以逗號分開並指定於分析目標。例如,Api\bin\Debug\Api.dll,Web\bin\Web.dll

Java

在開發環境組建並包裝應用程式

  1. 在開發環境中,使用 Ant、Gradle、Maven、sbt 等組建工具來組建應用程式。

    • 雖然二進位分析不依賴偵錯符號,它們能讓分析引擎產生更有意義的分析結果。

      • 要在使用 Ant 時產生偵錯符號,將 build.xml 中 <javac> 標籤的 debug 屬性設為 true 以及 debuglevel 屬性設為 source,lines,vars
      • 要在使用 Maven 時產生偵錯符號,將 pom.xml 中的 <debug> 標籤設為 true 以及 <debuglevel> 標籤設為 source,lines,vars,或不要在 pom.xml 中包含這兩個標籤。
      • 要在使用其他組建工具時產生偵錯符號,確認 javac-g 引數未被設定,或是設為 source,lines,vars
    • 若應用程式為網頁應用程式且可在 Eclipse 中開啟,依照以下步驟來匯出包含 .class.java 檔案的 .war 檔案:

      1. Project Explorer 視窗中,右點擊此專案並選取 [Export]。
      2. 選取 Export source files,並選擇專案的名稱以及匯入檔案的儲存位置。
    • 若應用程式為使用 Maven 的網頁應用程式,依照以下步驟來產生包含 .class 和 .java 檔案的 .war 檔案:

      1. 在命令提示字元中,瀏覽至包含專案頂層 build.xml 檔案的目錄。
      2. 使用文字編輯器開啟頂層 build.xml 檔案。確認其包含一個與以下類似,具有 war 工作的 <target> 元素:

         <target name="war">
             <war destfile="${dist.path}/webapp.war" webxml="${webapp.path}/WEB-INF/generated_web.xml">
                 <fileset dir="${webapp.path}">
                     <exclude name="*.jsp"/>
                     <exclude name="WEB-INF/generated_web.xml"/>
                     <exclude name="WEB-INF/web.xml"/>
                 </fileset>
             </war>
         </target>
        
      3. 若專案包含 JSP 檔案,在組建過程中加入 JSP 編譯可以增加對 JSP 檔案的覆蓋度。若 Lucent Sky AVM 在二進位分析時遇到編譯後的 JSP 位元組碼,會在分析目標上層目錄下的 classesbuild 目錄中或 web app path 下的 WEB-INF 目錄中尋找其原始檔案。要深入了解如何在 Ant 專案中包含 JSP 編譯,請參考 Lucent Sky 知識庫:
        掃描一個 Java 應用程式

      4. 輸入以下命令來將專案匯出為一個 .war 檔案:

         ant <WarTaskName>
        
      5. 使用匯出的 .war 檔案作為建立掃描時的程式碼壓縮檔案。
    • 若應用程式為使用 Maven 的網頁應用程式,依照以下步驟來產生包含 .class.java 檔案的 .war 檔案:

      1. 在命令提示字元中,瀏覽至包含專案頂層 pom.xml 檔案的目錄。
      2. 使用文字編輯器開啟頂層 pom.xml 檔案。
      3. 找到 <packaging> 元素,並確認其值設定為 war
      4. 找到 <build> 元素,並確認其包含一個與以下類似的 <resources/resource> 元素:

         <build>
             <resources>
                 <resource>
                     <directory>${basedir}/src/main/java</directory>
                 </resource>
             </resources>
         </build>
        
      5. 若專案包含 JSP 檔案,在組建過程中加入 JSP 編譯可以增加對 JSP 檔案的覆蓋度。若 Lucent Sky AVM 在二進位分析時遇到編譯後的 JSP 位元組碼,會在分析目標上層目錄下的 classesbuild 目錄中或 web app path 下的 WEB-INF 目錄中尋找其原始檔案。要深入了解如何在 Maven 專案中包含 JSP 編譯,請參考 Lucent Sky 知識庫:
        掃描一個 Java 應用程式

      6. 輸入以下命令來將專案匯出為一個 .war 檔案:

         mvn clean package
        
      7. 使用匯出的 .war 檔案作為建立掃描時的程式碼壓縮檔案。
  2. 組建完成後,記下主要組建成品(例如一個 .jar 檔案,一個 .war 檔案,或是一個包含一個以上 .class 檔案的 classes 目錄)和專案根目錄。

    • 如果組建成品位於專案根目錄之外,將成品複製至專案根目錄下的一個目錄(例如 build)中。
  3. 在專案的根目錄建立一個 .zip 壓縮檔案,不要包含根目錄。壓縮檔案應包含專案檔案(例如 build.xmlpom.xml),用來組建專案的程式碼,以及所有的組建成品。若使用 .war 檔案作為程式碼壓縮檔案,則跳過此步驟。

使用直接二進位分析掃描應用程式

  1. 使用 Web UI 或 CLI 建立一個掃描。
  2. 將主要組建成品在壓縮檔案中的相對路徑指定於分析目標欄位。例如,若主要組建成品是 target\contoso-web-1.0.0.jar,將分析目標設定為 target\contoso-web-1.0.0.jar;若主要組建成品是 WEB-INF\classes 目錄,將分析目標設定為 WEB-INF\classes。若分析目標是一個目錄,其下至少需有一個 .class 檔案。
  3. 多個 JAR 檔案可被指定為分析目標,將它們的相對路徑以逗號分開並指定於分析目標。例如,api\target\api-1.0.jar,web\target\web-1.0.jar
  4. (建議) 將 Java source path 相對於基礎目錄(base directory,當進行直接二進位分析時,分析目標的上層目錄)的路徑設定於 JavaSourcePath 掃描參數。例如,若分析目標為 main\target\contoso-web-1.0.0.jar 且 Java source path 為 main\src\java,則將 JavaSourcePath,..\src\java 包含在掃描參數中。
  5. (建議,若為網頁應用程式) 將 WEB-INF 上層目錄相對於基礎目錄的路徑設定於 WebAppPath 掃描參數。例如,若分析目標為 main\target\contoso-web-1.0.0.jarWEB-INF 目錄為 main\webapp\WEB-INF,則將 WebAppPath,..\src\java 包含在掃描參數中。