org.owasp.jbrofuzz.graph.canvas.HammingDistanceChart.java Source code

Java tutorial

Introduction

Here is the source code for org.owasp.jbrofuzz.graph.canvas.HammingDistanceChart.java

Source

/**
 * JbroFuzz 2.5
 *
 * JBroFuzz - A stateless network protocol fuzzer for web applications.
 * 
 * Copyright (C) 2007 - 2010 subere@uncon.org
 * hardening for version 2.4 by daemonmidi@gmail.com
 * This file is part of JBroFuzz.
 * 
 * JBroFuzz is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * JBroFuzz is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with JBroFuzz.  If not, see <http://www.gnu.org/licenses/>.
 * Alternatively, write to the Free Software Foundation, Inc., 51 
 * Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 * 
 * Verbatim copying and distribution of this entire program file is 
 * permitted in any medium without royalty provided this notice 
 * is preserved. 
 * 
 */
package org.owasp.jbrofuzz.graph.canvas;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.Align;
import org.owasp.jbrofuzz.version.ImageCreator;

public class HammingDistanceChart {

    private static final int MAX_CHARS = 1048576;
    // The x-axis filenames
    private final String[] xData;
    // The y-axis data
    private final double[] yData;
    // The data to be displayed
    private final DefaultCategoryDataset dataset;

    // The hash set with all the characters of the first response
    private final StringBuffer firstSet;

    // Constants
    private final static String END_SIGNATURE = "--jbrofuzz-->\n";

    public HammingDistanceChart() {

        this(0);

    }

    public HammingDistanceChart(final int size) {

        xData = new String[size];
        yData = new double[size];

        dataset = new DefaultCategoryDataset();

        firstSet = new StringBuffer();

    }

    private void calculateFirstSet(final File inputFile) {

        BufferedReader inBuffReader = null;
        try {

            inBuffReader = new BufferedReader(new FileReader(inputFile));

            int counter = 0;
            int check = 0;
            int got;
            while (((got = inBuffReader.read()) > 0) && (counter < MAX_CHARS)) {

                // If we are passed "--jbrofuzz-->\n" in the file
                if (check == END_SIGNATURE.length()) {

                    firstSet.append((char) got);

                }
                // Else find "--jbrofuzz-->\n" using a counter
                else {
                    // Increment the counter for each success
                    if (got == END_SIGNATURE.charAt(check)) {
                        check++;
                    } else {
                        check = 0;
                    }
                }

                counter++;

            }
            inBuffReader.close();

        } catch (final IOException e1) {
            System.out.println("An IOException occurred.");
        } finally {

            IOUtils.closeQuietly(inBuffReader);
        }

    }

    private int calculateValue(final File inputFile) {

        int hammingDistance = 0;

        BufferedReader inBuffReader = null;
        try {

            inBuffReader = new BufferedReader(new FileReader(inputFile));

            // Counter looping through the first response
            int counter1 = 0;
            int counter = 0;
            int check = 0;
            int got;
            while (((got = inBuffReader.read()) > 0) && (counter < MAX_CHARS)) {

                // If we are passed "--jbrofuzz-->\n" in the file
                if (check == END_SIGNATURE.length()) {

                    if (counter1 >= firstSet.length()) {
                        // For each extra character add to the distance
                        hammingDistance++;

                    } else {
                        // The current character is not equal to the
                        // one in the buffer, increment
                        if ((char) got != firstSet.charAt(counter1)) {
                            hammingDistance++;
                        }
                    }

                    counter1++;
                }
                // Else find "--jbrofuzz-->\n" using a counter
                else {
                    // Increment the counter for each success
                    if (got == END_SIGNATURE.charAt(check)) {
                        check++;
                    } else {
                        check = 0;
                    }
                }

                counter++;

            }
            inBuffReader.close();

        } catch (final IOException e1) {
            System.out.println("An IOException occurred.");
        } finally {

            IOUtils.closeQuietly(inBuffReader);

        }

        return hammingDistance;
    }

    public void createFinalPlotCanvas() {

    }

    public ChartPanel getPlotCanvas() {

        final JFreeChart chart = ChartFactory.createBarChart("JBroFuzz Hamming Distance Bar Chart", // chart title
                "File Name", // domain axis label
                "Hamming Distance", // range axis label
                dataset, // data
                PlotOrientation.VERTICAL, // orientation
                false, // include legend
                true, // tooltips?
                true // URLs?
        );

        final Plot plot = chart.getPlot();
        plot.setBackgroundImage(ImageCreator.IMG_OWASP_MED.getImage());
        plot.setBackgroundImageAlignment(Align.TOP_RIGHT);

        final CategoryItemRenderer renderer = chart.getCategoryPlot().getRenderer();
        renderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());

        return new ChartPanel(chart);
    }

    public void setValueAt(final int index, final File inputFile) {

        xData[index] = inputFile.getName();

        if (index == 0) {

            calculateFirstSet(inputFile);
            yData[index] = 0;

        } else {

            yData[index] = calculateValue(inputFile);

        }

        dataset.addValue(yData[index], "Row 1", xData[index]);

    }

}