soot-oss / soot

Soot - A Java optimization framework
GNU Lesser General Public License v2.1
2.85k stars 706 forks source link

SootClassNotFoundException: couldn't find class #750

Closed DongShuaike closed 7 years ago

DongShuaike commented 7 years ago

Hi, recently I worked on Android code analysis using Soot. I tried to create the call graph of a given APK but failed at soot.jimple.infoflow.entryPointCreators.BaseEntryPointCreator.createDummyMain. SootResolver threw an exception saying a class can not be found while I can get its code completely by a decompiler. My analyzer code refers to this page How to use Soot to create call graph for Android apps The APK file I used can be obtained through this https://drive.google.com/open?id=0B78lX108h39RcnU5SmdwaGtfa1k. The error info is as follow. Exception in thread "main" soot.SootResolver$SootClassNotFoundException: couldn't find class: com.baidu.android.pushservice.RegistrationReceiver (is your soot-class-path set properly?) at soot.SootResolver.bringToHierarchy(SootResolver.java:232) at soot.SootResolver.bringToSignatures(SootResolver.java:275) at soot.SootResolver.processResolveWorklist(SootResolver.java:173) at soot.SootResolver.resolveClass(SootResolver.java:134) at soot.Scene.forceResolve(Scene.java:1810) at soot.jimple.infoflow.entryPointCreators.AndroidEntryPointCreator.createDummyMainInternal(AndroidEntryPointCreator.java:173) at soot.jimple.infoflow.entryPointCreators.BaseEntryPointCreator.createDummyMainInternal(BaseEntryPointCreator.java:124) at soot.jimple.infoflow.entryPointCreators.BaseEntryPointCreator.createDummyMain(BaseEntryPointCreator.java:109) at soot.dex_test.graph_test.main(graph_test.java:57) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

I also programmed a snippet of code to certain the existence of that class.https://gist.github.com/DongShuaike/d8a004606f1f102d7e391e4637d7db70 and the code of that class can be accessed via https://gist.github.com/DongShuaike/bcc5c121393fc6e53edf19c49ed67095

I'll appreciate if you could figure the error out. Thanks.

DongShuaike commented 7 years ago

I re-checked the code and found that the error was due to my missing of the statement: Packmanager.v().runPacks();

Uporonier commented 5 months ago

hi,everyone ! i don't know how to change this wrong...can you tell me ?

import com.google.common.base.Optional; import soot.; import soot.options.; import soot.toolkits.graph.ExceptionalUnitGraph; import soot.toolkits.graph.UnitGraph;

import java.util.List; import java.util.Map;

public class ControlFlowGraphGenerator { public static void main(String[] args) {

    /*
    String javaClassFile = "target\\classes\\test01.class"; // 替换成你的 Java 字节码文件路径

// Scene.v().loadNecessaryClasses();

    // 设置 Soot 选项
    Options.v().set_output_format(Options.output_format_jimple); // 设置输出格式为 Jimple
    Options.v().set_allow_phantom_refs(true);
    Options.v().set_src_prec(Options.src_prec_java);
    Options.v().set_whole_program(true);
    Options.v().set_soot_classpath("target\\classes;A:\\jdk\\jdk1.8.0_251\\jre\\lib\\rt.jar");

    // 加载类
    Scene.v().loadClassAndSupport(javaClassFile);
    PackManager.v().runPacks();

    // 获取类
    SootClass sootClass = Scene.v().getSootClass(javaClassFile);

    // 生成控制流图
    for (SootMethod method : sootClass.getMethods()) {
        if (method.isConcrete()) {
            Body body = method.retrieveActiveBody();
            UnitGraph unitGraph = new ExceptionalUnitGraph(body);
            System.out.println("Control flow graph for method: " + method.getName());
            System.out.println(unitGraph);
            // 这里你可以执行基本路径分析等操作
        }
    }
    */
    // configure Soot's options, refer to example configurations below
    String modulePath="D:\\desktop\\软件测试\\Acer\\target\\classes";
    Options.v().set_soot_modulepath(modulePath);

    Options.v().set_soot_classpath("D:\\desktop\\软件测试\\Acer\\target\\classes");

// 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> map = ModulePathSourceLocator.v().getClassUnderModulePath(modulePath); for (String module : map.keySet()) { for (String klass : map.get(module)) { System.out.println("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;
}

}

