基本上,我的程序与另一个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”。我认为它与下载功能有关?我并没有真正想要击败反病毒程序。我不是在试图做任何非法行为。
或许有些混淆可以解决这个问题?
答案 0 :(得分:12)
您的编译器生成的字节码与AV正在寻找的某些特定代码模式/签名相匹配,这意味着他们过去发现/撤消的某些恶意软件的代码类似于他们可以找到的代码。
最好的选择是识别和重写触发检测的任何方法,直到它不再匹配AV正在寻找的任何方式,混淆不是一个好主意(但如果混淆器确实控制流混淆,可以做到) )为了解决这个问题,因为不能保证它会产生与原始字节码不同的字节码(有些混淆器,比如ProGuard,甚至也不进行控制流混淆)。
答案 1 :(得分:3)
您可以尝试使用代码签名证书对JAR进行签名,例如:来自Digicert。
这会以受信任的方式将您的公司名称添加到JAR,因此Antivirus程序也可以信任。但是,并不能保证每个防病毒程序都会这样做。
请注意,这样做也会产生一些影响:
答案 2 :(得分:2)
反病毒软件供应商寻找有点模式;如果有任何东西与数据库中已知的匹配,他们会将其标记为坏。当然,这给开发商/公司(小/大)带来了问题
一些供应商有一个自动机制来标记"错误检测"。请使用适当的渠道报告此类案件。
对于某些人,您必须通过其他方式与供应商联系:例如http://www.avast.com/contact-form.php?subject=VIRUS-FILE
VirusTotal正在研究一种更简单的方法来标记 - 但尚未投入生产,我猜
在任何情况下,其他答案中提到的选项始终不起作用。我们使用较新的编译器和最新API创建了更新的可执行文件。还尝试签署可执行文件。所有这些都提高了程序成为“防病毒”的好机会。程序。但是,最合适的方法是与供应商核实。个
答案 3 :(得分:0)
我要将此作为答案添加。让您的程序合法签名将为您解决此问题。你也可以伪造一个签名,但是像ESET这样的反病毒会立刻发现它。
最好的解决方法是诚实地试图欺骗反病毒。更改所有字符串名称...添加一堆无效的字符串,例如
int asdgsal = 1 + 2;
并且还添加了一些几乎没有任何内容的循环方法调用。
适合我。它是粗略的,可以被试图造成实际伤害的人滥用,但它确实有效。
另外,请勿下载到temp或appdata。把它扔在%userprofile%或我的文档中,你会没事的。
答案 4 :(得分:0)
我认为您可以使用许多文件进行测试,找出是否无法下载所有文件。 如果所有文件都返回相同。我认为原因是你的代码。然后你可以参考其他人的代码。