[Thread] Scheint nicht Sequenziell zu Arbeiten

ProTokra

Mitglied
Guten Tag Zusammen

Ich habe ein Problem mit Folgendem Code, der zu einem ICQ Passwort Wiederherstlelungstool gehört.
Die Kommandozeilenausgabe gibt auch schon Auskunft über das Problem.
Wie man in den erstne Zeilen der Ausgabe erkennt, wird z.b die in ASCII Kodierte Zahl 1 in
der setBrute Methode Ausgegeben und auch gespeichert.
In der run Methode des Thread wird jedoch als erstes ASCII zeichen die Zahl 2 Ausgegeben.

Die Methode setBrute() wird dabei von einer Oberklasse nur Aufgerufen,
wen die Variable needBrute == true ist.

Java:
	private class MD5Creator extends Thread {
		private boolean needBrute = true;
		private byte Brute[];
		
		void setBrute(byte BruteS[]) {
			System.out.println("setBrute: \t" + new String(BruteS));
			this.Brute = BruteS;
			this.needBrute = false;
		}

		public void run() {
			while (!HashCracked) {
				if (needBrute == false) {
					System.out.println("In Run: \t" + new String(Brute));
					if (MD5Hash.equals(MD5Java.hash(Brute))) {
						FinalBrute = String.valueOf(new String(Brute));
						HashCracked = true;
						break;
					}
					needBrute = true;
				}
				else {
					try {Thread.sleep(1);}
					catch (InterruptedException e) {}
				}
			}
		}
	}

Die Ausgabe in der Kommandozeile
Code:
setBrute: 	1
In Run: 	2
setBrute: 	2
In Run: 	3
setBrute: 	3
In Run: 	4
setBrute: 	4
In Run: 	5
setBrute: 	5
In Run: 	6
setBrute: 	6
In Run: 	7
setBrute: 	7
In Run: 	8
setBrute: 	8
In Run: 	9
setBrute: 	9
In Run: 	0
setBrute: 	0
In Run: 	a
setBrute: 	a
In Run: 	b
setBrute: 	b
In Run: 	c
setBrute: 	c
In Run: 	d
setBrute: 	d
In Run: 	e
setBrute: 	e
In Run: 	f
setBrute: 	f
In Run: 	g
setBrute: 	g
In Run: 	h
setBrute: 	h
In Run: 	i
setBrute: 	i
In Run: 	j
setBrute: 	j
In Run: 	k
setBrute: 	k
In Run: 	l
setBrute: 	l
In Run: 	m
setBrute: 	m
In Run: 	n
setBrute: 	n
In Run: 	o
setBrute: 	o
In Run: 	p
setBrute: 	p
In Run: 	q
setBrute: 	q
In Run: 	r
setBrute: 	r
In Run: 	s
setBrute: 	s
In Run: 	t
setBrute: 	t
In Run: 	u
setBrute: 	u
In Run: 	v
setBrute: 	v
In Run: 	w
setBrute: 	w
In Run: 	x
setBrute: 	x
In Run: 	y
setBrute: 	y
In Run: 	z
setBrute: 	z
In Run: 	A
setBrute: 	A
In Run: 	B
setBrute: 	B
In Run: 	C
setBrute: 	C
In Run: 	D
setBrute: 	D
In Run: 	E
setBrute: 	E
In Run: 	F
setBrute: 	F
In Run: 	G
setBrute: 	G
In Run: 	H
setBrute: 	H
In Run: 	I
setBrute: 	I
In Run: 	J
setBrute: 	J
In Run: 	K
setBrute: 	K
In Run: 	L
setBrute: 	L
In Run: 	M
setBrute: 	M
In Run: 	N
setBrute: 	N
In Run: 	O
setBrute: 	O
In Run: 	P
setBrute: 	P
In Run: 	Q
setBrute: 	Q
In Run: 	R
setBrute: 	R
In Run: 	S
setBrute: 	S
In Run: 	T
setBrute: 	T
In Run: 	U
setBrute: 	U
In Run: 	V
setBrute: 	V
In Run: 	W
setBrute: 	W
In Run: 	X
setBrute: 	X
In Run: 	Y
setBrute: 	Y
In Run: 	Z
setBrute: 	Z
In Run: 	Z

Danke im Vorraus
 
Ich würde folgendes machen / probieren:
setBrute synchronisieren, also "void synchronised setBrute(byte BruteS[]) "

dann die Berechnungsmethode in eine eigne Methode auslagern und auch diese synchronisieren.

Günter
 
Die setBrute Methode hat jetzt den synchronized Modifier.
Was du mit Berechnungsmethode meinst weis ich grad nicht, könntest evt genauer Beschreiben welchen Abschnitt^^
Java:
		synchronized void setBrute(byte BruteS[]) {
			System.out.println("setBrute: \t" + new String(BruteS));
			this.Brute = BruteS;
			this.needBrute = false;
		}
 
