<div dir="ltr">Hi Lokesh,<div><br></div><div>I am very new to the SOOT Framework and Flow-droid. I want to find the flow graph from android apk in my project and I am trying to run the code posted in this thread to do the same. I am trying to run the following command on Ubuntu&nbsp;<br><br>Command :&nbsp;java -cp soot-trunk.jar:soot-infoflow.jar:soot-infoflow-android.jar:slf4j-api-1.7.5.jar:slf4j-simple-1.7.5.jar:axml-2.0.jar -cp .:/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar CFG</div><div><br></div><div>but I am getting Error as :&nbsp;Error: Could not find or load main class CFG</div><div><br></div><div>Could you please tell me the command to execute the CFG program.</div><div><br></div><div>Thank you,</div><div>Monika</div><div><br>On Monday, 21 July 2014 13:46:37 UTC+5:30, LOKESH JAIN  wrote:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir="ltr">Hi all,<div><br></div><div>I resolved the issue and finally i am getting the call graph. Thank you all of you for your time and help. :)</div><div><br></div><div>1. But Stevan I am still curious to know how to work with QueueReader Object for generating dot format.</div>
<div>2. And why the size of call graph for RV2013.apk is 54. And is there any way to remove unnecessary size.</div><div><br></div><div>Thanks&amp;Regards</div><div>Lokesh</div></div><div><br><br><div>
On Mon, Jul 21, 2014 at 11:38 AM, LOKESH JAIN <span dir="ltr">&lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt;</span> wrote:<br><blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div><div dir="ltr"><div dir="ltr">Hi all,</div><div dir="ltr">Steven I still couldn't figure it out how to work with queuereader object for generating dot format.</div><div dir="ltr">

<br></div><div dir="ltr">I have used dot graph class manually as suggested to me by Stefan but,</div><div><div><div>I am getting NullPointerException. I don't know why. I have pasted the complete code.</div>
<div>Please help me out.</div>
<div><br></div><div>Exception in thread "main" java.lang.NullPointerException</div>
<div><span style="white-space:pre-wrap">        </span>at DotGraph.getNode(DotGraph.<wbr>java:53)</div><div><span style="white-space:pre-wrap">        </span>at DotGraph.drawNode(DotGraph.<wbr>java:61)</div><div><span style="white-space:pre-wrap">        </span>at CFG.visit(CFG.java:114)</div>


<div><span style="white-space:pre-wrap">        </span>at CFG.main(CFG.java:94)</div><div><br></div><div><br></div><div>CFG.java</div><div><br></div><div>import java.io.BufferedOutputStream;</div><div>import java.io.FileOutputStream;</div>

<div>
<div>import java.io.IOException;</div><div>import java.io.OutputStream;</div><div>import java.util.Collections;</div></div><div>import java.util.HashMap;</div><div>import java.util.HashSet;</div><div>import java.util.Iterator;</div>

<div>
<div>import java.util.LinkedList;</div><div>import java.util.List;</div><div><br></div><div>import org.xmlpull.v1.<wbr>XmlPullParserException;</div><div><br></div></div><div>import soot.MethodOrMethodContext;</div><div>
<div>import soot.PackManager;</div>
<div>import soot.Scene;</div><div>import soot.SootMethod;</div><div>import soot.jimple.infoflow.android.<wbr>SetupApplication;</div></div><div>import soot.jimple.toolkits.<wbr>callgraph.CallGraph;</div><div>import soot.jimple.toolkits.<wbr>callgraph.Targets;</div>

