跳到正文
更新日志

每个版本改了什么,都在这里

数据从项目根目录的 CHANGELOG.md 自动生成,页面上的记录与软件发行版本始终一致。

v1.22.3 最新版本 2026-10-04

框架场景预设补齐:ThinkPHP / Laravel / Discuz(原来只有 WordPress)

  • 保护方案页的「保护强度预设」以前只有 WordPress 一个场景,ThinkPHP / Laravel / Discuz 都得客户自己去「文件排除」页翻目录手填。现在三套都补齐, 而且排的是各自真正会踩雷的东西:ThinkPHP 的 `runtime` / `vendor`、 Laravel 的 `storage` / `bootstrap/cache` / `vendor` 与 Blade 模板 (正则 `^resources/views/.*\.blade\.php$`)、Discuz 的 `template` / `data` / `config` / `uc_server`。这三个框架的缓存与模板目录加密了反而跑不 起来(Blade 的 `@if`、Discuz 的 `{template}` 是模板伪指令),预设直接排掉。
  • 排除规则改成"去重追加":以前套预设是整体覆盖,客户自己维护的排除清单 会被冲掉。现在只往里加,重复套用也不会越套越长。三个框架预设还会显式把 「兼容WordPress主题/插件」关掉——从 WP 预设切过来时不会把开关留在打开状态。
  • 界面同步修好了:套完预设,「文件排除」页的目录 / 文件 / 正则 / 白名单 四个文本框以前根本不刷新(它们不是 `Variable`,走不到刷新那条路),客户 以为预设没生效、转头又手填一遍;现在当场同步。
  • 选中即预览:下拉里选中一条,功能设置底部按钮栏会显示这套预设会怎么改 设置;点「应用」后显示"已应用:…"。说明按实际字宽量过,一行放得下,窗口 窄了自动截断——按钮栏在标签页之外,不会把「保护方案」页顶高一格。
  • 新增 `tests/presets_check.py`(118 条):预设表本身(标签唯一、key 一致、 文案不含旧产品名)、追加语义(客户清单不丢、重复套用不膨胀、认不出的标签 一个字段都不改)、界面同步(含"说明一行放得下"的实测字宽断言),以及真机 验收——按每个框架预设跑一遍加密,被排除的文件必须原样复制、其余 PHP 必须真的变了样、过 `php -l` 且运行结果与原文件一致。已接进 `run_tests.bat` 与 `build_exe.bat` 闸门。
  • README 与产品介绍补上预设对照表(这一功能以前在文档里一个字都没提)。
v1.20.0 2026-10-04

CtouyKeygen 也加台账:软件注册认证码不再只躺在聊天记录里

  • 注册认证码台账(`CtouyKeygen.exe` → 新页「授权台账」):每出一枚注册 认证码自动落一条,记客户名 / 注册申请号 / 授权版本 / 签发日 / 到期日 / 认证码 / 备注。能按客户名或申请号搜、能一键续期、能复制码、能导出 / 导入 CSV(Excel 直接打开)。台账文件是 `%APPDATA%\CtouyPHP\serials.json`, 和网站授权台账(`licenses.json`)分开存,对账时不会看错行。
  • 到期日不是手填的:能验签时直接拿认证码解出来。认证码本身就把 「申请号 + 版本 + 有效期」签在里面,所以台账里的到期日和客户机器上实际 生效的一定一致——不会出现"台账写着还有半年、客户那边已经过期"。
  • 同一台机器重签并成一条:老客户换机器重申请、或者码丢了要补一份,用 同一个申请号再签一次会在原记录上更新认证码并留一条续期流水,而不是留两 行看起来像发给了两台机器。界面里选中记录点「一键续期」就是这个动作。
  • 无界面签发同样落账:`CtouyKeygen.exe --issue ... --customer 张三` 出码后会顺手记一条(`--customer` 选填);台账写不进去只记错误,不影响 出码。
  • 主界面签发页加了「客户名」选填框,填了会跟着这条记录一起存。
v1.20.1 2026-10-04

发售前边界检测:超长授权期限不再签出"废码"

  • 网站授权码(CtouyLicgen):有效期字段是固定 6 位十进制,天数一超 就多出一位,客户站点端第一关(长度校验)直接判"授权码长度不正确"。 现在超过上限(约 2739 年)当场报"授权期限过长",不再出码。
  • 软件注册认证码(CtouyKeygen):到期日越过 datetime 上限时,签发 或校验会抛未捕获的 `OverflowError`(界面表现为报错 / 崩溃)。现在超过 上限(约 7985 年)当场报"授权期限过长",校验端也加了溢出兜底。
  • 32 进制编码越界不再静默回绕(以前超范围的值会被截断成另一个数, 结果就是"签发看着成功、客户一验就废")。
v1.21.0 2026-10-04

**三条梯队一次收尾:台账会"催单"、PHP 矩阵补到 11 版、授权页给客户留了购买入口;

  • 到期提醒条:台账页顶部多一条橙色提醒,打开工具就告诉你「有 N 条 30 天内到期、M 条已过期」,不用自己一行行翻。启动时同步写进状态栏。
  • 状态筛选:搜索栏加「状态」下拉(全部 / 有效 / 即将到期 / 已过期 / 永久),和关键字搜索叠加使用,专治台账越记越长。
  • 批量续期:台账表支持多选(`extended`),选中一批点「批量续期」一次 续到新期限,落盘一次、跳过已不存在的记录,并回报真正续到了几条。
  • 导出对账单:一键导出客户对账单(客户名 / 记录数 / 有效 / 即将到期 / 已过期 / 永久 / 最近到期日 / 最近签发日),按客户汇总,发账单、对账都方便。
  • 认证码台账(`CtouyKeygen`)与网站授权台账(`CtouyLicgen`)两边同步升级, 接口一致。
  • `CTOUY_KEY_DIR`:密钥目录(默认 `<程序目录>\CtouyKeys`)
  • `CTOUY_ISSUER_KEY`:认证码签发私钥文件路径
  • `CTOUY_SITE_KEY`:网站授权签发私钥文件路径
