从寒假就开始看他的程序,寒假里边没有怎么搞明白,又冷,手生冻疮了。回来以后,从头开始看吧,分析那一部分不是很明白,但是看到后来,检测漏洞的时候,我想暂时不管它存储的结构什么,反正都是Node之类的东西,看他是怎么检测的,有的细节地方那个暂时翻过去,结果感觉比前边analysze部分简单得多了,连那些存储结构什么的都明白些了。
当然也看他的论文,论文换了一个寒假看完,没弄明白,像Cfg这些东西在论文中有,但是显示不出来,没有直观的感觉,不爽。所以这两天忙着弄了个GUI界面来显示这个Cfg控制流图,麻烦了一点,不过总算是出来了,看看好像也没有多大问题,献丑在这里了。另外,本来是自己使用的,有的地方考虑不周也无所谓,自己再调调就行了。
共有3个文件,第一个是Coor.java,保存每个节点的坐标以及其子节点坐标:
package at.ac.tuwien.infosys.www.pixy;
import java.util.*;
public class Coor
{
private int x;
private int y;
private ListCoor> coors;
public Coor(int x, int y)
{
this.coors = new LinkedListCoor>();
this.x = x;
this.y = y;
}
public int getX()
{
return this.x;
}
public int getY()
{
return this.y;
}
public ListCoor> getCoors()
{
return this.coors;
}
public void addCoor(Coor coor)
{
this.coors.add(coor);
}
public boolean equals(Coor coor)
{
if (coor.getX()==this.x && coor.getY()==y)
{
return true;
}
return false;
}
public boolean contains(Coor c)
{
for (Coor coor : this.coors)
{
if (coor.getX()==c.getX() && coor.getY()==c.getY())
{
return true;
}
}
return false;
}
}
第二个是DrawPanel.java,负责画图的组件:
package at.ac.tuwien.infosys.www.pixy;
import at.ac.tuwien.infosys.www.pixy.conversion.Cfg;
import at.ac.tuwien.infosys.www.pixy.conversion.nodes.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
*
* @author Administrator
*/
public class DrawPanel extends JPanel
{
private java.util.ListCfgNode> cfgList;
private java.util.ListCoor> coorList;
/** Creates a new instance of OvalJPanel */
public DrawPanel(java.util.ListCfgNode> cfgList, java.util.ListCoor> coorList)
{
this.cfgList = cfgList;
this.coorList = coorList;
}
//在面板上绘制图形
public void paintComponent(Graphics g)
{
for (int i=0 ;ithis.cfgList.size() ;i++ )
{
CfgNode cfgNode = this.cfgList.get(i);
Coor coor = this.coorList.get(i);
int x = coor.getX();
int y = coor.getY();
g.setColor(Color.red);
g.drawOval(x-50, y-15, 100, 30);
g.setColor(Color.blue);
g.drawString(cfgNode.toString(), x-30, y-5);
g.drawString("Loc :" + String.valueOf(cfgNode.getOrigLineno()), x, y+10);
java.util.ListCoor> coors = coor.getCoors();
for (Coor c : coors)
{
int cx = c.getX();
int cy = c.getY();
g.setColor(Color.black);
if (c.equals(coor))
{
g.setColor(Color.yellow);
}
g.drawLine(x, y+15, cx, cy-15);
}
}
}
}
第三个是Draw.java,主控制组件,只需要在Checker中调用该类,传以适当参数(Cfg),就可以了。
package at.ac.tuwien.infosys.www.pixy;
import at.ac.tuwien.infosys.www.pixy.conversion.Cfg;
import at.ac.tuwien.infosys.www.pixy.conversion.nodes.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
/**
*
* @author Administrator
*/
public class Draw {
//声明框架
private JFrame frame = new JFrame("Control Flow Graph");
//声明书签面板
private DrawPanel draw;
private Cfg cfg;
private MapCfgNode, Coor> map;
private java.util.ListCfgNode> cfgList;
private java.util.ListCoor> coorList;
private int startX = 50;
private int startY = 30;
/** Creates a new instance of TabbedJFrame */
public Draw(Cfg cfg) {
//this.map = new TreeMap
this.cfgList = new LinkedListCfgNode>();
this.coorList = new LinkedListCoor>();
this.cfg = cfg;
}
public void show()
{
frame.add(new JScrollPane(new DrawPanel(this.cfgList, this.coorList)), BorderLayout.CENTER);
frame.setSize(1000, 1000);
frame.setLocation(50, 50);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 将Cfg转换为cfgList和coorList.
*/
public void convert()
{
CfgNode node = this.cfg.getHead();
int size = this.cfg.size();
Coor coor = new Coor(startX, startY);
this.cfgList.add(node);
this.coorList.add(coor);
System.out.println(size);
java.util.ListCfgNode> noded = new LinkedListCfgNode>();
for (int i=0 ;isize ;i++ )
{
int n = i;
if (noded.contains(node))
{
n = -1;
for (CfgNode cfgNode : this.cfgList )
{
n++;
if (noded.contains(cfgNode))
{
continue;
}
node = cfgNode;
break;
}
}
noded.add(node);//为了上边的if判断好做,故在此向noded中添加
java.util.ListCfgNode> list = node.getSuccessors();
int len = list.size();
if (len == 0)
{
continue;
}
int k = 0;
coor = this.coorList.get(this.cfgList.indexOf(node));
startY = coor.getY() + 60;
for (CfgNode cfgNode : list)
{
startX = coor.getX() + k*250;
k++;
if (this.cfgList.contains(cfgNode))
{
Coor c = (Coor)this.coorList.get(this.cfgList.indexOf(cfgNode));
if (!coor.contains(c))
{
coor.addCoor(c);
}
continue;
}
coor.addCoor(new Coor(startX, startY));
this.cfgList.add(cfgNode);
this.coorList.add(new Coor(startX, startY));
}
node = list.get(0);//这里取到的CfgNode可能已经分析过了,通过上边的if判断可以从cfgList中另外取一个。
}
}
public void setStartX(int x)
{
this.startX = x;
}
public void setStartY(int y)
{
this.startY = y;
}
public int getStartX()
{
return this.startX;
}
public int getStartY()
{
return this.startY;
}
public void dump()
{
System.out.println("------------------");
for (int i=0 ; ithis.cfgList.size(); i++)
{
CfgNode cfgNode = this.cfgList.get(i);
Coor coor = this.coorList.get(i);
System.out.println(cfgNode.toString() + " "/* + cfgNode.toString()*/ +" " + coor.getX() + " " + coor.getY() + " " + coor.getCoors().size());
}
System.out.println("------------------");
}
public void dumpMap()
{
java.util.ListCfgNode> list = this.cfg.dfPreOrder();
System.out.println("******************");
for (CfgNode node : list)
{
System.out.println(" " + node.toString() + " " + node.getSuccessors().size());
}
System.out.println("******************");
}
public static void main(String [] args)
{
// new Draw();
}
}
可能这个项目还会做很久,中间会不会有些心得继续放到这个懒得管的空间中来呢,期待着。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

SublimeText3 Linux new version
SublimeText3 Linux latest version

Atom editor mac version download
The most popular open source editor

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

SublimeText3 Mac version
God-level code editing software (SublimeText3)