合法程序上的反病毒检测

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

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”。 我认为它与下载function有关? 我并不是真的想要打败反病毒程序。 我不是在试图做任何非法行为。

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

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

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

您可以尝试使用代码签名证书签署您的JAR,例如来自Digicert 。

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

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

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

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

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

首先,这里有一些。 赛门铁克或平均

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

我想,VirusTotal正在研究一种更简单的标记方式 – 尚未生产

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

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

对此最好的解决方法是诚实地试图欺骗反病毒。 更改所有字符串名称…添加一堆假的字符串,不做任何事情,例如

 int asdgsal = 1 + 2; 

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

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

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

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