2015-10-20 82 views
1

我正在嘗試獲取apk文件的調用圖。我運行下面的代碼。但之後當我檢查sootOutput文件時,它是空的!有任何想法嗎? P.S:它打印圖的大小,沒有錯誤!apk文件的調用圖。但它不產生輸出

預先感謝您

import java.io.IOException; 
import java.util.Collections; 
import org.xmlpull.v1.XmlPullParserException; 
import soot.PackManager; 
import soot.Scene; 
import soot.SootMethod; 
import soot.jimple.infoflow.android.SetupApplication; 
import soot.options.Options; 

public class call { 

    public call() { 
     // TODO Auto-generated constructor stub 
    } 

    public static void main(String[] args) { 

     // TODO Auto-generated method stub 

     SetupApplication app = new SetupApplication("D:\\Users\\ML\\AppData\\Local\\Android\\sdk\\platforms","D:/b.apk"); 
     try { 
      app.calculateSourcesSinksEntrypoints("C:\\Users\\ML\\workspace\\Graph\\1.txt"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     soot.G.reset(); 

     Options.v().set_src_prec(Options.src_prec_apk); 
     Options.v().set_process_dir(Collections.singletonList("D:/b.apk")); 
     Options.v().set_android_jars("D:\\Users\\ML\\AppData\\Local\\Android\\sdk\\platforms"); 
     Options.v().set_whole_program(true); 
     Options.v().set_allow_phantom_refs(true); 
     Options.v().set_output_format(Options.output_format_boutput_format_class); 
     Options.v().setPhaseOption("cg.spark", "on"); 

     Scene.v().loadNecessaryClasses(); 

     SootMethod entryPoint = app.getEntryPointCreator().createDummyMain(); 
     Options.v().set_main_class(entryPoint.getSignature()); 
     Scene.v().setEntryPoints(Collections.singletonList(entryPoint)); 
     //System.out.println(entryPoint.getActiveBody()); 

     PackManager.v().runPacks(); 
     System.out.println(Scene.v().getCallGraph().size()); 
    } 

} 

回答

0

你是在一個極不規範的方式 - 使用菸灰。特別是,你永遠不會實際調用寫出輸出所需的菸灰的方法。我強烈建議調用Soot自己的主要方法soot.Main.main,然後插入一堆變形金剛。