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 逻辑来“说服”插件我们是正版用户。
核心思路分为两步:
- 欺骗激活逻辑 (
extension.js):劫持网络请求,强行写入合法的证书文件。
- 欺骗校验逻辑 (
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; }
第三步:见证奇迹
代码修改完成并保存后,按照以下步骤激活:
- 重启 VS Code:必须重启以加载修改后的 JS 文件。
- 打开命令面板:
Ctrl + Shift + P(Mac:Cmd + Shift + P)。
- 输入命令:输入
Intelephense: Enter Licence Key并选择它。
- 输入 Key:
- 输入任意 15 个字符(必须是 15 位,否则前端校验不通过)。
- 例如:
000000000000000或EducationalCode。
- 回车:
- 右下角应弹出通知:
Key Activated。 - 尝试使用“重命名符号 (F2)”或“查找所有引用”,如果不再弹窗提示付费,即大功告成。
⚠️ 避坑与注意事项
- 关于 Uglify (混淆):
文中提到的变量名(如
u,i,n)是压缩后的产物。在不同版本的插件中,这些变量名一定会变(比如变成a,b,c)。 - 不要死记变量名。
- 要认准代码结构:搜索
intelephense_licence_key_和writeFile这一对组合,它们是不会变的特征。
- 关于自动更新: 一旦 VS Code 自动更新了该插件,你的所有修改都会被覆盖。
- 解决方案:在设置中关闭 Extensions 的自动更新,或者保存一份修改好的
extension.js和intelephense.js作为备份。
- 网络连接:
虽然我们伪造了返回数据,但
extension.js中的逻辑仍然会发起一个真实的 HTTP 请求。如果你的电脑完全断网,或者 DNS 解析失败,代码可能会走到error分支而不是end分支,导致激活失败。确保激活时网络通畅(哪怕连不上真正的验证服务器也没关系,只要能发出请求即可)。
- Author:Qi
- URL:https://blog.ltq.im/article/2eaab3b7-4a43-8046-8993-c9fb4ca6eaba
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!