【发布时间】:2019-07-23 12:37:31
【问题描述】:
我通过Eclipse生成了一个可执行的jar文件(它是一个GUI应用程序,不需要控制台),然后通过launch4j生成一个用于windows的exe文件。 这一切都按预期运行良好(程序仍按预期运行),但病毒总数显示误报,经过快速搜索后,我发现签署我的可执行文件是解决此问题的一种方法。
多次尝试对我的 jar 进行签名后,尝试使用以下命令:
"C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" java -jar jsign-2.1.jar --alias 'example.org' --keystore 'keystore.pfx' --storepass 'pass' --storetype PKCS12 'progam.exe'
"C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" -s keyfile.pfx -a "(codesign_1091_es_sw_kpsc)" --storepass pass --storetype pkcs12 -n Client -u https://www.example.org program.exe
"C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" --verbose signtool.exe sign /fd SHA256 /f keyfile.pfx /p pass /t http://timestamp.verisign.com/scripts/timstamp.dll my_signed.exe
这些似乎都不起作用,第一次尝试会从 sign4j.exe 输出帮助消息(好像没有提供任何参数)。 第二次尝试将输出:
Making temporary file
'"keyfile.pfx"' is not recognized as an internal or external command,
operable program or batch file.
'"keyfile.pfx"' is not recognized as an internal or external command,
operable program or batch file.
第三次尝试(在为 signtool.exe 设置 windows 10 sdk 之后) 只会说“无法打开文件”(甚至不指定哪个文件)。
然后,我在 sign4j github 上看到了一些带有示例代码的文档,您可以在其中导入库并通过 java 文件对 exe 进行签名。所以我试了一下,整理了以下脚本:
import java.io.File;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import net.jsign.KeyStoreUtils;
import net.jsign.PESigner;
import net.jsign.pe.PEFile;
public class Sign4j {
public static void main(String[] args) {
KeyStore keystore;
try {
keystore = KeyStoreUtils.load(new File("keystore.pfx"), "PKCS12", "pass", null);
PESigner signer;
try {
signer = new PESigner(keystore, "RuneRealm.org", "vnSsmwj4TYeurUYQ");
signer.withProgramName("Client")
.withProgramURL("https://www.example.org")
.withTimestamping(true)
.withTimestampingAutority("http://timestamp.comodoca.com/authenticode");
try {
signer.sign(new PEFile(new File("Program.exe")));
} catch (Exception e) {
e.printStackTrace();
}
} catch (UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException e) {
e.printStackTrace();
}
} catch (KeyStoreException e1) {
e1.printStackTrace();
}
}
}
最后,它成功了!或者看起来.. 没有生成输出并且程序被更改,(最后更改日期已更新),现在我再次将它通过 virustotal 并且错误的帖子消失了。我对自己感到非常满意,我尝试运行该程序,但它会弹出错误:
Error: Invalid or corrupt jarfile (path to my signed exe)
在这一点上,我不知道从这里去哪里?我一直在寻找签署 exe 的其他替代方案,几乎所有搜索结果都指向一个用于签署的命令,类似于我的 3 次尝试之一(其中没有一次奏效)。
我最接近的是使用 java 脚本,但由于我似乎在每个地方都阅读过的唯一解决方案是“使用 jsign 签名将避免损坏”并且这不起作用,我不知道如何继续。
我已经研究了 launch4j 的替代方案,例如 jar2exe。甚至无法生成工作的exe,通过launch4j生成的exe运行良好,甚至保留了系统托盘和其他库支持(这些库已经打包在可执行jar中)
【问题讨论】: