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);
}
}

