Agent Xmind 免注册技术

1、Agent 技术软件免注册

Agent 破解软件和直接修改代码来破解软件,在原理都是一样的都是修改了原始的代码,绕过了原始的验证逻辑。

1.1 反编译破解

比如用户的 LicenseChecker 类用于检查 Licence。

1
2
3
4
5
6
7
8
public class LicenseChecker{
public boolean check(String license){
if(license 是合法的){
return true;
}
return false;
}
}

我们可以通过反编译的工具JD-JUI,反编译以上的 Class ,修改以上的代码为:

1
2
3
4
5
public class LicenseChecker{
public boolean check(String license){
return false;
}
}

直接反编译修改Class,需要重新放入到jar中 。修改的时候需要相应的依赖,比较麻烦。 修改 Class 也可以去 Agent 方式,直接使用ASM修改字节码,不要再反编译,也无需相应的依赖。

1.2 Agent 字节码修改破解

Agent 修改和上面的原理是一致的,在加载Class的时候进行修改,这样就无需放入到jar中了,比较方便省事。

2、Xmind 注册

XMind\plugins\net.xmind.verify_3.7.8.201807240049.jar

checkSignatureValid 方法应用检验 License 是否合法。直接修改这个方法返回true就可以了

1
2
3
4
5
6
7
8
9
10
11
12
private boolean checkSignatureValid(byte[] base, byte[] signature, byte[] publicKey)
throws Exception
{
X509EncodedKeySpec ks = new X509EncodedKeySpec(
Base64.decodeBase64(publicKey));
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pub = kf.generatePublic(ks);
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initVerify(pub);
signer.update(base);
return signer.verify(signature);
}

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class Agent
{
public static void premain(String args, Instrumentation inst)
{
inst.addTransformer(new MethodEntryTransformer(null));
}

private static class MethodEntryTransformer
implements ClassFileTransformer
{
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException
{
try
{
//修改指定的class
if ((className != null) && (className.startsWith("net/xmind/verify/internal/LicenseVerifier")))
{
ClassReader cr = new ClassReader(classfileBuffer);
cn = new ClassNode();
cr.accept(cn, 0);
List<MethodNode> methodNodes = cn.methods;
for (MethodNode methodNode : methodNodes) {
//修改指定的方法
if ("checkSignatureValid".equals(methodNode.name))
{
Type[] type = Type.getArgumentTypes(methodNode.desc);
Type returnType = Type.getReturnType(methodNode.desc);
//验证方法的参数类型,避免方法重载
if ((type.length == 3) && (returnType.toString().equals("Z")))
{
InsnList insnList = methodNode.instructions;
//清除原先的指令
insnList.clear();
//添加true到操作数栈
insnList.add(new InsnNode(4));
//执行返回操作
insnList.add(new InsnNode(172));
//清除异常列表
methodNode.exceptions.clear();
methodNode.visitEnd();
ClassWriter cw = new ClassWriter(0);
cn.accept(cw);
System.out.println(className + " -> " + methodNode.name + " -> " + methodNode.desc);
return cw.toByteArray();
}
}
}
}
}
catch (Throwable e)
{
ClassNode cn;
e.printStackTrace();
}
return classfileBuffer;
}
}
}

声明

以上的内容,仅供与研究和学习使用,不要使用在非法用途上!!!