如何故意破坏java中的文件

时间:2012-04-15 20:48:13

标签: java file document corruption corrupt

注意: 请不要判断这个问题。对于那些认为我这样做是为了“欺骗”的人;你错了,因为我不再在学校。另外,如果我是,我自己实际上试图作弊,我会简单地使用已经为此创建的服务,而不是重新创建程序。我接受了这个项目,因为我认为它可能很有趣,没有别的。在您投票之前,请 consider the value of the question it's self ,而不是投机使用它,因为SO的目的不是判断,而只是提供公开信息。 < / p>


我正在使用java开发一个程序,故意破坏文件(特别是.doc,txt或pdf,但其他人也会很好)

我最初尝试过这个:

public void corruptFile (String pathInName, String pathOutName) {
    curroptMethod method  = new curroptMethod();
    ArrayList<Integer> corruptHash = corrupt(getBytes(pathInName));
    writeBytes(corruptHash, pathOutName);
    new MimetypesFileTypeMap().getContentType(new File(pathInName));
    //  "/home/ephraim/Desktop/testfile"
}

public ArrayList<Integer> getBytes(String filePath) {
    ArrayList<Integer> fileBytes = new ArrayList<Integer>();
    try {
        FileInputStream myInputStream = new FileInputStream(new File(filePath));
        do {
            int currentByte = myInputStream.read();
            if(currentByte == -1) {
                System.out.println("broke loop");
                break;
            }
            fileBytes.add(currentByte);
        } while (true);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(fileBytes);
    return fileBytes;
}

public void writeBytes(ArrayList<Integer> hash, String pathName) {
    try {
        OutputStream myOutputStream = new FileOutputStream(new File(pathName));
        for (int currentHash : hash) {
            myOutputStream.write(currentHash);
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //System.out.println(hash);
}

public ArrayList<Integer> corrupt(ArrayList<Integer> hash) {
    ArrayList<Integer> corruptHash = new ArrayList<Integer>();
    ArrayList<Integer> keywordCodeArray = new ArrayList<Integer>();
    Integer keywordIndex = 0;
            String keyword = "corruptthisfile";

    for (int i = 0; i < keyword.length(); i++) {
        keywordCodeArray.add(keyword.codePointAt(i));
    }

    for (Integer currentByte : hash) {


        //Integer currentByteProduct = (keywordCodeArray.get(keywordIndex) + currentByte) / 2;
        Integer currentByteProduct =  currentByte - keywordCodeArray.get(keywordIndex);
        if (currentByteProduct < 0) currentByteProduct += 255;
        corruptHash.add(currentByteProduct);

        if (keywordIndex == (keyword.length() - 1)) {
            keywordIndex = 0;
        } else keywordIndex++;
    }

    //System.out.println(corruptHash);
    return corruptHash;
}

但问题是文件仍然可以打开。当你打开文件时,所有单词都会被更改(它们可能没有任何意义,它们甚至可能不是字母,但它仍然可以打开)

所以这是我的实际问题:

有没有办法让文件如此腐败以至于计算机根本不知道如何打开它(即当你打开它时,计算机会说“这个文件是这样的”不承认,不能打开“)?

3 个答案:

答案 0 :(得分:3)

我想你想看看RandomAccessFile。此外,程序几乎始终是从一开始就识别其文件的情况。所以打开文件并加扰前5个字节。

答案 1 :(得分:1)

完全破坏任意文件的唯一方法是用随机垃圾替换其内容的所有。即使这样,随机垃圾实际上也是有意义的概率非常小。

根据文件类型的不同,可能会从有限的 - 甚至不那么有限的 - 腐败中恢复。 E.g:

  • 流媒体编解码器的设计考虑了网络丢包。有限的损坏可能会显示为图片伪影,甚至可能会显示为少量丢帧,但内容通常仍然可见。

  • 基于块的压缩算法(例如bzip2)允许恢复未损坏的块。

  • 基于文件的压缩系统(例如rarzip)可能能够恢复压缩数据未被损坏的文件,而不会损坏存档的其余部分。< / p>

  • 人类可读的文本,例如文本文件和源代码文件,仍然可以在文本编辑器中查看,即使它的一部分已损坏 - 更不用说它的大小不会改变。除非你破坏了整个事情,否则任何随意的读者都可以判断分配是否完成以及重新传输的文件是否与损坏的文件相同。

除道德问题外,您是否认为这只是一次性的事情?数据损坏确实发生了,但它不是那么频繁而且永远那么方便......

如果你 迫切需要更多的时间,那么你最好不要摔断腿,让自己住进医院。

答案 2 :(得分:0)

有更好的方法:

  1. 您的教授接受Word文档。在发送之前用宏病毒感染它。
  2. “忘记”将文件附加到电子邮件中。
  3. 在您的电子邮件中伪造发送日期。如果您的教授是接受Word文档的那种,这可能会有效。