Skip to content

Commit 0ad855b

Browse files
committed
修复设备ID修改失败的问题并完善文档
1 parent bff4610 commit 0ad855b

File tree

13 files changed

+818
-19
lines changed

13 files changed

+818
-19
lines changed

.gitignore

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ coverage.txt
1818
coverage.html
1919

2020
# 依赖目录
21+
/node_modules/
2122
/vendor/
2223

2324
# Go工作区文件
@@ -30,6 +31,7 @@ go.work
3031
*.swo
3132
*~
3233
.DS_Store
34+
Thumbs.db
3335

3436
# 临时文件和目录
3537
/tmp/
@@ -56,6 +58,7 @@ go.work
5658
config.local.json
5759

5860
# 数据目录和大文件
59-
/data/
60-
/data/*
61-
/data/JG-Cursor-1_4_0-mac/
61+
/data/JG-Cursor-1_4_0-mac/Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework
62+
63+
node_modules/
64+
data/*/node_modules/

README.md

Lines changed: 157 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,177 @@ JG-Cursor-cracker 是一个用于破解和激活 JG-Cursor 应用的工具。
99
- 自动搜索硬盘上的 JG-Cursor.app 安装
1010
- 自动安装 asar 工具(优先使用 cnpm)
1111
- 解包和修改 app.asar 文件
12+
- 支持指定自定义机器码
1213
- 炫酷的彩色控制台输出
1314

14-
## 构建和测试
15+
## 编译与安装
1516

16-
### 构建
17+
### 环境要求
1718

