type
Post
status
Published
date
Jan 16, 2026
slug
summary
tags
PHP
破解
Intelephense
category
技术分享
icon
password
Property
Jan 16, 2026 09:17 AM
Language

穷逼程序员的自我修养:手撕 VS Code Intelephense 插件

免责声明:本文仅供技术研究与学习 Node.js 逆向逻辑。软件开发不易,如果您通过该插件获得了收益,请务必支持正版。如有能力,请购买官方 License。

前言

Intelephense 是 PHP 开发的神器,但 20 美元的价格对学生党来说确实是一道门槛。既然代码在本地,我们就能通过修改 JS 逻辑来“说服”插件我们是正版用户。
核心思路分为两步:
  1. 欺骗激活逻辑 (extension.js):劫持网络请求,强行写入合法的证书文件。
  1. 欺骗校验逻辑 (intelephense.js):修改本地验证函数,永远返回 true

第一步:修改激活逻辑 (extension.js)

这是最关键的一步。我们需要找到插件向服务器请求 Key 并在本地写入文件的位置。

1. 定位文件与准备

  • 路径:找到插件安装目录下的 lib/extension.js
    • Windows: %USERPROFILE%\\.vscode\\extensions\\bmewburn.vscode-intelephense-client-x.x.x\\lib\\
    • Mac/Linux: ~/.vscode/extensions/bmewburn.vscode-intelephense-client-x.x.x/lib/
  • 操作:文件是混淆压缩过的。请务必先使用 VS Code 的 Format Document (格式化文档) 功能,将一行代码展开,否则无法修改。

2. 搜索关键代码

按下 Ctrl+F,搜索以下字符串(基于您提供的参考代码):
搜索关键词intelephense_licence_key_
你会找到一段类似下面的代码(变量名如 u, i, n, s 可能会因版本不同而变化,但结构一致):

🔴 原始代码 (修改前)

return new Promise((r, o) => { let s = "", // s 用来存储服务器返回的数据 c = u.request(i, (n) => { (n.on("data", (e) => { s += e.toString(); // 拼接数据 }), n.on("end", () => { // 关键点:这里将服务器返回的 s 写入文件 let n = a.join(e.globalStoragePath, "intelephense_licence_key_" + t); f.writeFile(n, s).then(r, o); }), n.on("error", o)); }); (c.write(n), c.on("error", o), c.end()); });

3. 修改代码

我们需要做的是:不管服务器返回什么(或者根本不理会服务器),在写入文件之前,强行把变量 s 替换成我们伪造的成功数据。

🟢 修改后的代码

请重点关注 n.on("end", ...) 内部的修改:
return new Promise((r, o) => { let s = "", c = u.request(i, (n) => { (n.on("data", (e) => { s += e.toString(); }), n.on("end", () => { // ==================【开始修改】================== // 1. 强行覆盖 s 的值,伪造一个成功的 JSON 对象 // 200 表示成功,message 随便写 s = '{"success":{"code":200,"message":"Thank you"}}'; // ==================【结束修改】================== // 下面保持原样,让插件以为这是服务器返回的,并乖乖写入文件 let n = a.join(e.globalStoragePath, "intelephense_licence_key_" + t); f.writeFile(n, s).then(r, o); }), n.on("error", o)); }); // 如果你怕断网报错,可以在这里 catch 一下,但通常不需要 (c.write(n), c.on("error", o), c.end()); });
原理:原逻辑是“请求->拿数据->写文件”。我们改成了“请求->拿数据->把数据换成假的->写文件”。这样插件在验证时读取的就是我们伪造的合法证书。

第二步:修改校验逻辑 (intelephense.js)

即便有了证书文件,插件核心库还会定期计算 Hash 或校验时间戳。我们需要通过暴力修改布尔值来绕过。

1. 定位文件

  • 路径:在插件目录下的 node_modules/intelephense/lib/intelephense.js
  • 注意:这是另一个文件,不要混淆。同样需要格式化

2. 搜索并替换函数

请依次搜索以下函数名,并直接修改其返回值。由于代码被压缩,建议搜索关键字组合(如 key:"isActive" 或直接搜函数名)。

🟢 修改方案

1. 强制激活状态 搜索 isActive,找到函数定义:
// 修改前:有一堆逻辑判断 // isActive() { return this.state.key && ... } // 修改后:直接返回 true isActive() { return true; }
2. 强制未吊销 搜索 isRevoked
// 修改前 // isRevoked() { return this.state.revoked; } // 修改后:直接返回 false isRevoked() { return false; }
3. 强制未过期 搜索 isExpired
// 修改前 // isExpired() { return Date.now() > ... } // 修改后:直接返回 false isExpired() { return false; }

第三步:见证奇迹

代码修改完成并保存后,按照以下步骤激活:
  1. 重启 VS Code:必须重启以加载修改后的 JS 文件。
  1. 打开命令面板Ctrl + Shift + P (Mac: Cmd + Shift + P)。
  1. 输入命令:输入 Intelephense: Enter Licence Key 并选择它。
  1. 输入 Key
      • 输入任意 15 个字符(必须是 15 位,否则前端校验不通过)。
      • 例如:000000000000000EducationalCode
  1. 回车
      • 右下角应弹出通知:Key Activated
      • 尝试使用“重命名符号 (F2)”或“查找所有引用”,如果不再弹窗提示付费,即大功告成。

⚠️ 避坑与注意事项

  1. 关于 Uglify (混淆): 文中提到的变量名(如 u, i, n)是压缩后的产物。在不同版本的插件中,这些变量名一定会变(比如变成 a, b, c)。
      • 不要死记变量名
      • 要认准代码结构:搜索 intelephense_licence_key_writeFile 这一对组合,它们是不会变的特征。
  1. 关于自动更新: 一旦 VS Code 自动更新了该插件,你的所有修改都会被覆盖。
      • 解决方案:在设置中关闭 Extensions 的自动更新,或者保存一份修改好的 extension.jsintelephense.js 作为备份。
  1. 网络连接: 虽然我们伪造了返回数据,但 extension.js 中的逻辑仍然会发起一个真实的 HTTP 请求。如果你的电脑完全断网,或者 DNS 解析失败,代码可能会走到 error 分支而不是 end 分支,导致激活失败。确保激活时网络通畅(哪怕连不上真正的验证服务器也没关系,只要能发出请求即可)。
CentOS 8 安装docker报错: conflicting requests - nothing provides container-selinux >= 2:2.74 needed...Debian13 certbot安装