破解 DVT 25.1.8

前言

  • DVT IDE 作为 Eclipse 和 VSCode 的插件,有 DVT Eclipse 和 DVT VSCode 两类。

  • DVT Eclipse 25.1.8 有 Linux x64、Linux arm64、macOS arm64 以及 Windows x64等版本

    • 解压 DVT Eclipse 的 zip 安装包,得到dvt_eclipse文件夹
    • 将DVT_HOME环境变量设置为解压后的dvt_eclipse目录
    • 在 Linux 平台,运行$DVT_HOME/bin/dvt.sh打开DVT Eclipse
    • 在 Windows 平台,运行$DVT_HOME/bin/dvt.bat打开DVT Eclipse

  • DVT VSCode 可直接从 VSCode 的插件市场安装

破解

  • 破解 DVT IDE 主要分为两个步骤:

    • 破解ro.amiq.dvt.flclient-2.21.jar文件
    • 将DVT_LICENSE_FILE环境变量设置为dvt.lic文件的路径(dvt.lic内容见附录)
  • 对于 DVT Eclipse

    • ro.amiq.dvt.flclient-2.21.jar文件存在以下两个目录,只需破解其中一个,并将破解后的ro.amiq.dvt.flclient-2.21.jar放入相应的目录即可。
    • 破解之前,应该先运行dvt.sh,将第二个目录的ro.amiq.dvt.flclient-2.21.jar释放出来。
    • 由于第二个目录的ro.amiq.dvt.flclient-2.21.jar位置不固定,故可使用命令find $DEV_HOME -name ro.amiq.dvt.flclient-2.21.jar进行查找。
    • 文件路径
      • dvt_eclipse/batch/libs/ro.amiq.dvt.flclient-2.21.jar
      • dvt_eclipse/eclipse/configuration/org.eclipse.osgi/304/0/.cp/libs/ro.amiq.dvt.flclient-2.21.jar
  • 对于 DVT VSCode

    • ro.amiq.dvt.flclient-2.21.jar文件存在一个位置,只需将破解的ro.amiq.dvt.flclient-2.21.jar替换原来的文件即可。
    • 文件路径
      • ~/.vscode-server/extensions/amiq.dvt-25.1.8-linux-x64/dvt_home/common/batch/libs/ro.amiq.dvt.flclient-2.21.jar

