[Soot-list] Creating n-custom entry point call graphs

Jason Ott jott002 at ucr.edu
Tue Apr 28 13:06:54 EDT 2015


I have 1,000+ methods that will be used as custom entry points to generate
a call graph.  They have different classes and what not.  I've tried a few
different things which I will list below, after I discuss my general
approach and shed some more light on exactly what I'm trying to do.

As I said I have N-number of methods that I want to generate a call graph
for.  They are in the following format:

android.accessibilityservice.IAccessibilityServiceClient$Stub$Proxy.onAccessibilityEvent,
android.accounts.IAccountAuthenticator$Stub.confirmCredentials,
android.app.admin.IDevicePolicyManager$Stub.setMaximumFailedPasswordsForWipe,
etc.

The class is actually an interface that contains a static inner class
(`$Stub`) that contains an inner class (`$Proxy`, which implements said
interface).  So `android.accessibilityservice.IAccessibilityServiceClient`
is an interface, `$Stub` is a static inner class to
`android.accessibilityservice.IAccessibilityServiceClient` and `$Proxy` is
an inner class to `$Stub`.

My logic for solving this is as follows:
// get records from disk...
while(records.hasNextRecord()) {

// get records from disk
while(records.hasNextRecord()) {
if(!setArgs) {
    Options.v().parse(args);
    setArgs = true;
}

SootClass sootClass = Scene.v().forceResolve(record.getClassName(),
SootClass.BODIES);
sootClass.setApplicationClass();
Scene.v().loadNecessaryClasses();
SootMethod sootMethod = sootClass.getMethodByName(record.getMethodName());
List<SootMethod> entryPoints = new ArrayList<SootMethod>();
entryPoints.add(sootMethod);
Scene.v().setEntryPoints(entryPoints);
PackManager.v().runPacks();

soot.jimple.toolkits.callgraph.CallGraph callgraph = Scene.v().getCallGraph();
System.out.println("[TestSpark] Call graph size " + callgraph.size());

System.out.println(String.format("It took: %d seconds to generate a
callgraph for: %s",
        TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start),
        record.getClassName() + "." + record.getMethodName()));

System.out.println("=====================================");}

This allows me to generate the callgraph from the custom entry point.
After the second iteration I get the following exception:

Exception in thread "main" java.lang.ClassCastException:
soot.baf.internal.BIdentityInst cannot be cast to soot.jimple.Stmt
at
soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.getImplicitTargets(OnFlyCallGraphBuilder.java:604)
at
soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processNewMethod(OnFlyCallGraphBuilder.java:530)
at
soot.jimple.toolkits.callgraph.OnFlyCallGraphBuilder.processReachables(OnFlyCallGraphBuilder.java:420)
at soot.jimple.spark.solver.OnFlyCallGraph.build(OnFlyCallGraph.java:55)
at
soot.jimple.spark.builder.ContextInsensitiveBuilder.build(ContextInsensitiveBuilder.java:76)
at
soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:84)
at soot.SceneTransformer.transform(SceneTransformer.java:39)
at soot.Transform.apply(Transform.java:90)
at soot.RadioScenePack.internalApply(RadioScenePack.java:57)
at
soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:49)
at soot.Pack.apply(Pack.java:116)
at soot.PackManager.runWholeProgramPacks(PackManager.java:563)
at soot.PackManager.runPacksNormally(PackManager.java:456)
at soot.PackManager.runPacks(PackManager.java:391)
at Main.main(Main.java:39)
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:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

I've tried adding all the methods per class to a the entry points and run
the callgraph when the class changes, obviously the above method,
one-by-one resolution, etc.  But the exception continues to persist.

Any ideas on how to build a callgraph for >50 different classes that
contain n-number of custom entry points that don't produce the exception
would be very helpful.  Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20150428/05846f95/attachment.html 


More information about the Soot-list mailing list