<div>
<div>import soot.options.Options;</div><div>import soot.util.dot.DotGraphUtility;</div><div>import soot.util.dot.Renderable;</div><div>public class CFG {</div></div><div>private static DotGraph dot = new DotGraph("callgraph");</div>


</div></div><div><span style="white-space:pre-wrap">private static&nbsp;</span>HashMap &lt;String,Boolean&gt; visited = new HashMap&lt;String,Boolean&gt;();<span style="white-space:pre-wrap">        </span></div><div><div>
<div>public CFG() {</div><div><div>
<div><br></div><div><br></div><div>}</div><div><br></div><div>public static void main(String[] args) {</div><div><br></div><div>// TODO Auto-generated method stub</div>
<div><br></div><div>SetupApplication app = new SetupApplication("/home/<wbr>lokesh/Desktop/android-sdk-<wbr>linux/platforms/android-19/<wbr>android.jar","/home/lokesh/<wbr>Desktop/android-<wbr>instrumentation-tutorial-<wbr>master/app-example/RV2013/bin/<wbr>RV2013.apk");</div>


<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span></div><div>try {</div><div><br></div><div>app.<wbr>calculateSourcesSinksEntrypoin<wbr>ts("/home/lokesh/Downloads/<wbr>soot-infoflow-android-develop/<wbr>SourcesAndSinks.txt");</div>


<div><br></div><div><br></div><div>} catch (IOException e) {</div><div><br></div><div>// TODO Auto-generated catch block</div><div><br></div><div>e.printStackTrace();</div><div><br></div><div>} catch (XmlPullParserException e) {</div>


<div><br></div><div>// TODO Auto-generated catch block</div><div><br></div><div>e.printStackTrace();</div><div><br></div><div>}</div><div><br></div><div>soot.G.reset();</div><div><br></div><div>Options.v().set_src_prec(<wbr>Options.src_prec_apk);</div>


<div><br></div><div>Options.v().set_process_dir(<wbr>Collections.singletonList("/<wbr>home/lokesh/Desktop/android-<wbr>instrumentation-tutorial-<wbr>master/app-example/RV2013/bin/<wbr>RV2013.apk"));</div><div><br></div><div>Options.v().set_force_android_<wbr>jar("/home/lokesh/Desktop/<wbr>android-sdk-linux/platforms/<wbr>android-19/android.jar");</div>


<div><br></div><div>Options.v().set_whole_program(<wbr>true);</div><div><br></div><div>Options.v().set_allow_phantom_<wbr>refs(true);</div><div><br></div><div>Options.v().set_output_format(<wbr>Options.output_format_none);</div><div><br>


</div><div>Options.v().setPhaseOption("<wbr>cg.spark verbose:true", "on");</div><div><br></div><div>Scene.v().<wbr>loadNecessaryClasses();</div><div><br></div><div>SootMethod entryPoint = app.getEntryPointCreator().<wbr>createDummyMain();</div>


<div><br></div><div>Options.v().set_main_class(<wbr>entryPoint.getSignature());</div><div><br></div><div>Scene.v().setEntryPoints(<wbr>Collections.singletonList(<wbr>entryPoint));</div><div><br></div><div>System.out.println("..........<wbr>.."+entryPoint.getActiveBody()<wbr>);</div>


<div><br></div><div>PackManager.v().runPacks();</div><div><br></div><div>System.out.println(Scene.v().<wbr>getCallGraph().size());</div></div></div><div><div>CallGraph cg = Scene.v().getCallGraph();</div><div><br></div>
<div>visit(cg, entryPoint);</div>
</div><div>dot.plot("/home/lokesh/<wbr>Desktop/soot1"+ dot.DOT_EXTENSION);</div><div><div><br></div><div>}</div><div>private static void visit(CallGraph cg, SootMethod k)</div><div>{</div><div>String identifier = k.getName();</div>


</div><div><br></div></div></div><div><div><div>visited.put(k.getSignature(),<wbr>true);</div><div><div><br></div><div><br></div><div>dot.drawNode(identifier);</div><div><br></div><div><br>
</div><div>//iterate over unvisited parents</div><div>Iterator&lt;<wbr>MethodOrMethodContext&gt; ptargets = new Targets(cg.edgesInto(k));</div><div><br></div><div><br></div><div>if(ptargets != null){</div><div>while(ptargets.hasNext())</div>


<div>{</div><div>SootMethod p = (SootMethod) ptargets.next();</div><div><br></div><div><br></div><div>if(p == null) System.out.println("p is null");</div><div><br></div><div><br></div><div>if(!visited.containsKey(p.<wbr>getSignature()))</div>


<div>visit(cg,p);</div><div>}</div><div>}</div><div><br></div><div><br></div><div>//iterate over unvisited children</div><div>Iterator&lt;<wbr>MethodOrMethodContext&gt; ctargets = new Targets(cg.edgesOutOf(k));</div><div><br>

</div>
<div><br></div><div>if(ctargets != null){</div><div>while(ctargets.hasNext())</div><div>{</div><div>SootMethod c = (SootMethod) ctargets.next();</div><div>if(c == null) System.out.println("c is null");</div><div>


dot.drawEdge(identifier, c.getName());</div><div><br></div><div><br></div><div>if(!visited.containsKey(c.<wbr>getSignature()))</div><div>visit(cg,c);</div><div>}</div><div>}</div><div>}</div><div>}</div><div><br></div><div><br>


</div><div><br></div><div><br></div></div><div>DotGraph.java</div><div><br></div><div>import java.io.BufferedOutputStream;</div><div>import java.io.FileOutputStream;</div><div>import java.io.IOException;</div><div>import java.io.OutputStream;</div>


