合法程序上的防病毒检测

2022-09-02 01:50:21

基本上,我的程序与另一个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 环境之外测试它时,我的防病毒软件也会立即将其选中。

它被检测为“特洛伊木马下载器”。我认为它与下载功能有关?我并不是真的想打败一个防病毒程序。我不是想做任何非法的事情。

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


答案 1

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

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


答案 2

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

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

请注意,这样做也有一些影响:

  • 可以执行 CRL(证书吊销列表)检查。这将从互联网上下载数据。如果PC具有物理网络连接(本地)但没有互联网连接,则可能会遇到明显的超时。
  • 您需要熟悉时间戳,否则当证书过期时,签名将变为无效。

推荐