StrategyQuant X Build 134 by Tonyweb for Sale

You can either crack it yourself or you can buy from me.

How to crack it:

Three jars are decrypted from native code and main loader class takes control.

The java loader starts decrypting the crypted jar in relative path:

./internal/libs/SQLib.jar

and one of the interesting steps for us is the checkLicense one

CheckLicense

private void checkLicense() {
        try {
            SQApp.Log.debug("Verifying license.");
            Brokers.init();
            SQApp.Log.debug("Verifying license. Step 2");
            final SQLicenser instance = SQLicenser.getInstance();
            instance.setLicenceFilePath(MainApp.getDataPath() + "licenceFile.lic");
            SQApp.Log.debug("Verifying license. Step 3");
            try {
                if (instance.licenseFileExists()) {
                    SQApp.Log.debug("Verifying license. Step 4");
                    instance.verifyLicenseFromFile();
                }
            }
            catch (Exception ex) {
                LicenseDialog.getInstance().setLicense(instance.getLastCheckedLicenseCode());
                LicenseDialog.getInstance().setError(ex.getMessage());
                SQApp.Log.error("License verification failed. Exc. ", (Throwable)ex);
            }
            LicenseDb.init(SQStructure.INTERNAL_DIR_PATH);
            if (this.isRunInConsole()) {
                SQApp.Log.debug("Verifying license. Step 5 CLI");
                if (!SQLicenser.getInstance().verified()) {
                    SQApp.Log.debug("Verifying license. Step 6 CLI");
                    final String license = LicenseDb.getLicense();
                    if (license != null && !license.isEmpty()) {
                        SQApp.Log.debug("Verifying license. Step 7 CLI");
                        instance.verifyLicenseOnline(license);
                    }
                }
            }
            else {
                SQApp.Log.debug("Verifying license. Step 5");
                while (BrowserGUI.getInstance() == null) {
                    SQApp.Log.info("Waiting for internal browser initialization");
                    Thread.sleep(500L);
                }
                SQApp.Log.info("License dialog initing");
                BrowserGUI.getInstance().showLicenseLoadingScreen();
                final String license2 = LicenseDb.getLicense();
                if (license2 != null && !license2.isEmpty()) {
                    LicenseDialog.getInstance().setLicense(license2);
                }
                SQApp.Log.debug("Verifying license. Step 6");
                if (!SQLicenser.getInstance().verified()) {
                    SQApp.Log.debug("Verifying license. Step 7");
                    BrowserGUI.getInstance().loadLicenseDialogForm();
                    SQApp.Log.debug("Verifying license. Step 8");
                    if (instance.isItTrial() || instance.isItPartnerTrial() || instance.isItFullMbg()) {
                        LicenseDb.setLicense(instance.getLicenseCode());
                    }
                    else {
                        LicenseDb.setLicense("");
                    }
                }
            }
            if (!SQLicenser.getInstance().verified()) {
                SQApp.Log.info("Missing license.");
                MainApp.exitJVM();
            }
            SQApp.Log.debug("License was successfully verified.");
        }
        catch (Exception ex2) {
            SQApp.Log.error("Failed to check license. Exc. ", (Throwable)ex2);
            MainApp.exitJVM();
        }
    }

You can start tracing from here to follow what’s happening:

String references are not easy to deal with because of the way Go arranges them (i.e. concatenated in blocks).

private SQLicenseXml _verifyLicenseOnServer(final String s, final String s2, final String s3, final boolean b) throws SQLicenseException {
        try {
            final SQLicenseXml sqLicenseXml = new SQLicenseXml();
            sqLicenseXml.type = 5;
            String str = URLEncoder.encode("productid", "UTF-8") + "=" + URLEncoder.encode(this.product, "UTF-8") + "&" + URLEncoder.encode("mac", "UTF-8") + "=" + URLEncoder.encode(s, "UTF-8") + "&" + URLEncoder.encode("dsn", "UTF-8") + "=" + URLEncoder.encode(s2, "UTF-8") + "&" + URLEncoder.encode("license", "UTF-8") + "=" + URLEncoder.encode(s3, "UTF-8") + "&" + URLEncoder.encode("resellerid", "UTF-8") + "=" + URLEncoder.encode(this.reseller, "UTF-8") + "&" + URLEncoder.encode("uniqid", "UTF-8") + "=" + URLEncoder.encode(this.uniqID, "UTF-8") + "&" + URLEncoder.encode("hardwareid", "UTF-8") + "=" + URLEncoder.encode(this.hardwareid, "UTF-8") + "&" + URLEncoder.encode("newhardwareid", "UTF-8") + "=" + URLEncoder.encode(this.newhardwareid, "UTF-8") + "&" + URLEncoder.encode("dateid", "UTF-8") + "=" + URLEncoder.encode(this.dateid + "", "UTF-8") + "&" + URLEncoder.encode("os", "UTF-8") + "=" + URLEncoder.encode(HardwareInfo.getOSKey() + "", "UTF-8");
            if (b) {
                str = str + "&" + URLEncoder.encode("offline", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8");
            }
            if (this.builds.containsKey(this.product)) {
                str = str + "&" + URLEncoder.encode("build", "UTF-8") + "=" + this.builds.get(this.product);
            }
            final String string = str + "&" + URLEncoder.encode("ival", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8");
            boolean b2 = false;
            final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
            final ArrayList<Future<String>> list = new ArrayList<Future<String>>();
            list.add(fixedThreadPool.<String>submit((Callable<String>)new SQHttpClient("https://api.strategyquant.com/licensechecksqx", string)));
            list.add(fixedThreadPool.<String>submit((Callable<String>)new SQHttpClient("https://api2.strategyquant.com/licensechecksqx", string)));
            String xml = null;
            String s4 = null;
            final Iterator<Object> iterator = list.iterator();
            while (iterator.hasNext()) {
                final String s5 = (String)((Future<String>)iterator.next()).get();
                if (s5 != null) {
                    b2 = true;
                    final String[] split = s5.split("\n");
                    if (split.length != 2) {
                        continue;
                    }
                    xml = new String(Base64.decodeBase64(split[0]), "UTF-8");
                    s4 = split[1];
                    if (!xml.contains("<error>")) {
                        break;
                    }
                    continue;
                }
            }
            if (!b2) {
                throw new SQLicenseException(2);
            }
            if (xml == null || s4 == null) {
                throw new SQLicenseException(9);
            }
            sqLicenseXml.hash = Base64.decodeBase64(s4);
            sqLicenseXml.xml = xml;
            return sqLicenseXml;
        }
        catch (SQLicenseException ex) {
            throw ex;
        }
        catch (Exception ex2) {
            SQLicenser.Log.error("Exc.", (Throwable)ex2);
            throw new SQLicenseException(20);
        }
    }