<div>import java.util.HashMap;</div><div>import java.util.LinkedList;</div><div>import java.util.List;</div><div><br></div><div>import soot.util.dot.DotGraphEdge;</div><div>import soot.util.dot.DotGraphNode;</div><div>
<div>import soot.util.dot.DotGraphUtility;</div>
<div>import soot.util.dot.Renderable;</div><div><br></div><div>public class DotGraph implements Renderable</div><div>{</div></div><div>public final static String DOT_EXTENSION = ".dot";</div><div>private HashMap&lt;String, DotGraphNode&gt; nodes;</div>

<div>
<div>private boolean isSubGraph;</div><div>private List&lt;Renderable&gt; drawElements;</div><div>private String graphname;</div><div>public DotGraph(String graphname)</div><div>{</div><div>this.drawElements = new LinkedList&lt;Renderable&gt;();</div>


<div>}</div><div>public DotGraph createSubGraph(String label)</div><div>{</div><div>DotGraph subgraph = new DotGraph(label);</div><div>subgraph.isSubGraph = true;</div><div>this.drawElements.add(<wbr>subgraph);</div><div>System.out.println(subgraph);</div>


<div>return subgraph;</div><div>}</div><div>@Override</div><div>public void render(OutputStream out, int indent) throws IOException {</div><div><span style="white-space:pre-wrap">        </span>String graphname = this.graphname;</div>


<div><span style="white-space:pre-wrap">        </span> &nbsp; &nbsp;if (!isSubGraph) {</div><div><span style="white-space:pre-wrap">        </span> &nbsp; &nbsp; &nbsp;DotGraphUtility.renderLine(<wbr>out, "digraph \""+graphname+"\" {", indent);</div>


<div><span style="white-space:pre-wrap">        </span> &nbsp; &nbsp;} else {</div><div>&nbsp;DotGraphUtility.renderLine(<wbr>out, "subgraph \""+graphname+"\" {", indent);</div><div><br></div><div><span style="white-space:pre-wrap">        </span> &nbsp; &nbsp;}</div>


<div><span style="white-space:pre-wrap">        </span></div><div>}</div></div><div>public void plot(String filename) {</div><div>&nbsp; &nbsp; try {</div><div>&nbsp; &nbsp; &nbsp; BufferedOutputStream out =new BufferedOutputStream(new FileOutputStream(filename));</div>


<div>&nbsp; &nbsp; &nbsp; render(out, 0);</div><div>&nbsp; &nbsp; &nbsp; out.close();</div><div>&nbsp; &nbsp; } catch (IOException ioe) {</div><div>&nbsp; &nbsp; }</div><div>&nbsp; }</div><div>public DotGraphNode getNode(String name){</div><div>DotGraphNode node = nodes.get(name);</div>


<div>if (node == null) {</div><div>node = new DotGraphNode(name);</div><div>nodes.put(name, node);</div><div>}</div><div>return node;</div><div>}</div><div>public DotGraphNode drawNode(String name){</div><div>DotGraphNode node = getNode(name);</div>


<div>if(node == null)</div><div>throw new RuntimeException("Assertion failed.");</div><div>if(!this.drawElements.<wbr>contains(node))</div><div>this.drawElements.add(node);</div><div>return node;</div><div>&nbsp; }</div>

<div>
<br></div><div>public DotGraphEdge drawEdge(String from, String to) {</div><div>DotGraphNode src = drawNode(from);</div><div>DotGraphNode dst = drawNode(to);</div><div>DotGraphEdge edge = new DotGraphEdge(src, dst);</div>


<div>this.drawElements.add(edge);</div><div>return edge;</div><div><br></div><div>&nbsp; }</div><div>}&nbsp;</div><div><br></div><div>Thanks &amp; Regards</div><span><font color="#888888"><div>Lokesh</div><div><br></div></font></span></div>
</div></div><div><div>
<div><div><div><br><br>
<div>On Sun, Jul 20, 2014 at 5:10 PM, Stefan Gommer <span dir="ltr">&lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">gom...@informatik.uni-bremen.<wbr>de</a>&gt;</span> wrote:<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<div style="word-wrap:break-word">Hi Lokesh,<div><br></div><div>sorry I misspelled it. Originally it is of type Hash<u><b>Map</b></u>&lt;String,Boolean&gt;.</div><div><br></div><div>You can also use HashSet&lt;String&gt;. In this case you have to use visited.add(k.getSignature());</div>


<div><br></div><div>Regards,</div><div>Stefan</div><div><br></div><div><div><div>Am 20.07.2014 um 13:35 schrieb LOKESH JAIN &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt;:</div>


<div><div><br><blockquote><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:13px">Hi Stefan,</span><div style="font-family:arial,sans-serif;font-size:13px">HashSet&lt;String,Boolean&gt; type is giving error whereas&nbsp;HashSet&lt;String&gt; is correct form. But<br>



</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">then</div><div style="font-family:arial,sans-serif;font-size:13px">visited.put(k.getSignature(),<wbr>true) is giving error.</div>



<div style="font-family:arial,sans-serif;font-size:13px">How do i resolve this?</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px"><font face="arial, sans-serif">Thanks &amp; Regards</font></div>



<div style="font-family:arial,sans-serif;font-size:13px"><div><img origsrc="https://ssl.gstatic.com/ui/v1/icons/mail/images/cleardot.gif"></div></div><span style="font-family:arial,sans-serif;font-size:13px"><font color="#888888">Lokesh</font></span></div>



<div><br><br><div>On Sun, Jul 20, 2014 at 4:52 PM, LOKESH JAIN <span dir="ltr">&lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt;</span> wrote:<br>



<blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Hi Stefan,<div><span style="font-family:arial,sans-serif;font-size:13px">HashSet&lt;String,Boolean&gt; type is giving error whereas&nbsp;</span><span style="font-family:arial,sans-serif;font-size:13px">HashSet&lt;String&gt; is correct form. But</span><br>




</div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">then</span></div><div><span style="font-family:arial,sans-serif;font-size:13px">visited.put(k.getSignature(),<wbr>true) is giving error.</span></div>




