2025 Xmind Pro (windows&macOS) 一键激活/破解脚本(2月25日更新)

Xmind 是什么不用我多介绍了吧,52 上已经有类似的授权分析了,只是步骤比较繁琐。本文直接用python脚本实现一键解包替。如果以前替换过公钥,需要还原一下app.asar再执行一键脚本,否则重新生成的公钥会不匹配;没备份app.asar的话建议重装最新版。

Xmind 介绍

Xmind 是一款   全功能   的思维导图和头脑风暴软件。像大脑的瑞士军刀一般,助你理清思路,捕捉创意。

Windows 版本激活 / 破解脚本

注意:必须安装 python 环境,否则报错:

没有 python 环境报错截图

安装 python 环境

下载 python for windows:https://www.python.org/downloads/windows/

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

下载安装

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

安装注意勾选环境变量选项

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

安装后验证

python 环境安装成功后,按下面流程操作:

1、下载完整脚本包:crack_xmind.zip (5.3 KB) 2、解压后执行 一键脚本(无需管理员身份运行)

常见问题

FileExistsError

Traceback (most recent call last):
  File "C:\Users\admin\AppData\Local\Programs\Xmind\xmind.py", line 108, in
    XmindKeyGen().run()
  File "C:\Users\admin\AppData\Local\Programs\Xmind\xmind.py", line 31, in run
    patch_info = self.patch()
                 ^^^^^^^^^^^^
  File "C:\Users\admin\AppData\Local\Programs\Xmind\xmind.py", line 69, in patch
    extract_asar(str(self.asar_file), str(self.crack_asar_dir))
  File "C:\Users\admin\AppData\Local\Programs\Xmind\venv\Lib\site-packages\asarPy\asar.py", line 162, in extract_asar
    a.extract(dest)
  File "C:\Users\admin\AppData\Local\Programs\Xmind\venv\Lib\site-packages\asarPy\asar.py", line 143, in extract
    raise FileExistsError()
FileExistsError
请按任意键继续. . .

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

解决方案

卸载重装!卸载重装!卸载重装!

重要的事情说三遍,讲你的 xmind 卸载,下载重装最新版即可。不需要管理员权限运行,脚本也没问题。

解决后正常脚本输出如下图:

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

破解成功

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

注意:需要注册登录账号后,才能看到 Pro 版本。

脚本源码

import os
import pathlib
import shutil
from abc import ABCMeta
from abc import abstractmethod
from base64 import b64encode, b64decode

from asarPy import extract_asar, pack_asar
from crypto_plus import CryptoPlus
from crypto_plus.encrypt import encrypt_by_key, decrypt_by_key

class KeyGen(metaclass=ABCMeta):
    @abstractmethod
    def generate(self):
        pass

    @abstractmethod
    def parse(self, licenses):
        pass

    @abstractmethod
    def patch(self):
        return ""

    def run(self, patch=True):
        ciphertext_licenses = self.generate()
        print(f"ciphertext_licenses: \n{ciphertext_licenses}")
        if patch:
            patch_info = self.patch()
            if patch_info:
                print(f"patch: \n{patch_info}")
        plaintext_licenses = self.parse(ciphertext_licenses)
        print(f'plaintext_licenses: \n{plaintext_licenses}')