D:\Java\bin\java.exe "-javaagent:A:\IntelliJ IDEA 2023.2.1\lib\idea_rt.jar=54356:A:\IntelliJ IDEA 2023.2.1\bin" -Dfile.encoding=UTF-8 -classpath D:\desktop\软件测试\Acer\target\classes;C:\Users\A.m2\repository\ca\mcgill\sable\soot\4.1.0\soot-4.1.0.jar;C:\Users\A.m2\repository\commons-io\commons-io\2.6\commons-io-2.6.jar;C:\Users\A.m2\repository\org\smali\dexlib2\2.3.4\dexlib2-2.3.4.jar;C:\Users\A.m2\repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;C:\Users\A.m2\repository\com\google\guava\guava\27.1-android\guava-27.1-android.jar;C:\Users\A.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\A.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\A.m2\repository\org\checkerframework\checker-compat-qual\2.5.2\checker-compat-qual-2.5.2.jar;C:\Users\A.m2\repository\com\google\errorprone\error_prone_annotations\2.2.0\error_prone_annotations-2.2.0.jar;C:\Users\A.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;C:\Users\A.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.17\animal-sniffer-annotations-1.17.jar;C:\Users\A.m2\repository\org\ow2\asm\asm\7.1\asm-7.1.jar;C:\Users\A.m2\repository\org\ow2\asm\asm-tree\7.1\asm-tree-7.1.jar;C:\Users\A.m2\repository\org\ow2\asm\asm-util\7.1\asm-util-7.1.jar;C:\Users\A.m2\repository\org\ow2\asm\asm-analysis\7.1\asm-analysis-7.1.jar;C:\Users\A.m2\repository\org\ow2\asm\asm-commons\7.1\asm-commons-7.1.jar;C:\Users\A.m2\repository\xmlpull\xmlpull\1.1.3.4d_b4_min\xmlpull-1.1.3.4d_b4_min.jar;C:\Users\A.m2\repository\de\upb\cs\swt\axml\2.0.0\axml-2.0.0.jar;C:\Users\A.m2\repository\ca\mcgill\sable\polyglot\2006\polyglot-2006.jar;C:\Users\A.m2\repository\de\upb\cs\swt\heros\1.2.0\heros-1.2.0.jar;C:\Users\A.m2\repository\org\functionaljava\functionaljava\4.2\functionaljava-4.2.jar;C:\Users\A.m2\repository\ca\mcgill\sable\jasmin\3.0.2\jasmin-3.0.2.jar;C:\Users\A.m2\repository\ca\mcgill\sable\java_cup\0.9.2\java_cup-0.9.2.jar;C:\Users\A.m2\repository\org\slf4j\slf4j-api\1.7.5\slf4j-api-1.7.5.jar;C:\Users\A.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\A.m2\repository\javax\xml\bind\jaxb-api\2.4.0-b180725.0427\jaxb-api-2.4.0-b180725.0427.jar;C:\Users\A.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\A.m2\repository\org\glassfish\jaxb\jaxb-runtime\2.4.0-b180830.0438\jaxb-runtime-2.4.0-b180830.0438.jar;C:\Users\A.m2\repository\org\glassfish\jaxb\txw2\2.4.0-b180830.0438\txw2-2.4.0-b180830.0438.jar;C:\Users\A.m2\repository\com\sun\istack\istack-commons-runtime\3.0.7\istack-commons-runtime-3.0.7.jar;C:\Users\A.m2\repository\org\jvnet\staxex\stax-ex\1.8\stax-ex-1.8.jar;C:\Users\A.m2\repository\com\sun\xml\fastinfoset\FastInfoset\1.2.15\FastInfoset-1.2.15.jar;A:\jdk\jdk1.8.0_251\jre\lib\rt.jar;C:\Users\A.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\A.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar ControlFlowGraphGenerator Loaded Class: com.oracle.net.Sdp$1

Loaded Class: com.oracle.net.Sdp$SdpSocket

Loaded Class: com.oracle.net.Sdp

Loaded Class: com.oracle.nio.BufferSecrets

Exception in thread "main" soot.SootResolver$SootClassNotFoundException: couldn't find class: module-info (is your soot-class-path set properly?) at soot.SootResolver.bringToHierarchyUnchecked(SootResolver.java:245) at soot.SootResolver.bringToHierarchy(SootResolver.java:221) at soot.SootResolver.bringToSignatures(SootResolver.java:292) at soot.SootResolver.bringToBodies(SootResolver.java:332) at soot.SootResolver.processResolveWorklist(SootResolver.java:176) at soot.SootModuleResolver.resolveClass(SootModuleResolver.java:83) at soot.ModuleUtil.findModuleThatExports(ModuleUtil.java:115) at soot.ModuleScene.containsClass(ModuleScene.java:213) at soot.ModuleScene.containsClass(ModuleScene.java:204) at soot.ModuleUtil.findModuleThatExports(ModuleUtil.java:135) at soot.SootModuleResolver.makeClassRef(SootModuleResolver.java:48) at soot.asm.SootClassBuilder.makeClassRef(SootClassBuilder.java:264) at soot.asm.SootClassBuilder.visitMethod(SootClassBuilder.java:197) at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1122) at org.objectweb.asm.ClassReader.accept(ClassReader.java:688) at org.objectweb.asm.ClassReader.accept(ClassReader.java:400) at soot.asm.AsmClassSource.resolve(AsmClassSource.java:67) at soot.SootResolver.bringToHierarchyUnchecked(SootResolver.java:253) at soot.SootResolver.bringToHierarchy(SootResolver.java:221) at soot.SootResolver.processResolveWorklist(SootResolver.java:182) at soot.SootModuleResolver.resolveClass(SootModuleResolver.java:83) at soot.ModuleScene.loadClass(ModuleScene.java:300) at soot.ModuleScene.loadClassAndSupport(ModuleScene.java:281) at ControlFlowGraphGenerator.loadClass(ControlFlowGraphGenerator.java:68) at ControlFlowGraphGenerator.main(ControlFlowGraphGenerator.java:54)

Process finished with exit code 1