2022 年 12 月,我們正式發布了 SootUp,這是一個經過徹底改造、更模組化、可測試、可維護和可用架構的 Soot 版本。如果您想開始一個新的程式分析項目,請查看此內容。
由於存在一些混亂:SootUp 的功能尚未完成。因此,「舊的」Soot 暫時需要繼續存在,特別是對於需要儀器功能或強大的 Android 支援的專案。 「舊」Soot 仍在維護中,直到可以安全地放棄它以獲得功能完整的繼任者。
我們定期申請資金來幫助我們維護 Soot。您可以透過讓我們了解使用 Soot 的專案(無論是商業專案還是研究工具的形式)來為我們提供巨大幫助。
也非常感謝您透過免費使用的開源許可證支持 Soot!
....支持Soot的進一步發展!亞馬遜網路服務是金牌贊助商。
在這裡閱讀更多關於如何自己成為贊助商的資訊。
嘗試參與 Soot 的 Java 9 前沿開發。
ModuleScene
中的模組Soot 是一個 Java 優化框架。它提供了四種用於分析和轉換 Java 字節碼的中間表示形式:
有關詳細信息,請參閱 https://soot-oss.github.io/soot。
我們在 wiki 中有一些關於 Soot 的文檔,還有大量關於 Soot 的教學。
有關詳細信息,請請考慮 Soot 的 JavaDoc 和選項文件。
目前,為master
分支的每次提交建立了一個 Soot 版本。您可以使用以下座標透過 Maven、Gradle、SBT 等將 Soot 作為依賴項包含在內:
< dependencies >
< dependency >
< groupId >org.soot-oss</ groupId >
< artifactId >soot</ artifactId >
< version >4.3.0</ version >
</ dependency >
</ dependencies >
您還可以獲得master
分支的較舊版本。完整的建置清單可以在 Maven Central 上找到。
目前為develop
分支的每次提交構建了一個 Soot SNAPSHOT。您可以使用以下座標透過 Maven、Gradle、SBT 等將 Soot 作為依賴項包含在內:
< dependencies >
< dependency >
< groupId >org.soot-oss</ groupId >
< artifactId >soot</ artifactId >
< version >4.4.0-SNAPSHOT</ version >
</ dependency >
</ dependencies >
< repositories >
< repository >
< id >sonatype-snapshots</ id >
< url >https://oss.sonatype.org/content/repositories/snapshots</ url >
< releases >
< enabled >false</ enabled >
</ releases >
</ repository >
</ repositories >
您還可以獲得develop
分支的較舊版本。完整的建置清單可以在 Maven Central 上找到。
我們建議將 Soot 與 Maven 一起使用,您可以直接取得 Soot 的最新版本。您可以直接取得 Soot 的最新 SNAPSHOT 版本。
soot-<RELEASE>-jar-with-dependencies.jar
檔案是一個一體化文件,也包含所有必要的程式庫。
soot-<RELEASE>.jar
檔案僅包含 Soot,可讓您根據需要手動選擇相依性。如果您不想擔心依賴關係,我們建議使用前者。
如果您無法使用預先建置版本並且需要自行建置 Soot,請考慮 wiki 以取得進一步的步驟。
Soot 遵循 git-flow 約定。版本和修補程式在主分支中維護。開發發生在開發分支。要抓住 Soot 的前沿,請查看後者。
我們很高興以 GitHub Pull 請求的形式接受 Soot 的任意改進。在設定拉取請求之前,請閱讀我們的貢獻指南。
您正在使用 Soot 並願意在未來幫助我們支持它嗎?那麼請填寫這個小網絡表格來支持我們。
這樣您就可以透過兩種方式幫助我們:
如果您想使用 Java > 8 運行 Soot,那麼您就完成了。像往常一樣運行即可。如果您想使用 Java 8 執行 Soot 但分析 Java >8 項目,反之亦然,請參閱下文。
要從 java 載入 Soot 的ModuleScene
中的模組:
// configure Soot's options, refer to example configurations below
Options . v (). set_soot_modulepath ( modulePath );
// load classes from modules into Soot
// Here, getClassUnderModulePath() expects the module path to be set using the Options class as seen above
Map < String , List < String >> map = ModulePathSourceLocator . v (). getClassUnderModulePath ( modulePath );
for ( String module : map . keySet ()) {
for ( String klass : map . get ( module )) {
logger . info ( "Loaded Class: " + klass + " n " );
loadClass ( klass , false , module );
// the loadClass() method is defined below
}
}
//this must be called after all classes are loaded
Scene . v (). loadNecessaryClasses ();
public static SootClass loadClass ( String name , boolean main , String module ) {
SootClass c = ModuleScene . v (). loadClassAndSupport ( name , Optional . of ( module ));
c . setApplicationClass ();
if ( main )
Scene . v (). setMainClass ( c );
return c ;
}
ModuleUtil.module_mode() 幫助您檢查 Soot 中是否啟用了模組。這是根據是否使用 Options 類別設定模組路徑來完成的。
if ( java < 9 ) { // when you have a target benchmark with Java < 9 and hence no modules
Options . v (). set_prepend_classpath ( true );
Options . v (). set_process_dir ( Arrays . asList ( applicationClassPath (). split ( File . pathSeparator )));
Options . v (). set_soot_classpath ( sootClassPath ());
}
if ( java >= 9 && USE_CLASSPATH ) { // when you have a target benchmark with Java >= 9 and do not want module support
Options . v (). set_soot_classpath ( "VIRTUAL_FS_FOR_JDK" + File . pathSeparator + sootClassPath ());
Options . v (). set_process_dir ( Arrays . asList ( applicationClassPath (). split ( File . pathSeparator )));
}
if ( java >= 9 && USE_MODULEPATH ) { // when you have a target benchmark with Java >= 9 and want module support
Options . v (). set_prepend_classpath ( true );
Options . v (). set_soot_modulepath ( sootClassPath ());
Options . v (). set_process_dir ( Arrays . asList ( applicationClassPath (). split ( File . pathSeparator )));
}
在上面的範例中,applicationClassPath() 應替換為 Soot 分析的應用程式類別的路徑,sootClassPath() 應替換為 Soot 類別路徑。
要使用 Java 1.9 執行 Soot,但分析類別路徑運行,就像以前一樣: java -cp soot-trunk.jar soot.Main --process-dir directoryToAnalyse
如果要明確指定類別路徑,請執行: java -cp soot-trunk.jar soot.Main -cp VIRTUAL_FS_FOR_JDK --process-dir directoryToAnalyse
VIRTUAL_FS_FOR_JDK
值表示 Soot 也應該在 Java 的 (>9) 虛擬檔案系統jrt:/
中搜尋類,儘管 Soot 不是在模組模式下執行的。
若要使用 java 1.8 載入 Soot 中的模組和類,請執行:
java -cp PATH_TO_JAVA9/jrt-fs.jar:soot-trunk.jar soot.Main -pp -soot-modulepath modules/
請將PATH_TO_JAVA9
rt.jar
為 java 9 本機安裝的路徑jrt-fs.jar