class XmindKeyGen(KeyGen):
    def __init__(self):
        tmp_path = os.environ['TMP']
        asar_path = pathlib.Path(tmp_path).parent.joinpath(r'Programs\Xmind\resources')
        self.asar_file = asar_path.joinpath('app.asar')
        self.asar_file_bak = asar_path.joinpath('app.asar.bak')
        self.crack_asar_dir = asar_path.joinpath('ext')
        self.main_dir = self.crack_asar_dir.joinpath("main")
        self.renderer_dir = self.crack_asar_dir.joinpath("renderer")
        self.private_key = None
        self.public_key = None
        self.old_public_key = open('old.pem').read()

    def generate(self):
        if os.path.isfile('key.pem'):
            rsa = CryptoPlus.load('key.pem')
        else:
            rsa = CryptoPlus.generate_rsa(1024)
            rsa.dump("key.pem", "new_public_key.pem")
        license_info = '{"status":"sub","expireTime": 4093057076000,"ss":"", "deviceId": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"}'
        self.public_key = rsa.public_key
        self.private_key = rsa.private_key
        self.license_data = b64encode(encrypt_by_key(rsa.private_key, license_info.encode()))
        return self.license_data

    def parse(self, licenses):
        return decrypt_by_key(self.public_key, b64decode(licenses))

    def patch(self):
        # 解包
        extract_asar(str(self.asar_file), str(self.crack_asar_dir))
        shutil.copytree('crack', self.main_dir, dirs_exist_ok=True)
        # 注入
        with open(self.main_dir.joinpath('main.js'), 'rb') as f:
            lines = f.readlines()
            lines[5] = b'require("./hook")\n'
        with open(self.main_dir.joinpath('main.js'), 'wb') as f:
            f.writelines(lines)
        # 替换密钥
        old_key = f"String.fromCharCode({','.join([str(i) for i in self.old_public_key.encode()])})".encode()
        new_key = f"String.fromCharCode({','.join([str(i) for i in self.public_key.export_key()])})".encode()
        for js_file in self.renderer_dir.rglob("*.js"):
            with open(js_file, 'rb') as f:
                byte_str = f.read()
                index = byte_str.find(old_key)
                if index != -1:
                    byte_str.replace(old_key, new_key)
                    with open(js_file, 'wb') as _f:
                        _f.write(byte_str.replace(old_key, new_key))
                    print(js_file)
                    break
        # 占位符填充
        with open(self.main_dir.joinpath('hook.js'), 'r', encoding='u8') as f:
            content = f.read()
            content = content.replace("{{license_data}}", self.license_data.decode())
        with open(self.main_dir.joinpath('hook.js'), 'w', encoding='u8') as f:
            f.write(content)
        with open(self.main_dir.joinpath('hook').joinpath('crypto.js'), 'r', encoding='u8') as f:
            content = f.read()
            content = content.replace("{{old_public_key}}", self.old_public_key.replace("\n", "\\n"))
            content = content.replace("{{new_public_key}}", self.public_key.export_key().decode().replace("\n", "\\n"))
        with open(self.main_dir.joinpath('hook').joinpath('crypto.js'), 'w', encoding='u8') as f:
            f.write(content)
        # 封包
        os.remove(self.asar_file)
        pack_asar(self.crack_asar_dir, self.asar_file)
        shutil.rmtree(self.crack_asar_dir)

if __name__ == '__main__':
    XmindKeyGen().run()

macOS 版本激活 / 破解脚本

1、下载完整脚本包:crack_xmind_macos.zip(12 KB) 2、解压后执行 xmind.py(需要 python 环境,见:macOS 安装 python)

python3 xmind.py

如果脚本运行正常,你会得到以下内容:

此时不要打开 xmind,否则会得到如下反馈(xmind 已损坏,无法打开):

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

3、为解决上述报错,在命令行执行如下脚本:

sudo xattr -rd com.apple.quarantine /Applications/Xmind.app

破解成功

注册登录账号后,打开 xmind:

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

脚本源码

import os
import pathlib
import shutil
from base64 import b64decode, b64encode

from asarPy import extract_asar, pack_asar
from crypto_plus import CryptoPlus
from crypto_plus.encrypt import decrypt_by_key, encrypt_by_key
from abc import ABCMeta, abstractmethod

class KeyGen(metaclass=ABCMeta):
    @abstractmethod
    def generate(self):
        pass

    @abstractmethod
    def parse(self, licenses):
        pass

    @abstractmethod
    def patch(self):
        return ""

    def run(self, patch=True):
        ciphertext_licenses = self.generate()
        print(f"ciphertext_licenses: \n{ciphertext_licenses}")
        if patch:
            patch_info = self.patch()
            if patch_info:
                print(f"patch: \n{patch_info}")
        plaintext_licenses = self.parse(ciphertext_licenses)
        print(f'plaintext_licenses: \n{plaintext_licenses}')