v1.21.1 2026-10-04

签名私钥的默认位置改成"跟着运行程序走"

  • 源码运行:项目根目录下的 `CtouyKeys\`
  • 打包运行:`CtouyPHP.exe` 同级的 `CtouyKeys\`
  • 只有程序目录取不到、或落在系统临时目录时,才退回用户主目录兜底
v1.22.0 2026-10-04

产物防篡改自校验:载荷被动过手脚,装载器静默不执行

  • 装载器在 `eval` 之前先算一遍载荷指纹(`md5 + sha1 + 字节长度` 三段), 改一个字节三样全不匹配;
  • 对不上时静默不执行:不 `die()`、不报错、不写日志、页面上没有任何提示, 反汇编时也没有醒目的失败分支;
  • 指纹不以明文出现:按运行时密钥异或后再 base64,产物里搜不到 `md5(...)!=='...'` 这种一眼可见的校验特征;
  • 无关改动(改明文注释、末尾加一行注释)不会误伤——客户改个版权备注站点 照样正常跑。
  • 编码型「字符码方式」产物本来就是坏的:装载代码多解了一层 base64 (`base64_decode` 连做两次),产物跑起来是乱码。这一版改成只解一次。
  • 损坏载荷时 `gzuncompress` 会吐 warning:现在用 `@` 压掉,"拒绝执行"是 真静默,不会出现"页面白屏但满屏报错"的中间状态。
v1.22.1 2026-10-04

修掉加密报告里的两条假警报(其中一条会让客户以为整站都坏了)

  • "有产物引用不到的包含文件"是误报:产物里写的是 `require_once __DIR__.'/1ef2d433.php'`,自检的正则抓到的是带前导斜杠的 `'/1ef2d433.php'`。Windows 上直接 `os.path.join` 会把它当成盘符根目录 (`C:\1ef2d433.php`),于是整站每个受保护文件都报"引用不到包含文件", 报告里红成一片。现在先削掉前导斜杠再按 `__DIR__` 相对解析;真缺文件的 情况照旧会报(反向用例已覆盖)。
  • "产物体检发现语法问题"可能是误报:`php -l` 偶尔会退出码非 0 却一个字 都不输出(杀软实时扫描刚写出的文件、进程被中途掐掉都会长这样)。旧代码 拿"语法错误"四个字兜底,还标成"必须处理"。现在体检分成三态——通过 / 真语法错误 / 无法判定:
  • 无法判定会自动重试两次(每次间隔递增),拿不到结果才下结论;
  • 无法判定单列一条,按"建议处理"提示,不会冒充语法错误;
  • 报"语法错误"时带上 PHP 的原话(以前报告里只有文件名,连我们都无法定位);
  • "打不开文件 / 拒绝访问"这类输出也归入无法判定,不再当成语法错误。
  • 「代码检测」里的语法检查走同一套三态判断,不再出现同源的假"严重"提示。
  • 新增 `tests/report_check.py`(24 条):包含路径解析、自检正/反向用例、 三态判定、重试次数、报告是否带原话。
v1.22.2 2026-10-04

加密时不再弹命令行黑框

  • 打包出来的图形界面是"无控制台"程序,而 `php.exe` 是控制台程序。Windows 的规矩是:无控制台的进程启动控制台程序,系统就得新开一个控制台窗口。 加密时每个产物要跑两遍 `php -l`(外壳 + 载荷),一个十几二十个文件的站点 就是几十次窗口一闪——客户看到的就是"命令行框一直弹闪"。
  • 现在所有外部进程都走新的 `ctouy/proc.py`,带 `CREATE_NO_WINDOW`(再配一份 `STARTF_USESHOWWINDOW + SW_HIDE` 兜底)。子进程照常运行、stdout/stderr 照常走管道,只是不给它开窗口。涉及 `php_version()`、`lint_file_ex()` 和「代码检测」里的语法检查。
  • 新增 `tests/console_check.py`(6 条):一条源码扫描盯着"打包进 EXE 的模块 不许直接写 `subprocess.run/Popen/...`,必须走 `ctouy.proc.run`";一条真机 探测把脚本交给 `pythonw.exe`(没有控制台,和打包后的 GUI 一样)去跑,一边 枚举可见的控制台窗口一边起子进程——静默标志跑三遍应当 0 个窗口,不带标志 必须冒出窗口(对照组,证明探针真的看得见窗口)。已接进 `run_tests.bat` 与 `build_exe.bat` 闸门。

只列出版本要点。完整变更记录见项目根目录的 CHANGELOG.md。

更新方式

下载新版可执行文件覆盖旧版即可,任务配置可以带过去接着用。

去下载最新版

当前版本

v1.23.0

首页、下载页与页脚显示的版本号都取自同一处配置。

保持最新版本,保护强度也一起更新

下载试用版先跑一遍,保护能力一项不锁,产出带水印。