AI 自动化逆向(三十五)假设空间枚举的完备性是假设出来的

发布时间:2026/10/30 6:47:30
AI 自动化逆向(三十五)假设空间枚举的完备性是假设出来的

AI 自动化逆向(三十五)假设空间枚举的完备性是假设出来的

本文是「AI 自动化逆向」系列第 35 篇。上一篇:自建指令缓存:把分钟级查询压到秒级;下一篇预告:先找不加密的部分。

前言

从这一篇起进入整卷最敏感的一段——协议与密码。处理方法照旧:只讲思路,一个字段、一个常量都不给。

这一篇讲一个特别"自信"的方法是怎么翻车的:手上有一条完整样本(一段明文、一段对应的密文),把常见变体全部排列组合枚举一遍,谁能让"加密(明文)== 密文",谁就是答案。

这个思路看似科学——直到你意识到它有一个从不被写在纸上的前提。

(同前几篇:文中"AI"指执行分析的模型,"我"指设定目标、审结果的人;本篇只讲方法与自证思路,不给任何具体参数。)

一、AI 在这里踩的坑:“两万多种全灭”

枚举的真实规模是这样的:轮数档位 × 用加密子还是解密子 × 字节序 × 两个半块是否互换 × 半步更新的细节 ×链接模式(若干种) × 明文在信封里的偏移(逐格扫)——乘出来,大约两万两千种配置。

验收判据也很严格:“与明文重叠的全部块都要对——只对一块,算巧合。”

结果:零个配置成立。全灭。

然后 AI 写下了一句看起来很扎实的推论:

“两万两千种组合全部失败 ⇒这个二进制里的密码核不是那个标准家族。”

这句推论是错的。错的地方不在算术,在于:枚举再大,也只是"我列出的那张变体表"里的大。而那张表,是我按"标准实现的常见形态"假设出来的——

枚举的完备性,建立在假设之上。表漏掉的形态,枚举一亿种也不会覆盖。

二、过程:两处根子,都在"表"上

根子一:链接层漏了一整类形态

真相是后来把那段函数从头读完才拿到的——而它是这样的:

  • 核本身就是标准家族的标准实现——没有任何异常;
  • 问题在链接层:它用了两个互相独立的反馈量——一个来自密文侧、一个来自明文侧,两个寄存器各司其职;
  • 而枚举里所有"链接模式"的选项,都是围绕单一反馈量设计的。

于是"任意单一反馈的假设"必然全灭——不是差一点,是结构性够不着。标准核 + 自定义链接,是一种完全合理的组合;而枚举假设空间的时候,人们默认"链接也该是标准的"。

"全灭"的第一解释对象,应该是表,不是目标。(这是第 7 篇"先怀疑模型、别怀疑阈值"的协议层版本:把被怀疑的一端选对。)

根子二:那条样本的"配对"本身没被证明

更早一层还有一处松土:被拿来拟合的那条"明文-密文对",是怎么配上的?

——按尺寸自洽反推的(只有那一条满足长度关系)。

尺寸自洽只证明了"它们长度上兼容",没有证明它们真的是同一帧的两面(缓冲区里甚至看到过两帧指向同一地址的征兆)。教训一句话:

拟合的输入如果本身是"猜的配对",那么无论拟合多全,都在拟合噪声。

三、正确的姿势:三件事

后来的一次性破局,用的正是下面三件事——它们组合成了一条不用枚举的路。

1. 在"输入侧"取对——配对由构造保证,不用证。不去猜缓冲区的哪个是明文、哪个是密文;而是在编码器的入口取一对:“这串明文进去、那串密文出来”,是同一次调用保证的。配对问题被构造性地消灭了。

2. 让程序自证——终点判据是"重算 == 截获"。模型建好后,把明文重新加密一遍,与线上截获的密文逐字节比对:全等才算成立。再叠加几条互相独立的旁证同时成立(长度关系、偏移、尾巴、逐字节)——一个巧合不可能同时满足四路。多路独立同向,才敢宣布。

3. 枚举之前先读代码。这次的两万两千种全灭,最后是"把函数读完"一次破的——枚举是穷举"我的想象",读代码是看"它的现实"。

从这一战提炼出的四条判据:

1. 枚举之前,先给变体表标上"这是假设"。"全灭"的第一解释对象是表的完备性,不是目标的反常。

2. 标准家族 ≠ 标准组合。核可以是标准实现,链接/信封层可以是自定义的——两类因素分开枚举、分开怀疑;否则"全家桶一起排"会让某一层的缺失污染整张表。

3. 拟合的输入要"构造性配对"。在输入侧取对(同一次调用产生的明文进、密文出),永远不要按尺寸猜配对。

4. 终点是"重算 = 截获",外加边界诚实。逐字节相等 + 多条独立信号同向;样本是简化情形的部分(真实条件下不可观测的项)、以及"另一半链条是否成立",未测就写未测——那是"部分证明"的标准写法。

四、结论

一句话收束这一篇全部的内容:

枚举的边界,不是计算机的时间,是写枚举的人"想象力的边界"——而那张想象力的表,常常被误当成世界的表。

"两万多种全灭"听起来像一座丰碑;其实它只是假设空间的边界被画在了哪里。而越过边界的方法,从来不是枚举得更狠,是换一个认识论:别试了,去读。

五、边界声明

  • 本文只讨论AI 自动化逆向中的判据设计与审核方法,不涉及任何具体产品、厂商或服务的分析结论。
  • 文中所有地址、偏移、常量、字段名一律为占位符或示意值,
    不代表任何真实目标中的取值;示例代码为说明判据而编写,不构成可运行的针对特定目标的工具。
  • 文中提到的比例与数字均来自作者项目内的测量记录,仅用于说明方法失效的方式。
  • 请勿将本文内容用于未授权的用途。

六、收尾

还剩最后一条,也是最"便宜"的一条方法——它把所有昂贵的难题都先推到一边:先找不加密的部分。同一套协议栈里,未必每一段都设防;先把明文段的红利吃干,再谈剩下的。

下一篇计划聊:先找不加密的部分。



转载请注明出处:
https://lizhiyong.blog.csdn.net/article/details/169268951