first commit

This commit is contained in:
2024-06-22 01:36:29 +08:00
commit 292551fbc7
15 changed files with 940 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,8 @@
<component name="ArtifactManager">
<artifact type="jar" name="jetbrains_cracker:jar">
<output-path>$PROJECT_DIR$/out/artifacts/jetbrains_cracker_jar</output-path>
<root id="archive" name="jetbrains_cracker.jar">
<element id="module-output" name="jetbrains_cracker" />
</root>
</artifact>
</component>

8
.idea/encodings.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java/top/zunmx/MWindow.java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

14
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

124
.idea/uiDesigner.xml generated Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

86
pom.xml Normal file
View File

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>jetbrains_cracker</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.28.0-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>top.zunmx.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- <build>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-compiler-plugin</artifactId>-->
<!-- <version>3.11.0</version>-->
<!-- <configuration>-->
<!-- <source>1.8</source>-->
<!-- <target>1.8</target>-->
<!-- </configuration>-->
<!-- </plugin>-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-jar-plugin</artifactId>-->
<!-- <version>3.3.0</version>-->
<!-- <configuration>-->
<!-- <archive>-->
<!-- <manifest>-->
<!-- <mainClass>top.zunmx.Main</mainClass>-->
<!-- <addClasspath>true</addClasspath>-->
<!-- <classpathPrefix>lib/</classpathPrefix>-->
<!-- <useUniqueVersions>false</useUniqueVersions>-->
<!-- </manifest>-->
<!-- <manifestEntries>-->
<!-- <Premain-Class>top.zunmx.Main</Premain-Class>-->
<!-- </manifestEntries>-->
<!-- </archive>-->
<!-- </configuration>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
</project>

185
readme.md Normal file
View File