19+
- Go 1.18 或更高版本
20+
- Node.js 和 npm (用于 asar 工具)
21+
22+
### 从源码编译
23+
24+
1. 克隆仓库:
25+
```bash
26+
git clone https://github.com/JSREP/JG-Cursor-cracker.git
27+
cd JG-Cursor-cracker
28+
```
29+
30+
2. 编译:
31+
```bash
32+
go build -o jg-cursor-cracker
33+
```
34+
35+
或者指定主文件:
36+
```bash
37+
go build -o jg-cursor-cracker main.go
38+
```
39+
40+
3. 运行测试(可选):
41+
```bash
42+
go test -v ./pkg/cracker/...
43+
```
44+
45+
### 直接下载编译好的二进制文件
46+
47+
访问 [Releases](https://github.com/JSREP/JG-Cursor-cracker/releases) 页面下载对应系统的二进制文件。
48+
49+
对于 MacOS 用户,下载后可能需要添加执行权限:
1850
```bash
19-
go build -o jg-cursor-cracker main.go
51+
chmod +x jg-cursor-cracker
2052
```
2153

22-
### 运行测试
54+
## 使用方法
55+
56+
### 基本用法
2357

2458
```bash
25-
go test -v ./pkg/cracker/...
59+
# 使用默认设置破解
60+
./jg-cursor-cracker crack
61+
62+
# 使用自定义机器码破解
63+
./jg-cursor-cracker crack --device-id "MY-CUSTOM-ID-12345"
64+
65+
# 指定JG-Cursor安装路径
66+
./jg-cursor-cracker crack --path /Applications/JG-Cursor.app
67+
68+
# 全盘搜索JG-Cursor安装并破解
69+
./jg-cursor-cracker crack --search-disk
70+
71+
# 显示JG-Cursor安装信息
72+
./jg-cursor-cracker info
73+
74+
# 显示版本信息
75+
./jg-cursor-cracker version
2676
```
2777

78+
### 命令说明
79+
80+
- `crack`: 破解JG-Cursor应用
81+
- `-d, --device-id string`: 自定义机器码
82+
- `-p, --path string`: JG-Cursor安装路径
83+
- `-s, --search-disk`: 搜索整个硬盘
84+
- `-y, --yes`: 自动确认所有提示
85+
86+
- `info`: 显示安装信息
87+
- `-p, --path string`: JG-Cursor安装路径
88+
- `-s, --search-disk`: 搜索整个硬盘
89+
90+
- `version`: 显示版本信息
91+
2892
## 持续集成
2993

3094
项目使用 GitHub Actions 进行持续集成,每次代码提交都会自动运行测试。
3195

3296
## 贡献代码
3397

34-
欢迎提交 Pull Request 或 Issue。在提交代码前,请确保所有测试能够通过。
98+
欢迎提交 Pull Request 或 Issue。在提交代码前,请确保所有测试能够通过。
99+
100+
## 自定义机器码详细步骤
101+
102+
### 为什么需要自定义机器码?
103+
104+
使用自定义机器码可以让你指定一个固定的识别码,这样即使重新安装操作系统或在不同设备上使用,都能保持相同的许可状态。
105+
106+
### 自定义机器码的命令格式
107+
108+
```bash
109+
./jg-cursor-cracker crack -d <自定义机器码>
110+
```
111+
112+
或使用长选项:
113+
114+
```bash
115+
./jg-cursor-cracker crack --device-id <自定义机器码>
116+
```
117+
118+
### 详细操作步骤
119+
120+
1. **下载并编译工具**
121+
```bash
122+
git clone https://github.com/JSREP/JG-Cursor-cracker.git
123+
cd JG-Cursor-cracker
124+
go build -o jg-cursor-cracker
125+
```
126+
127+
2. **查看当前 JG-Cursor 安装位置**
128+
```bash
129+
./jg-cursor-cracker info
130+
```
131+
工具会自动搜索系统中的 JG-Cursor 安装并显示其路径。
132+
133+
3. **使用自定义机器码破解**
134+
```bash
135+
./jg-cursor-cracker crack -d YOUR-CUSTOM-ID-123
136+
```
137+
`YOUR-CUSTOM-ID-123` 替换为你想要使用的机器码。机器码可以是任意字符串,建议使用字母、数字和连字符的组合。
138+
139+
4. **确认操作**
140+
工具会显示以下信息:
141+
```
142+
将对以下安装进行破解: /path/to/JG-Cursor.app
143+
破解即将开始,将使用机器码: YOUR-CUSTOM-ID-123
144+
该操作将修改应用文件并可能影响其功能!
145+
是否继续?(y/N):
146+
```
147+
输入 `y` 确认继续。
148+
149+
5. **等待破解完成**
150+
工具会执行以下操作:
151+
- 安装必要的 asar 工具
152+
- 解包 app.asar 文件
153+
- 修改设备ID
154+
- 重新打包 app.asar 文件
155+
- 替换原始文件(自动备份)
156+
157+
6. **重启 JG-Cursor 应用**
158+
```bash
159+
pkill -f JG-Cursor # 关闭应用
160+
open /path/to/JG-Cursor.app # 重新打开应用
161+
```
162+
`/path/to/JG-Cursor.app` 替换为实际的安装路径。
163+
164+
### 注意事项
165+
166+
- 机器码长度建议不要超过32个字符
167+
- 避免使用特殊字符,仅使用字母、数字和连字符
168+
- 每次破解都会备份原始 app.asar 文件,格式为 `app.asar.bak-YYYYMMDD-HHMMSS`
169+
- 如果破解后应用无法正常工作,可以恢复备份文件
170+
171+
### 自动确认所有提示
172+
173+
如果你想跳过确认提示,可以使用 `-y``--yes` 选项:
174+
175+
```bash
176+
./jg-cursor-cracker crack -d YOUR-CUSTOM-ID-123 -y
177+
```
178+
179+
### 同时指定安装路径
180+
181+
如果有多个 JG-Cursor 安装,或者安装在非标准位置,可以同时指定路径:
182+
183+
```bash
184+
./jg-cursor-cracker crack -d YOUR-CUSTOM-ID-123 -p /path/to/JG-Cursor.app
185+
```

cmd/crack.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package cmd
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
"path/filepath"
8+
"time"
9+
10+
"github.com/JSREP/JG-Cursor-cracker/cmd/utils"
11+
"github.com/JSREP/JG-Cursor-cracker/pkg/cracker"
12+
"github.com/spf13/cobra"
13+
)
14+
15+
var targetPath string
16+
17+
// crackCmd represents the crack command
18+
var crackCmd = &cobra.Command{
19+
Use: "crack",
20+
Short: "破解JG-Cursor应用",
21+
Long: `破解JG-Cursor应用并替换机器码。
22+
如果不指定目标路径,将自动搜索系统中的JG-Cursor安装。
23+
如果提供--device-id参数,将使用指定的机器码替换当前机器码。`,
24+
RunE: func(cmd *cobra.Command, args []string) error {
25+
console := cracker.NewConsole()
26+
console.EnableRainbowMode(true)
27+
console.SetVerbose(verbose)
28+
29+
// 初始化查找器和破解器
30+
finder := cracker.NewFinder()
31+
finder.SearchEntireDisk = searchDisk
32+
33+
fooling := cracker.NewFooling()
34+
35+
// 如果指定了机器码,则设置
36+
if deviceId != "" {
37+
fooling.SetDeviceId(deviceId)
38+
fmt.Println(utils.GreenText(fmt.Sprintf("设备ID已设置为: %s", deviceId)))
39+
} else {
40+
fmt.Println(utils.YellowText("未指定机器码,将使用默认生成的随机机器码"))
41+
}
42+
43+
// 寻找安装路径
44+
var installPaths []string
45+
var err error
46+
47+
if targetPath != "" {
48+
// 验证指定路径是否为有效安装
49+
valid, _ := isValidInstallation(targetPath)
50+
if !valid {
51+
return fmt.Errorf(utils.RedText("指定的路径不是有效的JG-Cursor安装: %s"), targetPath)
52+
}
53+
installPaths = []string{targetPath}
54+
} else {
55+
// 自动搜索安装路径
56+
fmt.Println(utils.BlueText("正在搜索系统中的JG-Cursor安装..."))
57+
installPaths, err = finder.Find()
58+
if err != nil {
59+
return fmt.Errorf(utils.RedText("搜索JG-Cursor安装时出错: %v"), err)
60+
}
61+
}
62+
63+
if len(installPaths) == 0 {
64+
return errors.New(utils.RedText("未找到任何JG-Cursor安装,请指定安装路径或使用--search-disk扫描整个硬盘"))
65+
}
66+
67+
// 如果找到多个安装,让用户选择
68+
var selectedPath string
69+
if len(installPaths) == 1 {
70+
selectedPath = installPaths[0]
71+
} else {
72+
fmt.Println(utils.BlueText("找到多个JG-Cursor安装:"))
73+
for i, path := range installPaths {
74+
fmt.Printf("[%s] %s\n", utils.BoldCyanText(fmt.Sprintf("%d", i+1)), utils.WhiteText(path))
75+
}
76+
77+
var selection int
78+
fmt.Print(utils.BoldYellowText(fmt.Sprintf("请选择要破解的安装 (1-%d): ", len(installPaths))))
79+
fmt.Scanf("%d", &selection)
80+
81+
if selection < 1 || selection > len(installPaths) {
82+
return fmt.Errorf(utils.RedText("无效的选择: %d"), selection)
83+
}
84+
85+
selectedPath = installPaths[selection-1]
86+
}
87+
88+
fmt.Println(utils.BoldCyanText(fmt.Sprintf("将对以下安装进行破解: %s", selectedPath)))
89+
if deviceId != "" {
90+
fmt.Println(utils.BlueText(fmt.Sprintf("破解即将开始,将使用机器码: %s", deviceId)))
91+
}
92+
93+
// 确认操作
94+
if !cmd.Flags().Changed("yes") {
95+
fmt.Println(utils.BoldYellowText("该操作将修改应用文件并可能影响其功能!"))
96+
fmt.Print(utils.BoldYellowText("是否继续? (y/N): "))
97+
98+
var confirm string
99+
fmt.Scanf("%s", &confirm)
100+
if confirm != "y" && confirm != "Y" {
101+
fmt.Println(utils.BlueText("操作已取消"))
102+
return nil
103+
}
104+
}
105+
106+
// 执行破解
107+
startTime := time.Now()
108+
err = fooling.Fool(selectedPath)
109+
if err != nil {
110+
return fmt.Errorf(utils.RedText("破解失败: %v"), err)
111+
}
112+
113+
fmt.Println(utils.BoldGreenText(fmt.Sprintf("破解完成!耗时: %v", time.Since(startTime))))
114+
fmt.Println(utils.BoldCyanText("请重启JG-Cursor应用以使修改生效"))
115+
116+
return nil
117+
},
118+
}
119+
120+
// 验证是否为有效安装路径
121+
func isValidInstallation(path string) (bool, error) {
122+
appInfo, err := os.Stat(path)
123+
if err != nil || !appInfo.IsDir() {
124+
return false, nil
125+
}
126+
127+
// 检查app.asar文件是否存在
128+
asarPath := filepath.Join(path, "Contents", "Resources", "app.asar")
129+
if _, err := os.Stat(asarPath); os.IsNotExist(err) {
130+
return false, nil
131+
}
132+
133+
return true, nil
134+
}
135+
136+
func init() {
137+
rootCmd.AddCommand(crackCmd)
138+
139+
// 添加命令特有的标志
140+
crackCmd.Flags().StringVarP(&targetPath, "path", "p", "", "JG-Cursor安装路径")
141+
crackCmd.Flags().BoolP("yes", "y", false, "自动确认所有提示")
142+
}

0 commit comments

Comments
 (0)