Creating Control Flow Diagram from Java Class files Using Soot.
In order to create control flow diagram you need to convert Java class file into dot files by using control flow viewer soot tool. You can get HelloWorld.java file from previous posts(here). Convert it in to class file and type following commands on command prompt inside soot directory where HelloWorld is located:
>Java soot.tools.CFGViewer HelloWorld
And if you do not set classpath then type following inside soot directory where HelloWorld and soot jars are located:
>Java -cp soot-2.5.0.jar soot.tools.CFGViewer HelloWorld
you will see following if it succeed:
It will create graphical representation of control flow graph of dot file format for each method from the class files.
Java.lang.String[] Method:
digraph
"void main(java.lang.String[])" {
label="void main(java.lang.String[])";
node [shape=box];
"0" [style=filled,fillcolor=gray,label="r0 := @parameter0",];
"1" [label="$r1 = new HelloWorld",];
"0"->"1";
"2" [label="specialinvoke $r1.<init>()",];
"1"->"2";
"3" [label="HelloWorld.helloObj = $r1",];
"2"->"3";
"4" [label="$r2 = java.lang.System.out",];
"3"->"4";
"5" [label="$r3 = HelloWorld.helloObj",];
"4"->"5";
"6" [label="$r4 = $r3.printMessage()",];
"5"->"6";
"7" [label="$r2.println($r4)",];
"6"->"7";
"8" [style=filled,fillcolor=lightgray,label="return",];
"7"->"8";
}
label="void main(java.lang.String[])";
node [shape=box];
"0" [style=filled,fillcolor=gray,label="r0 := @parameter0",];
"1" [label="$r1 = new HelloWorld",];
"0"->"1";
"2" [label="specialinvoke $r1.<init>()",];
"1"->"2";
"3" [label="HelloWorld.helloObj = $r1",];
"2"->"3";
"4" [label="$r2 = java.lang.System.out",];
"3"->"4";
"5" [label="$r3 = HelloWorld.helloObj",];
"4"->"5";
"6" [label="$r4 = $r3.printMessage()",];
"5"->"6";
"7" [label="$r2.println($r4)",];
"6"->"7";
"8" [style=filled,fillcolor=lightgray,label="return",];
"7"->"8";
}
digraph
"java.lang.String printMessage()" {
label="java.lang.String printMessage()";
node [shape=box];
"0" [style=filled,fillcolor=gray,label="r0 := @this",];
"1" [label="$r1 = r0.output",];
"0"->"1";
"2" [style=filled,fillcolor=lightgray,label="return $r1",];
"1"->"2";
}
label="java.lang.String printMessage()";
node [shape=box];
"0" [style=filled,fillcolor=gray,label="r0 := @this",];
"1" [label="$r1 = r0.output",];
"0"->"1";
"2" [style=filled,fillcolor=lightgray,label="return $r1",];
"1"->"2";
}
I get "Error: Could not find or load main class soot.tools.CFGViewer"
ReplyDelete[soot is installed as a plugin for eclipse, not sure if that matters]
I also set my "soot" environmental variable to soot-trunk.jar
The plugin doesn't matter, you haven't set path right- please follow the installation guide for more details: https://analysisapp.blogspot.com/2015/08/static-analysis-of-android-applications_20.html and test
Delete