前言
自从上次聊天室项目结束之后,到后面小组纳新,到最近才刚刚结束。偶然间听到小组同届的同学和大一新生介绍博客的时候,听到“你也可以像这个学长一样,也做一个自己的个人博客…”。哦,原来我还有个自己的个人博客啊。加上最近一直抖音给我推关于vibe知识大赏的视频,也看到了最近十分火爆的REA。
“逆向一切”
这个名字听起来噱头太大了,reverse anything。github榜星一度冲到了200k。但其实他并不是真正的逆向一切,anything代表的是逆向目标的宽度,而非逆向结果的深度。
据官方文档介绍,逆向的目标包括二进制文件,apk包,.net文件,javsScript,网站等等。其次,逆向的结果也并非完全可靠,而是自己本身作为mcp服务器,去承担agent和tools之前的转发,暴火的原因我认为,在于他把逆向这件看起来很隐秘的事情放到了大众面前,为每个人提供了一次逆向的机会。
mcp
突然想写这样的一篇文章,更多的灵感来源于昨天和实验室同学的一次聚餐,聊起了mcp。rea本身就是作为mcp服务器,去来进行逆向工程。
而mcp的本质,就是把各种写好的工具,通过统一的mcp协议,和agent进行交互,让模型可以调用这些工具,完成一个完整的任务。
再往下拆解一下,比如,什么是mcp协议。mcp协议有点类似于tcp协议,tcp协议面向的双方是服务端和客户端,比如tcp三次握手和四次挥手,确保了服务端和客户端的正常连接和正常断开。再比如http协议,一次请求,一次响应,面向的是web服务端和浏览器客户端。
但mcp本身作为应用层协议,在协议的双方,本质是mcp server和mcp client,server负责暴露工具,之后agent把工具列表塞入上下文,通过模型推理得知工具被调用的意图,之后agent根据意图进行调度,然后处理成mcp请求,mcp请求提供到client之后,处理发到server。server处执行完工具的调用之后,再把返回的结果通过mcp client,发送到agent,作为模型的上下文继续进行推理和计算。
说完了mcp协议,回到rea。rea则就是mcp服务器的一个真实的例子。他作为mcp服务器部署到本地或云端,通过和本地的agent进行交互,实现agent内模型和工具的请求和响应。
下面我将从进程的角度来介绍一下mcp服务器和agent之间的通信。
要想通信,首先得把mcp server在agent内部注册好。
下一步,agent作为父进程,mcp server作为子进程启动。
而两个进程之间通过两个互相方向相反的管道进行通信,对于rea来说,通过标准输入,标准输出,标准错误输出来进行通信,stdin是agent写,mcp server读,stdout是mcp server写,agent读,两个管道互相独立。
而在内核角度来看的话,agent把内容序列化成字节,调用write()执行写操作,后陷入内核态,往管道A进行写数据,再回到用户态。mcp server通过read()向管道A拿到数据,反序列化之后执行工具。执行的结果再通过管道B,序列化之后执行write()写操作,陷入内核态,往管道B写数据,返回用户态。在agent侧从管道B通过read()读数据,反序列化之后塞入上下文进行进一步的推理计算。
这就是mcp的通信流程,也就是rea在处理一个目标软件的流程。
我的尝试
了解了mcp,再回看REA的工作原理,也很清晰了。REA内部分配好了对应的逆向工具,agent通过mcp协议调用REA,REA作为中间层去调用工具,检查目标并且追踪对应代码,返回处理结果和证据链路。
我在小学的时候特别喜欢一个minecraft主播,酷爱zero。老肉和老高,老高也就是现在在youtube上的海外中文主播老高与小茉的主理人,老肉现在虽然现在不再常年做视频,但在10年前,我记得他们做过一个游戏KUAIblocks,一个单机的安卓小游戏。我小时候很想知道,这个游戏到底是怎么做的,我也想做一个。
现在我想试一试。
后记
本文章关键部分由AI审查,如还有不准确地方欢迎指出(1203987745@qq.com)。
部分参考来源于分析 21 万星的 REA:「逆向一切」这四个字,水分和干货我都扒出来了。