AI 智能体让所有软件都变成开源了吗
All Software Is Open Source Now
作者认为,AI 编码智能体正在大幅降低理解和重建闭源软件的成本,让过去需要数周逆向工程的工作变得更容易尝试。文中举例说明,Arkham Knight 与 Spider-Man 的合体项目是两款游戏同时运行、通过共享内存通信,并非真正还原源码;ArtCraft 则基于反编译应用做 Rust 重实现。
软件分发史对我来说一直是个引人入胜的话题,因为我们集体接受的那种相当奇怪的安排。
这在互联网出现之前的时代更为有趣——尤其是1970-80年代,那时开发者无法简单地把关键功能藏在API或服务器后面。运行程序所需的一切都必须存在于用户的机器上,而一旦到了那里,他们对它会发生什么几乎无法控制。
所以自然而然地,他们变得富有创意。
他们使用普通复制工具无法复制的特殊磁盘格式,将许可证检查嵌入可执行文件,甚至要求用户查阅实体手册或密码轮来启动游戏。

当然,爱好者和修补匠们也不甘落后。
1981年,有一本真正的杂志叫Hardcore Computing,专门致力于破解Apple II软件的复制保护。人们会反汇编商业程序,逆向工程其保护机制的工作原理,并发布称为“Softkeys”的说明来移除它们。

即使在当时,其中大部分也被辩护为不是盗版,因为人们有权为他们已经付费的软件制作备份副本。同样的论点我不知怎么这周还在Twitter上一直看到。
其中很大一部分——至少在精神上仍然存在于我们现代的软件中,我们仍然编写、编译、压缩和转换它,然后发送到我们几乎无法控制的机器上。
当然,绕过复制保护检查与重建整个程序非常不同,但两者都是同一个根本问题的后果——我们给用户可执行代码,同时试图保留对他们能用它做什么的控制。
这种软件分发方式大多有效,因为人们(正确地)认为,反编译软件并使其达到有用状态所需的痛苦、专业知识和时间,尤其是对于任何现代软件,远远超出任何个人的能力。
而最近,这个假设开始看起来不那么可靠了。
那么,什么改变了?
如果你过去一周上过Twitter,你可能看到过一些相当荒谬的事情。
所有这些项目都使用AI编码代理来制作这些,这让人很容易认为有人只是让LLM反编译两个游戏并将它们组合起来,但现实更有趣。
对于《蝙蝠侠:阿卡姆骑士》中的蜘蛛侠项目,两个游戏实际上同时运行。阿卡姆用于哥谭地图和碰撞几何体,蜘蛛侠提供移动和桥接传递。
甚至还有一个隐形的蝙蝠侠在四处移动,以保持阿卡姆世界的正确流式加载。
这些不是反编译的直接例子,也没有人神奇地恢复两个AAA游戏的完整源代码——但它们确实展示了处理不熟悉的闭源系统变得多么容易。
而且不仅限于游戏。
ArtCraft一直在基于Adobe的整个创意套件构建一整套开源Rust应用。

有用于Photoshop的PhotoCraft,用于Illustrator的VectorCraft,用于Premiere的FilmCraft,以及用于Lightroom、After Effects、Acrobat和InDesign的类似项目——所有这些都是对反编译应用的净室重新实现。
老实说,即使看到这样的项目达到目前的状态,对我来说也相当疯狂。
将复杂的专有应用程序重构为有用的东西,历来是软件工程中最困难、最繁琐的工作之一,因为要处理大量缺乏文档的函数、行为、边缘情况和决策。
而现在,人们正以远低于传统预期的资源尝试这类事情。
LLM 反编译入门
我对这方面的许多理解来自个人经历:几个月前 Claude Code 的源码通过 npm sourcemap 被暴露后,我参与了 Claurst 的工作,还幸运地从四月起与一些琢磨这些想法的人交流过。
最妙的是,最有趣的部分并不是反编译软件本身的能力——我们已经有 Ghidra、IDA 和各种语言专用反编译器几十年了。

但问问任何不得不直接反编译软件的人,他们都会告诉你这有多痛苦。
反编译器通常会给你成千上万行伪代码,里面满是匿名函数、猜测的类型和能跑通的算术,但“难”的部分一直在于如何理解它。
你必须追踪函数、弄清它们的依赖关系、理解没有文档的结构,并设法从编译器留下的东西中重建原始意图。