Zuletzt bearbeitet:
das ziel ist hier ganz klar zu erkennen : bruteforce gegen icq-password-recovery und fällt damit unter "cracking" was in diesem forum nicht erwünscht ist / keine hilfe gegeben wird
 
Schadet aber nicht. Jetzt wuerd ich mir mal den Aufruf ansehen. Wieso eigentlich ein Thread? Ich wuerde die Werte eher in einem blockierenden FiFo-Buffer speichern.

guenter via tapatalk
 
@gb Ja da hast du Recht, aber der Fehler ist so Komisch das ich iwie Versuche ihn zu Finden^^
Nen Alternativen Algorithmus habe ich der Funktioniert auch.
Den Fehler zu finden ist mehr so ne Persöhnliche Sache^^

Habe das ganze jetzt mal mit einer Blockierenden Queue gemacht.
Aber der Fehler ist Immernoch der selbe, die Konsolenausgabe ebenfalls.

Java:
	private class MD5Comparer extends Thread {
		private byte[] Brute;
		private SynchronousQueue<byte[]> BFIFO = new SynchronousQueue<byte[]>();
			
		public void run() {
			while (!HashCracked) {
				try {this.Brute = BFIFO.take();}
				catch (InterruptedException e) {}
				System.out.println("In Run: \t" + new String(Brute));
				if (MD5Hash.equals(MD5Java.hash(Brute))) {
					MD5Key = String.valueOf(new String(Brute));
					HashCracked = true;
					break;
				}
			}
		}
	}

Okay habe eine KSKB erstellt, hoffe wir können das Problem finden <.<
Konnte Heute Nacht deswegen nichtmal richtig Schlafen habe nur Quellcode vor den Augen gehabt <.<

Die Main Klasse
[Java]
package ThreadProblem;

public class ThreadProblem {
static final byte zTon[] = {'1','2','3','4','5','6','7','8','9','0'};
static MD5Creator thread1 = new MD5Creator();

public static void main(String[] args) {
thread1.start();

byte Brute[] = new byte[1];
for (byte c : zTon) {
Brute[0] = c;
BruteGiven:
while (true) {
if (thread1.needBrute) {
thread1.setBrute(Brute);
break BruteGiven;
}
}
}

thread1.interrupt();
System.exit(1);
}

}
[/Java]

Die Klasse vom Thread
[Java]
package ThreadProblem;

class MD5Creator extends Thread {
boolean needBrute = true;
byte Brute[];

synchronized void setBrute(byte BruteS[]) {
System.out.println("setBrute: \t" + new String(BruteS));
this.Brute = BruteS;
this.needBrute = false;
}

public void run() {
while (true) {
if (needBrute == false) {
System.out.println("In Run: \t" + new String(Brute));
needBrute = true;
}
else {
try {Thread.sleep(1);}
catch (InterruptedException e) {}
}
}
}
}
[/Java]
 
Habe das ganze umgebaut, vielleicht etwas zu kompliziert (ist ja schon spät am abend), aber es funktioniert:

Java:
public class MD5Creator extends Thread
{
    boolean needBrute = true;
    byte Brute[];

    synchronized void setBrute(byte BruteS[])
    {
        this.Brute = new byte[BruteS.length];
        for (int i = 0; i < BruteS.length; i++) {
            this.Brute[i] = BruteS[i];
        }
        System.out.println("setBrute: \t" + new String(this.Brute));
        this.needBrute = false;
    }

    synchronized boolean isNeedBrute() {
        return needBrute;
    }

    synchronized public void setNeedBrute(boolean needBrute) {
        this.needBrute = needBrute;
    }

    synchronized boolean isWarte()
    {
        boolean warte = true;

        if (isNeedBrute() == false)
        {
           System.out.println("In Run: \t" + new String(Brute));
           setNeedBrute(true);
           warte = false;
        }

        return warte;
    }
    public void run() {
        while (true) {
            if (isWarte() == false) {
                try {Thread.sleep(1);}
                catch (InterruptedException e) {}
            }
        }
    }

}

Und dann das Programm:

Java:
public class ThreadProblem
{
        static final byte zTon[] = {'1','2','3','4','5','6','7','8','9','0'};
        static MD5Creator thread1 = new MD5Creator();

        public static void main(String[] args) {
            thread1.start();

            byte Brute[] = new byte[1];
            for (byte c : zTon) {
                Brute[0] = c;
                BruteGiven:
                while (true) {
                    if (thread1.isNeedBrute() == true) {
                        thread1.setBrute(Brute);
                        break BruteGiven;
                    }
                }
            }

            thread1.interrupt();
            System.exit(1);
        }

}

Läuft, ohne Verklemmungen.

Wichtig ist, dass die Byte-Übergabe nicht als Referenz erfolgt, sonder die Bytes in die Variable des Threads kopiert wird. Mal wieder das Geheimhaltungsprinzip missachtet 🙂
 

Zurück
Oben