合法程序上的反病毒检测

时间:2015-06-20 13:00:51

标签: java obfuscation antivirus

基本上,我的程序与另一个jar文件一起运行。以下是下载功能的代码:

public void saveUrl(final String filename, final String urlString) throws MalformedURLException, IOException {
    BufferedInputStream in = null;
    FileOutputStream fout = null;
    try {
        in = new BufferedInputStream(new URL(urlString).openStream());
        fout = new FileOutputStream(filename);

        final byte data[] = new byte[1024];
        int count;
        while ((count = in.read(data, 0, 1024)) != -1) {
            fout.write(data, 0, count);
        }

    } catch (Exception e) {
        return;
    } finally {
        if (in != null) {
            in.close();
        }
        if (fout != null) {
            fout.close();
        }
    }
}

开始新流程

public void runUpdate() throws IOException{
    String folder = fileLocation;
    ProcessBuilder p = new ProcessBuilder();
    p.command(folder);
    p.start();
}

然而,即使有用户提示并且必须批准下载,当我在日食环境之外进行测试时,我的防病毒软件会立即将其提取出来。

它被检测为“trojan.downloader”。我认为它与下载功能有关?我并没有真正想要击败反病毒程序。我不是在试图做任何非法行为。

或许有些混淆可以解决这个问题?

5 个答案:

答案 0 :(得分:12)

您的编译器生成的字节码与AV正在寻找的某些特定代码模式/签名相匹配,这意味着他们过去发现/撤消的某些恶意软件的代码类似于他们可以找到的代码。

最好的选择是识别和重写触发检测的任何方法,直到它不再匹配AV正在寻找的任何方式,混淆不是一个好主意(但如果混淆器确实控制流混淆,可以做到) )为了解决这个问题,因为不能保证它会产生与原始字节码不同的字节码(有些混淆器,比如ProGuard,甚至也不进行控制流混淆)。

答案 1 :(得分:3)

您可以尝试使用代码签名证书对JAR进行签名,例如:来自Digicert

这会以受信任的方式将您的公司名称添加到JAR,因此Antivirus程序也可以信任。但是,并不能保证每个防病毒程序都会这样做。

请注意,这样做也会产生一些影响:

  • 可能会进行CRL(证书撤销列表)检查。这将从Internet下载数据。如果PC具有物理网络连接(本地)但没有Internet连接,则可能会发生严重超时。
  • 您需要熟悉时间戳,否则证书过期时签名将失效。

答案 2 :(得分:2)

反病毒软件供应商寻找有点模式;如果有任何东西与数据库中已知的匹配,他们会将其标记为坏。当然,这给开发商/公司(小/大)带来了问题

一些供应商有一个自动机制来标记"错误检测"。请使用适当的渠道报告此类案件。

对于初学者,这里有一些。symantecavg

对于某些人,您必须通过其他方式与供应商联系:例如http://www.avast.com/contact-form.php?subject=VIRUS-FILE

VirusTotal正在研究一种更简单的方法来标记 - 但尚未投入生产,我猜

在任何情况下,其他答案中提到的选项始终不起作用。我们使用较新的编译器和最新API创建了更新的可执行文件。还尝试签署可执行文件。所有这些都提高了程序成为“防病毒”的好机会。程序。但是,最合适的方法是与供应商核实。个

答案 3 :(得分:0)

我要将此作为答案添加。让您的程序合法签名将为您解决此问题。你也可以伪造一个签名,但是像ESET这样的反病毒会立刻发现它。

最好的解决方法是诚实地试图欺骗反病毒。更改所有字符串名称...添加一堆无效的字符串,例如

int asdgsal = 1 + 2; 

并且还添加了一些几乎没有任何内容的循环方法调用。

适合我。它是粗略的,可以被试图造成实际伤害的人滥用,但它确实有效。

另外,请勿下载到temp或appdata。把它扔在%userprofile%或我的文档中,你会没事的。

答案 4 :(得分:0)

我认为您可以使用许多文件进行测试,找出是否无法下载所有文件。 如果所有文件都返回相同。我认为原因是你的代码。然后你可以参考其他人的代码。