繁体   English   中英

签署launch4j生成的exe会破坏它

[英]Signing launch4j generated exe corrupts it

我通过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 中)

这有点晚了,但我能够在不使用单引号的情况下使用第一个选项:

"C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" java -jar jsign-3.1.jar --alias example.org --keystore keystore.pfx --storepass pass --storetype PKCS12 progam.exe

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM