2022년 12월, 우리는 완전히 개편되고, 더욱 모듈화되고, 테스트 가능하고, 유지 관리 및 사용 가능한 아키텍처를 갖춘 Soot 버전인 SootUp을 공식 출시했습니다. 새로운 프로그램 분석 프로젝트를 시작하고 싶다면 이 내용을 확인해 보세요.
약간의 혼란이 있었기 때문에: SootUp은 아직 기능이 완벽하지 않습니다. 따라서 "오래된" Soot는 당분간 계속 유지되어야 하며, 특히 계측 기능이나 강력한 Android 지원이 필요한 프로젝트의 경우 더욱 그렇습니다. "오래된" 그을음은 기능이 완전한 후속 제품을 위해 안전하게 삭제될 수 있을 때까지 계속 유지 관리되고 있습니다.
우리는 그을음 유지를 돕기 위해 정기적으로 자금을 신청하고 있습니다. 상업적으로나 연구 도구의 형태로 Soot를 사용하는 프로젝트 에 대해 알려주시면 우리에게 큰 도움이 될 수 있습니다.
또한 무료 오픈 소스 라이선스로 Soot를 지원해 주셔서 감사합니다!
... Soot의 추가 개발을 지원해 주셔서 감사합니다! Amazon Web Services는 골드 스폰서입니다.
스스로 후원자가 되는 방법에 대해 여기에서 자세히 알아보세요.
Soot의 Java 9 최첨단 개발에 참여해보세요.
ModuleScene
에서 모듈 해결Soot는 Java 최적화 프레임워크입니다. Java 바이트코드를 분석하고 변환하기 위한 네 가지 중간 표현을 제공합니다.
자세한 내용은 https://soot-oss.github.io/soot를 참조하세요.
위키에는 Soot에 대한 일부 문서가 있으며 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를 빌드해야 하는 경우 위키에서 추가 단계를 고려하세요.
Soot는 git-flow 규칙을 따릅니다. 릴리스 및 핫픽스는 마스터 분기에서 유지됩니다. 개발은 개발 브랜치에서 이루어집니다. 그을음의 최첨단을 잡으려면 후자를 확인하십시오.
우리는 GitHub 풀 요청 형태로 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에서 모듈이 활성화되었는지 확인하는 데 도움이 됩니다. 이는 옵션 클래스를 사용하여 모듈 경로를 설정했는지 여부에 따라 수행됩니다.
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
대체하는 jrt:// 파일 시스템 Java 9 사용을 위한 내장 NIO 파일 시스템 제공자입니다.