[Soot-list] Fwd: Generating Android APK CallFlowGraph
LOKESH JAIN
lokeshjain92 at gmail.com
Mon Jul 21 02:08:52 EDT 2014
Hi all,
Steven I still couldn't figure it out how to work with queuereader object
for generating dot format.
I have used dot graph class manually as suggested to me by Stefan but,
I am getting NullPointerException. I don't know why. I have pasted the
complete code.
Please help me out.
Exception in thread "main" java.lang.NullPointerException
at DotGraph.getNode(DotGraph.java:53)
at DotGraph.drawNode(DotGraph.java:61)
at CFG.visit(CFG.java:114)
at CFG.main(CFG.java:94)
CFG.java
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.xmlpull.v1.XmlPullParserException;
import soot.MethodOrMethodContext;
import soot.PackManager;
import soot.Scene;
import soot.SootMethod;
import soot.jimple.infoflow.android.SetupApplication;
import soot.jimple.toolkits.callgraph.CallGraph;
import soot.jimple.toolkits.callgraph.Targets;
import soot.options.Options;
import soot.util.dot.DotGraphUtility;
import soot.util.dot.Renderable;
public class CFG {
private static DotGraph dot = new DotGraph("callgraph");
private static HashMap <String,Boolean> visited = new
HashMap<String,Boolean>();
public CFG() {
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SetupApplication app = new
SetupApplication("/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar","/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk");
try {
app.calculateSourcesSinksEntrypoints("/home/lokesh/Downloads/soot-infoflow-android-develop/SourcesAndSinks.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("/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk"));
Options.v().set_force_android_jar("/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar");
Options.v().set_whole_program(true);
Options.v().set_allow_phantom_refs(true);
Options.v().set_output_format(Options.output_format_none);
Options.v().setPhaseOption("cg.spark verbose:true", "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());
CallGraph cg = Scene.v().getCallGraph();
visit(cg, entryPoint);
dot.plot("/home/lokesh/Desktop/soot1"+ dot.DOT_EXTENSION);
}
private static void visit(CallGraph cg, SootMethod k)
{
String identifier = k.getName();
visited.put(k.getSignature(),true);
dot.drawNode(identifier);
//iterate over unvisited parents
Iterator<MethodOrMethodContext> ptargets = new Targets(cg.edgesInto(k));
if(ptargets != null){
while(ptargets.hasNext())
{
SootMethod p = (SootMethod) ptargets.next();
if(p == null) System.out.println("p is null");
if(!visited.containsKey(p.getSignature()))
visit(cg,p);
}
}
//iterate over unvisited children
Iterator<MethodOrMethodContext> ctargets = new Targets(cg.edgesOutOf(k));
if(ctargets != null){
while(ctargets.hasNext())
{
SootMethod c = (SootMethod) ctargets.next();
if(c == null) System.out.println("c is null");
dot.drawEdge(identifier, c.getName());
if(!visited.containsKey(c.getSignature()))
visit(cg,c);
}
}
}
}
DotGraph.java
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import soot.util.dot.DotGraphEdge;
import soot.util.dot.DotGraphNode;
import soot.util.dot.DotGraphUtility;
import soot.util.dot.Renderable;
public class DotGraph implements Renderable
{
public final static String DOT_EXTENSION = ".dot";
private HashMap<String, DotGraphNode> nodes;
private boolean isSubGraph;
private List<Renderable> drawElements;
private String graphname;
public DotGraph(String graphname)
{
this.drawElements = new LinkedList<Renderable>();
}
public DotGraph createSubGraph(String label)
{
DotGraph subgraph = new DotGraph(label);
subgraph.isSubGraph = true;
this.drawElements.add(subgraph);
System.out.println(subgraph);
return subgraph;
}
@Override
public void render(OutputStream out, int indent) throws IOException {
String graphname = this.graphname;
if (!isSubGraph) {
DotGraphUtility.renderLine(out, "digraph \""+graphname+"\" {",
indent);
} else {
DotGraphUtility.renderLine(out, "subgraph \""+graphname+"\" {", indent);
}
}
public void plot(String filename) {
try {
BufferedOutputStream out =new BufferedOutputStream(new
FileOutputStream(filename));
render(out, 0);
out.close();
} catch (IOException ioe) {
}
}
public DotGraphNode getNode(String name){
DotGraphNode node = nodes.get(name);
if (node == null) {
node = new DotGraphNode(name);
nodes.put(name, node);
}
return node;
}
public DotGraphNode drawNode(String name){
DotGraphNode node = getNode(name);
if(node == null)
throw new RuntimeException("Assertion failed.");
if(!this.drawElements.contains(node))
this.drawElements.add(node);
return node;
}
public DotGraphEdge drawEdge(String from, String to) {
DotGraphNode src = drawNode(from);
DotGraphNode dst = drawNode(to);
DotGraphEdge edge = new DotGraphEdge(src, dst);
this.drawElements.add(edge);
return edge;
}
}
Thanks & Regards
Lokesh
On Sun, Jul 20, 2014 at 5:10 PM, Stefan Gommer <
gommer at informatik.uni-bremen.de> wrote:
> Hi Lokesh,
>
> sorry I misspelled it. Originally it is of type Hash*Map*<String,Boolean>.
>
> You can also use HashSet<String>. In this case you have to use
> visited.add(k.getSignature());
>
> Regards,
> Stefan
>
> Am 20.07.2014 um 13:35 schrieb LOKESH JAIN <lokeshjain92 at gmail.com>:
>
> Hi Stefan,
> HashSet<String,Boolean> type is giving error whereas HashSet<String> is
> correct form. But
>
> then
> visited.put(k.getSignature(),true) is giving error.
> How do i resolve this?
>
> Thanks & Regards
> Lokesh
>
>
> On Sun, Jul 20, 2014 at 4:52 PM, LOKESH JAIN <lokeshjain92 at gmail.com>
> wrote:
>
>> Hi Stefan,
>> HashSet<String,Boolean> type is giving error whereas HashSet<String> is
>> correct form. But
>>
>> then
>> visited.put(k.getSignature(),true) is giving error.
>>
>> Thanks & Regards
>> Lokesh
>>
>>
>> On Sun, Jul 20, 2014 at 4:16 PM, Stefan Gommer <
>> gommer at informatik.uni-bremen.de> wrote:
>>
>>> Hi Lokesh,
>>>
>>> visited is of type HashSet<String,Boolean> but can also be any kind of
>>> List like HashSet<String>
>>>
>>> Regards
>>> Stefan
>>>
>>> Am 20.07.2014 um 12:44 schrieb LOKESH JAIN <lokeshjain92 at gmail.com>:
>>>
>>> Hey Stefan!
>>>
>>> What is the type of "visited" ?
>>>
>>> Thanks & Regards
>>> Lokesh
>>>
>>>
>>> On Sun, Jul 20, 2014 at 2:57 PM, Stefan Gommer <
>>> gommer at informatik.uni-bremen.de> wrote:
>>>
>>>> Hi Lokesh,
>>>>
>>>> I did it like this (I skipped the standard soot settings:
>>>>
>>>> private static DotGraph dot = new DotGraph("CallGraph“);
>>>> ...
>>>> SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();
>>>> …
>>>> PackManager.v().runPacks();
>>>> CallGraph cg = Scene.v().getCallGraph();
>>>> visit(cg, entryPoint);
>>>> …
>>>> dot.plot("/Users/neji/Desktop/graph"+ dot.DOT_EXTENSION);
>>>> …
>>>>
>>>>
>>>> private static void visit(CallGraph cg, SootMethod k)
>>>> {
>>>> String identifier = k.getName();
>>>>
>>>> visited.put(k.getSignature(), true);
>>>>
>>>> dot.drawNode(identifier);
>>>>
>>>> //iterate over unvisited parents
>>>> Iterator<MethodOrMethodContext> ptargets = new
>>>> Targets(cg.edgesInto(k));
>>>>
>>>> if(ptargets != null){
>>>> while(ptargets.hasNext())
>>>> {
>>>> SootMethod p = (SootMethod) ptargets.next();
>>>>
>>>> if(p == null) System.out.println("p is null");
>>>>
>>>> if(!visited.containsKey(p.getSignature()))
>>>> visit(cg,p);
>>>> }
>>>> }
>>>>
>>>> //iterate over unvisited children
>>>> Iterator<MethodOrMethodContext> ctargets = new
>>>> Targets(cg.edgesOutOf(k));
>>>>
>>>> if(ctargets != null){
>>>> while(ctargets.hasNext())
>>>> {
>>>> SootMethod c = (SootMethod) ctargets.next();
>>>> if(c == null) System.out.println("c is null");
>>>> dot.drawEdge(identifier, c.getName());
>>>>
>>>> if(!visited.containsKey(c.getSignature()))
>>>> visit(cg,c);
>>>> }
>>>> }
>>>> }
>>>>
>>>>
>>>> Am 20.07.2014 um 09:44 schrieb LOKESH JAIN <lokeshjain92 at gmail.com>:
>>>>
>>>> I have tried DotGraph class from the soot.util.dot package but it's
>>>> giving me null pointer exception. Following is the tried code.
>>>>
>>>> I have converted QueueReader object into string as DotGraph takes only
>>>> string argument. It's getting complicated. Please suggest some simple
>>>> solution.
>>>>
>>>> import java.io.IOException;
>>>> import java.io.OutputStream;
>>>> import java.util.Collections;
>>>> import java.util.LinkedList;
>>>> import java.util.List;
>>>>
>>>> import org.xmlpull.v1.XmlPullParserException;
>>>>
>>>> import soot.PackManager;
>>>> import soot.Scene;
>>>> import soot.SootMethod;
>>>> import soot.jimple.infoflow.android.SetupApplication;
>>>> import soot.options.Options;
>>>> import soot.util.dot.DotGraphUtility;
>>>> import soot.util.dot.Renderable;
>>>> public class CFG {
>>>> //private static Map options;
>>>> static DotGraph dg;
>>>> public CFG() {
>>>> //this.options=options;
>>>> // TODO Auto-generated constructor stub
>>>>
>>>> }
>>>> /*public DotGraph createSubGraph(String label)
>>>> {
>>>>
>>>> DotGraph createSubGraph =
>>>> DotGraph.createSubGraph(Scene.v().getCallGraph().listener().toString());
>>>> }*/
>>>> public static void main(String[] args) {
>>>>
>>>> // TODO Auto-generated method stub
>>>>
>>>> SetupApplication app = new
>>>> SetupApplication("/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar","/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk");
>>>>
>>>> try {
>>>>
>>>>
>>>> app.calculateSourcesSinksEntrypoints("/home/lokesh/Downloads/soot-infoflow-android-develop/SourcesAndSinks.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("/home/lokesh/Desktop/android-instrumentation-tutorial-master/app-example/RV2013/bin/RV2013.apk"));
>>>>
>>>> Options.v().set_force_android_jar("/home/lokesh/Desktop/android-sdk-linux/platforms/android-19/android.jar");
>>>>
>>>> Options.v().set_whole_program(true);
>>>>
>>>> Options.v().set_allow_phantom_refs(true);
>>>>
>>>> Options.v().set_output_format(Options.output_format_none);
>>>>
>>>> Options.v().setPhaseOption("cg.spark verbose:true", "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());
>>>> String label = Scene.v().getCallGraph().listener().toString();
>>>> dg.createSubGraph(label);
>>>> }
>>>> }
>>>>
>>>> import java.io.IOException;
>>>> import java.io.OutputStream;
>>>> import java.util.LinkedList;
>>>> import java.util.List;
>>>>
>>>> import soot.util.dot.DotGraphUtility;
>>>> import soot.util.dot.Renderable;
>>>>
>>>> public class DotGraph implements Renderable
>>>> {
>>>> private boolean isSubGraph;
>>>> private List<Renderable> drawElements;
>>>> private String graphname;
>>>> public DotGraph(String graphname)
>>>> {
>>>> this.drawElements = new LinkedList<Renderable>();
>>>> }
>>>> public DotGraph createSubGraph(String label)
>>>> {
>>>> DotGraph subgraph = new DotGraph(label);
>>>> subgraph.isSubGraph = true;
>>>> this.drawElements.add(subgraph);
>>>> System.out.println(subgraph);
>>>> return subgraph;
>>>> }
>>>> @Override
>>>> public void render(OutputStream out, int indent) throws IOException {
>>>> String graphname = this.graphname;
>>>> if (!isSubGraph) {
>>>> DotGraphUtility.renderLine(out, "digraph \""+graphname+"\"
>>>> {", indent);
>>>> } else {
>>>> DotGraphUtility.renderLine(out, "subgraph \""+graphname+"\" {",
>>>> indent);
>>>>
>>>> }
>>>>
>>>> }
>>>> }
>>>>
>>>> Thanks & Regards
>>>> Lokesh
>>>>
>>>>
>>>> On Sat, Jul 19, 2014 at 10:57 PM, Stefan Gommer <
>>>> gommeriphone at googlemail.com> wrote:
>>>>
>>>>> Hi Lokesh,
>>>>>
>>>>> you could use the DotGraph class from the soot.util.dot package and
>>>>> build a Graph on your own while traversing through the cfg. I don’t know if
>>>>> there is a method to do this automatically.
>>>>>
>>>>> Stefan
>>>>>
>>>>>
>>>>> Am 19.07.2014 um 15:16 schrieb LOKESH JAIN <lokeshjain92 at gmail.com>:
>>>>>
>>>>> Hi Steven,
>>>>> this Scene.v().getCallgraph().listener() is giving me QueueReader
>>>>> object. But I am not able to create a dot file from it. I have tried
>>>>> dump_cfg and various others options but all are of no help.
>>>>>
>>>>> 1. Please can you tell me how do i print a dot file out of QueueReader
>>>>> object?
>>>>>
>>>>> Also I am getting the call graph size as 54 for the general example
>>>>> apk "RV2013.apk".
>>>>>
>>>>> 2. How come call graph size is 54?
>>>>>
>>>>>
>>>>>
>>>>> On Fri, Jul 18, 2014 at 9:37 PM, Steven Arzt <Steven.Arzt at cased.de>
>>>>> wrote:
>>>>>
>>>>>> Hi Lokesh,
>>>>>>
>>>>>>
>>>>>>
>>>>>> You can manually iterate over the callgraph using
>>>>>> Scene.v().getCallgraph().listener() and print it out in dot format which
>>>>>> should be fairly simple as it is just a QueueReader over the edges. Still,
>>>>>> I think Soot can also directly do that, but I have never used the dot
>>>>>> visualizer for callgraphs.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Afterwards, you can visualize the dot file using GraphViz.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Best regards,
>>>>>>
>>>>>> Steven
>>>>>>
>>>>>>
>>>>>>
>>>>>> *Von:* LOKESH JAIN [mailto:lokeshjain92 at gmail.com]
>>>>>> *Gesendet:* Freitag, 18. Juli 2014 18:04
>>>>>> *An:* Steven Arzt
>>>>>> *Cc:* Modhi Alsobiehy; soot-list at cs.mcgill.ca;
>>>>>> soot-list at sable.mcgill.ca; soot-list at googlegroups.com
>>>>>>
>>>>>> *Betreff:* Re: [Soot-list] Generating Android APK CallFlowGraph
>>>>>>
>>>>>>
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> A gentle reminder. Please reply fast. I need it for my research
>>>>>> project.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Regards
>>>>>>
>>>>>> Lokesh
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, Jul 17, 2014 at 9:21 PM, LOKESH JAIN <lokeshjain92 at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>> Thanks a lot Steven and Modhi. It worked.
>>>>>>
>>>>>> It is showing call graph in words. How can I graphically see the call
>>>>>> graph for apk files as we see for java files??
>>>>>>
>>>>>>
>>>>>>
>>>>>> Regards
>>>>>>
>>>>>> Lokesh Jain
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, Jul 17, 2014 at 6:11 PM, Steven Arzt <Steven.Arzt at cased.de>
>>>>>> wrote:
>>>>>>
>>>>>> Hi Lokesh,
>>>>>>
>>>>>>
>>>>>>
>>>>>> It seems that you are missing the axml-2.0.jar library on your Java
>>>>>> classpath.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Best regards,
>>>>>>
>>>>>> Steven
>>>>>>
>>>>>>
>>>>>>
>>>>>> *Von:* soot-list-bounces at CS.McGill.CA [mailto:
>>>>>> soot-list-bounces at CS.McGill.CA] *Im Auftrag von *Modhi Alsobiehy
>>>>>> *Gesendet:* Donnerstag, 17. Juli 2014 14:39
>>>>>> *An:* LOKESH JAIN
>>>>>> *Cc:* soot-list at cs.mcgill.ca; soot-list at sable.mcgill.ca;
>>>>>> soot-list at googlegroups.com
>>>>>> *Betreff:* Re: [Soot-list] Generating Android APK CallFlowGraph
>>>>>>
>>>>>>
>>>>>>
>>>>>> Hi Lokesh,
>>>>>>
>>>>>>
>>>>>>
>>>>>> Open the folder of your project and add the call back file into it.
>>>>>>
>>>>>>
>>>>>>
>>>>>> -Best,
>>>>>>
>>>>>> Modhi
>>>>>>
>>>>>>
>>>>>> On Jul 17, 2014, at 12:03 PM, "LOKESH JAIN" <lokeshjain92 at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> Modhi, I am using your code for generating call graph for apk file.
>>>>>> But, I am getting following error
>>>>>>
>>>>>> Exception in thread "main" java.lang.NoClassDefFoundError:
>>>>>> pxb/android/axml/NodeVisitor
>>>>>> at
>>>>>> soot.jimple.infoflow.android.manifest.ProcessManifest.handle(Unknown Source)
>>>>>> at
>>>>>> soot.jimple.infoflow.android.manifest.ProcessManifest.<init>(Unknown Source)
>>>>>> at
>>>>>> soot.jimple.infoflow.android.manifest.ProcessManifest.<init>(Unknown Source)
>>>>>> at
>>>>>> soot.jimple.infoflow.android.SetupApplication.calculateSourcesSinksEntrypoints(Unknown
>>>>>> Source)
>>>>>> at
>>>>>> soot.jimple.infoflow.android.SetupApplication.calculateSourcesSinksEntrypoints(Unknown
>>>>>> Source)
>>>>>> at CFG.main(CFG.java:33)
>>>>>> Caused by: java.lang.ClassNotFoundException:
>>>>>> pxb.android.axml.NodeVisitor
>>>>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
>>>>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
>>>>>> at java.security.AccessController.doPrivileged(Native Method)
>>>>>> at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
>>>>>> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
>>>>>> ... 6 more
>>>>>>
>>>>>> It's pretty much the same error that you were getting. Though I had
>>>>>> checked , there is no duplicate library added. Also there is already
>>>>>> AndroidCallbacks.txt in soot-infoflow-android, i haven't understood how to
>>>>>> add it into my project.
>>>>>> Any help would be appreciated. Thank You
>>>>>> Regards
>>>>>> Lokesh
>>>>>>
>>>>>>
>>>>>> On Saturday, 5 July 2014 23:04:49 UTC+5:30, Modhi Alsobiehy wrote:
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I need to traverse the call flow graph of android apps( apk files).
>>>>>>
>>>>>> I understand that I must set an entry point so to start, I tried the
>>>>>> following code :
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> ----------------------------------------------------------------------------------------------------
>>>>>>
>>>>>> *mport* 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* CFG {
>>>>>>
>>>>>> *public* CFG() {
>>>>>>
>>>>>> // *TODO* Auto-generated constructor stub
>>>>>>
>>>>>> }
>>>>>>
>>>>>> *public* *static* *void* main(String[] args) {
>>>>>>
>>>>>> // *TODO* Auto-generated method stub
>>>>>>
>>>>>> SetupApplication app = *new* SetupApplication(
>>>>>> "D:/AndroidADT/adt-bundle-windows-x86_64-20131030/sdk/platforms",
>>>>>> "D:/APKs/location.apk");
>>>>>>
>>>>>> *try* {
>>>>>>
>>>>>> app.calculateSourcesSinksEntrypoints(
>>>>>> "D:/FlowDroid/SourcesAndSinks.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:/APKs/location.apk"));
>>>>>>
>>>>>> Options.*v*().set_android_jars(
>>>>>> "D:/AndroidADT/adt-bundle-windows-x86_64-20131030/sdk/platforms");
>>>>>>
>>>>>> Options.*v*().set_whole_program(*true*);
>>>>>>
>>>>>> Options.*v*().set_allow_phantom_refs(*true*);
>>>>>>
>>>>>> Options.*v*().set_output_format(Options.*output_format_none*);
>>>>>>
>>>>>> 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());
>>>>>>
>>>>>> }
>>>>>>
>>>>>> }
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------------------------------------------------------
>>>>>>
>>>>>> Unfortunately, I am getting the following error:
>>>>>>
>>>>>> Exception in thread "main" java.lang.NoClassDefFoundError:
>>>>>> pxb/android/axml/NodeVisitor
>>>>>>
>>>>>> at
>>>>>> soot.jimple.infoflow.android.manifest.ProcessManifest.handle(Unknown Source)
>>>>>>
>>>>>> at
>>>>>> soot.jimple.infoflow.android.manifest.ProcessManifest.<init>(Unknown Source)
>>>>>>
>>>>>> at
>>>>>> soot.jimple.infoflow.android.manifest.ProcessManifest.<init>(Unknown Source)
>>>>>>
>>>>>> at
>>>>>> soot.jimple.infoflow.android.SetupApplication.calculateSourcesSinksEntrypoints(Unknown
>>>>>> Source)
>>>>>>
>>>>>> at
>>>>>> soot.jimple.infoflow.android.SetupApplication.calculateSourcesSinksEntrypoints(Unknown
>>>>>> Source)
>>>>>>
>>>>>> at apkCFG.CFG.main(*CFG.java:25*)
>>>>>>
>>>>>> Caused by: *java.lang.ClassNotFoundException*:
>>>>>> pxb.android.axml.NodeVisitor
>>>>>>
>>>>>> at java.net.URLClassLoader$1.run(Unknown Source)
>>>>>>
>>>>>> at java.net.URLClassLoader$1.run(Unknown Source)
>>>>>>
>>>>>> at java.security.AccessController.doPrivileged(*Native Method*)
>>>>>>
>>>>>> at java.net.URLClassLoader.findClass(Unknown Source)
>>>>>>
>>>>>> at java.lang.ClassLoader.loadClass(Unknown Source)
>>>>>>
>>>>>> at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
>>>>>>
>>>>>> at java.lang.ClassLoader.loadClass(Unknown Source)
>>>>>>
>>>>>> ... 6 more
>>>>>>
>>>>>>
>>>>>>
>>>>>> Any help or advise on how to do that would be deeply appreciated!
>>>>>>
>>>>>> Thanx!!
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Sent from Windows Mail
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Soot-list mailing list
>>>>> Soot-list at CS.McGill.CA
>>>>> https://mailman.CS.McGill.CA/mailman/listinfo/soot-list
>>>>> <https://mailman.cs.mcgill.ca/mailman/listinfo/soot-list>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20140721/d1a4aacd/attachment-0003.html
More information about the Soot-list
mailing list