class XmindKeyGen(KeyGen):

    def __init__(self):
        # tmp_path = os.environ['TMP']
        # mac 软件路径不一样,可以自己看着修改
        asar_path = pathlib.Path('/Applications/Xmind.app/Contents/Resources')
        self.asar_file = asar_path.joinpath('app.asar')
        self.asar_file_bak = asar_path.joinpath('app.asar.bak')
        self.crack_asar_dir = asar_path.joinpath('ext')
        self.main_dir = self.crack_asar_dir.joinpath("main")
        self.renderer_dir = self.crack_asar_dir.joinpath("renderer")
        self.private_key = None
        self.public_key = None
        self.old_public_key = open('old.pem').read()

    def generate(self):
        if os.path.isfile('key.pem'):
            rsa = CryptoPlus.load('key.pem')
        else:
            rsa = CryptoPlus.generate_rsa(1024)
            rsa.dump("key.pem", "new_public_key.pem")
        license_info = '{"status":"sub","expireTime": 4093057076000,"ss":"", "deviceId": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA"}'
        self.public_key = rsa.public_key
        self.private_key = rsa.private_key
        self.license_data = b64encode(encrypt_by_key(rsa.private_key, license_info.encode()))
        return self.license_data

    def parse(self, licenses):
        return decrypt_by_key(self.public_key, b64decode(licenses))

    def patch(self):
        # 先删除接包的内容,防止已经存在报错
        shutil.rmtree(self.crack_asar_dir, ignore_errors=True)
        # 解包
        extract_asar(str(self.asar_file), str(self.crack_asar_dir))
        shutil.copytree('crack', self.main_dir, dirs_exist_ok=True)
        # 注入
        # 看了一下 mac 最新版本的源代码只有一行,这里采用插入首行
        with open(self.main_dir.joinpath('main.js'), 'rb') as f:
            lines = f.readlines()
            # lines[5] = b'require("./hook")\n'
        lines.insert(0, b'require("./hook");\n')
        with open(self.main_dir.joinpath('main.js'), 'wb') as f:
            f.writelines(lines)
        # 替换密钥
        old_key = f"String.fromCharCode({','.join([str(i) for i in self.old_public_key.encode()])})".encode()
        new_key = f"String.fromCharCode({','.join([str(i) for i in self.public_key.export_key()])})".encode()
        for js_file in self.renderer_dir.rglob("*.js"):
            with open(js_file, 'rb') as f:
                byte_str = f.read()
                index = byte_str.find(old_key)
                if index != -1:
                    byte_str.replace(old_key, new_key)
                    with open(js_file, 'wb') as _f:
                        _f.write(byte_str.replace(old_key, new_key))
                    print(js_file)
                    break
        # 手动搜索发现 main.js 里面也有公钥信息,一起替换掉
        for js_file in self.main_dir.rglob("*.js"):
            with open(js_file, 'rb') as f:
                byte_str = f.read()
                index = byte_str.find(old_key)
                if index != -1:
                    byte_str.replace(old_key, new_key)
                    with open(js_file, 'wb') as _f:
                        _f.write(byte_str.replace(old_key, new_key))
                    print(js_file)
                    break
        # 占位符填充
        with open(self.main_dir.joinpath('hook.js'), 'r', encoding='u8') as f:
            content = f.read()
            content = content.replace("{{license_data}}", self.license_data.decode())
        with open(self.main_dir.joinpath('hook.js'), 'w', encoding='u8') as f:
            f.write(content)
        with open(self.main_dir.joinpath('hook').joinpath('crypto.js'), 'r', encoding='u8') as f:
            content = f.read()
            content = content.replace("{{old_public_key}}", self.old_public_key.replace("\n", "\\n"))
            content = content.replace("{{new_public_key}}", self.public_key.export_key().decode().replace("\n", "\\n"))
        with open(self.main_dir.joinpath('hook').joinpath('crypto.js'), 'w', encoding='u8') as f:
            f.write(content)
        # 封包
        os.remove(self.asar_file)
        pack_asar(self.crack_asar_dir, self.asar_file)
        shutil.rmtree(self.crack_asar_dir)

if __name__ == '__main__':
    XmindKeyGen().run()

常见问题

ModuleNotFoundErrore No module named “asarPy“

Xmind Pro (windows&macOS) 一键激活 / 破解脚本

解决方案

pip install asarPy
##or pip3 install asarPy

更新日志

2024.10.18 新增读者朋友反馈 windows 环境没有 python 导致脚本无法执行的问题及解决方案 2024.10.09 新增读者朋友反馈 FileExistsError 问题导致无法激活问题复现及解决方案。2024.3.22: 修复无法激活的 bug,提供了一键脚本。 注意:如果以前替换过公钥,需要还原一下 app.asar 再执行一键脚本,否则重新生成的公钥会不匹配;没备份 app.asar 的话建议重装最新版。