附录

  • dvt.lic文件的内容

    FEATURE dvt_core dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_cpp_ext dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_sv dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_sv_batch dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_sv_debug dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_sv_lint dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_sv_specador dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_vhdl dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_vhdl_debug dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_vhdl_lint dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_vhdl_specador dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_e dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_e_batch dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_e_debug dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_e_specador dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_pss dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_pass_lint dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_sln dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    FEATURE dvt_sdl dvtlmd 2099.99 29-aug-2119 uncounted \
            11111111111111111111 HOSTID=ANY SIGN2=111111111111
    
  • 破解ro.amiq.dvt.flclient-2.21.jar

    • 下载RecafJava字节码编辑器(Java bytecode editor)

      • 从https://github.com/Col-E/Recaf/releases下载recaf-2.21.14-J8-jar-with-dependencies.jar
    • 运行Recaf并加载ro.amiq.dvt.flclient-2.21.jar

      • 使用命令java -jar ./recaf-2.21.14-J8-jar-with-dependencies.jar打开Recaf
      • 依次点击File->Load,加载ro.amiq.dvt.flclient-2.21.jar
    • 定位目标代码

      • 依次点击Search->Values,使用-515、-514等值确定要修改的文件
      • 展开搜索到的函数,右击函数并点击"Goto definition"
      • 若代码如下所示,则为目标代码(目标函数public static boolean a(byte[] byArray, byte[] byArray2, k object, int n))
        // Decompiled with: CFR 0.152
        // Class Version: 8
        package com.a.a.e;
        import com.a.a.a.s;
        import com.a.a.b;
        import com.a.a.e;
        import com.a.a.g;
        import com.a.a.k;
        import com.certicom.ecc.jcae.Certicom;
        import com.certicom.ecc.scheme.ECDSA;
        import com.certicom.ecc.system.SystemConfig;
        import com.certicom.ecc.util.Conversion;
        import java.security.InvalidKeyException;
        import java.security.KeyFactory;
        import java.security.NoSuchAlgorithmException;
        import java.security.NoSuchProviderException;
        import java.security.Provider;
        import java.security.PublicKey;
        import java.security.Security;
        import java.security.Signature;
        import java.security.SignatureException;
        import java.security.spec.InvalidKeySpecException;
        import java.security.spec.KeySpec;
        import java.security.spec.X509EncodedKeySpec;
        import javax.security.spec.ECParameterSpec;
        import javax.security.spec.ECRawPublicKeySpec;
        import javax.security.spec.F2mParameterSpec;
        /*
         * Duplicate member names - consider using --renamedupmembers true
         */
        public class l
        implements g {
            private static String a;
            public static boolean a(byte[] byArray, byte[] byArray2, k object, int n) {
                boolean bl;
                Object object2;
                Object object3;
                System.setProperty("JDK_1_3_Compatibility", "YES");
                if (a != null) {
                    object3 = a;
                } else {
                    object2 = new Certicom();
                    Security.addProvider((Provider)object2);
                    object3 = object2 = (a = ((Provider)object2).getName());
                }
                if (object3 == null) {
                    throw new b(-514, 4026);
                }
                Object object4 = SystemConfig.getConfig();
                ((SystemConfig)object4).setConformance(16);
                ((SystemConfig)object4).setPtCompression(2);
                ((SystemConfig)object4).setFormat(10);
                switch (n) {
                    case 2: {
                        break;
                    }
                    case 3: {
                        ((SystemConfig)object4).setCurve("sect163k1");
                        break;
                    }
                    case 4: {
                        ((SystemConfig)object4).setCurve("sect239k1");
                        break;
                    }
                    default: {
                        throw new b(-515, 4027);
                    }
                }
                object = ((k)object).a(n);
                if (object == null) {
                    throw new b(-515, 4028);
                }
                object = object.getEncoded();
                try {
                    object4 = KeyFactory.getInstance("ECDSA");
                    if (n == 2) {
                        ECDSA.setThreadOldHashTruncate(true);
                        Object object5 = new int[]{9};
                        String string = "1.3.132.0.4";
                        object5 = new F2mParameterSpec(Conversion.HexString2OS("3088250ca6e7c7fe649ce85820f7"), Conversion.HexString2OS("e8bee4d3e2260744188be0e9c723"), Conversion.HexString2OS("10e723ab14d696e6768756151756febf8fcb49a9"), Conversion.HexString2OS("9d73616f35f4ab1407d73562c10f"), Conversion.HexString2OS("a52830277958ee84d1315ed31886"), Conversion.HexString2OS("100000000000000d9ccec8a39e56f"), 2, 113, (int[])object5, string);
                        object = new ECRawPublicKeySpec((byte[])object, (ECParameterSpec)object5);
                        object = ((KeyFactory)object4).generatePublic((KeySpec)object);
                    } else {
                        object = new X509EncodedKeySpec((byte[])object);
                        object = ((KeyFactory)object4).generatePublic((KeySpec)object);
                    }
                    Signature signature = Signature.getInstance("ECDSA", (String)object2);
                    signature.initVerify((PublicKey)object);
                    signature.update(byArray);
                    bl = signature.verify(byArray2);
                }
                catch (NoSuchAlgorithmException noSuchAlgorithmException) {
                    throw new b(-515, 4029);
                }
                catch (InvalidKeySpecException invalidKeySpecException) {
                    throw new b(-515, 4030);
                }
                catch (InvalidKeyException invalidKeyException) {
                    throw new b(-515, 4031);
                }
                catch (NoSuchProviderException noSuchProviderException) {
                    throw new b(-515, 4032);
                }
                catch (SignatureException signatureException) {
                    throw new b(-515, 4033);
                }
                finally {
                    Security.removeProvider(a);
                    a = null;
                }
                return bl;
            }
            @Override
            public String a() {
                return System.getProperty("user.name");
            }
            @Override
            public String b() {
                return s.f();
            }
            @Override
            public String c() {
                return "JavaDisplay";
            }
            @Override
            public int a() {
                return 255;
            }
            @Override
            public void a(e e2) {
            }
        }
        
    • 反编译目标函数

      • 在目标函数区域右键选择Edit with assembler
      • 在弹出窗口的汇编代码开头添加如下指令,并Ctrl+S保存文件
        ICONST_1
        IRETURN
        
      • 再次回到目标代码,其文件内容变为
        // Decompiled with: CFR 0.152
        // Class Version: 8
        package com.a.a.e;
        import com.a.a.a.s;
        import com.a.a.e;
        import com.a.a.g;
        import com.a.a.k;
        /*
         * Duplicate member names - consider using --renamedupmembers true
         */
        public class l
        implements g {
            private static String a;
            public static boolean a(byte[] byArray, byte[] byArray2, k k2, int n) {
                return true;
            }
            @Override
            public String a() {
                return System.getProperty("user.name");
            }
            @Override
            public String b() {
                return s.f();
            }
            @Override
            public String c() {
                return "JavaDisplay";
            }
            @Override
            public int a() {
                return 255;
            }
            @Override
            public void a(e e2) {
            }
        }
        
    • 导出jar文件

      • 依次点击File->Export program,即可导出jar文件
posted @ 2025-05-06 09:47  ZhengQC  阅读(919)  评论(0)    收藏  举报