<div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><font face="arial, sans-serif">Thanks &amp; Regards</font></div><span><font color="#888888"><div><font face="arial, sans-serif">Lokesh</font></div>



</font></span></div><div><div><div>
<br><br><div>On Sun, Jul 20, 2014 at 4:16 PM, Stefan Gommer <span dir="ltr">&lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">gom...@informatik.uni-bremen.<wbr>de</a>&gt;</span> wrote:<br>




<blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Hi Lokesh,<div><br></div>

<div>visited is of type HashSet&lt;String,Boolean&gt; but can also be any kind of List like HashSet&lt;String&gt;</div>


<div><br></div><div>Regards</div><div>Stefan&nbsp;</div><div><br><div><div>Am 20.07.2014 um 12:44 schrieb LOKESH JAIN &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt;:</div><div>

<br><blockquote><div dir="ltr"><div><div><div>Hey Stefan!<br><br></div>What is the type of "visited" ?<br><br></div>Thanks &amp; Regards<br></div>Lokesh<br></div><div><br><br><div>




On Sun, Jul 20, 2014 at 2:57 PM, Stefan Gommer <span dir="ltr">&lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">gom...@informatik.uni-bremen.<wbr>de</a>&gt;</span> wrote:<br>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Hi Lokesh,<div><br></div>

