Stackoverflow in Rekursion. Bin ich schuld oder Java?

Status
Nicht offen für weitere Antworten.
P

Patrick_GAST

Gast
Hallo

ich arbeite gerade an einem Programm das zum auffinden von Sicherheitslücken im lokalen Netz und Webanwendungen dienen soll, in diesem Projekt habe eine Klasse BruteForce, mit einer rekursiven Methode, geschrieben um schwache Passwörter aufzuspüren, hierfür verwende ich die Ascii Tabelle von '!' bis '~'. Um es nicht zu performancelastig zu gestallten arbeite ich mit char Arrays und nicht mit Listen oder dergleichen.

Leider führt es immer wieder zu StackOverflows, nachdem ich den gc an so ziemlich jeder Stelle manuel aufgerufen haben ist es ein wenig weiter gelaufen aber das reicht nicht, gibt es Programmiermethoden um dieses Problem zu umgehen?


Hier der Code:


Code:
public class BruteForce {

	private String toCompare = "!";
	private char[] array;
	private boolean geschafft = false;
	
	public BruteForce() 
	{
		array = toCompare.toCharArray();
	}
	
	//Erzeugt neues Array und kopiert die Werte des Alten
	//zusätzlich wird im letzten Feld noch der Initialwert gesetzt 
	private char[] increaseArraySize(char[] zeichen)
	{
		char[] newCharSequenze = new char[zeichen.length + 1];
		int index = 0;
		for(; index < zeichen.length; index++)
		{
			newCharSequenze[index] = zeichen[index];
		}
		newCharSequenze[index] = 0x21;
		zeichen = null;
		System.gc();
		
		return newCharSequenze;
	}
	
	//Ausgabe Funktion
	private void ausgabe()
	{
		System.gc();
		for(int count = 0; count < array.length; count++)
		{
			System.out.print(array[count]);
		}
		System.out.println();
	}
	
	//rekursive methode um alle Fälle durchzugehen bis geschafft
	private void increase(int index)
	{
		if(!geschafft)
		{
			System.gc();
			//falls der übergeben Index im array vorkommt 
			if(index < array.length)
			{
				ausgabe();
				compare();
				//wird der Wert um +1 erhöht
				array[index]++;
				//falls dieser Wert dann größer ist als 0x7E also '~'
				if(array[index] > 0x7E)
				{
					System.out.println("greater then");
					//wird der Wert wieder auf den Startwert gesetzt 
					array[index] = 0x21;
					//und increase wird mit dem nächst höheren index aufgerufen
					increase(index+1);
				}
				//falls der Wert kleiner als 0x7E ist 
				else
				{
					//wird increase mit Startindex aufgerufen
					increase(0);
				}
			}
			//falls der übergebene index nicht im array vorkommt
			else
			{
				System.out.println("erweitere Array");
				//wird das Array erweitert
				array = increaseArraySize(array);
				//und increase mit Startindex aufgerufen
				increase(0);
			}
		}
	}
	
	//Vergleichsfunktion
	private void compare()
	{
		toCompare = new String(array);
		System.gc();
		if(toCompare.equals("TEST"))
		{
			geschafft = true;
			System.out.println("GESCHAFFT!!!");
		}
	}
	
	public void start()
	{
		increase(0);
	}
}


Ist noch teilweise einbischen unschön aber ist ja auch noch prealpha :D
Liegt das jetzt an Java oder hab ich Mist programmiert... oder beides ???:L

Schönen Tag noch
 

Wildcard

Top Contributor
Mit dem GC hat das überhaupt nichts zu tun.
Es gibt in jeder Programmiersprache Speicher für den Stack auf dem Variablen und Rücksprungadressen abgelegt werden.
Wenn die Rekursion zu tief geht, läuft dieser Speicher voll was zu genannter Exception führt.
Die beiden Lösungsmöglichkeiten sind:
-Vergrößerung des Stacks
-Iterative Programmierung

Als Tipp:
Ein rekursiver Brute Force Angriff ist dämlich...
 
M

maki

Gast
Liegt das jetzt an Java oder hab ich Mist programmiert... oder beides icon_scratch.gif
Rekursion führt zu einem Funktionsaufruf in jedem Durchlauf, da wird der Stack bei vielen Aufrufen knapp.

Iteration (Schleifen) haben dieses Problem nicht, die Stack Klasse ist nützlich in solchen Fällen.
 
S

SlaterB

Gast
StackOverflow heißt StackOverflow und nicht OutOfMemoryException, was soll der Gc da machen, den Stack löschen?
nagut, mit weniger Heap hätte der Stack wieder mehr Platz, falls der auch den Heap benutzt (?)
aber so eine Exception kommt doch nochmalerweise bei einer Endlos- oder zumindest zu fahrlässigen Rekursion,
da bringt es dir auch kaum etwas, den Stack höchstens zu verdoppeln

-------

> toCompare = new String(array);
> System.gc();
> if(toCompare.equals("TEST"))

ist das nur testweise? wenn diese compare-Funktion tausendfach aufgerufen wird,
dann vergleiche doch das Array mit dem String Zeichen für Zeichen,
ohne unnötig einen String zu erzeugen und mit GC aufzuräumen versuchen

--------

