Java, schowek i brute force

Potrzebuję programu, który będzie wszystkie możliwe kombinacje wybranych znaków wklejał w odpowiednie miejsce i zatwierdzał enterem. Poszukałem trochę w googlach i mimo, że wcześniej nie miałem okazji pisać w javie, udało mi się złożyć coś takiego:

import java.util.Arrays;

import java.awt.AWTException;

import java.awt.event.KeyEvent;

import java.awt.Robot;

import java.awt.datatransfer.Clipboard;

import java.awt.datatransfer.ClipboardOwner;

import java.awt.datatransfer.Transferable;

import java.awt.datatransfer.StringSelection;

import java.awt.datatransfer.DataFlavor;

import java.awt.datatransfer.UnsupportedFlavorException;

import java.awt.Toolkit;

import java.io.*;


public class BruteForce {

public static void setClipboard(String str) {

    StringSelection ss = new StringSelection(str);

    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);

}

	public static void main(String[] args) {

		String password = "PA3[";

		char[] charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ[]".toCharArray();

		BruteForce bf = new BruteForce(charset, 12);

		String attempt = bf.toString();

		while (true) {

			if (attempt.equals(password)) { 

				System.out.println("Password Found: " + attempt);

				break;

			}

			attempt = bf.toString();

			//System.out.println("key: " + attempt);

			setClipboard(attempt);

			try {

            Robot robot = new Robot();

			robot.delay(100);

			robot.keyPress(KeyEvent.VK_CONTROL);

			robot.keyPress(KeyEvent.VK_V);

			robot.keyRelease(KeyEvent.VK_V);

			robot.keyRelease(KeyEvent.VK_CONTROL);

			robot.keyPress(KeyEvent.VK_ENTER);

			robot.keyRelease(KeyEvent.VK_ENTER);

			} 

			catch (AWTException e) {

            e.printStackTrace();

			}	

			bf.increment();

		}

	}


	private char[] cs;	// Character Set

	private char[] cg;	// Current Guess


	public BruteForce(char[] characterSet, int guessLength) {

		cs = characterSet;

		cg = new char[guessLength];

		Arrays.fill(cg, cs[0]);

	}


	public void increment() {

		int index = cg.length - 1;

		while(index >= 0) {

			if (cg[index] == cs[cs.length-1]) {

				if (index == 0) {

					cg = new char[cg.length+1];

					Arrays.fill(cg, cs[0]);

					break;

				} else {

					cg[index] = cs[0];

					index--;

				}

			} else {

				cg[index] = cs[Arrays.binarySearch(cs, cg[index]) + 1];

				break;

			}

		}

	}


	public String toString() {

		return String.valueOf(cg);

	}

}

Wiem, że zostawiłem kilka niepotrzebnych rzeczy, ale nie chciało mi się ich usuwać. Ważne, że działa. A raczej prawie działa, bo po wklejeniu kilku (3-4) wyników dostaję

Exception in thread "main" java.lang.IllegalStateException: cannot open system clipboard

        at sun.awt.windows.WClipboard.openClipboard(Native Method)

        at sun.awt.windows.WClipboard.setContentsNative(Unknown Source)

        at sun.awt.datatransfer.SunClipboard.setContents(Unknown Source)

        at BruteForce.setClipboard(BruteForce.java:17)

        at BruteForce.main(BruteForce.java:31)

Wygląda na to, że program zbyt szybko używa schowka. Jednak nawet po sporym spowolnieniu go (robot.delay(5000):wink: błąd występuje nadal. Czy da się coś z tym zrobić? I czy w javie da się bezpośrednio wyrzucać stringa do dowolnego, innego okna (np. notatnik) bez użycia schowka? Myślałem o tym, żeby zrobić to Robotem (naciskanie po kolei każdego klawisza poszczególnego wyniku) ale jakoś nie mam pomysłu jak się za to zabrać… Proszę o pomoc.

Witam,

Czyżbyś chciał zapuścić brute force’a na zarejestrowanie jakiegoś programu? :slight_smile: Bo rozumiem, że stąd ten wymóg do wklejania w dowolne miejsce. Bo jeżeli nie ma potrzeby wklejania do okienka, to może do pisać do pliku i oddzielać znakiem końca linii (będzie jakbyś nacisnął enter).

W javie jednak nie robiłem interakcji z innymi programami. Osobiście przepisałbym to na c++ i skorzystał z operacji i funkcji wyszukiwania okienek i kontrolek na podstawie uchwytu (pid’a) programu.

To taka moja sugestia.

Powodzenia.