<div>I did it like this (I skipped the standard soot settings:</div>



<div><br></div><div><div style="margin:0px"><span style="font-family:Monaco;font-size:11px;color:rgb(147,26,104)">private</span> <span style="font-family:Monaco;font-size:11px;color:rgb(147,26,104)">static</span><font face="Monaco"><span style="font-size:11px"> DotGraph </span></font><span style="font-family:Monaco;font-size:11px;color:rgb(3,38,204)">dot</span><font face="Monaco"><span style="font-size:11px"> = </span></font><span style="font-family:Monaco;font-size:11px;color:rgb(147,26,104)">new</span><font face="Monaco"><span style="font-size:11px"> DotGraph(</span></font><span style="font-family:Monaco;font-size:11px;color:rgb(57,51,255)">"CallGraph</span><font color="#3933ff" face="Monaco"><span style="font-size:11px">“</span></font><font face="Monaco"><span style="font-size:11px">);</span></font></div>





<div style="margin:0px"><font face="Monaco"><span style="font-size:11px">...</span></font></div><div style="margin:0px"><div style="font-family:Monaco;font-size:11px;margin:0px">SootMethod entryPoint = app.getEntryPointCreator().<wbr>createDummyMain();</div>





<div style="font-family:Monaco;font-size:11px;margin:0px">…</div><div style="font-family:Monaco;font-size:11px;margin:0px"><div style="margin:0px">PackManager.v().runPacks();</div><div style="margin:0px">CallGraph cg = Scene.v().getCallGraph();</div>





</div><div style="margin:0px"><div style="font-family:Monaco;font-size:11px;margin:0px">visit(cg, entryPoint);</div><div style="font-family:Monaco;font-size:11px;margin:0px">…</div><div style="margin:0px"><div style="font-family:Monaco;font-size:11px;margin:0px;color:rgb(57,51,255)">





<span style="color:rgb(3,38,204)">dot</span><span>.plot(</span>"/Users/neji/Desktop/<wbr>graph"<span>+ </span><span style="color:rgb(3,38,204)">dot</span><span>.</span><span style="text-decoration:underline;color:rgb(3,38,204)">DOT_EXTENSION</span><span>);</span></div>





<div style="margin:0px"><font face="Monaco"><span style="font-size:11px">…</span></font></div><div style="font-family:Monaco;font-size:11px;margin:0px;color:rgb(57,51,255)"><span><br></span></div></div>
<div style="font-family:Monaco;font-size:11px;margin:0px"><br></div><div style="font-family:Monaco;font-size:11px;margin:0px"><div style="margin:0px"><span style="color:rgb(147,26,104)">private</span> <span style="color:rgb(147,26,104)">static</span> <span style="color:rgb(147,26,104)">void</span> visit(CallGraph cg, SootMethod k)</div>





<div style="margin:0px"><span style="white-space:pre-wrap">        </span>{</div><div style="margin:0px"><span style="white-space:pre-wrap">                </span>String identifier = k.getName();</div><div style="margin:0px;min-height:15px">




<span style="white-space:pre-wrap">                </span><br>
</div><div style="margin:0px"><span style="white-space:pre-wrap">                </span><span style="color:rgb(3,38,204)">visited</span>.put(k.getSignature(), <span style="color:rgb(147,26,104)">true</span>);</div><div style="margin:0px;min-height:15px">





<span style="white-space:pre-wrap">                </span><br></div><div style="margin:0px"><span style="white-space:pre-wrap">                </span><span style="color:rgb(3,38,204)">dot</span>.drawNode(identifier);</div><div style="margin:0px;min-height:15px">





<span style="white-space:pre-wrap">                </span><br></div><div style="margin:0px;color:rgb(78,144,114)"><span><span style="white-space:pre-wrap">                </span></span>//iterate over unvisited parents</div><div style="margin:0px">
<span style="white-space:pre-wrap">                </span>Iterator&lt;<wbr>MethodOrMethodContext&gt; ptargets = <span style="color:rgb(147,26,104)">new</span> Targets(cg.edgesInto(k));</div><div style="margin:0px;min-height:15px"><span style="white-space:pre-wrap">                </span><br>





</div><div style="margin:0px"><span style="white-space:pre-wrap">                </span><span style="color:rgb(147,26,104)">if</span>(ptargets != <span style="color:rgb(147,26,104)">null</span>){</div><div style="margin:0px"><span style="white-space:pre-wrap">                        </span><span style="color:rgb(147,26,104)">while</span>(ptargets.hasNext())</div>





<div style="margin:0px"><span style="white-space:pre-wrap">                        </span>{</div><div style="margin:0px"><span style="white-space:pre-wrap">                                </span>SootMethod p = (SootMethod) ptargets.next();</div><div style="margin:0px;min-height:15px">





<span style="white-space:pre-wrap">                                </span><br></div><div style="margin:0px"><span style="white-space:pre-wrap">                                </span><span style="color:rgb(147,26,104)">if</span>(p == <span style="color:rgb(147,26,104)">null</span>) System.<span style="color:rgb(3,38,204)">out</span>.println(<span style="color:rgb(57,51,255)">"p is null"</span>);</div>




<div style="margin:0px;min-height:15px"><span style="white-space:pre-wrap">                                </span><br></div><div style="margin:0px"><span style="white-space:pre-wrap">                                </span><span style="color:rgb(147,26,104)">if</span>(!<span style="color:rgb(3,38,204)">visited</span>.containsKey(p.<wbr>getSignature()))</div>





<div style="margin:0px"><span style="white-space:pre-wrap">                                        </span>visit(cg,p);</div><div style="margin:0px"><span style="white-space:pre-wrap">                        </span>}</div><div style="margin:0px"><span style="white-space:pre-wrap">                </span>}</div>




<div style="margin:0px;min-height:15px"><span style="white-space:pre-wrap">                </span><br></div><div style="margin:0px;color:rgb(78,144,114)"><span><span style="white-space:pre-wrap">                </span></span>//iterate over unvisited children</div>





<div style="margin:0px"><span style="white-space:pre-wrap">                </span>Iterator&lt;<wbr>MethodOrMethodContext&gt; ctargets = <span style="color:rgb(147,26,104)">new</span> Targets(cg.edgesOutOf(k));</div><div style="margin:0px;min-height:15px">





<span style="white-space:pre-wrap">                </span><br></div><div style="margin:0px"><span style="white-space:pre-wrap">                </span><span style="color:rgb(147,26,104)">if</span>(ctargets != <span style="color:rgb(147,26,104)">null</span>){</div>

<div style="margin:0px">



<span style="white-space:pre-wrap">                        </span><span style="color:rgb(147,26,104)">while</span>(ctargets.hasNext())</div><div style="margin:0px"><span style="white-space:pre-wrap">                        </span>{</div><div style="margin:0px"><span style="white-space:pre-wrap">                                </span>SootMethod c = (SootMethod) ctargets.next();</div>





<div style="margin:0px"><span style="white-space:pre-wrap">                                </span><span style="color:rgb(147,26,104)">if</span>(c == <span style="color:rgb(147,26,104)">null</span>) System.<span style="color:rgb(3,38,204)">out</span>.println(<span style="color:rgb(57,51,255)">"c is null"</span>);</div>





<div style="margin:0px"><span style="white-space:pre-wrap">                                </span><span style="color:rgb(3,38,204)">dot</span>.drawEdge(identifier, c.getName());</div><div style="margin:0px;min-height:15px"><span style="white-space:pre-wrap">                                </span><br>





</div><div style="margin:0px"><span style="white-space:pre-wrap">                                </span><span style="color:rgb(147,26,104)">if</span>(!<span style="color:rgb(3,38,204)">visited</span>.containsKey(c.<wbr>getSignature()))</div><div style="margin:0px">

<span style="white-space:pre-wrap">                                        </span>visit(cg,c);</div>



<div style="margin:0px"><span style="white-space:pre-wrap">                        </span>}</div><div style="margin:0px"><span style="white-space:pre-wrap">                </span>}</div><div style="margin:0px"><span style="white-space:pre-wrap">        </span>}</div>





<div style="margin:0px"><br></div><div style="margin:0px"><br></div></div></div></div><div><div>Am 20.07.2014 um 09:44 schrieb LOKESH JAIN &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt;:</div>





<div><br><blockquote><div dir="ltr"><div>I have tried DotGraph class from the soot.util.dot package but it's giving me null pointer exception. Following is the tried code.<br><br></div>I have converted QueueReader object into string as DotGraph takes only string argument. It's getting complicated. Please suggest some simple solution.<br>






<div><div><br>import java.io.IOException;<br>import java.io.OutputStream;<br>import java.util.Collections;<br>import java.util.LinkedList;<br>import java.util.List;<br><br>import org.xmlpull.v1.<wbr>XmlPullParserException;<br>






<br>import soot.PackManager;<br>import soot.Scene;<br>import soot.SootMethod;<br>import soot.jimple.infoflow.android.<wbr>SetupApplication;<br>import soot.options.Options;<br>import soot.util.dot.DotGraphUtility;<br>import soot.util.dot.Renderable;<br>






public class CFG {<br>&nbsp;&nbsp;&nbsp; &nbsp;//private static Map options;<br>&nbsp;&nbsp;&nbsp; static DotGraph dg;<br>public CFG() {<br>//this.options=options;<br>// TODO Auto-generated constructor stub<br><br>}<br>/*public DotGraph createSubGraph(String label)<br>






{<br><br>DotGraph createSubGraph = DotGraph.createSubGraph(Scene.<wbr>v().getCallGraph().listener().<wbr>toString());&nbsp;&nbsp;&nbsp; <br>}*/<br>public static void main(String[] args) {<br><br>// TODO Auto-generated method stub<br><br>SetupApplication app = new SetupApplication("/home/<wbr>lokesh/Desktop/android-sdk-<wbr>linux/platforms/android-19/<wbr>android.jar","/home/lokesh/<wbr>Desktop/android-<wbr>instrumentation-tutorial-<wbr>master/app-example/RV2013/bin/<wbr>RV2013.apk");<br>






&nbsp;&nbsp; <br>try {<br><br>app.<wbr>calculateSourcesSinksEntrypoin<wbr>ts("/home/lokesh/Downloads/<wbr>soot-infoflow-android-develop/<wbr>SourcesAndSinks.txt");<br><br><br>} catch (IOException e) {<br><br>// TODO Auto-generated catch block<br>






<br>e.printStackTrace();<br><br>} catch (XmlPullParserException e) {<br><br>// TODO Auto-generated catch block<br><br>e.printStackTrace();<br><br>}<br><br>soot.G.reset();<br><br>Options.v().set_src_prec(<wbr>Options.src_prec_apk);<br>






<br>Options.v().set_process_dir(<wbr>Collections.singletonList("/<wbr>home/lokesh/Desktop/android-<wbr>instrumentation-tutorial-<wbr>master/app-example/RV2013/bin/<wbr>RV2013.apk"));<br>Options.v().set_force_android_<wbr>jar("/home/lokesh/Desktop/<wbr>android-sdk-linux/platforms/<wbr>android-19/android.jar");<br>






<br>Options.v().set_whole_program(<wbr>true);<br><br>Options.v().set_allow_phantom_<wbr>refs(true);<br><br>Options.v().set_output_format(<wbr>Options.output_format_none);<br><br>Options.v().setPhaseOption("<wbr>cg.spark verbose:true", "on");<br>






<br>Scene.v().<wbr>loadNecessaryClasses();<br><br>SootMethod entryPoint = app.getEntryPointCreator().<wbr>createDummyMain();<br><br>Options.v().set_main_class(<wbr>entryPoint.getSignature());<br><br>Scene.v().setEntryPoints(<wbr>Collections.singletonList(<wbr>entryPoint));<br>






<br>System.out.println("..........<wbr>.."+entryPoint.getActiveBody()<wbr>);<br><br>PackManager.v().runPacks();<br><br>System.out.println(Scene.v().<wbr>getCallGraph().size());<br>String label = Scene.v().getCallGraph().<wbr>listener().toString();<br>






dg.createSubGraph(label);<br>}<br>}<br><br>import java.io.IOException;<br>import java.io.OutputStream;<br>import java.util.LinkedList;<br>import java.util.List;<br><br>import soot.util.dot.DotGraphUtility;<br>import soot.util.dot.Renderable;<br>






<br>public class DotGraph implements Renderable<br>{<br>private boolean isSubGraph;<br>private List&lt;Renderable&gt; drawElements;<br>private String graphname;<br>public DotGraph(String graphname)<br>{<br>this.drawElements = new LinkedList&lt;Renderable&gt;();<br>






}<br>public DotGraph createSubGraph(String label)<br>{<br>DotGraph subgraph = new DotGraph(label);<br>subgraph.isSubGraph = true;<br>this.drawElements.add(<wbr>subgraph);<br>System.out.println(subgraph);<br>return subgraph;<br>






}<br>@Override<br>public void render(OutputStream out, int indent) throws IOException {<br>&nbsp;&nbsp;&nbsp; String graphname = this.graphname;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!isSubGraph) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DotGraphUtility.renderLine(<wbr>out, "digraph \""+graphname+"\" {", indent);<br>






&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {<br>&nbsp;DotGraphUtility.renderLine(<wbr>out, "subgraph \""+graphname+"\" {", indent);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>}<br>} <br><br></div><div>Thanks &amp; Regards<br></div><div>Lokesh<br>






</div></div></div><div><br><br><div>On Sat, Jul 19, 2014 at 10:57 PM, Stefan Gommer <span dir="ltr">&lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">gommer...@googlemail.com</a>&gt;</span> wrote:<br>






<blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div style="word-wrap:break-word">Hi Lokesh,<div><br></div>

<div>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.</div>




<div><br></div><div>Stefan</div><div><br></div><div><br><div><div>Am 19.07.2014 um 15:16 schrieb LOKESH JAIN &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt;:</div><br><blockquote>






<div><div dir="ltr">Hi Steven,<div><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:15px">this Scene.v().getCallgraph().</span><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:15px">liste<wbr>ner() 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.&nbsp;</span><br>







</div><div><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:15px"><br></span></div><div><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:15px">1. Please can you tell me how do i print a dot file out of QueueReader object?</span></div>







<div><br></div><div><font color="#1f497d" face="Calibri, sans-serif"><span style="font-size:15px">Also I am getting the call graph size as 54 for the general example apk "RV2013.apk".</span></font></div><div><font color="#1f497d" face="Calibri, sans-serif"><span style="font-size:15px"><br>







</span></font></div><div><font color="#1f497d" face="Calibri, sans-serif"><span style="font-size:15px">2. How come call graph size is 54?</span></font></div><div><span style="color:rgb(31,73,125);font-family:Calibri,sans-serif;font-size:15px"><br>







</span></div></div><div><br><br><div>On Fri, Jul 18, 2014 at 9:37 PM, Steven Arzt <span dir="ltr">&lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">Steve...@cased.de</a>&gt;</span> wrote:<br>







<blockquote style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="DE"><p>

<span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Hi Lokesh,<u></u><u></u></span></p>
<p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u>&nbsp;<u></u></span></p><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">You can manually iterate over the callgraph using Scene.v().getCallgraph().<wbr>listener() and print it out in dot format &nbsp;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 &nbsp;the dot visualizer for callgraphs.<u></u><u></u></span></p>


<p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US"><u></u>&nbsp;<u></u></span></p><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">Afterwards, you can visualize the dot file using GraphViz.<u></u><u></u></span></p>


<p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US"><u></u>&nbsp;<u></u></span></p><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">Best regards,<u></u><u></u></span></p>


<p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">&nbsp; Steven<u></u><u></u></span></p><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u>&nbsp;<u></u></span></p>


<p><b><span style="font-size:10pt;font-family:Tahoma,sans-serif">Von:</span></b><span style="font-size:10pt;font-family:Tahoma,sans-serif"> LOKESH JAIN [mailto:<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a><wbr>] <br>







<b>Gesendet:</b> Freitag, 18. Juli 2014 18:04<br><b>An:</b> Steven Arzt<br><b>Cc:</b> Modhi Alsobiehy; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@cs.mcgill.ca</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@sable.mcgill.ca</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@googlegroups.com</a></span></p>







<div><br><b>Betreff:</b> Re: [Soot-list] Generating Android APK CallFlowGraph<u></u><u></u></div><div><br></div><div><p><u></u>&nbsp;<u></u></p><div><div><p>Hi,<u></u><u></u></p>

</div><p>A gentle reminder. Please reply fast. I need it for my research project.<u></u><u></u></p><div><p><u></u>&nbsp;<u></u></p></div><div><p>Regards<u></u><u></u></p></div>







<div><p>Lokesh<u></u><u></u></p></div></div><div><p style="margin-bottom:12pt"><u></u>&nbsp;<u></u></p><div><p>On Thu, Jul 17, 2014 at 9:21 PM, LOKESH JAIN &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt; wrote:<u></u><u></u></p>







<div><div><div><p style="margin-bottom:12pt">Thanks a lot Steven and Modhi. It worked.<u></u><u></u></p></div><div><p>It is showing call graph in words. How can I graphically see the call graph for apk files as we see for java files??<u></u><u></u></p>







</div><div><p><u></u>&nbsp;<u></u></p></div><p>Regards<u></u><u></u></p></div><p><span><span style="color:rgb(136,136,136)">Lokesh Jain</span></span><u></u><u></u></p></div>

<div>
<div><p style="margin-bottom:12pt"><u></u>&nbsp;<u></u></p><div><p>On Thu, Jul 17, 2014 at 6:11 PM, Steven Arzt &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">Steve...@cased.de</a>&gt; wrote:<u></u><u></u></p>







<div><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Hi Lokesh,</span><u></u><u></u></p><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">&nbsp;</span><u></u><u></u></p>


<p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">It seems that you are missing the axml-2.0.jar library on your Java classpath.</span><u></u><u></u></p>
<p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">&nbsp;</span><u></u><u></u></p><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">Best regards,</span><u></u><u></u></p>


<p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">&nbsp; Steven</span><u></u><u></u></p><p><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)" lang="EN-US">&nbsp;</span><u></u><u></u></p>







<div><div style="border-style:solid none none;border-top-color:rgb(181,196,223);border-top-width:1pt;padding:3pt 0cm 0cm"><p><b><span style="font-size:10pt;font-family:Tahoma,sans-serif">Von:</span></b><span style="font-size:10pt;font-family:Tahoma,sans-serif"> <a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot-lis...@CS.McGill.CA</a> [mailto:<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot-lis...@CS.<wbr>McGill.CA</a>] <b>Im Auftrag von </b>Modhi Alsobiehy<br>







<b>Gesendet:</b> Donnerstag, 17. Juli 2014 14:39<br><b>An:</b> LOKESH JAIN<br><b>Cc:</b> <a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@cs.mcgill.ca</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@sable.mcgill.ca</a>; <a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">soot...@googlegroups.com</a><br>







<b>Betreff:</b> Re: [Soot-list] Generating Android APK CallFlowGraph</span><u></u><u></u></p></div></div><div><p>&nbsp;<u></u><u></u></p><div><div><p>Hi Lokesh,<u></u><u></u></p></div><div>


<p style="margin-bottom:12pt"><u></u>&nbsp;<u></u></p></div><div><p>Open the folder of your project and add the call back file into it.<u></u><u></u></p></div><p>&nbsp;<u></u><u></u></p>







<div><p>-Best,<u></u><u></u></p></div><div><p>Modhi<u></u><u></u></p></div></div><div><p style="margin-bottom:12pt"><br>On Jul 17, 2014, at 12:03 PM, "LOKESH JAIN" &lt;<a href="javascript:" target="_blank" gdf-obfuscated-mailto="dCqHX7WoSGoJ" rel="nofollow" onmousedown="this.href='javascript:';return true;" onclick="this.href='javascript:';return true;">lokesh...@gmail.com</a>&gt; wrote:<u></u><u></u></p>







</div><blockquote style="margin-top:5pt;margin-bottom:5pt"><p>Hi all,<br><br>Modhi, I am using your code for generating call graph for apk file. But, I am getting following error<br>&nbsp;<br>Exception in thread "main" java.lang.<wbr>NoClassDefFoundError: pxb/android/axml/NodeVisitor<br>







&nbsp;&nbsp;&nbsp; at soot.jimple.infoflow.android.<wbr>manifest.ProcessManifest.<wbr>handle(Unknown Source)<br>&nbsp;&nbsp;&nbsp; at soot.jimple.infoflow.android.<wbr>manifest.ProcessManifest.&lt;<wbr>init&gt;(Unknown Source)<br>&nbsp;&nbsp;&nbsp; at soot.jimple.infoflow.android.<wbr>manifest.ProcessManifest.&lt;<wbr>init&gt;(Unknown Source)<br>







&nbsp;&nbsp;&nbsp; at soot.jimple.infoflow.android.<wbr>SetupApplication.<wbr>calculateSourcesSinksEntrypoin<wbr>ts(Unknown Source)<br>&nbsp;&nbsp;&nbsp; at soot.jimple.infoflow.android.<wbr>SetupApplication.<wbr>calculateSourcesSinksEntrypoin<wbr>ts(Unknown Source)<br>&nbsp;&nbsp;&nbsp; at CFG.main(CFG.java:33)<br>







Caused by: java.lang.<wbr>ClassNotFoundException: pxb.android.axml.NodeVisitor<br>&nbsp;&nbsp;&nbsp; at java.net.URLClassLoader$1.run(<wbr>URLClassLoader.java:366)<br>&nbsp;&nbsp;&nbsp; at java.net.URLClassLoader$1.run(<wbr>URLClassLoader.java:355)<br>&nbsp;&nbsp;&nbsp; at java.security.<wbr>AccessController.doPrivileged(<wbr>Native Method)<br>







&nbsp;&nbsp;&nbsp; at java.net.URLClassLoader.<wbr>findClass(URLClassLoader.java:<wbr>354)<br>&nbsp;&nbsp;&nbsp; at java.lang.ClassLoader.<wbr>loadClass(ClassLoader.java:<wbr>425)<br>&nbsp;&nbsp;&nbsp; at sun.misc.Launcher$<wbr>AppClassLoader.loadClass(<wbr>Launcher.java:308)<br>&nbsp;&nbsp;&nbsp; at java.lang.ClassLoader.<wbr>loadClass(ClassLoader.java:<wbr>358)<br>







&nbsp;&nbsp;&nbsp; ... 6 more<br><br>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.<br>







Any help would be appreciated. Thank You<br>Regards<br>Lokesh<br><br><br>On Saturday, 5 July 2014 23:04:49 UTC+5:30, Modhi Alsobiehy wrote:<u></u><u></u></p><div><div><p><span style="font-family:Calibri,sans-serif">Hi all,</span><u></u><u></u></p>







</div><div><p><span style="font-family:Calibri,sans-serif">I need to traverse the call flow graph of android apps( apk files).</span><u></u><u></u></p></div><div><p>





<span style="font-family:Calibri,sans-serif">I understand that I must set an entry point so to start,&nbsp;I tried the following code :</span><u></u><u></u></p></div><div><p><span style="font-family:Calibri,sans-serif">&nbsp;</span><u></u><u></u></p>







</div><div><p><span style="font-family:Calibri,sans-serif">---------------------</span></p></div></div></blockquote></div></div></div></div></div></div></div></div></div></blockquote></div></div></div></blockquote></div></div></div></blockquote></div></div></blockquote></div></div></div></div></blockquote></div></div></blockquote></div></div></div></div></blockquote></div></div></div></div></blockquote></div></div></blockquote></div></div></div></div></div></blockquote></div></div></div></div></div></div></div></div></blockquote></div></div>...</blockquote></div></div>