private void Initialize()
 {
     graph           = new Graph();
     fdg             = new ForceDirected3D(graph, Stiffness, Repulsion, Damping);
     fdg.Threadshold = Threadshold;
     graphRenderer   = new GraphRenderer(this, fdg);
 }
Exemplo n.º 2
0
    // Method for loading the JSON data from the API controller
    private IEnumerator LoadLayout()
    {
        graph = new Graph();

        statusText.text = "Loading radia.json...";

        string rawJson = null;

        //var req = new WWW(apiUrl + "/functions");
        string path_prefix;

        if (SystemInfo.operatingSystem.StartsWith("Win"))
        {
            path_prefix = "\\";
        }
        else
        {
            path_prefix = "/../../";
        }

        //local app path for finding the JSON files
        var req = new WWW("file://" + Application.dataPath + path_prefix + "radia.json");

        yield return(req);

        if (req.error != null)
        {
            statusText.text = "Error reading radia.json";
            return(false);
        }
        rawJson = req.text;

        statusText.text = "Processing Data";

        var j = JSON.Parse(rawJson);

        j = j["functions"];

        for (int i = 0; i < j.Count; i++)
        {
            float x = 0.0f;
            float y = 0.0f;
            float z = 0.0f;

            int category = 0;
            if (j[i]["category"] != null)
            {
                category = int.Parse(j[i]["category"]);
            }

            // (danger << 6) + (string << 5) + (fileio << 4) + (crypto << 3) + (socket << 2) + (heap << 1) + system
            //  64              32              16              8                4              2             1
            Function nodeObject;
            float    scale = 1.0f;
            if ((category & 64) == 64)
            {
                nodeObject = Instantiate(dangerPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 8) == 8)
            {
                nodeObject = Instantiate(cryptoPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 4) == 4)
            {
                nodeObject = Instantiate(socketPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 32) == 32)
            {
                nodeObject = Instantiate(stringPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 16) == 16)
            {
                nodeObject = Instantiate(filePrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
                scale      = 1.5f;
            }
            else if ((category & 1) == 1)
            {
                nodeObject = Instantiate(systemPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 2) == 2)
            {
                nodeObject = Instantiate(heapPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
                scale      = 2.0f;
            }
            else
            {
                nodeObject = Instantiate(defaultPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }

            nodeObject.funcname   = j[i]["name"];
            nodeObject.address    = ulong.Parse(j[i]["address"]);
            nodeObject.attributes = category;
            if (j[i]["size"] != null)
            {
                nodeObject.size = int.Parse(j[i]["size"]);
            }
            else
            {
                nodeObject.size = 0;
            }
            nodeObject.module_name   = j[i]["module_name"];
            nodeObject.functag       = j[i]["tag"];
            nodeObject.comment       = j[i]["comment"];
            nodeObject.longname      = j[i]["long_name"];
            nodeObject.basic_blk_cnt = int.Parse(j[i]["basic_blk_cnt"]);

            if (j[i]["dangerous_list"] != null)
            {
                nodeObject.dangerous_calls = new string[j[i]["dangerous_list"].Count];
                for (int c = 0; c < j[i]["dangerous_list"].Count; c++)
                {
                    nodeObject.dangerous_calls[c] = j[i]["dangerous_list"][c];
                }
            }

            if (j[i]["strings"] != null)
            {
                nodeObject.strings = new string[j[i]["strings"].Count];
                for (int c = 0; c < j[i]["strings"].Count; c++)
                {
                    nodeObject.strings[c] = j[i]["strings"][c];
                }
            }

            nodeObject.transform.localScale += new Vector3(scale, scale, scale);
            nodes.Add(nodeObject.address, nodeObject);

            // For force directed graph
            NodeData data = new NodeData();
            data.label = nodeObject.address.ToString();
            data.mass  = (float)nodeObject.size / 50.0f + 10.0f;
            graph.CreateNode(data);

            statusText.text = "Loading Functions: Function " + nodeObject.funcname;

            if (i % 100 == 0)
            {
                yield return(true);
            }
        }

        j = JSON.Parse(rawJson);
        j = j["callgraph"];


        for (int i = 0; i < j.Count; i++)
        {
            ulong srcid = ulong.Parse(j[i]["source"]);
            ulong dstid = ulong.Parse(j[i]["target"]);

            if (FindDupLink(srcid, dstid))
            {
                continue;
            }

            Link linkObject = Instantiate(linkPrefab, new Vector3(0, 0, 0), Quaternion.identity) as Link;
            linkObject.id       = i + 1;
            linkObject.sourceId = srcid;
            linkObject.targetId = dstid;
            links.Add(linkObject.id, linkObject);

            // For force directed graph
            Node     node1 = graph.GetNode(linkObject.sourceId.ToString());
            Node     node2 = graph.GetNode(linkObject.targetId.ToString());
            EdgeData data  = new EdgeData();
            data.label  = linkObject.sourceId.ToString() + "-" + linkObject.targetId.ToString();
            data.length = 1.0f;
            graph.CreateEdge(node1, node2, data);

            statusText.text = "Loading Callgraph: Call " + linkObject.id.ToString();

            if (i % 100 == 0)
            {
                yield return(true);
            }
        }

        // Map node edges
        MapLinkFunctions();

        // For force directed graph
        physics = new ForceDirected3D(graph,         // instance of Graph
                                      stiffness,     // stiffness of the spring
                                      repulsion,     // node repulsion rate
                                      damping        // damping rate
                                      );
        render = new FDRenderer(physics);
        render.setController(this);

        statusText.text = "";

        Camera.main.transform.LookAt(new Vector3(0f, 0f, 0f));

        renderThread = new Thread(new ThreadStart(FDRenderThread));
        renderThread.Start();
    }
    public void CreateGraph()
    {
        Graph graph = new Graph();

        List <NodeData> nodeDatas = new List <NodeData>();

        for (int i = 0; i <= numberOfNodes; i++)
        {
            NodeData data = new NodeData
            {
                label = $"Node_{i.ToString()}"
            };
            nodeDatas.Add(data);
        }

        graph.CreateNodes(nodeDatas);

        List <Triple <string, string, EdgeData> > edges = new List <Triple <string, string, EdgeData> >
        {
            new Triple <string, string, EdgeData>("3", "13", new EdgeData {
                label = "Edge_3_13"
            }),
            new Triple <string, string, EdgeData>("3", "49", new EdgeData {
                label = "Edge_3_49"
            }),
            new Triple <string, string, EdgeData>("4", "20", new EdgeData {
                label = "Edge_4_20"
            }),
            new Triple <string, string, EdgeData>("4", "28", new EdgeData {
                label = "Edge_4_28"
            }),
            new Triple <string, string, EdgeData>("4", "36", new EdgeData {
                label = "Edge_4_36"
            }),
            new Triple <string, string, EdgeData>("5", "9", new EdgeData {
                label = "Edge_5_9"
            }),
            new Triple <string, string, EdgeData>("5", "25", new EdgeData {
                label = "Edge_5_25"
            }),
            new Triple <string, string, EdgeData>("5", "46", new EdgeData {
                label = "Edge_5_46"
            }),
            new Triple <string, string, EdgeData>("7", "4", new EdgeData {
                label = "Edge_7_4"
            }),
            new Triple <string, string, EdgeData>("8", "33", new EdgeData {
                label = "Edge_8_33"
            }),
            new Triple <string, string, EdgeData>("10", "42", new EdgeData {
                label = "Edge_10_42"
            }),
            new Triple <string, string, EdgeData>("12", "18", new EdgeData {
                label = "Edge_12_18"
            }),
            new Triple <string, string, EdgeData>("12", "30", new EdgeData {
                label = "Edge_12_30"
            }),
            new Triple <string, string, EdgeData>("12", "48", new EdgeData {
                label = "Edge_12_48"
            }),
            new Triple <string, string, EdgeData>("13", "21", new EdgeData {
                label = "Edge_13_21"
            }),
            new Triple <string, string, EdgeData>("15", "8", new EdgeData {
                label = "Edge_15_8"
            }),
            new Triple <string, string, EdgeData>("15", "32", new EdgeData {
                label = "Edge_15_32"
            }),
            new Triple <string, string, EdgeData>("16", "28", new EdgeData {
                label = "Edge_16_28"
            }),
            new Triple <string, string, EdgeData>("16", "41", new EdgeData {
                label = "Edge_16_41"
            }),
            new Triple <string, string, EdgeData>("17", "5", new EdgeData {
                label = "Edge_17_5"
            }),
            new Triple <string, string, EdgeData>("17", "7", new EdgeData {
                label = "Edge_17_7"
            }),
            new Triple <string, string, EdgeData>("17", "40", new EdgeData {
                label = "Edge_17_40"
            }),
            new Triple <string, string, EdgeData>("17", "41", new EdgeData {
                label = "Edge_17_41"
            }),
            new Triple <string, string, EdgeData>("18", "5", new EdgeData {
                label = "Edge_18_5"
            }),
            new Triple <string, string, EdgeData>("18", "29", new EdgeData {
                label = "Edge_18_29"
            }),
            new Triple <string, string, EdgeData>("19", "25", new EdgeData {
                label = "Edge_19_25"
            }),
            new Triple <string, string, EdgeData>("20", "15", new EdgeData {
                label = "Edge_20_15"
            }),
            new Triple <string, string, EdgeData>("20", "19", new EdgeData {
                label = "Edge_20_19"
            }),
            new Triple <string, string, EdgeData>("20", "48", new EdgeData {
                label = "Edge_20_48"
            }),
            new Triple <string, string, EdgeData>("20", "49", new EdgeData {
                label = "Edge_20_49"
            }),
            new Triple <string, string, EdgeData>("21", "14", new EdgeData {
                label = "Edge_21_14"
            }),
            new Triple <string, string, EdgeData>("21", "23", new EdgeData {
                label = "Edge_21_23"
            }),
            new Triple <string, string, EdgeData>("22", "39", new EdgeData {
                label = "Edge_22_39"
            }),
            new Triple <string, string, EdgeData>("23", "1", new EdgeData {
                label = "Edge_23_1"
            }),
            new Triple <string, string, EdgeData>("23", "18", new EdgeData {
                label = "Edge_23_18"
            }),
            new Triple <string, string, EdgeData>("23", "26", new EdgeData {
                label = "Edge_23_26"
            }),
            new Triple <string, string, EdgeData>("23", "38", new EdgeData {
                label = "Edge_23_38"
            }),
            new Triple <string, string, EdgeData>("24", "47", new EdgeData {
                label = "Edge_24_47"
            }),
            new Triple <string, string, EdgeData>("26", "14", new EdgeData {
                label = "Edge_26_14"
            }),
            new Triple <string, string, EdgeData>("27", "12", new EdgeData {
                label = "Edge_27_12"
            }),
            new Triple <string, string, EdgeData>("27", "47", new EdgeData {
                label = "Edge_27_47"
            }),
            new Triple <string, string, EdgeData>("30", "3", new EdgeData {
                label = "Edge_30_3"
            }),
            new Triple <string, string, EdgeData>("30", "44", new EdgeData {
                label = "Edge_30_44"
            }),
            new Triple <string, string, EdgeData>("31", "35", new EdgeData {
                label = "Edge_31_35"
            }),
            new Triple <string, string, EdgeData>("31", "40", new EdgeData {
                label = "Edge_31_40"
            }),
            new Triple <string, string, EdgeData>("33", "27", new EdgeData {
                label = "Edge_33_27"
            }),
            new Triple <string, string, EdgeData>("34", "6", new EdgeData {
                label = "Edge_34_6"
            }),
            new Triple <string, string, EdgeData>("34", "15", new EdgeData {
                label = "Edge_34_15"
            }),
            new Triple <string, string, EdgeData>("35", "17", new EdgeData {
                label = "Edge_35_17"
            }),
            new Triple <string, string, EdgeData>("35", "31", new EdgeData {
                label = "Edge_35_31"
            }),
            new Triple <string, string, EdgeData>("35", "41", new EdgeData {
                label = "Edge_35_41"
            }),
            new Triple <string, string, EdgeData>("36", "14", new EdgeData {
                label = "Edge_36_14"
            }),
            new Triple <string, string, EdgeData>("37", "1", new EdgeData {
                label = "Edge_37_1"
            }),
            new Triple <string, string, EdgeData>("37", "15", new EdgeData {
                label = "Edge_37_15"
            }),
            new Triple <string, string, EdgeData>("37", "25", new EdgeData {
                label = "Edge_37_25"
            }),
            new Triple <string, string, EdgeData>("38", "15", new EdgeData {
                label = "Edge_38_15"
            }),
            new Triple <string, string, EdgeData>("38", "18", new EdgeData {
                label = "Edge_38_18"
            }),
            new Triple <string, string, EdgeData>("38", "44", new EdgeData {
                label = "Edge_38_44"
            }),
            new Triple <string, string, EdgeData>("39", "6", new EdgeData {
                label = "Edge_39_6"
            }),
            new Triple <string, string, EdgeData>("39", "36", new EdgeData {
                label = "Edge_39_36"
            }),
            new Triple <string, string, EdgeData>("39", "49", new EdgeData {
                label = "Edge_39_49"
            }),
            new Triple <string, string, EdgeData>("41", "5", new EdgeData {
                label = "Edge_41_5"
            }),
            new Triple <string, string, EdgeData>("41", "6", new EdgeData {
                label = "Edge_41_6"
            }),
            new Triple <string, string, EdgeData>("41", "17", new EdgeData {
                label = "Edge_41_17"
            }),
            new Triple <string, string, EdgeData>("41", "46", new EdgeData {
                label = "Edge_41_46"
            }),
            new Triple <string, string, EdgeData>("42", "18", new EdgeData {
                label = "Edge_42_18"
            }),
            new Triple <string, string, EdgeData>("42", "40", new EdgeData {
                label = "Edge_42_40"
            }),
            new Triple <string, string, EdgeData>("42", "46", new EdgeData {
                label = "Edge_42_46"
            }),
            new Triple <string, string, EdgeData>("43", "12", new EdgeData {
                label = "Edge_43_12"
            }),
            new Triple <string, string, EdgeData>("43", "22", new EdgeData {
                label = "Edge_43_22"
            }),
            new Triple <string, string, EdgeData>("43", "26", new EdgeData {
                label = "Edge_43_26"
            }),
            new Triple <string, string, EdgeData>("43", "39", new EdgeData {
                label = "Edge_43_39"
            }),
            new Triple <string, string, EdgeData>("44", "37", new EdgeData {
                label = "Edge_44_37"
            }),
            new Triple <string, string, EdgeData>("45", "19", new EdgeData {
                label = "Edge_45_19"
            }),
            new Triple <string, string, EdgeData>("45", "49", new EdgeData {
                label = "Edge_45_49"
            }),
            new Triple <string, string, EdgeData>("47", "2", new EdgeData {
                label = "Edge_47_2"
            }),
            new Triple <string, string, EdgeData>("47", "11", new EdgeData {
                label = "Edge_47_11"
            }),
            new Triple <string, string, EdgeData>("47", "41", new EdgeData {
                label = "Edge_47_41"
            }),
            new Triple <string, string, EdgeData>("48", "11", new EdgeData {
                label = "Edge_48_11"
            }),
            new Triple <string, string, EdgeData>("48", "40", new EdgeData {
                label = "Edge_48_40"
            }),
            new Triple <string, string, EdgeData>("48", "46", new EdgeData {
                label = "Edge_48_46"
            }),
            new Triple <string, string, EdgeData>("49", "0", new EdgeData {
                label = "Edge_49_0"
            }),
            new Triple <string, string, EdgeData>("49", "17", new EdgeData {
                label = "Edge_49_17"
            }),
            new Triple <string, string, EdgeData>("49", "37", new EdgeData {
                label = "Edge_49_37"
            })
        };

        graph.CreateEdges(edges);

        ForceDirected3D m_fdgPhysics = new ForceDirected3D(graph, stiffness, repulsion, damping);

        m_fdgPhysics.Threadshold = threadshold;

        if (graphRenderer != null)
        {
            graphRenderer.Clear();
        }

        graphRenderer = new Renderer(m_fdgPhysics);

        foreach (var edge in graph.edges)
        {
            Debug.Log(edge.ToString());
        }

        //float timeStep = 0.05f;
        //graphRenderer.Draw(timeStep);
    }
Exemplo n.º 4
0
    // Method for loading the JSON data from the API controller
    private IEnumerator LoadLayout()
    {
        graph = new Graph();

        statusText.text = "Loading radia.json...";

        string rawJson = null;

        //var req = new WWW(apiUrl + "/functions");
        string path_prefix;
        if (SystemInfo.operatingSystem.StartsWith ("Win")) {
            path_prefix = "\\";
        } else {
            path_prefix = "/../../";
        }

        //local app path for finding the JSON files
        var req = new WWW ("file://" + Application.dataPath + path_prefix + "radia.json");
        yield return req;
        if (req.error != null) {
            statusText.text = "Error reading radia.json";
            return false;
        }
        rawJson = req.text;

        statusText.text = "Processing Data";

        var j = JSON.Parse(rawJson);
        j = j["functions"];

        for(int i = 0; i < j.Count; i++) {
            float x = 0.0f;
            float y = 0.0f;
            float z = 0.0f;

            int category = 0;
            if (j[i]["category"] != null) {
                category = int.Parse(j[i]["category"]);
            }

            // (danger << 6) + (string << 5) + (fileio << 4) + (crypto << 3) + (socket << 2) + (heap << 1) + system
            //  64              32              16              8                4              2             1
            Function nodeObject;
            float scale = 1.0f;
            if ((category & 64) == 64) {
                nodeObject = Instantiate(dangerPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 8) == 8) {
                nodeObject = Instantiate(cryptoPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 4) == 4) {
                nodeObject = Instantiate(socketPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 32) == 32) {
                nodeObject = Instantiate(stringPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 16) == 16) {
                nodeObject = Instantiate(filePrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
                scale = 1.5f;
            }
            else if ((category & 1) == 1) {
                nodeObject = Instantiate(systemPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }
            else if ((category & 2) == 2) {
                nodeObject = Instantiate(heapPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
                scale = 2.0f;
            } else {
                nodeObject = Instantiate(defaultPrefab, new Vector3(x, y, z), Quaternion.identity) as Function;
            }

            nodeObject.funcname = j[i]["name"];
            nodeObject.address = ulong.Parse(j[i]["address"]);
            nodeObject.attributes = category;
            if (j[i]["size"] != null) {
                nodeObject.size = int.Parse(j[i]["size"]);
            } else {
                nodeObject.size = 0;
            }
            nodeObject.module_name   = j[i]["module_name"];
            nodeObject.functag		 = j[i]["tag"];
            nodeObject.comment		 = j[i]["comment"];
            nodeObject.longname		 = j[i]["long_name"];
            nodeObject.basic_blk_cnt = int.Parse(j[i]["basic_blk_cnt"]);

            if (j[i]["dangerous_list"] != null) {
                nodeObject.dangerous_calls = new string[j[i]["dangerous_list"].Count];
                for (int c = 0; c < j[i]["dangerous_list"].Count; c++) {
                    nodeObject.dangerous_calls[c] = j[i]["dangerous_list"][c];
                }
            }

            if (j[i]["strings"] != null) {
                nodeObject.strings = new string[j[i]["strings"].Count];
                for (int c = 0; c < j[i]["strings"].Count; c++) {
                    nodeObject.strings[c] = j[i]["strings"][c];
                }
            }

            nodeObject.transform.localScale += new Vector3(scale, scale, scale);
            nodes.Add(nodeObject.address, nodeObject);

            // For force directed graph
            NodeData data = new NodeData();
            data.label = nodeObject.address.ToString();
            data.mass = (float)nodeObject.size / 50.0f + 10.0f;
            graph.CreateNode(data);

            statusText.text = "Loading Functions: Function " + nodeObject.funcname;

            if(i % 100 == 0)
                yield return true;
        }

        j = JSON.Parse(rawJson);
        j = j["callgraph"];

        for(int i = 0; i < j.Count; i++) {
            ulong srcid = ulong.Parse(j[i]["source"]);
            ulong dstid = ulong.Parse(j[i]["target"]);

            if (FindDupLink (srcid, dstid)) {
                continue;
            }

            Link linkObject = Instantiate(linkPrefab, new Vector3(0, 0, 0), Quaternion.identity) as Link;
            linkObject.id       = i+1;
            linkObject.sourceId = srcid;
            linkObject.targetId = dstid;
            links.Add(linkObject.id, linkObject);

            // For force directed graph
            Node node1 = graph.GetNode(linkObject.sourceId.ToString());
            Node node2 = graph.GetNode(linkObject.targetId.ToString());
            EdgeData data = new EdgeData();
            data.label = linkObject.sourceId.ToString()+"-"+linkObject.targetId.ToString();
            data.length = 1.0f;
            graph.CreateEdge(node1, node2, data);

            statusText.text = "Loading Callgraph: Call " + linkObject.id.ToString();

            if(i % 100 == 0)
                yield return true;
        }

        // Map node edges
        MapLinkFunctions();

        // For force directed graph
        physics = new ForceDirected3D(graph, // instance of Graph
                                      stiffness, // stiffness of the spring
                                      repulsion, // node repulsion rate
                                      damping    // damping rate
                                     );
        render = new FDRenderer(physics);
        render.setController(this);

        statusText.text = "";

        Camera.main.transform.LookAt (new Vector3 (0f, 0f, 0f));

        renderThread = new Thread(new ThreadStart(FDRenderThread));
        renderThread.Start ();
    }