0

我有一个任务,我基本上必须编写一个小型僵尸网络。我们得到了用户名和加密密码的列表。我们还获得了解密这些密码的代码。任务是使用 TCP 破解 Master/Slave 关系中的密码。密码破解类似于字典攻击,您将加密的密码与字典进行比较。

这意味着主机(服务器)必须向从机(客户端)发送指令。这些指令是加密的密码,在字典中从哪里开始查找,以便不同的slave可以同时查看字典的不同部分,加快解密过程。

就我个人而言,我必须照顾主人。该过程是这样工作的:

主(类)在新线程中启动会话(实现可运行的类)。Session 为每个 Slave 创建单独的 InputStreamListeners(实现 Runnable 的类),以便可以在单独的线程上处理输入。当 Slave 完成后,所有解密的密码都被发送到 InputStreamListener 并添加到字符串的 ArrayList 中。然后这个列表将被发送到 Session,并希望添加到 ArrayLists 列表中(因此 ArrayList>)。会话确实收到所有密码。Socket 在 InputStreamListener 中关闭,Slave 关闭。对我来说,这意味着该侦听器的任务现在应该关闭,并且不再位于 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 循环,但只打印一次“尝试锁定”。如果它被锁定,这意味着现在应该向控制台发送“尝试锁定”的垃圾邮件,直到它可以实际到达该方法,然后打印“已将结果添加到会话”。

会话中的代码如下所示:

public void addResults(ArrayList<String> list) {
    lock.lock();
    try {
        results.add(list);
    } finally {
        lock.unlock();
    }
}

该锁是可重入锁。

这当然是完成的,因此 2 个或更多 InputStreamListeners 不会同时访问该方法。

我根本不知道为什么会发生这种情况,以及为什么程序不起作用。从逻辑上讲,它似乎正在工作。除此之外,它只是将信息放入创建 txt 文件的新方法中。帮助?

4

0 回答 0