@ -0,0 +1,185 @@
# 引言
tb上买过教育版结果用了一年多就封了我记得之前用过ja-netfilter用的是激活码但是看起来直接替换的这种解决方案不太靠谱现在是使用jetbra.in激活服务器激活但是如果断网条件下或者某一天这个网站down了就没办法了尝试过通过fiddler拦截激活服务器的响应发现相同请求所获得的响应是不同的加密算法也搞不懂power.conf也看不懂用着就不放心还是社区版搞起吧毕竟社区版也够用了。这里也是从52大神那里作为参考想到的另一种方案此方法仅供技术研究和讨论切勿用于商业用途否则后果自负。
经测试idea,datagrip,clion均过许可
# 版本
idea 2024.1.3
# 准备工作
jadx
idea
arthas
jdk
# 思路
## 找到窗口
![image.png](https://www.zunmx.top/usr/uploads/2024/06/799549738.png)
![image.png](https://www.zunmx.top/usr/uploads/2024/06/3547910640.png)
通过arthas获取awt的窗口`$ ognl '@java.awt.Window@getWindows()'`
尝试关闭窗口`ognl '@javax.swing.JDialog@getWindows()[3].dispose()'`
发现idea并没有完全退出如果直接手动点退出的话程序会结束
## 找到类名
上文中找到窗口了,类名其实也就出来了,但是如何判断`com.intellij.openapi.ui.impl.DialogWrapperPeerImpl$MyDialogWrapperImpl`具体在哪个包里,还是有些困难,通过`sc -d -f com.intellij.openapi.ui.impl.DialogWrapperPeerImpl`并没有找到这里就是猜猜到app-client.jar文件
## 分析代码
找到注入位置这里也踩了很多坑比如说关闭了不该关闭的窗口但是开发过java的应该都熟悉get/set方法那么在setTitle时检查名称是不是就可以判断出这个窗口是不是应该关闭了
## 写代码
### 依赖
```xml
<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.28.0-GA</version>
</dependency>
</dependencies>
```
### 代码
```java
package org.example;
import javassist.*;
import java.io.*;
import java.util.Enumeration;
import java.util.jar.*;
public class ModifyDialogWrapperPeerImpl {
public static void main(String[] args) {
try {
ClassPool pool = ClassPool.getDefault();
String jarPath = "G:\\test\\app-client-old.jar"; // jar文件路径
String exportPath = "G:\\test\\app-client.jar"; // jar文件路径
pool.insertClassPath(jarPath);
CtClass ctClass = pool.get("com.intellij.openapi.ui.impl.DialogWrapperPeerImpl"); // 类名
CtMethod setTitleMethod = ctClass.getDeclaredMethod("setTitle",
new CtClass[]{pool.get("java.lang.String")}); // 方法名
setTitleMethod.insertBefore("{ System.out.println(\"即将打开窗口-->\"+$1);" +
"boolean isLicenseWindow = false;" +
"if($1.indexOf(\"许可证\")>-1) {isLicenseWindow=true; this.dispose();}" +
"if($1.indexOf(\"Licenses\")>-1) {isLicenseWindow=true; this.dispose();}" +
"if(isLicenseWindow)System.out.println(\"发现激活窗口,即将关闭\");" +
" }"); // 注入的代码
String tempDir = "G:\\test\\modified_classes";
ctClass.writeFile(tempDir);
ctClass.detach();
updateJarFile("G:\\test\\app-client-old.jar", tempDir, exportPath);
System.out.println("Method modified successfully.");
} catch (NotFoundException | CannotCompileException | IOException e) {
e.printStackTrace();
}
}
public static void updateJarFile(String originalJarPath, String modifiedClassesPath, String outputJarPath) throws IOException {
JarFile originalJar = new JarFile(originalJarPath);
FileOutputStream fos = new FileOutputStream(outputJarPath);
JarOutputStream jos = new JarOutputStream(fos);
// 复制原始JAR中的所有文件到新的JAR中跳过要修改的类文件
Enumeration<JarEntry> entries = originalJar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (!entry.getName().equals("com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.class")) { // 跳过要修改的类文件
InputStream is = originalJar.getInputStream(entry);
jos.putNextEntry(new JarEntry(entry.getName()));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
jos.write(buffer, 0, bytesRead);
}
is.close();
jos.closeEntry();
}
}
originalJar.close();
// 添加修改后的类文件到新的JAR中
File modifiedClassesDir = new File(modifiedClassesPath);
addModifiedFilesToJar(modifiedClassesDir, "", jos);
jos.close();
}
private static void addModifiedFilesToJar(File source, String parent, JarOutputStream jos) throws IOException {
File[] files = source.listFiles();
for (File file : files) {
if (file.isDirectory()) {
addModifiedFilesToJar(file, parent + file.getName() + "/", jos);
} else {
FileInputStream fis = new FileInputStream(file);
jos.putNextEntry(new JarEntry(parent + file.getName()));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
jos.write(buffer, 0, bytesRead);
}
fis.close();
jos.closeEntry();
}
}
}
}
```
执行完成后,需要把生成的文件替换回去。
# 测试
![image.png](https://www.zunmx.top/usr/uploads/2024/06/2847269302.png)
![image.png](https://www.zunmx.top/usr/uploads/2024/06/709101366.png)
# 注意
这里需要注意的是上文代码中的Licenses和许可证是写死的如果使用其他语言的语言包需要手动修改一下。
jar文件路径
idea == > app-client.jar
clion ==> app-client.jar
datagrip ==> app.jar
操作前需要先备份一下
经过测试MyDialog是所有子窗口的类如果一股脑全部关闭设置新建打开关于你都将无法看到。
但是用了这个方法,注册窗口也是无法显示出来的
这种方法不能绕过插件的激活
# 工程实例
![image.png](https://www.zunmx.top/usr/uploads/2024/06/3344638210.png)
![image.png](https://www.zunmx.top/usr/uploads/2024/06/92482229.png)
[jc.zip](https://www.zunmx.top/usr/uploads/2024/06/1200008417.zip)
运行:
```bash
java -jar jetbrains_cracker-1.0-SNAPSHOT-jar-with-dependencies.jar
```
⚠ 仅以开源和学习精神,切勿用于商业用途。
# 结语
请支持正版,仅供研究学习使用,请勿用于非法用途。

View File

@ -0,0 +1,219 @@
package top.zunmx;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JFileChooser;
public class MWindow extends Frame {
private static MyList logList;
private final MyButton selectDirButton;
private final MyButton clearListButton;
private final MyButton creckButton;
private MyTextArea textLabel;
private Thread searchThread;
public static boolean stop = false;
private static ArrayList<String> file_paths = new ArrayList();
public static String findAppJar(File dir) {
File[] files = dir.listFiles();
if (files != null) {
lab1:
for (File file : files) {
if (stop) break;
if (file.isDirectory()) {
if (file.getName().equalsIgnoreCase("lib")) {
File[] libFiles = file.listFiles();
if (libFiles != null) {
for (File libFile : libFiles) {
if (stop) break;
if (libFile.isFile() && libFile.getName().equalsIgnoreCase("app.jar")) {
file_paths.add(file.getAbsolutePath());
break lab1;
}
}
}
} else {
// 递归检查子目录
if (stop) break;
if (findAppJar(file) != null) {
file_paths.add(file.getAbsolutePath());
break lab1;
}
}
}
}
}
return null;
}
private void buttonEnabled(boolean flag) {
// clearListButton.setEnabled(flag);
creckButton.setEnabled(flag);
selectDirButton.setEnabled(flag);
}
public MWindow() {
// 设置窗口标题
super("JetBrains License Cracker V1.0");
// 设置窗口布局
setLayout(new BorderLayout());
// 创建目录选择器按钮
selectDirButton = new MyButton("Select Jetbrains Path");
selectDirButton.addActionListener(e -> {
File directory = selectDirectory();
if (directory != null && directory.isDirectory()) {
logList.removeAll();
file_paths.clear();
if (directory.exists() && directory.isDirectory()) {
logList.add("=============================[SEARCHING]=================================");
stop = false;
logList.add("[i] Searching for jetbrains product in " + directory.getAbsolutePath());
new Thread(() -> {
this.buttonEnabled(false);
Thread searchThread = new Thread(() -> findAppJar(directory));
searchThread.start();
try {
searchThread.join();
logList.add("=============================[FOUND " + file_paths.size() + " ITEM]=================================");
for (String filePath : file_paths) {
logList.add("[#] Found Product: " + filePath);
}
if (stop) {
logList.add("[!] STOPPED");
}
this.buttonEnabled(true);
} catch (InterruptedException ex) {
logList.add("[x] Exception: " + ex.getMessage());
throw new RuntimeException(ex);
}
}).start();
} else {
logList.add("[!] The specified path is not a directory or does not exist.");
}
}
});
// 创建清除列表按钮
clearListButton = new MyButton("Reset / Clear List");
clearListButton.addActionListener(e -> {
stop = true;
logList.removeAll();
file_paths.clear();
});
// 创建破解按钮
creckButton = new MyButton("Crack!");
creckButton.addActionListener(e -> {
if (file_paths.isEmpty()) {
logList.removeAll();
logList.add("[!] No product found");
logList.add("[!] Please select the Jetbrains software installation directory.");
return;
}
buttonEnabled(false);
new Thread(() -> {
Thread thread = new Thread(() -> {
for (String filePath : file_paths) {
try {
String[] split = filePath.split("\\\\");
String product = split[filePath.split("\\\\").length - 2];
logList.add("=============================[CRACKING " + product + "]=================================");
logList.add("[i] Cracking " + filePath);
ModifyDialogWrapperPeerImpl modifyDialogWrapperPeer = new ModifyDialogWrapperPeerImpl();
modifyDialogWrapperPeer.crack_it(filePath, logList);
modifyDialogWrapperPeer = null;
System.gc();
if (stop) {
logList.add("[!] STOPPED");
break;
}
} catch (Exception except) {
logList.add("[!] Crack Failed: " + except.getMessage());
}
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException ex) {
logList.add("[x] Exception: " + ex.getMessage());
throw new RuntimeException(ex);
}
buttonEnabled(true);
}).start();
});
textLabel = new MyTextArea("[i] Usage\n" +
" 1. Click [Select Jetbrains Path] Button\n" +
" 2. Select Jetbrains software installation directory\n" +
" eg. C:\\program files\\Jetbrains\n" +
" 3. Click [crack!] Button\n" +
" 4. Just a moment. \n\n" +
"[!] Recovery\n" +
" If you want to restore the original version,\n" +
" go to the lib\\JZC-backup directory under the product installation directory,\n" +
" find the backup files, and replace the files that in the lib directory.\n" +
"[!] Crack by Bypass the license window for trial\n" +
"[x] For code academic exchange only, do not use for commercial purposes\n" +
"[x] please delete the sample within 24 hours\n" +
"[i] Detection to prevent repeated cracking\n" +
"[i] Patch by ZunMX\n", 9, 30, TextArea.SCROLLBARS_VERTICAL_ONLY);
// 创建文件列表
logList = new MyList();
// 创建按钮面板
Panel buttonPanel = new Panel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(selectDirButton);
buttonPanel.add(clearListButton);
buttonPanel.add(creckButton);
// 添加组件到窗口
add(buttonPanel, BorderLayout.NORTH);
add(logList, BorderLayout.CENTER);
add(textLabel, BorderLayout.SOUTH);
// 设置窗口关闭行为
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(750, 550);
Dimension windowSize = this.getSize();
int x = (screenSize.width - windowSize.width) / 2;
int y = (screenSize.height - windowSize.height) / 2;
this.setLocation(x, y);
setVisible(true);
validate();
repaint();
}
private File selectDirectory() {
File directory = null;
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Choose Jetbrains path");
// fileChooser.setCurrentDirectory(new File("d:\\software\\jetbrains"));
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int option = fileChooser.showOpenDialog(this);
if (option == JFileChooser.APPROVE_OPTION) {
directory = fileChooser.getSelectedFile();
}
return directory;
}
public static void main(String[] args) {
new MWindow();
}
}

View File

@ -0,0 +1,13 @@
package top.zunmx;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
// ModifyDialogWrapperPeerImpl.crack_it("D:\\software\\JetBrains\\DataGrip 2024.1.2\\lib");
// ModifyDialogWrapperPeerImpl.crack_it("D:\\software\\JetBrains\\CLion 2024.1.4\\lib");
JOptionPane.showMessageDialog(null,
"此程序仅用于学术交流,切勿用于商业用途,您若花钱购买此产品,请立即举报商家!","注意",2);
new MWindow();
}
}

View File

@ -0,0 +1,190 @@
package top.zunmx;
import javassist.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.*;
import java.util.Enumeration;
import java.util.jar.*;
public class ModifyDialogWrapperPeerImpl {
public String filename = "";
public String backupPath = "";
public String middlePath = "";
public String bkPath = "";
public MyList logList;
private CtClass ctClass;
private URLClassLoader urlClassLoader;
private ClassPool pool = null;
private LoaderClassPath jarClassPath = null;
public boolean deleteDirectory(String dirPath) {
File directory = new File(dirPath);
// 检查目录是否存在
if (!directory.exists()) {
logList.add("[#] Directory " + dirPath + " does not exist.");
return false;
}
// 递归删除目录中的所有文件和子目录
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
deleteDirectory(file.getAbsolutePath());
} else {
file.delete();
logList.add(" |-[#] Deleted file: " + file.getAbsolutePath());
}
}
}
// 最后尝试删除空目录
logList.add(" |-[#] Deleting directory: " + directory.getAbsolutePath());
return directory.delete();
}
public void moveFile(String sourcePath, String targetPath) throws IOException {
Path src = Paths.get(sourcePath);
Path dest = Paths.get(targetPath);
Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING);
logList.add("[#] Moved backup file from " + sourcePath + " to " + targetPath);
}
public String checker(String dirPath) {
File file = new File(dirPath + "\\" + "JCZ-backup");
boolean directory = file.exists();
if (!directory) {
logList.add("[#] JCZ-backup folder not found, creating...");
file.mkdir();
}
file = new File(dirPath + "\\" + "JCZ-middle");
directory = file.exists();
if (!directory) {
logList.add("[#] JCZ-middle folder not found, creating...");
file.mkdir();
}
backupPath = dirPath + "\\" + "JCZ-backup";
middlePath = dirPath + "\\" + "JCZ-middle";
if (new File(dirPath + "\\" + "app-client.jar").exists()) {
filename = "app-client.jar";
logList.add("[#] app-client.jar found, using it.");
return dirPath + "\\" + "app-client.jar";
} else {
filename = "app.jar";
logList.add("[#] app.jar found, using it.");
return dirPath + "\\" + "app.jar";
}
}
public void crack_it(String dirPath, MyList log_list) throws Exception {
logList = log_list;
pool = ClassPool.getDefault();
String d_jarPath = checker(dirPath);
File file = new File(backupPath + "\\" + filename);
if (file.exists()) {
bkPath = backupPath + "\\" + System.currentTimeMillis() + filename;
moveFile(backupPath + "\\" + filename, bkPath); // 将原来的文件备份起来
}
moveFile(d_jarPath, backupPath + "\\" + filename); // 将原来的文件备份起来
bkPath = backupPath + "\\" + filename;
String jarPath = backupPath + "\\" + filename;
File jar_url = new File(jarPath);
urlClassLoader = new URLClassLoader(
new URL[]{jar_url.toURI().toURL()}
);
jarClassPath = new LoaderClassPath(urlClassLoader);
pool.insertClassPath(jarClassPath);
logList.add("[#] Loading jar file: " + jarPath);
ctClass = pool.get("com.intellij.openapi.ui.impl.DialogWrapperPeerImpl"); // 类名
CtMethod setTitleMethod = ctClass.getDeclaredMethod("setTitle",
new CtClass[]{pool.get("java.lang.String")}); // 方法名
if (setTitleMethod.getMethodInfo().getCodeAttribute().getCode().length > 20) {
ctClass.detach();
urlClassLoader.close();
pool.removeClassPath(jarClassPath);
logList.add("[!] The file seems to have been cracked. EXIT");
moveFile(bkPath, dirPath + "\\" + filename);
throw new RuntimeException("PRODUCT HAS BEEN CRACKED!");
}
setTitleMethod.insertBefore("{ System.out.println(\"即将打开窗口-->\"+$1);" +
"boolean isLicenseWindow = false;" +
"if($1.indexOf(\"许可证\")>-1) {isLicenseWindow=true; this.dispose();}" +
"if($1.indexOf(\"Licenses\")>-1) {isLicenseWindow=true; this.dispose();}" +
"if(isLicenseWindow)System.out.println(\"发现激活窗口,即将关闭\");" +
"Exception e = new Exception(\"↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\");\n" +
"System.out.println(\"调用栈信息-->\");" +
"e.printStackTrace();" +
" }"); // 注入的代码
logList.add("[#] Modifying class: " + ctClass.getName());
ctClass.writeFile(middlePath);
ctClass.detach();
updateJarFile(jarPath, middlePath, d_jarPath);
logList.add("[#] Exporting modified jar file: " + d_jarPath);
moveFile(jarPath, backupPath + "\\" + filename);
new File(d_jarPath).renameTo(new File(jarPath));
logList.add("[#] Deleting middle folder: " + middlePath);
urlClassLoader.close();
pool.removeClassPath(jarClassPath);
deleteDirectory(middlePath);
logList.add("[√] Cracked ^_^");
}
public void updateJarFile(String originalJarPath, String modifiedClassesPath, String outputJarPath) throws IOException {
JarFile originalJar = new JarFile(originalJarPath);
FileOutputStream fos = new FileOutputStream(outputJarPath);
JarOutputStream jos = new JarOutputStream(fos);
// 复制原始JAR中的所有文件到新的JAR中跳过要修改的类文件
Enumeration<JarEntry> entries = originalJar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (!entry.getName().equals("com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.class")) { // 跳过要修改的类文件
InputStream is = originalJar.getInputStream(entry);
jos.putNextEntry(new JarEntry(entry.getName()));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
jos.write(buffer, 0, bytesRead);
}
is.close();
jos.closeEntry();
}
}
originalJar.close();
// 添加修改后的类文件到新的JAR中
File modifiedClassesDir = new File(modifiedClassesPath);
addModifiedFilesToJar(modifiedClassesDir, "", jos);
jos.close();
fos.close();
}
private void addModifiedFilesToJar(File source, String parent, JarOutputStream jos) throws IOException {
File[] files = source.listFiles();
for (File file : files) {
if (file.isDirectory()) {
addModifiedFilesToJar(file, parent + file.getName() + "/", jos);
} else {
FileInputStream fis = new FileInputStream(file);
jos.putNextEntry(new JarEntry(parent + file.getName()));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
jos.write(buffer, 0, bytesRead);
}
fis.close();
jos.closeEntry();
}
}
}
}

View File

@ -0,0 +1,11 @@
package top.zunmx;
import javax.swing.*;
import java.awt.*;
public class MyButton extends JButton {
public MyButton(String label)
{
super(label);
}
}

View File

@ -0,0 +1,18 @@
package top.zunmx;
import java.awt.*;
public class MyList extends List {
public MyList() {
super();
this.setBackground(new Color(125,125,125));
this.setForeground(new Color(255, 255, 255, 255));
Font font = new Font("Monospaced", Font.PLAIN, 14);
this.setFont(font);
}
@Override
public void add(String item) {
super.add(item);
this.select(this.getItemCount() - 1);
}
}

View File

@ -0,0 +1,15 @@
package top.zunmx;
import java.awt.*;
public class MyTextArea extends TextArea {
public MyTextArea(String text, int rows, int columns, int style) {
super(text, rows, columns, style);
this.setEditable(false);
this.setBackground(new Color(125,125,125));
this.setForeground(new Color(255, 251, 0, 255));
this.setEditable(false);
this.setFont(new Font("Monospaced", Font.BOLD, 14));
this.setFocusable(false); // 禁止获取焦点
}
}

View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: top.zunmx.Main