Mindmap Gallery 是思维导图软件 Xmind 的一官方公开网站,专门分享一些热门实用高质量思维导图集合,思维导图都来自用户分享,支持免费开放下载,还可以进行搜索,各种各样的思维大图都有,非常赞。

Mindmap Gallery 网站地址:https://xuanyuan.me/lab/sites/12164.html

参考资料

Crack 脚本项目:项目  939 GitHub:https://github.com/qy527145/crack

免责申明

本文内容收集自互联网,仅供学习交流,如果不慎侵权请联系(# 换 @)javaercn#gmail.com 删除。

请勿传播盗版软件。

历史评论(28 条)

评论区已迁移至 GitHub Discussions,以下为原站评论存档,仅作保留。

  1. HH
    好像失效了
  2. 轩源
    哪个失效了?可以截图或文字说明下吗?
  3. HH
    官网下载了最新版:Xmind-for-Windows-x64bit-24.09.13001-202409190140,使用脚本运行后提示正常,但打开后显示未激活,仍然可以升级到pro。
    https://github.com/BenjiaH/cloudimg/blob/master/data/PowerShell_2024-10-22_08-58-24.png?raw=true
    https://github.com/BenjiaH/cloudimg/blob/master/data/Xmind_2024-10-22_08-58-47.png?raw=true
  4. 轩源
    文中忘了讲,需要注册登录,登录账号就好了。 我更新补充下。
  5. HH
    多谢,登陆后提示升级成功。另外,asar路径检测有点bug,当没有安装到默认路径时,asar路径会报错,我是修改您的源码才搞定的。
  6. 轩源
    点赞,动手能力杠杠的👍
  7. 安定坊
    登录账号能用。给个建议:安装路径可以提供自己输入的位置,考虑下改位置的人。加个判断,不改就默认。
  8. 轩源
    谢谢反馈🙏
  9. xiaoc
    20241024版本登录也激活无效
  10. xiaoc
    切换相同版本也无效
  11. 轩源
    具体报错或截图信息发我看下。
  12. 安定坊
    官网最新的是24.10.01101吧,我这能用啊。
  13. Jacky Tang
    MacOS下似乎已经失效了。 24.10.01101 版本,MacOS 15.0.1 (24A348)下正常运行破解脚本,提示都正常,但是打开后没有起效。
  14. 轩源
    登录账号了吗?
  15. Jacky Tang
    登录了。 刚刚尝试了24.04.05171,发现可以破解,没有问题。
  16. 轩源
    好嘞。
  17. Timothy
    MacOS报错: darwin,arm64,24.1.0:
    ————————————————–
    Error: listen EPERM: operation not permitted 127.0.0.1:3000
    at Server.setupListenHandle [as _listen2] (node:net:1415:21)
    at listenInCluster (node:net:1480:12)
    at doListen (node:net:1629:7)
    at process.processTicksAndRejections (node:internal/process/task_queues:84:21)
  18. coder
    可以出一起linux版本的马
  19. coder
    可以出一期linux版本的吗
    我在Fedora里面运行了MAc版本的激活文件,总是出问题
    卡在ModuleNotFoundError: No module named ‘crypto_plus’
  20. 轩源
    谢谢反馈,最近比较忙,空了我找个linux环境试试。
  21. coder
    好的,感谢大佬
  22. OW
    mac os version :24.12.04124 执行完脚本,没有用,仍然 没有pro
  23. 轩源
    具体什么报错,可以贴出来看下~ 或者扫文末二维码,进群聊下哈~
  24. owen.jiao
    没有报错,脚本运行成功,但是登陆后还是没有变成pro版,MAC, 25.01.01061
  25. mark
    老兄,有linux最新xmind破解吗
  26. 南国遗梦
    老哥牛逼,很好用
  27. 小白
    大佬,不知道过了这么久这个脚本还有没有在更新,但是XMind25.07.03033版本也能破解,登录进去之后能够正常使用Pro的功能,不过每次关闭进程之后,重新打开之后就会提示要重新登录,这个是因为新版本更新之后脚本不能覆盖这种问题吗
  28. 轩源
    很久没更新了。
最后更新于 2025年2月25日
使用 Hugo 构建
主题 Stack,作者 Jimmy