有一个相当不错的 DX-Ball 重构正好展示了这一点。某个函数最初的反编译输出大致是这样的:
longlong FUN_00406400(void) {
return __ftol();
}不太有帮助。
但顺着它的调用者、检查底层汇编并阅读它引用的常量,就能发现该函数是在根据砖块的水平位置计算声音声像。
恢复出的逻辑(此处简化)更像是:
int screen_pan(int x) {
return (int)((x * 1.5625 - 500.0) * pan_scale);
}随后,仅针对这一个函数,重构结果就对照原始可执行文件在 3,205 个测试用例上进行了验证。
而这正是智能体发挥作用的地方——它们极其擅长这件事,现在你可以通过 REA 把 Claude Code 或 Codex 连接到 Ghidra 之类的工具,让它跟踪交叉引用、推断结构、给函数起有意义的名字,并编写实验来验证它认为自己看到的东西。
但另一个重要的部分是弄清楚你实际需要理解原始软件的多少内容。

例如,最近许多游戏混搭都建立在模组社区数十年的工作之上。GTA V 已有 Script Hook V,Skyrim 有 SKSE,Minecraft 有 Fabric。这些提供了与游戏交互的方式,无需重建其整个引擎,因而使它们成为这些演示最受欢迎的宿主。

SkyCraft 就利用了这一点,同时运行 Minecraft 和 Skyrim,插件通过共享内存通信。另一些人将单个系统提取为可复用库,比如 libsm64,它暴露了《超级马里奥 64》的移动和渲染代码,还有些人甚至重建了部分原始运行时。
一旦你有了进入软件的方法,智能体就能帮助编写这些系统之间的粘合代码、转换资源、同步行为,并持续测试,直到各部分开始协同工作。
同样的通用方法也适用于重构应用程序。
在 Claurst 中,我用一个智能体把暴露出的 Claude Code 源码转化为详细的行为规范,再用另一个智能体在无法访问原始 TypeScript 的情况下用 Rust 实现这些规范。
当然,暴露的源代码比反编译的原生可执行文件要容易得多,而仅凭这种分离并不能保证法律上干净的实现。
但即便有这一优势,仍有大量行为需要考虑。像执行 shell 命令这样简单的事情,就涉及权限、超时、进度报告、错误处理以及许多其他从功能本身并不立即显而易见的细微约定。
仍然涉及大量工程工作,智能体可能完全误解它所看到的内容——但智能体可以在一个引导良好的循环中持续前进。
这意味着即便只是尝试这些项目所需的工作量也在显著减少。
当然,这一切都不完美
你得中一个相当荒谬的彩票,才能让复杂的软件重建在第一次尝试时就正确运行。
我认为值得一提,因为演示可能会给人非常误导的印象,让人高估我们实际取得的进展。
在 30 秒的片段里可能看起来很酷,但一旦你进入不同区域或重新加载存档,很可能就会崩溃——重现所有行为并在考虑边缘情况的同时保持与文件的兼容性,需要迭代,通常需要大量迭代。
从这个意义上说,当然,人类的专业知识也没有消失。与 LLM 合作,知道该测试什么、信任什么,并提前嗅出潜在问题,仍然是一项技能。
这让我们处于什么境地?
这里也存在明显的法律知识产权和伦理混乱。
就在几天前,甚至有人让一个非官方的 GTA V WebAssembly 移植版在浏览器中运行,但显然几小时内就消失了。

但我们都清楚,法律界限模糊已经有一段时间了。
更有趣的是,这对软件分发本身可能意味着什么。
与 1970 年代开发者必须交付软件的每一个部分不同,如今将功能保留在服务器端完全是一种选择。
如果理解和重建本地分发的软件变得越来越便宜,那么回应是首先减少分发量,我也不会感到惊讶——这是许多电子游戏走过的路,尤其是在线服务。
如果你唯一关心的是保护专有实现,那这很好,但对消费者和所有权、离线软件和保存来说就相当不妙了,我们正在看到这种控制的后果,比如“停止杀死游戏”。(https://www.stopkillinggames.com/en)
就在本周,我们看到了 OpenAI 的数学成果,以及 Terence Tao 博客上的我们应该告诉学生什么?,提出了一个问题:当一个人能完成的工作量可能在几个月内完全改变时,花数年成为专家意味着什么——我相信我们很多人也处于这种困境中。
虽然我不认为专业知识正在变得无用,但如果说有什么变化,那就是在使用这些模型时,知道该测试什么、验证什么、质疑什么正变得更有价值——与 LLM 的竞赛正在将大量工作交接出去,抽象程度足够高,随着模型改进,你可能不需要了解这些工具如何工作。
这让这一切感觉与 Hardcore Computing 当时发生的事情非常不同。
这些人足够有雄心,愿意花数周时间用反编译器拆解软件、追踪指令,并把他们学到的东西分享给一个真正的社区,大家共同把问题推进得更远。
而我认为,这其中很多正在变成一场“谁能先到那里”的竞赛,而不是那种社区与连接——即便作为一个乐于看到它的人,这也让技术感觉更加加速,却同样孤立。

所以是的,我想现在所有软件都只是开源的了。
来源:Hacker News · kuber.studio