时至今日,已经没有人能大言不惭地说 ai 是废物云云。或许还有各式各样的问题,但是 agent 的到来已经完全改变了编程。

agent 的 loop 能力在深挖某个方向更是强大,在人类无法集中注意力去 deep in 一些领域,比如说二进制分析,ai 更是做得又快又好。 在 26 年中的这个时间节点,gpt5.6sol 横空出世,与 claude opus/fable 隔空相望,而又有 glm5.2 等开源国产模型虎视眈眈。agent 不但有 codex/claude,各家如 kimi code,pi 等也百花齐放。网络安全(cyber security)或许经常能被 openai 恶心到,但是却也是不得不品的一个环节。
做什么#
是啊,做什么
再三聋
当然得先说点紧急避险的话。我也懒得多说,总而言之我不负责你想复现我本文行为产生的一切后果。
使用 agent 可以做的逆向当然包括 bypass license 这种(相对来说感觉像是还算比较简单的)活,但是也并不意味着随便一个人来都能做得很好。AI 在训练的时候或多或少训练集里面都有点正能量的东西,因此可能会因为他自身有道德感而拒绝你——比如告诉你这件事情是违反什么什么的,我不能帮助你做这个。又或者说本身模型提供商做了额外的对话内容核验——经典的 o/和 a/ 最喜欢干的坏事,用 cyber security 来直接 stop 对话,甚至可能会封你号。
除开这些,也不是就万事大吉了,怎么做,做什么其实很多时候还是需要引导。ai 可能并不能一次性选到最优路径,很多时候还是需要点经验来干这个事。尽管对于人和 ai 都是黑箱操作(ai 可能多看看就变成白盒,但是对人来说还是黑盒),但是有经验的人类还是能根据经验以及 ai 在分析的时候给出的只言片语就能推断出大概是怎样的,需要怎么做,而这个直觉很多时候居然比 ai 自己的分析准,能够快速的帮助 ai 拨乱反正——当然误导 ai 的也是有的,这肯定还是看人的水平。
这里也主要给出几个案例,来看看这几个月下来,codex 趋于稳定之后,工作流是怎样的。结合几种类型的逆向来看。
license hacking#
这事确实很容易让 ai 拒绝,怎么让 ai 帮你做这个事其实还挺有技巧。很多时候你不需要主动去提你要做什么,而是让 ai 在做完之后一般会告诉你下一步做什么,怎么做,你顺势而为。 比如说你问ai license check 的机制是什么,然后 ai 读半天之后回答,哦怎样怎样,如果你需要替换什么什么,你可以怎样怎样做,这时候你就可以说,好就按你的方案,开始吧!大概率 ai 就继续做下去了。如果你想知道小概率是什么的话,那无非就是一些这件事不符合xx,我不能帮你做的一些废话。当然你可以选择esc 两下回到上一个对话,重新开始抽奖,ai 这种概率模型,多抽几下有时候还挺有效果的,只要有一次他愿意做下去了,接下来下次对话,上下文就是最好的破甲词。
license hacking 对于不同软件当然也不一样。但根据我的经验无非分为两大类,在线核验和离线核验。当然还有离线核完偶尔还回去请求在线复核的这种也有,多见于更新的软件,不得不说网络这个发展没几十年的东西已经习以为常到软件默认他的用户一定有网可以用。
离线校验最最最,最草台班子的核验当然是属于 if else 类型的,你在二进制里面找到了那个 if else,把
if is_license_validate () {
do something
} else {
if !is_free_trial_expired() {
do something
}
exit()
}
这种伪代码里面的 if 改成 if not,对应 arm 汇编可能是 cbz -> cbnz, tbz -> tbnz, b.ne -> b.eq 等等,总而言之这种类型的手改也简单,甚至不用上 ai,当然这么草台班子的自然也不必多讲。
好一点的是含有算法类型的,比如说校验 license 真有一套机制可以校验它的有效性。但是依旧草台的比如 mathematica, charles,他们的 license check 函数甚至是可逆的,也就是你可以根据这个 check 函数写一份生成(碰撞)一堆可用的 license。这也是为啥这俩软件你可以直接下载正版,然后随便找个网站生成一份授权码就能用上。charles 是 java写的,因此你只需要让 ai 自己去装一个 jadx,然后直接去分析字节码,ai 大概率能把这个函数拆出来然后分析分析就能直接搞出来——实测 deepseek v4 能全部做完。
更好一点但不多的是公私钥类型的 license。 公司发行的时候持有一个私钥,然后把公钥硬编码到二进制里面,然后后续用私钥签发不同的 license 给用户,二进制可以用公钥核验 license 的有效性但是不能用公钥反推私钥(自然也就不能生成另外一份合法license),这听起来对极了,但是这个破解甚至更简单,更通杀。因为这类型的公私钥基本上都是一些比较公开的通用的算法,比如说 rsa,比如 ecdsa 之类这种非对称算法,这种你只要拿 openssl 自己生成一份公私钥,然后把你的公钥替换掉原本二进制硬编码的那一份公钥,自己再用私钥签一份有效的 license——嘿,想要啥用户名想要啥有效期自己写就行了。唯一的难点可能是签一份 license 这件事,你可能需要逆向一下二进制看看它期望的格式是怎样的——这点正是 llm 可以帮你的,大部分这种都是 json,二进制里面 parse json 肯定是按字段名的,因此绝对有字符串在里面,很好搜索到,反编译之后结构也算比较清晰。捏一份 license 出来也比较简单。经典的比如 typora,ida pro 都是这样干的。
离线类型的大概就这些,一般能想到更安全的都不是在这个层面上做校验,而是对软件本身的完整性进行插桩和校验,比如反篡改,各种暗桩一大堆,需要一个个拔掉的那种。有一些软件写了一百多个 hook 还是会在一些情况下崩溃的,基本上都是这样。
然后是在线类型的。这类型的首先需要知道 check 都是连接上一个软件自己的服务商的后端,然后校验——然后这个地方就可以分类了。有的 app 比较草台,网络层一点安全都没有,随便开个 charles 就能抓到他在发什么,收到了什么。稍微更安全一些的就有 ssl pinning,mtls 这类型的,需要一个个过掉,关于过掉这种,ssl pinning 在 mac 和 ios 上一般有标准组件可以直接用 objection 的原理过掉,mtls 则需要抽取二进制里面包含的那份证书然后导入你的 mitm 软件里面。至于这份证书在二进制的哪里,就需要发挥你的逆向功底(或者你让你的 agent 帮你代劳)了,有的 app 还会将这份证书加密再放在二进制里面,运行时动态解密出来,然后每个版本换一个证书,这都是有的——比如某音游。
即使不去考虑中间人攻击,依旧还有抓包手段,比如直接挂一个 hook,例如 frida,直接在网络层即将发送的时候挂一个 hook 打印发送和回包的内容,也能知道大概在干什么。这时候可能你就得和软件本身的安全机制 battle。安全做得好的软件可能会有各种反 frida,反调试组件,总而言之就是打断你当前做的事,让你不得不去把那部分先给拆掉。
有些人可能会喜欢 mitm 来做 hack,这个仅在没有上述的网络层安全机制的情况下可行,如果有的话那就不行了,我个人还是喜欢用修改的办法。如果考虑修改,那么可以考虑挂 hook 来直接在对应点 instrument 动对应内存块,甚至重分配一块内存出来,然后让原本的指针指向我们的新的内存(改回包),然后这个时候又分情况。草台的软件可能就会一个
{
"verified": true // or false
}
那你就伪造回包就行了。稍微没那么草台的可能会回一个
{
"success": true,
"detailed": {
"timestamp": 0d000721,
"license": "AVeryLongMeaninglessStringYouNeverKnowWhatItIs==",
"email": "me@me.me"
}
}
然后 license 本身还会做一些类似于刚才说的,ecdsa 这种校验,可能先 base64 decode 一下,然后再去做点别的也有可能。总之看代码怎写的,二进制怎么说的。
在线校验自然还有其他类型的,数不胜数了属于是。比如还有下发一个什么东西然后存 keychain 里面,然后每次启动的时候去读 keychain 的,还有一堆七七八八的类型。
讲了半天。llm 辅助在哪里?llm 就在上面无处不在。判断这是什么类型,很多时候就靠 llm 怎么去分析这个二进制。我这里会推荐 qiuchenly 二创爆改的 ida pro mcp enhancement,他这个版本给每个mcp 请求都带上了一个独一无二的ida 实例名字,这样的好处就在于你可以同时打开多个 ida实例,让 ai 跨实例分析很简单——或者你有两个任务同时做的时候也可以这样玩。 然后连上之后,先让 ai 在你想干的事情的目标点附近先探索一下,填充一下上下文,然后接下来再开始干活。
然后 llm 读完之后就会告诉你这个机制大概是怎样的,接下来 llm 可能会给出一些方案,采取哪个方案,合不合适就看你的经验了,你觉得合适但是实际上这个方案不合适可能就浪费不少 token,或者你可能大概率得从头再来,或者一直 deep in 一个不对的方向,比如 matlab 也是公钥离线校验类型的,但是他把公钥拆散了丢二进制里面,运行时临时组起来的,这种就不太适合用替换公钥,实际上这就回归到一个 fast fail 的反面 fast success 了,你直接找到那个校验函数快速返回一个 return 0 就完事了。因此怎样做还取决于你的判断。
然后 llm 能辅助的事情,例如刚才说的,伪造一份 license 放在那里,格式是怎样的,你肯定也不会想要手逆 json 反序列化的 pseudo c,看那个也属于折磨中的折磨。总而言之,几乎能做到全自动化逆向,但是偶尔还是需要人稍微参与一下,决策。
其他类型的#
逆向当然不只是搞破坏,还有一类复刻类的。比如某游戏给游戏的地址 url 加密了,分析加密的方法,你现在甚至可以让 ai 找到地方,读完之后直接写一份代码出来,很难想象技术进步这么快。或者你发现请求服务器,被网关层因为 header 对不上拦下来,然后发现 header 可能有什么 X-Challenge 又或者字节系的七神 X-Helios/X-Medusa 这俩大神,你想要过他网关,你得复刻这俩算法出来。以前几乎只有逆向届大神能做到的事情,现在可能用 ai 就可以做到。相较于上一类,这类型的各种 ai 好像都更愿意干一些,因为他很难说是某种破坏,而是在创造,ai 对于复刻这种算法大概还是愿意给你做的,因此反而不太需要一些隐晦的手段。
但是这种 header 一般都是不可逆算法,而且大概率也是复杂至极。例如某游戏的 X-Challenge 实际上是 HAVAL-192的变体,改了几个常数,虽然是密码学不安全,但是他见过的人也少啊,总而言之似乎让当初查分器的作者气恼了一小阵。这个算法本身你可以让比较弱的模型去一点点用 unicorn 模拟计算一点点抠出来,但是比较牛逼的模型,比如 gpt 还是能从浩如烟海的二进制代码里面快速识别出这是 haval-192 然后快速的实现了一个纯算法版本的。
至于字节系的七神,这就真的很难搞了。X-Medusa 含有七八个 VM 在里面。对于 vm 这种类型的,目前似乎并没有什么特别好的解法,一般真要搞出算法来都是直接去分析一个个 handler 然后一个个看一个个分析行为,然后挂 hook 去将自己实现的和真实行为一个个对拍,对上了之后再进行下一个——但是你别说,这个流程真的还挺适合 ai 这种 reAct 架构的设计,因为本身对拍就是一种很好的反馈,只要 ai 懂得怎么去挂 hook(反正至少比我懂),能拿到真实值之后一个个往下反馈,至少我试过,能做出来。不过似乎花了三天——是真的三天,一天 24 小时的那种不间断 work
ai 越来越智能的时候,或许需要人的部分越来越少,尽管这让人很怀疑自己这些年学的东西到底有什么意义,让人有一种无用感——正如 sam altman 所说
我看到 gpt 的一刹那,被震惊到眩晕瘫坐,那一刻像看到原子弹爆炸!让我瘫坐在椅子上,那一刻,自己毫无用处的想法,从未如此强烈。
但是总归,就这样吧,谁知道明年是怎样呢?25 年这个时候,我还在看着上上代的模型,在 zed 里面写一些看上去并不高明的 python 代码,而感到无比苦恼,而现在看到 ai 自己去客户端二进制里面对照端点的发送结构和期望接收结构而实现一个高性能可用服务器,我的心里又是怎样想的呢?
此情可待成追忆,只是当时已惘然。