dein Hauptprogramm mit der Rekursion habe ich persönlich noch nicht verstanden,
willst du da keine minimale Erklärung abgegben?
'macht xy, in jedem Rekursionsschritt yz'

und wie wärs mit einer main-Operation + Test-Eingaben, um das ganz ablaufen zu lassen bis zur Exception?
 
P

Patrick_GAST

Gast
Das Programm beginnt bei '!' alle Zeichen bis '~' durchzuiterieren, falls nichts gefudnen wird, wird noch ein Zeichen angehängt und es geht von vorne los usw.


Meine Main:

Code:
	public static void main(String[] args) {

		BruteForce brute = new BruteForce();
		brute.start();
	}

und hier die Ausgabe auch wenn das nicht viel bringt denke ich:

nopaste.com/p/atvhnQcEb

ich werd mich mal daran machen das ganz iteratiev zu lösen, für weitere Hilfe bin ich trotzdem dankbar.
 
S

SlaterB

Gast
im Grunde brauchst du statt der Rekursion nur eine Schleife,

int index = 0;
while(!geschafft) {
..
index erhöhen
...
}
 
P

patrick_GAST

Gast
Jo danke, ich weiß :D jetzt

Ist es demnach nicht möglich tiefe rekursionen zu implementieren?
 

Marco13

Top Contributor
Zwischen den Zeichen ! und ~ liegen 93 Zeichen. Bei einem Passwort der Länge 5 hat man damit eine Rekursionstiefe von 6.9 Milliarden... Naja, ganz so weit wird er nicht kommen: Stell' dir nur mal vor, für jeden Rekursionsstufe würden nur 10 bytes Stack-Speicher benötigt (es dürften aber deutlich mehr sein) - dann wären das schon kanpp 70 GB für ein Furz-Passwort, das man iterativ in ein paar Minuten bei wenigen KB Speicherbedarf durchratten lassen könnte....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Rekursion und StackOverflow Allgemeine Java-Themen 11
D Stackoverflow verhindern Allgemeine Java-Themen 4
K Threads StackOverflow Allgemeine Java-Themen 12
M Eclipse Stackoverflow beim Einlesen von großen Bilder in kd Baum Allgemeine Java-Themen 15
S Binärer Suchbaum Stackoverflow Problem Allgemeine Java-Themen 4
S StackOverflow Allgemeine Java-Themen 7
H StackOverflow Fehler? Allgemeine Java-Themen 3
foobar [groovy]Stackoverflow bei invokeMethod Allgemeine Java-Themen 3
J Warum Stackoverflow oder Nullpointerexeption? Allgemeine Java-Themen 4
S StackOverflow Allgemeine Java-Themen 10
nico3000 Rekusrion mit Stackoverflow Allgemeine Java-Themen 7
0 StackOverflow abfangen Allgemeine Java-Themen 15
I Vector serialisieren: StackOverflow Allgemeine Java-Themen 13
P Rekursion Aufrufbaum Allgemeine Java-Themen 7
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
Zeppi Rekursion StackOverflowError Allgemeine Java-Themen 4
J Rekursion Allgemeine Java-Themen 4
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
B Rekursion Allgemeine Java-Themen 11
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
J Rekursion Mergesort Allgemeine Java-Themen 10
R Rekursion Allgemeine Java-Themen 3
R Programm zur Rekursion Allgemeine Java-Themen 5
V Rekursion Allgemeine Java-Themen 2
J Denkfehler Rekursion Allgemeine Java-Themen 5
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
B Rekursion Allgemeine Java-Themen 2
B Rekursion Allgemeine Java-Themen 22
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
Hacer Rekursion- sumOfAllNodes Allgemeine Java-Themen 5
L Rekursion Binärbaum Allgemeine Java-Themen 7
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
Y Rekursion Allgemeine Java-Themen 19
M Permutation ohne Wiederholung mit rekursion Allgemeine Java-Themen 4
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
T Pascalsches Dreieck ohne array und rekursion Allgemeine Java-Themen 9
P Rekursion Allgemeine Java-Themen 9
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
W Rekursion-Probleme mit return Allgemeine Java-Themen 35
C Rekursion Fibonacci Allgemeine Java-Themen 31
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
eQuest Rekursion Dauer Allgemeine Java-Themen 6
Weiti Swingworker und Rekursion Allgemeine Java-Themen 8
L fragwürdige Rekursion Allgemeine Java-Themen 4
L Kleine Rekursion Allgemeine Java-Themen 12
M Rekursion!! Allgemeine Java-Themen 8
J Rekursion in Schleifenkonstrukt wandeln Allgemeine Java-Themen 21
R Rekursion Ablauflogik Allgemeine Java-Themen 19
M Rückwärts geführte Rekursion Allgemeine Java-Themen 3
Schandro StackOverflowError bei Rekursion verhindern Allgemeine Java-Themen 14
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
G Rekursion - Denksport Allgemeine Java-Themen 6
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S Rekursion Allgemeine Java-Themen 2
Linad Tiefe der Rekursion als Abbruchbedingung Allgemeine Java-Themen 6
Linad Zahlensysteme -> Rekursion Allgemeine Java-Themen 4
N Frage zu einer Rekursion Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben