8

ここに投稿するのは初めてなので、何を言ったらいいのか、何を質問したらいいのかよくわかりません。とにかく、主にpingフラッド(自分自身のpingフラッド)に使用される、Javaプログラムからコマンドプロンプトコマンドを実行する単純なJavaプログラムを作成しようとしています。

これが私の現在のコードです

public class Core extends JFrame {

JTextField ipTextField;

int packets = 0;

boolean running = false;

public Core() {
    super("Fatique");

    Container container = getContentPane();
    JButton bAttack = new JButton("Start Attack");
    JButton bStop = new JButton("Stop Attack");
    JPanel jPanel = new JPanel();

    container.setLayout(new FlowLayout());
    ipTextField = new JTextField("IP Address", 30);
    container.add(ipTextField);

    bAttack.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            String input = ipTextField.getText();
            String[] value = input.split(":");

            int amountOfPackets = Integer.parseInt(value[1]);

            exec("cmd /c" + input + " -t -n " + amountOfPackets);
            running = true;
        }
    });

    bStop.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            stop();
        }
    });

    if(!running) {
        jPanel.add(bAttack);
    } else {
        jPanel.add(bStop);
    }

    add(jPanel);
}  

public void exec(String cmd) {
    try {
        Process p = Runtime.getRuntime().exec(cmd);
        System.out.println(getOutput(p) + " - " + getPacketsSent());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public String getOutput(Process p) {
    String output = null;

    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            output = line;
            packets++;
        }

        return output;
    } catch (IOException e) {
        System.err.println(e.getStackTrace());
    }

    return null;
}

public int getPacketsSent() {
    return packets;
}

public void stop() {
    exec("cmd /c break");
    running = false;
}

public static void main(String[] args) {  
    Core c = new Core();
    c.setSize(500, 300);
    c.setVisible(true);
    c.setResizable(false);
    c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    c.setLocationRelativeTo(null);
}

私はJavaが初めてなので、やりたいことがうまくいかないかもしれません。私がやりたいことは、テキストフィールドにIPアドレスを入力し、それを「:」で分割し、その後にパケットの量を入力することです。

127.0.0.1:100

そのIPとパケット量を使用しようとすると、(execメソッドから)「null - 0」が返され、pingに関連する何かが行われたかどうかさえわかりません。

私が達成しようとしているのは、すでに述べたように、自分自身に ping フラッドを送信し、応答として取得したものを出力することです。

 public String getOutput(Process p) {
    String output = null;

    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            output = line;
            packets++;
        }

        return output;
    } catch (IOException e) {
        System.err.println(e.getStackTrace());
    }

    return null;
}

誰かが私のコードコードが私が望むように機能しない理由を説明してもらえますか? 私がすでに言ったように、判断しないでください、私はJavaプログラミングにまったく慣れていません。

編集:これは、私が達成しようとしていることの簡単な「有益な」説明です。

  1. IP アドレスと送信するパケット数を入力します。この説明では、localhost ip と 5 つのパケットを使用しています。 localhost ip に 5 つのパケットを送信しようとしています
  2. 攻撃を開始します。この部分で、プログラムに cmd prompt コマンドを実行させたい

    ping 127.0.0.1 -t -n 5

    127.0.0.1 はプログラムのテキストフィールドに入力した IP で、5 はテキストフィールドに入力したパケットの量です。

  3. 攻撃を開始したので、コマンド プロンプトで次のように表示されます。 locahost に送信された 5 つのパケット

    言語はフィンランド語ですが、それでも同じです。

    これは私が達成しようとしていることの基本的な説明です。うまくいけば、誰かが理解し、私のコードが機能しない理由、または機能しているがEclipseコンソールに適切な行を出力しない理由を教えてくれることを願っています。

4

3 に答える 3

4

getOutput メソッドに問題があります。出力のすべての行を収集するつもりのようです。しかし実際には、 に代入lineしているためoutput、ストリームの終わりの前の最後の行のみを返します。

これを修正するには、変更します

    output = line;

    output += line + "\n";

またはより正確に言うと:

    output += line + LINE_SEPARATOR;

以前に後者を次のように宣言した場所:

    final String LINE_SEPARATOR = System.getProperty("line.separator");

を取得している理由を直接説明するものではnullありませんが、実行しているコマンドが「出力」ストリームではなく「エラー」ストリームに出力を書き込んでいる可能性があります。

于 2013-04-06T15:18:10.303 に答える
0
bAttack.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        String input = ipTextField.getText();
        String[] value = input.split(":");

        int amountOfPackets = Integer.parseInt(value[1]);

        try {
            p=Runtime.getRuntime().exec("ping -n "+amountOfPackets+" "+value[0]);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        running = true;


    }

コードを少し変更するだけです。出力は次のとおりです。

public String getOutput(Process p) {
String output = null;

try {
    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = null;
    while ((line = in.readLine()) != null) {
        output =output+ line+"\n";
        packets++;
    }

    return output;
} catch (IOException e) {
    System.err.println(e.getStackTrace());
}

return null;
}

ここでの出力は、PING プロセスの出力を表示するために取得した JTextArea です。評判が悪いので、出力をお見せできません。

なぜ最初の行が null なのかわかりません。とにかく、それは動作します。

これがお役に立てば幸いです。コーディングをお楽しみください。

于 2014-12-06T10:58:46.460 に答える