对合法程序的反病毒检测

Anti-Virus Detection on a legitimate program

基本上,我的程序与另一个 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();
}

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

它被检测为 "trojan.downloader"。我在想这与下载功能有关吗?我并不是真的想打败防病毒程序。我没有试图做任何非法的事情。

也许一些混淆可以解决问题?

您的编译器生成的字节码与 AV 正在寻找的一些特定代码 pattern/signature 匹配,这意味着他们过去 found/reversed 拥有的一些恶意软件具有与此相似的代码,他们可以可靠地找到这些代码。

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

反病毒供应商以位为单位寻找模式;如果有任何与数据库中已知的匹配,他们会将其标记为错误。当然,这给 developers/companies (small/big)

带来了问题

一些供应商有一个自动标记 "false-detection" 的机制。请使用适当的渠道报告此类情况。

对于初学者,这里有一些。symantec or avg

对于某些您必须通过其他 means:For 示例联系供应商 http://www.avast.com/contact-form.php?subject=VIRUS-FILE

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

无论如何,其他答案中提到的选项并不总是有效。我们使用更新的编译器和最近的 API 创建了更新的可执行文件。还尝试对可执行文件进行签名。所有这些都提高了程序成为 "anti-virus" 程序的好机会。但是,最合适的方法是与供应商核实。第

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

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

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

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

我要添加这个作为答案。对您的程序进行合法签名将为您解决此问题。您也可以伪造签名,但 ESET 等防病毒软件几乎可以立即识别出来。

解决这个问题的最佳方法是老实说,尝试欺骗防病毒软件。更改所有字符串名称...添加一堆不执行任何操作的假字符串,例如

int asdgsal = 1 + 2; 

并且还添加了一些几乎什么都不做的循环方法调用。

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

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

我觉得你可以用很多文件来测试,看看是不是所有的文件都下载不了。 如果所有文件 return 相同。我认为原因是您的代码。然后就可以参考别人的代码了