IDEA插件之Squaretest逆向激活

squareTest是一款非常优秀的java单元测试生成插件,众所周知,idea的插件基本都是用java写的,那么对于java程序员来说就可以非常容易对其进行逆向研究,通过修改反编译后的字节码来达成间接修改源码的目的,例如跳过激活步骤…(当然有能力还是尽量支持正版)

squaretest官方购买地址

本文研究使用版本是最新的 squareTest 1.8.7

1.反编译插件jar包

idea 插件默认存放目录为 C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea 你的idea版本\plugins

SquareTest的jar包为

1
C:\Users\用户名\AppData\Roaming\JetBrains\IntelliJIdea2023.3\plugins\Squaretest\lib\instrumented-TestStarter-1.8.7.jar

解压后,用IDEA 打开项目

可以看到,代码是有混淆的。

2.定位激活代码

从UI界面入手

全局搜索校验按钮Validate and Save

然后一步步查找调用,最终定位到公钥位置在com.squaretest.c包的q对象下

既然找到了公钥的存放地址,那么生成一个公钥替换即可完成激活。

3 生成公钥替

验签算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void main(String[] args) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
KeyPair keys = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keys.getPublic();
System.out.println("公钥:"+Base64.getEncoder().encodeToString(publicKey.getEncoded()));
PrivateKey privateKey = keys.getPrivate();
System.out.println("私钥:"+Base64.getEncoder().encodeToString(privateKey.getEncoded()));
Signature sig = Signature.getInstance("SHA256withDSA", "SUN");
sig.initSign(privateKey);
String clearText = "SQT1-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" +
"SQT1-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n" +
"SQT1-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n";
sig.update(clearText.getBytes(StandardCharsets.UTF_8));
byte[] signature = sig.sign();
System.out.println("签名:"+Base64.getEncoder().encodeToString(signature));
sig.initVerify(publicKey);
sig.update(clearText.getBytes(StandardCharsets.UTF_8));
boolean verify = sig.verify(signature);
System.out.println("校验:"+verify);
}

运行结果:
公钥:MIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7FnjuvNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSzNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51kjviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmYchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaWpoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6NHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2p5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOlXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92vAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veA4IBBQACggEACWm771QQO2uUh4tC9Y4xTQ9UN+ip/11Lpm6iCdPbRStnnonjaz2Liktweg/cISaQctMzpS24KecCHlGE9JJI41hT9bL9tSDr7pJuYdjLBa9oHiTf7fo8xcYL79W0yIEGT0RfI90g/ruTgBraQKgKqkq8lxA0EeafN+F8bLs5JCyjOsqya05K7k1NH9yFwwOJq3BaDk1ZdtOBYPHW3bVu9jY18kqiFnhPFfpEEKt0nvduDRO7gsAWwwPX8pN4AJcXqQ/JWVeye7FsUiL9AeybOvslHpO7vR43JnNLzopkyByu9AWABgw7gb6YXIcm2CTh0DnHXKUGJvQwbS5w5RrEDA==
私钥:MIICXQIBADCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7FnjuvNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSzNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51kjviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmYchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaWpoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6NHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2p5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOlXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92vAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veBB8CHQCjGsN7Jath4Gc9aKWF9AvXVy30UD0ug7/PPFXG
签名:MDwCHD/aj6q/ajidBmVUCISdbwhaL+LVWLdFQUeNe1ICHDa2cW0hXXWUyiIGp+eDdj6z3W44mbxz5pNYofU=
校验:true

4.替换class文件

替换q.class文件中的公钥变量,可以使用jclasslib插件即可

找到公钥穿对应的字符串常量,点击编辑,替换为上述方法生成的公钥,保存退出。

将修改过的class替换回jar包后,重启idea。进入激活页面,输入激活码即可完成激活

1
2
3
4
5
6
--- BEGIN SQUARETEST LICENSE ---
SQT1-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SQT1-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
SQT1-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
MDwCHD/aj6q/ajidBmVUCISdbwhaL+LVWLdFQUeNe1ICHDa2cW0hXXWUyiIGp+eDdj6z3W44mbxz5pNYofU=
--- END SQUARETEST LICENSE ---