【问题标题】:Anti-Virus Detection on a legitimate program合法程序的反病毒检测
【发布时间】:2015-09-06 09:21:57
【问题描述】:

基本上,我的程序与另一个 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”。我在想它与下载功能有关吗?我并不是真的想打败一个反病毒程序。我没有试图做任何非法的事情。

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

【问题讨论】:

  • 我认为你已经实现了一个基本的病毒:一个应用程序,它将加载一个可执行文件并执行它。有没有试过其他环境或者杀毒软件?也许这只是一个防病毒工具的问题。
  • 您的代码的问题在于,在同一台计算机上运行的任何程序都可能在运行时轻松劫持您的“已批准”代码并更改例如 url 以下载另一个可执行文件。必须不惜一切代价避免这种情况。通常您必须提供单独的更新程序,例如用于 Windows 的 .msi,可以在运行时进行认证等和内存保护(因为您可能会以管理员权限运行它)
  • @BeyelerStudios 嗯,那么所有其他程序如何检测和安装升级,如 Firefox、Skype 等?
  • 您需要安装它们,它们在后台运行单独的更新服务 - 或者它们需要您以管理员模式(admin-pw 弹出窗口)执行更新命令来运行它们的安装 - 大多数重要:它们不是在 java 中运行,也不是下载代码并执行它
  • 或者在 Skype M$ 的情况下,每次您的操作系统自动更新时都会强制升级到您的系统

标签: java obfuscation antivirus


【解决方案1】:

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

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

【讨论】:

  • 奇怪的是它不再被检测到。有人私信我,并建议我只是更改随机名称并添加一堆假字符串和垃圾代码以及方法调用,这些方法调用什么都不做以绕过它。实现这一点的实际合法方式是什么?我真的无法为我的申请获得官方证书(那不是要花钱吗?)。
  • @Ben 你想实现什么?您是否尝试向您的应用程序添加某种自动更新功能?
  • 是的,只是一个自动更新功能。在它调用这个类之前就有用户输入,所以它不会在没有用户批准的情况下更新。
  • @Ben 问题不在于用户的认可,而在于您盲目相信返回的任何内容。虽然这可能在 Intranet 上有效(尽管它有点不确定),但如果您从 Internet 下载某些内容,任何人都可以劫持连接或入侵您从中下载的网站。缓解这种情况的方法是使用 HTTPS 来加密连接和验证服务器的身份,并确保下载的代码也被签名。
  • 好吧,我刚刚实现了这个。客户端程序生成一个 base64 编码的密钥,该密钥返回给服务器构建器,然后生成一个密钥文件和我想要执行的可执行文件。然后在客户端程序上,它将密钥文件与生成的密钥进行比较并执行应用程序。
【解决方案2】:

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

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

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

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

【讨论】:

  • 是的,我知道这一点,但对于一个完全免费的项目来说,它确实要花很多钱。
  • @Ben:感谢您的反馈。最好将诸如“我尝试过证书,但它们太贵”之类的信息添加到问题中,因为它缩小了答案的范围。无论如何,我会把它留在这里给其他能买得起证书的读者。
【解决方案3】:

反病毒供应商寻找比特模式;如果有任何内容与数据库中的已知内容匹配,他们会将其标记为错误。当然,这给开发人员/公司(小/大)带来了问题

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

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

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

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

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

【讨论】:

    【解决方案4】:

    我将添加这个作为答案。让您的程序合法签名将为您解决此问题。您也可以伪造签名,但 ESET 等防病毒软件会立即识别该签名。

    老实说,最好的解决方法是尝试欺骗防病毒软件。更改所有字符串名称...添加一堆假字符串,例如

    int asdgsal = 1 + 2; 
    

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

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

    另外,不要下载到 temp 或 appdata。将其放入 %userprofile% 或我的文档中,您会没事的。

    【讨论】:

    • 编译器应该在发布版本中优化这些语句。还是您提供调试版本?
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 2010-11-26
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2017-04-19
      • 2010-09-06
      • 2011-11-21
      相关资源
      最近更新 更多