2022 年 12 月に、完全にオーバーホールされ、よりモジュール化され、テスト可能で保守可能で使いやすいアーキテクチャを備えた Soot のバージョンである SootUp を正式にリリースしました。新しいプログラム分析プロジェクトを開始したい場合は、これを確認してください。
いくつかの混乱があるため、SootUp はまだ機能が完成していません。したがって、特にインストルメンテーション機能や堅牢な Android サポートを必要とするプロジェクトの場合は、「古い」Soot が当面存続する必要があります。 「古い」Soot は、完全な機能を備えた後継版として安全に削除できるようになるまで、引き続き維持されます。
私たちは、すすの維持を支援するための資金を定期的に申請しています。 Soot を商用または研究ツールの形で使用するプロジェクトについてお知らせいただくと、非常に助かります。
また、無料で使用できるオープンソース ライセンスで Soot をサポートしていただいたことにも感謝します。
...すすのさらなる発展をサポートしてください!アマゾン ウェブ サービスはゴールド スポンサーです。
自分でスポンサーになる方法について詳しくは、こちらをお読みください。
Soot の Java 9 の最先端の開発に参加してみてください。
ModuleScene
でのモジュールの解決Soot は Java 最適化フレームワークです。 Java バイトコードを分析および変換するための 4 つの中間表現を提供します。
詳細については、https://soot-oss.github.io/soot を参照してください。
ウィキにはすすに関するドキュメントがいくつかあり、すすに関する幅広いチュートリアルもあります。
詳細については、Soot の JavaDoc およびオプションのドキュメントも参照してください。
Soot リリースは現在、 master
ブランチへのコミットごとにビルドされます。次の座標を使用して、Maven、Gradle、SBT などを介して Soot を依存関係として含めることができます。
< dependencies >
< dependency >
< groupId >org.soot-oss</ groupId >
< artifactId >soot</ artifactId >
< version >4.3.0</ version >
</ dependency >
</ dependencies >
master
ブランチの古いビルドを入手することもできます。ビルドの完全なリストは、Maven Central で見つけることができます。
Soot SNAPSHOT は現在、 develop
ブランチへのコミットごとに構築されます。次の座標を使用して、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 で見つけることができます。
Maven で Soot を使用することをお勧めします。Sootの最新リリース ビルドを直接入手できます。 Soot の最新の SNAPSHOT ビルドを直接入手できます。
soot-<RELEASE>-jar-with-dependencies.jar
ファイルは、必要なライブラリがすべて含まれているオールインワン ファイルです。
soot-<RELEASE>.jar
ファイルには Soot のみが含まれているため、必要に応じて依存関係を手動で選択できます。依存関係に煩わされたくない場合は、前者を使用することをお勧めします。
プレビルド バージョンを使用できず、Soot を自分でビルドする必要がある場合は、Wiki でさらなる手順を検討してください。
Soot は git-flow の規則に従います。リリースとホットフィックスは master ブランチで管理されます。開発は開発ブランチで行われます。 Soot の最先端を知るには、後者をチェックしてください。
私たちは、GitHub プル リクエストの形式で Soot に対する任意の改善を喜んで受け入れます。プルリクエストを設定する前に、貢献ガイドラインをお読みください。
あなたは Soot を使用していて、将来それをサポートするのを手伝ってくれませんか?それでは、この小さな Web フォームにご記入いただき、私たちをサポートしてください。
そうすれば、次の 2 つの方法で私たちを助けることができます。
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 はモジュール モードでは実行されませんが、Soot が Java (>9) 仮想ファイルシステムjrt:/
でクラスも検索する必要があることを示します。
Java 1.8 を使用して Soot にモジュールとクラスをロードするには、次のコマンドを実行します。
java -cp PATH_TO_JAVA9/jrt-fs.jar:soot-trunk.jar soot.Main -pp -soot-modulepath modules/
PATH_TO_JAVA9
Java 9 のローカル インストールへのパスに置き換えてください。 jrt-fs.jar
は、 rt.jar
置き換える、 Java 9 が使用する jrt:// ファイルシステム用の組み込み NIO ファイルシステム プロバイダーです。