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) 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.