腦瓜一熱趕緊搜索破解碼;
可能大部分伙伴都在搜各種一堆一大串的破解碼往里面粘,一個個試到最后終于過了。但也有一部分老司機是不搜破解碼的,他們使用jar包破解,有效期100年。
那么!本文并不引導用戶都去使用破解版,像IDEA這么優秀,其實給你提供了很多選擇;
如果你是學生可以免費使用分為社區辦和旗艦版,你可以使用社區版 Free, open-一般大公司都是有正版授權的,可以使用如果你有開源項目也可以申請 IDEA 授權
所以,個人開發使用社區版本即可,不要使用破解。
好!回歸正題,本文主要講解是為什么放個Jar包就能破解idea找不到或無法加載主類,最后在使用一個jar進行破解演示。在以下章節中你可以學習到如下知識;
二、案例工程
我們通過一個案例工程來模擬破解過程是怎么做到的,其實每個版本的IDEA都在增強防護機制,破解也越來越難。
itstack-demo-code-idea
└── src
├── main
│ ├── java
│ │ └── org.itstack.demo
│ │ └── JetbrainsCrack.java
│ └── resources
│ └── META-INF
│ └── MANIFEST.MF
└── test
└── java
├── com.jetbrains.ls.newLicenses
│ └── DecodeCertificates.java
└── org.itstack.demo.test
└── ApiTest.java
三、環境配置JDK 1.8IDEA 2019.3.1asm-all 3.3.1四、代碼講述
在案例中我們模擬 IDEA 有一個 類idea找不到或無法加載主類,用于做授權碼校驗。之后通過我們的 java agent 編程模擬授權被破解。
1. Java Agent 介紹
在 JDK1.5 以后,JVM 提供了 agent 技術構建一個獨立于應用程序的代理程序(即為Agent),用來協助監測、運行甚至替換其他JVM上的程序。使用它可以實現虛擬機級別的AOP功能。
2. ASM 介紹
ASM 是一個 JAVA 字節碼分析、創建和修改的開源應用框架。在 ASM 中提供了諸多的API用于對類的內容進行字節碼操作的方法。與傳統的 BCEL 和 SERL 不同,在 ASM 中提供了更為優雅和靈活的操作字節碼的方式。目前 ASM 已被廣泛的開源應用架構所使用,例如:、 等。
3. 開始我們的模擬破解之路
.java & Agent 操作類
/**
* 博客:http://bugstack.cn

* 公眾號:bugstack蟲洞棧 | 更多原處優質干貨
* Agent 類,所有程序啟動只要配置了 -javaagent: 都會走到 premain 方法
*/
public class JetbrainsCrack {
public static void premain(String args, Instrumentation inst) {
System.out.println("**************************************");
System.out.println("* 公眾號:bugstack蟲洞棧 *");
System.out.println("* 博客:https://bugstack.cn *");
System.out.println("* 你用劍,我用刀,好的代碼都很燒! *");
System.out.println("**************************************");
inst.addTransformer(new MethodEntryTransformer());
}
static class MethodEntryTransformer implements ClassFileTransformer {
private Logger logger = LoggerFactory.getLogger(MethodEntryTransformer.class);
public byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
try {
if (className.equals("com/jetbrains/ls/newLicenses/DecodeCertificates")) {
ClassReader cr = new ClassReader(classfileBuffer);
ClassNode cn = new ClassNode();
cr.accept(cn, 0);
List methodNodes = cn.methods;
for (MethodNode methodNode : methodNodes) {
if ("decodeLicense".equals(methodNode.name)) {
InsnList insns = methodNode.instructions;
//清除指令
insns.clear();
insns.add(new VarInsnNode(Opcodes.ALOAD, 1)); // 將本地指定的引用存入棧中
insns.add(new InsnNode(Opcodes.ARETURN)); // 從方法中返回引用類型的數據

// 訪問結束
methodNode.visitEnd();
ClassWriter cw = new ClassWriter(0);
cn.accept(cw);
byte[] bytes = cw.toByteArray();
// 輸出字節碼到Class
this.outputClazz(bytes);
// 返回最新字節碼
return cw.toByteArray();
}
}
}
} catch (Exception e) {
return classfileBuffer;
}
return classfileBuffer;
}
private void outputClazz(byte[] bytes) {
// 輸出類字節碼
FileOutputStream out = null;
try {
out = new FileOutputStream("ASMDecodeCertificates.class");
logger.info("ASM類輸出路徑:{}", (new File("")).getAbsolutePath());
out.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != out) try {
out.close();
} catch (IOException e) {
e.printStackTrace();

}
}
}
}
}
4. .java & 模擬 -15.0.1 軟件授權碼校驗類
public class DecodeCertificates {
public String decodeLicense(String usingKey) {
// 模擬校驗授權碼
return "usingKey is error:"+ usingKey;
}
}
5. .java & 測試類
/**
* 博客:http://bugstack.cn
* 公眾號:bugstack蟲洞棧 | 更多原處優質干貨
* 測試類配置 VM 參數
* Idea VM options:-javaagent:E:\itstack\GIT\itstack.org\itstack-demo-code\itstack-demo-code-idea\target\itstack-demo-code-idea-1.0-SNAPSHOT.jar
*/
public class ApiTest {
private static Logger logger = LoggerFactory.getLogger(ApiTest.class);
public static void main(String[] args) throws Exception {
DecodeCertificates decodeCertificates = new DecodeCertificates();
// 模擬usingKey:認購有效期至2089年7月8日
String license = decodeCertificates.decodeLicense("Subscription is active until July 8, 2089");

logger.info("測試結果:{}", license);
}
}
6. .MF 配置引導啟動時加載
Manifest-Version: 1.0
Premain-Class: org.itstack.demo.JetbrainsCrack
Can-Redefine-Classes: true
7. POM 配置打包時加入ASM包
org.apache.maven.plugins
maven-shade-plugin
package
shade
asm:asm-all:jar:
五、工程測試先單純的直接運行.java ,測試結果如下(模擬返回授權不可用); 21:23:46.101 [main] INFO org..demo.test. - 測試結果: is error: is until July 8, 2089第二步測試前先打包下工程,這個時候你會看到如下結果; [INFO] --- maven--:2.4: (-) @ -demo-code-idea ---
[INFO] E:\\GIT\\-demo-code\-demo-code-idea\\-demo-code-idea-1.0-.jar to D:\ Files (x86)\-maven-3.6.2\\org\\demo\-demo-code-idea\1.0-\-demo-code-idea-1.0-.jar
[INFO] E:\\GIT\\-demo-code\-demo-code-idea\--pom.xml to D:\ Files (x86)\-maven-3.6.2\\org\\demo\-demo-code-idea\1.0-\-demo-code-idea-1.0-.pom
[INFO] E:\\GIT\\-demo-code\-demo-code-idea\\-demo-code-idea-1.0--.jar to D:\ Files (x86)\-maven-3.6.2\\org\\demo\-demo-code-idea\1.0-\-demo-code-idea-1.0--.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.080 s
[INFO] at: 2020-01-05T23:25:08+08:00
[INFO] ------------------------------------------------------------------------配置 VM :-:E:\\GIT\\-demo-code\-demo-code-idea\\-demo-code-idea-1.0-.jar 微信公眾號:蟲洞棧 & IDEA VM 運行 測試,正確結果如下; 23:29:42.803 [main] INFO org..demo.test. - 測試結果: is error: is until July 8, 2089
with exit code 0別忘了我們還在 Agent 中輸出了新的字節碼,看看這個時候的類是什么樣(你大爺還是你大爺,但你大娘可不是你大娘了)
被代理前
public class DecodeCertificates {
public String decodeLicense(String usingKey) {
// 模擬校驗授權碼
return "usingKey is error:"+ usingKey;
}
}
被代理后
package com.jetbrains.ls.newLicenses;
public class DecodeCertificates {
public DecodeCertificates() {
}
public String decodeLicense(String usingKey) {
return usingKey;
}
}
六、綜上總結