В декабре 2022 года мы официально выпустили SootUp — версию Soot с полностью переработанной, более модульной, тестируемой, поддерживаемой и удобной архитектурой. Пожалуйста, ознакомьтесь с этим, если захотите начать новый проект по анализу программ.
Поскольку возникла некоторая путаница: SootUp еще не является полнофункциональным. Поэтому «старому» Soot нужно какое-то время жить, особенно для проектов, требующих инструментальных возможностей или надежной поддержки Android. «Старый» Soot все еще поддерживается до тех пор, пока его можно будет безопасно отказаться от полнофункционального преемника.
Мы регулярно подаем заявки на финансирование для поддержки Soot. Вы можете нам очень помочь, сообщив нам о проектах, в которых Soot используется как в коммерческих целях, так и в виде исследовательских инструментов.
Также большое спасибо за поддержку Soot с помощью бесплатной лицензии с открытым исходным кодом!
... за поддержку дальнейшего развития Soot! Amazon Web Services является золотым спонсором.
Подробнее о том, как стать спонсором самостоятельно, читайте здесь.
Попробуйте принять участие в передовой разработке Soot для Java 9.
ModuleScene
SootSoot — это платформа оптимизации Java. Он предоставляет четыре промежуточных представления для анализа и преобразования байт-кода Java:
Подробности см. на https://soot-oss.github.io/soot.
У нас есть некоторая документация по Soot в вики, а также большое количество руководств по Soot.
Для получения более подробной информации ознакомьтесь также с документацией Soot JavaDoc и опциями.
Релиз Soot в настоящее время создается для каждого коммита в master
ветке. Вы можете включить Soot в качестве зависимости через Maven, Gradle, SBT и т. д., используя следующие координаты:
< dependencies >
< dependency >
< groupId >org.soot-oss</ groupId >
< artifactId >soot</ artifactId >
< version >4.3.0</ version >
</ dependency >
</ dependencies >
Вы также можете получить более старые сборки master
ветки. Полный список сборок можно найти на Maven Central.
В настоящее время для каждого коммита в ветку develop
создается Soot SNAPSHOT. Вы можете включить Soot в качестве зависимости через Maven, Gradle, SBT и т. д., используя следующие координаты:
< 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 самостоятельно, ознакомьтесь с вики для дальнейших действий.
Soot следует соглашению git-flow. Выпуски и исправления хранятся в основной ветке. Разработка происходит в ветке разработки. Чтобы уловить суть Сажи, обратите внимание на последнюю.
Мы рады принять произвольные улучшения Soot в виде запросов на извлечение GitHub. Пожалуйста, прочтите наши правила внесения взносов, прежде чем настраивать запрос на включение.
Вы используете Soot и хотели бы помочь нам поддерживать его в будущем? Тогда, пожалуйста, поддержите нас, заполнив эту небольшую веб-форму.
Таким образом, вы можете помочь нам двумя способами:
Если вы хотите запустить Soot с Java > 8, все готово. Просто запустите его как обычно. Если вы хотите выполнить Soot с помощью Java 8, но анализировать проекты Java > 8 или наоборот, см. ниже.
Чтобы загрузить модули в ModuleScene
Soot из Java:
// 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.
Чтобы выполнить Soot с использованием Java 1.9, но с анализом пути к классам, как и раньше: 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 не выполняется в режиме модуля.
Чтобы загрузить модули и классы в Soot с помощью Java 1.8, выполните:
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
— это встроенный поставщик файловой системы NIO для файловой системы jrt://, которую использует Java 9, который заменяет rt.jar
.