基本的に小さなボットネットを作成する必要があるという課題があります。ユーザー名と暗号化されたパスワードのリストが提供されています。これらのパスワードを復号化するためのコードも提供されています。割り当ては、TCPを使用してマスター/スレーブ関係のパスワードを解読することです。パスワードクラッキングは、暗号化されたパスワードを辞書と比較する辞書攻撃のようなものです。
これは、マスター(サーバー)がスレーブ(クライアント)に指示を送信する必要があることを意味します。これらの命令は暗号化されたパスワードであり、異なるスレーブが同時に辞書の異なる部分をチェックできるように、辞書のどこから検索を開始するかによって、復号化のプロセスが高速化されます。
個人的に私はマスターの世話をしなければなりません。プロセスは次のように機能します。
マスター(クラス)は、新しいスレッドでセッション(Runnableを実装するクラス)を開始します。セッションでは、スレーブごとに個別のInputStreamListeners(Runnableを実装するクラス)を作成して、入力を個別のスレッドで処理できるようにします。スレーブが完了すると、復号化されたすべてのパスワードがInputStreamListenerに送信され、文字列のArrayListに追加されます。その後、このリストはセッションに送信され、できればArrayListsのリストに追加されます(つまり、ArrayList>)。セッションはすべてのパスワードを受け取ります。ソケットはInputStreamListenerで閉じられ、スレーブはシャットダウンします。これは、そのリスナーのタスクがシャットダウンされ、ExecutorServiceスレッドプールに存在しないことを意味します。
これまでのところ、一度に1つのスレーブのみを使用しています。InputStreamListenerを閉じると、コードは次のようになります。
try {
writer.println("Disconnecting Slave...");
scanner.close();
writer.close();
slave.getSocket().close();
Master.messageServer("Slave Socket Close");
} catch (IOException ex) {
Master.messageServer("[" + ip + "]: Problem closing Socket for Slave: ");
Master.messageServer("[" + ip + "]:" + ex.getMessage());
}
while(true) {
Master.messageServer("Trying Lock");
if(session.lock.tryLock()) {
try {
session.addResults(results);
Master.messageServer("Added Results to Session.");
break;
} finally {
session.lock.unlock();
}
}
}
InputStreamListenerはwhileループに到達しますが、「TryingLock」を1回だけ出力します。ロックされている場合、これは、コンソールが実際にメソッドに到達するまで「ロックの試行」でスパム送信され、「セッションに結果を追加」と出力されることを意味します。
セッションのコードは次のようになります。
public void addResults(ArrayList<String> list) {
lock.lock();
try {
results.add(list);
} finally {
lock.unlock();
}
}
ロックはReentrantLockです。
もちろんこれは行われるため、2つ以上のInputStreamListenersが同時にメソッドにアクセスすることはありません。
なぜこれが起こるのか、そしてなぜプログラムが機能しないのか、私にはわかりません。論理的には機能しているようです。これ以外は、情報を新しいメソッドに入れてtxtファイルを作成するだけです。ヘルプ?