AI-逆向工程的原理与实验
看到 AI 复刻 Photoshop、After Effects,或者解析尼康相机滤镜的演示,很容易产生一个疑问:没有源码,AI 怎么知道软件内部在做什么?难道把安装包交给模型,它就能还原整个程序?
实际上,“AI 逆向”包含几种不同的工作:分析机器指令、观察输入输出、解析文件格式,以及根据已有功能重新开发。它们需要的证据不同,最终能证明的事情也不同。
本文先解释这些路线,再完整走一遍教学实验:把一个色彩滤镜当成黑盒,设计测试输入,从错误猜测出发,逐步推导它的计算公式,并用独立样本验证。随后结合 REA(Reverse Engineer Anything)的工具分工与官方案例,解释 AI 怎样主动调查程序内部。教学滤镜实验不调用 REA、Adobe 或尼康软件,也不代表对它们真实算法的还原。
1. AI 逆向究竟在研究什么
正常开发的方向是:需求 → 设计 → 源码 → 可执行程序。逆向工程从另一端出发:手里已经有程序、文件或运行结果,尝试推导其中的结构与规则。
| 路线 | 可以观察的材料 | 主要成果 |
|---|---|---|
| 二进制分析 | 可执行文件、动态库、运行时内存 | 函数逻辑、数据结构、调用关系 |
| 黑盒实验 | 输入、操作参数与输出 | 与原系统行为接近的算法模型 |
| 文件格式分析 | 同类文件及它们的差异 | 解析器、导出器、格式说明 |
| 功能重新实现 | 界面、文档、公开算法 | 能完成类似任务的新软件 |
这些路线可以组合使用。例如,先通过界面确认某个滤镜参数,再在程序中定位对应函数,最后用原软件输出验证新实现。
也有项目只根据截图写出相似界面,底层直接使用现成图像库。这能体现开发效率,但不能据此断言它已经还原了原软件的算法。
二进制分析为什么可行
闭源软件虽然不提供源码,但处理器需要执行它的指令,这些指令仍然存在于发布文件中。反汇编工具可以将机器指令显示为汇编,反编译器进一步尝试恢复为接近 C 的伪代码。Ghidra 官方教程介绍了字节查看、反编译、符号和函数调用图等工具。
AI 可以辅助阅读这些材料:推测参数含义、整理调用关系、识别常见数学运算,再生成实验来检验解释。
不过,编译过程会丢掉注释、许多名字与源码组织信息,优化还可能把多个操作合并或改写。恢复出来的通常是某种等价解释,而不是原作者的工程原样重现。模型给一个函数取名为 ApplyToneCurve,也只是一个需要验证的推断。
2. 为什么图像处理适合做黑盒实验
图像软件有一个便利条件:输入可以人为构造。研究者不必只拿风景照片反复试,而可以把不同因素拆开观察。
| 测试图案 | 可以帮助研究的问题 |
|---|---|
| 黑白与灰阶渐变 | 黑白点、亮度曲线、分段和裁剪 |
| 单独变化的红绿蓝通道 | 通道混合、颜色曲线 |
| 黑底上的单个白点 | 空间扩散、模糊核的形状 |
| 棋盘格与细线 | 缩放、采样、锐化与边缘处理 |
| 相同色块放在不同背景上 | 局部对比度、自适应处理 |
| 连续多帧与重复运行 | 时间依赖、随机噪声、状态变化 |
例如,对线性、平移不变的模糊操作,单点输入的输出能直接揭示其脉冲响应。但如果算法会根据内容改变模糊强度,一张单点图就不足以描述全局行为。
这也是逆向实验的关键:每种输入都带着一个明确问题。照片“看起来很像”,与算法假设“经受住了有针对性的反例”,证据强度不同。
3. 实验:一步一步推导一个未知滤镜
下面构造一个可复现的教学黑盒。假设我们只知道它接收一个 RGB 颜色,并返回处理后的 RGB,允许重复查询。所有数值都是 0 到 1 的浮点数,不涉及 JPEG 压缩、色彩管理或整数取整。
为便于学习,实验假定同一个函数独立处理每个像素。真实软件里,这个条件本身需要通过不同位置、不同邻域和不同图像尺寸的实验来检查。
第一步:固定实验条件
固定参数,重复输入同一个颜色,检查输出是否稳定。若结果随时间变化,可能存在随机颗粒、自动调整或内部状态,不能直接按确定函数拟合。
还要记录输入输出的数值约定。这里的 0.5 就是实验函数中的数值 0.5,不能顺手理解成“物理亮度的一半”。实际系统中,同一个数值在 sRGB 编码与线性光空间中的意义不同。
接下来,暂时把滤镜写成未知函数 y = F(x)。
第二步:输入纯黑,观察固定偏移
查询纯黑,得到:
1 | |
黑色输出并不是零,说明至少在这个输入点,滤镜抬高了三个通道的底部。我们提出一个候选模型:输出包含固定偏移 b = (0.02, 0.03, 0.04)。
注意,这一步还不能证明所有颜色都加上同一个偏移;这只是接下来要检验的假设。
第三步:用三个基色,建立最简单的模型
分别查询纯红、纯绿、纯蓝:
| 输入 RGB | 输出 RGB |
|---|---|
| (1, 0, 0) | (0.82, 0.08, 0.06) |
| (0, 1, 0) | (0.12, 0.78, 0.12) |
| (0, 0, 1) | (0.04, 0.08, 0.82) |
扣除黑色偏移以后,就得到三个输入通道分别对输出的贡献。以它们为矩阵的三列,先猜测滤镜是仿射变换:
1 | |
例如,第一行表示输出红色暂时被解释为 0.02 + 0.80R + 0.10G + 0.02B。
这个模型已经解释了前四个样本。但它是用这四个样本建立的,解释它们只是必要条件,还算不上独立验证。
第四步:半强度输入推翻第一次猜测
把红色强度降到 0.5。按照刚才的模型,输出应该是:
1 | |
预测明显错误。扣除偏移,实际贡献是纯红输入贡献的四分之一,而不是二分之一。
这提示我们尝试幂函数:0.5² = 0.25。假设滤镜先对输入通道取某个幂,再进行颜色混合:
1 | |
这里的 γ 是待求指数,不预设它就是某个标准色彩空间的 Gamma。利用红色输出分量,可以计算:
1 | |
再查询半强度绿、蓝,以及 0.25、0.75 强度的基色。如果它们也满足同样的指数关系,这个假设才获得更多支持。
第五步:混合颜色检查处理顺序
仅测试单通道还不够。真实系统可能先混色后取幂,或者根据色相使用不同曲线。
输入 (0.5, 0.5, 0),新模型预测:
1 | |
查询黑盒,得到相同结果。这支持“逐通道取幂,再做矩阵混合”的模型。再测试其他混色和随机颜色,检查误差是否系统性地集中在某些区域。
矩阵混合与取幂通常不能随意交换顺序。顺序问题也是复杂滤镜逆向中常见的误差来源:每个操作单独看都合理,组合后却始终对不上。
第六步:实现并用独立样本验证
下面的代码只需要 Python 标准库。query 代表外部黑盒接口;函数推导指数与矩阵,再返回候选实现:
1 | |
这段代码依赖本实验的模型族,并不是对任意滤镜都有效的通用解码器。例如,红色对红色输出没有贡献时,这里的除法就不能成立;真实系统可能需要分别拟合三个指数,甚至放弃幂函数。
完整的可运行实验脚本包含教学黑盒、恢复过程、错误模型对照,以及固定随机种子的 1000 个独立验证颜色。保存后执行:
1 | |
脚本会打印推导出的指数和候选模型误差,并检查错误的仿射模型确实无法解释半强度红色。教学黑盒的实现放在脚本中,目的是让实验可以复核;恢复函数只通过 query 查询数据,不读取黑盒内部参数。它演示的是推导方法,不是一次真实闭源软件研究记录。
即使 1000 个样本全部吻合,也不能数学上证明所有输入都等价。很多函数可以穿过同一组有限样本。合理结论是:在规定的输入范围、实验条件和验证样本上,这个候选模型没有被推翻。
4. AI 在这个过程中具体做了什么
上面的实验没有训练神经网络。AI 的主要角色是辅助研究与编程,而最终得到的滤镜只是一个很小的数学函数。
一个接入脚本和测试工具的 AI Agent,可以根据观测提出候选模型,生成下一轮测试,运行程序,读取误差,再修改实现。人需要明确目标、控制实验条件,审查假设和证据。
例如,可以给 AI 这样的任务描述:
1 | |
模型的价值在于加快“提出假设—设计实验—写代码—解释误差”的循环。只给一张照片让它猜滤镜公式,信息通常不足;允许查询原系统,主动设计输入,才会显著改变可研究的范围。
另一种路线确实会训练模型:收集大量原图与处理结果,让神经网络学习输入输出映射。它可能得到不错的近似,却未必能解释原算法,也未必复现边界条件。使用 AI 协助逆向和训练 AI 逼近效果,应当分别说明。
5. REA 起到了什么作用
REA 的全称是 Reverse Engineer Anything。根据其官方说明,它通过 MCP(Model Context Protocol,模型上下文协议)把逆向分析能力提供给 AI Agent,让模型能够调用工具取得程序内部材料,再继续调查。官方仓库
它承担的是工具连接与编排这一层。原生二进制分析可以使用 Ghidra、IDA、Hopper 等后端;JavaScript、Electron、.NET 与运行行为等目标,则有各自适用的分析路径。具体能取得哪些信息,取决于目标类型、配置和工具支持,不能把所有能力理解成每个环境都能直接使用。
逆向工具、REA 与 AI 怎样分工
| 部分 | 主要职责 | 需要注意的边界 |
|---|---|---|
| 反汇编、反编译等底层工具 | 从程序中提取指令、伪代码和结构信息 | 分析结果不等于原始源码 |
| REA | 将相应能力通过统一入口提供给 Agent | 连接成功不代表目标功能已被定位 |
| AI Agent | 选择调查方向、解释材料、提出假设并编写实现 | 解释与生成代码仍需验证 |
| 人与验证程序 | 规定研究范围,检查证据和输出 | 局部匹配不能扩大为整套软件等价 |
没有这种连接时,常见的工作方式是:人在分析工具里找函数,复制伪代码给 AI,再根据建议回去查下一处。接入以后,Agent 可以在可用工具范围内连续查询,让前一次结果决定下一次调查。
1 | |
这让“查到一段代码”更容易接上“再确认它调用的函数”。但循环可以执行得很快,也可以沿着错误假设走得很远;记录证据与保留反例依然必要。
官方案例:为什么 200 + 10% 得到 220
REA 官网用 Windows 计算器演示了从程序指令恢复百分号规则的过程。下面概括的是官方展示,不是本文在本机复跑的结果。官网计算器案例
- 确定研究对象。 找到百分号对应的处理逻辑,而不是先尝试理解整个计算器。
- 检查运算分支。 查看处理函数怎样区分当前运算符,追踪相关调用与数值传递。
- 恢复规则。 加法场景中,10% 被解释为前一个数 200 的 10%,得到 20;乘法场景中,10% 则转换成 0.1。
- 做交叉核对。 官方展示结合微软公开源码解释运算符编号,并提供实现与测试链接。计算器本身有公开源码,因此这个案例不能被描述为完整攻破闭源软件。
REA 提供用于调查的指令、反编译结果和调用信息,Agent 将这些材料解释成行为规则,再据此重建功能。界面上都叫百分号,但处理路径可能不同,这正是只看操作名称容易漏掉的细节。
它与前面的滤镜实验有什么关系
教学滤镜实验只允许查询 query(rgb),研究者靠输入输出推导公式,这是黑盒路线,运行那个 Python 脚本不需要 REA。
如果可以检查目标程序内部,则能增加另一类证据。例如,研究者可能先在程序中发现查找表或通道混合的线索,再设计灰阶与基色测试,检查运行结果是否符合解释。反过来,实验发现明显的分段行为,也可以指导内部调查去寻找相关处理环节。这是两条路线相互验证的研究思路,不是对某个 Adobe 或尼康项目的实测描述。
同样,尼康预设的字节差分可以用普通脚本完成,未必需要 REA;需要追查应用怎样读取、解释或执行参数时,内部分析工具才可能提供额外帮助。
为什么有了 REA,仍然不能保证完整复刻
REA 能改善证据获取与工具调用,研究中的难题仍然存在:函数可能没有有用的名字,优化会改变代码结构,一个效果可能分散在 CPU、GPU 和多个库里,某些处理还可能依赖远端服务。
本地程序中不存在的服务器实现,不能仅靠分析本地文件直接恢复。某个函数看懂了,也不能自动推出文件兼容、界面交互和复杂工程都已经正确。
因此,判断一项复刻成果是否可靠,应继续追问:实际用了哪些工具,取得了哪些证据,哪些行为已经验证?不能仅凭“使用了 REA”替代这些说明,也不能把所有近期的 AI 复刻项目都归因于它。
6. 尼康滤镜怎样一步一步解析
前面的实验研究“颜色怎样变化”;尼康 Picture Control 工具还涉及“参数怎样保存”。尼康官方允许编辑、保存自定义 Picture Control,但不同产品支持的调整项和范围可能不同。官方帮助
一个典型的文件分析流程是:
- 从相同软件版本导出基准预设,保留原文件。
- 只修改饱和度,其他设置和名称保持一致,再导出。
- 比较字节差异,找出候选位置;重复导出相同设置,排查时间戳等无关变化。
- 继续导出多个正负值,判断编码方式、步长、符号与字节序。
- 改变其他参数,检查字段是否独立,是否还有长度、校验等联动变化。
- 从已知有效模板出发生成新文件,先验证软件能否导入,再验证参数与效果是否正确。
假设饱和度从 0 改为 1、2、3,某个位置依次出现 00、01、02、03,它就是候选字段。但也可能还有一处校验数据同步变化,不能把所有变化位置都理解成饱和度本身。
公开的 nikon_cps_generator-converter 项目说明记载了通过对比 NX Studio 导出文件研究 NP3 格式的做法。这是文件差分路线的实例,不等于本文已经独立核验了该项目的全部兼容性。
尤其要区分三个验收目标:文件能够重新读写、目标软件能够正确导入、图像效果能够准确匹配。通过前一个,不自动代表通过后一个。
同样,把参考照片转换成尼康预设,通常还涉及受限参数下的风格拟合。参考照片中的局部蒙版、颗粒或复杂光照变化,未必能用相机开放的控制项表达。生成一个可导入预设,不意味着完整复制了照片的处理流程。
7. 为什么复刻一个效果与替代 PS、AE 差距很大
教学滤镜只有少量参数。完整图像和视频软件还需要处理图层、蒙版、色彩管理、缓存、文件兼容、字体、插件、GPU 资源、内存与复杂交互。AE 的很多效果还涉及连续帧和时间状态,不能只比较一张截图。
例如,同一种混合模式在不同位深度、颜色空间或透明度约定下可能得到不同结果;一个模糊效果在图像中心吻合,在边缘也可能因为填充规则不同而出错。
判断“AI 复刻某软件”的成果,可以沿着几个问题往下看:它只是复刻界面,还是功能确实能工作?普通样例通过后,复杂工程是否仍然正确?输出误差有没有测量?原生文件是否能往返保存?性能和稳定性是否经过实际负载验证?
一个功能较少的新软件,也可以独立地有价值。需要谨慎的是把局部演示直接扩大为完整替代能力。
总结
AI 逆向的核心仍然是证据:从能观察到的程序、文件与运行结果出发,提出可被推翻的解释,再用实验逼近真实行为。
这次教学实验的转折点,是半强度输入推翻了“颜色矩阵加偏移”的猜测,促使我们引入非线性,再用混色检查处理顺序。AI 可以加快每一轮分析和实现,研究是否成立仍取决于实验设计与验证范围。
REA 则帮助 Agent 连续调用逆向工具,把内部调查接入这个循环。它补充的是证据获取能力;算法解释、重新实现与独立验证,仍然需要分别完成。
理解这一点,再看 PS、AE 或相机滤镜的复刻演示,就能更清楚地区分:它恢复了哪些结构,匹配了哪些行为,还有哪些结论尚未被证明。
参考资料
- Ghidra:Introduction to Ghidra:反汇编、反编译与程序分析工具。
- REA 官方仓库:工具定位、分析目标与后端连接方式。
- REA 官网计算器案例:百分号处理逻辑的调查与重建展示;本文未在本机复跑。
- 尼康:Creating/Editing Custom Picture Control:自定义 Picture Control 的编辑、产品选择与保存。
- nikon_cps_generator-converter:CLAUDE.md:第三方项目记录的 NP3 文件差分分析路线;属于项目自述。